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)); }