示例#1
0
        public async Task <ActionResult <CaffItemDetailsDto> > AddCaffItem([FromForm] AddCaffItemDto addCaffItem)
        {
            var response = await _caffItemService.AddCaffItemAsync(addCaffItem);

            return(CreatedAtAction(nameof(GetCaffItem), new { caffItemId = response.Id }, response));
        }
        public async Task <CaffItemDetailsDto> AddCaffItemAsync(AddCaffItemDto caffItem)
        {
            var parseResult = await CaffParser.ParseCaffFileAsync(caffItem.CaffFile.OpenReadStream());

            if (!parseResult.Succeeded)
            {
                throw new CaffStoreBusinessException(parseResult.Message);
            }

            var caffData = _mapper.Map <CaffData>(parseResult.Result);

            // Get all tags
            var parsedTags = caffData.Animations.Select(a => a.CiffData.Tags).SelectMany(t => t).ToList();
            var tagStrings = parsedTags.Select(t => t.Tag.Text).ToHashSet();

            // Prefetch existing tags
            var existingTags = await _context
                               .Tags
                               .Where(t => tagStrings.Contains(t.Text))
                               .ToListAsync();

            // If a tag is already in the database, do not store again, only set reference
            foreach (var parsedTag in parsedTags)
            {
                var existingTag = existingTags
                                  .FirstOrDefault(t => t.Text == parsedTag.Tag.Text);

                if (existingTag == null)
                {
                    existingTags.Add(parsedTag.Tag);
                }
                else
                {
                    parsedTag.Tag = existingTag;
                }
            }

            Guid caffFileId = await _fileService.UploadFileAsync(caffItem.CaffFile.OpenReadStream(), ".caff", FileType.Caff);

            Guid previewFileId;

            await using (var previewStream = new MemoryStream())
            {
                parseResult.Preview.Save(previewStream, ImageFormat.Png);
                previewStream.Position = 0;

                previewFileId = await _fileService.UploadFileAsync(previewStream, ".png", FileType.Preview);
            }

            var caffItemEntity = new CaffItem
            {
                Title           = caffItem.Title,
                Description     = caffItem.Description,
                CaffFileId      = caffFileId,
                PreviewFileId   = previewFileId,
                CaffData        = caffData,
                DownloadedTimes = 0,
            };

            _context.CaffItems.Add(caffItemEntity);

            await _context.SaveChangesAsync();

            return(await GetCaffItemAsync(caffItemEntity.Id));
        }