Пример #1
0
        public async Task <IActionResult> GetDataFiles([FromRoute] long?id, [FromQuery] bool withUrl)
        {
            if (id == null)
            {
                return(JsonBadRequest("DataSet ID is required."));
            }
            var dataSet = await dataSetRepository.GetDataSetIncludeDataSetEntryAndDataAsync(id.Value);

            if (dataSet == null)
            {
                return(JsonNotFound($"DataSet Id {id.Value} is not found."));
            }
            var model = new DataFileOutputModel(dataSet);

            if (dataSet.DataSetEntries != null)
            {
                //エントリの作成開始
                var entities    = new Dictionary <string, List <ApiModels.DataApiModels.DataFileOutputModel> >();
                var flatEntries = new ConcurrentQueue <ApiModels.DataApiModels.DataFileOutputModel>();

                //空のデータ種別も表示したい&順番を統一したいので、先に初期化しておく
                foreach (var dataType in dataTypeRepository.GetAllWithOrderby(d => d.SortOrder, true))
                {
                    entities.Add(dataType.Name, new List <ApiModels.DataApiModels.DataFileOutputModel>());
                }

                //エントリを並列で取得する
                if (dataSet.IsFlat)
                {
                    dataSet.DataSetEntries.AsParallel().ForAll(entry =>
                    {
                        var dataFiles = dataLogic.GetDataFiles(entry.Data, withUrl);
                        foreach (var x in dataFiles)
                        {
                            flatEntries.Enqueue(x);
                        }
                    });
                }
                else
                {
                    dataSet.DataSetEntries.AsParallel().ForAll(entry =>
                    {
                        var key       = entry.DataType.Name;
                        var dataFiles = dataLogic.GetDataFiles(entry.Data, withUrl);
                        lock (entities)
                        {
                            entities[key].AddRange(dataFiles);
                        }
                    });
                }

                model.SetEntries(entities);
                model.FlatEntries = flatEntries;
            }

            return(JsonOK(model));
        }
Пример #2
0
        /// <summary>
        /// 指定したIDの全ファイル情報を取得する。
        /// </summary>
        /// <param name="data">データ</param>
        /// <param name="withUrl">結果にダウンロード用のURLを含めるか</param>
        public IEnumerable <DataFileOutputModel> GetDataFiles(Data data, bool withUrl)
        {
            var result = new List <DataFileOutputModel>();

            foreach (var property in data.DataProperties)
            {
                var model = new DataFileOutputModel {
                    Id = data.Id, Key = property.Key, FileId = property.Id, FileName = property.DataFile.FileName
                };

                if (withUrl)
                {
                    model.Url = storageLogic.GetPreSignedUriForGet(ResourceType.Data, property.DataFile.StoredPath, property.DataFile.FileName, true).ToString();
                }
                result.Add(model);
            }
            return(result);
        }
Пример #3
0
        public async Task <IActionResult> GetDataFiles([FromRoute] long?id, [FromQuery] bool withUrl)
        {
            if (id == null)
            {
                return(JsonBadRequest("DataSet ID is required."));
            }
            var dataSet = await dataSetRepository.GetDataSetIncludeDataSetEntryAsync(id.Value);

            if (dataSet == null)
            {
                return(JsonNotFound($"DataSet Id {id.Value} is not found."));
            }
            var model = new DataFileOutputModel(dataSet);

            if (dataSet.DataSetEntries != null)
            {
                //エントリの作成開始。最初はDictionary形式で
                var entities = new Dictionary <string, List <ApiModels.DataApiModels.DataFileOutputModel> >();

                //空のデータ種別も表示したい&順番を統一したいので、先に初期化しておく
                foreach (var dataType in dataTypeRepository.GetAllWithOrderby(d => d.SortOrder, true))
                {
                    entities.Add(dataType.Name, new List <ApiModels.DataApiModels.DataFileOutputModel>());
                }

                //エントリを一つずつ突っ込んでいく。件数次第では遅いかも。
                foreach (var entry in dataSet.DataSetEntries)
                {
                    string key       = entry.DataType.Name;
                    var    dataFiles = dataLogic.GetDataFiles(entry.DataId, withUrl);
                    entities[key].AddRange(dataFiles);
                }

                model.SetEntries(entities);
            }

            return(JsonOK(model));
        }