Source Viewer-GetAnimalController.cs.src

Powered by Google Code Prettify
戻る
        
///
/// 指定ページの動物データをMongoDBから取得してJsonで返すWeb API
///
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using MongoDB.Driver;
using MongoDB.Driver.GridFS;
using AnimalData;

namespace MyWebService.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class GetAnimalController : ControllerBase
    {
        private readonly ILogger<GetAnimalController> _logger;

        public GetAnimalController(ILogger<GetAnimalController> logger)
        {
            _logger = logger;
        }

        // HTTP GETリクエスト処理
        // 呼出し元に返される戻り値の形式
        //      {
        //          "pagecount" : n,
        //          [
        //              {
        //                  "name" : 動物名1,
        //                  "image" : イメージデータ(Base64文字列)
        //              },
        //              {
        //                  "name" : 動物名2,
        //                  "image" : イメージデータ(Base64文字列)
        //              },
        //              ・・・
        //          ]
        //      }
        [HttpGet]
        public AnimalList Get(
            [FromQuery]int page=0,          // ページ番号(0ベース。URLに指定。デフォルト0)
            [FromQuery]int itemcount=5) {   // ページ内の項目数(URLに指定。)

            // MongoDB関連初期化
            var cli = new MongoClient();
            var db = cli.GetDatabase("AnimalDb");
            var col = db.GetCollection<AnimalBsonData>("Animals");
            var fs = new GridFSBucket(db);  // GridFS
            // 全レコード数とページ内項目数から全ページ数を求める
            int count = col.AsQueryable().Count();
            int pagecount = count / itemcount;
            if ((count%itemcount) != 0) pagecount++;
            // 返すべきレコードまでのスキップ数を計算
            int skip = itemcount * page;
            // 返す値を設定
            var anidata = new AnimalList();
            anidata.PageCount = pagecount;  // 全ページ数
            // 動物データ
            List<Animal> lst = new List<Animal>();
            foreach(var itm in col.AsQueryable().Skip(skip).Take(itemcount)) {
                var ani = new Animal();
                ani.Name = itm.Name;    // 動物名
                ani.Image = fs.DownloadAsBytes(itm.ImageId);    // 画像データ
                lst.Add(ani);
            }
            anidata.Animals = lst;
            return anidata; // 呼出し元へはJson形式で返される。画像データはBase64化される。
        }
    }
}