public async Task <Guid> UpsertFursuitBadgeAsync(FursuitBadgeRegistration registration) { byte[] imageBytes = Convert.FromBase64String(registration.ImageContent); var hash = Hashing.ComputeHashSha1(imageBytes); await _sync.WaitAsync(); try { var record = await _fursuitBadgeRepository.FindOneAsync(a => a.ExternalReference == registration.BadgeNo.ToString()); if (record == null) { record = new FursuitBadgeRecord(); record.NewId(); await _fursuitBadgeRepository.InsertOneAsync(record); } record.ExternalReference = registration.BadgeNo.ToString(); record.OwnerUid = $"RegSys:{_conventionSettings.ConventionNumber}:{registration.RegNo}"; record.Gender = registration.Gender; record.Name = registration.Name; record.Species = registration.Species; record.IsPublic = (registration.DontPublish == 0); record.WornBy = registration.WornBy; record.Touch(); var imageRecord = await _fursuitBadgeImageRepository.FindOneAsync(record.Id); if (imageRecord == null) { imageRecord = new FursuitBadgeImageRecord { Id = record.Id, Width = 240, Height = 320, MimeType = "image/jpeg" }; imageRecord.Touch(); await _fursuitBadgeImageRepository.InsertOneAsync(imageRecord); } if (imageRecord.SourceContentHashSha1 != hash) { imageRecord.SourceContentHashSha1 = hash; var image = Image.Load(imageBytes); image.Resize(new ResizeOptions() { Mode = ResizeMode.Max, Size = new Size(240, 320), Sampler = new BicubicResampler() }); var ms = new MemoryStream(); image.SaveAsJpeg(ms, new JpegEncoderOptions() { IgnoreMetadata = true, Quality = 85 }); imageRecord.SizeInBytes = ms.Length; imageRecord.ImageBytes = ms.ToArray(); ms.Dispose(); imageRecord.Touch(); await _fursuitBadgeImageRepository.ReplaceOneAsync(imageRecord); } await _fursuitBadgeRepository.ReplaceOneAsync(record); return(record.Id); } finally { _sync.Release(); } }
public async Task <Guid> InsertOrUpdateImageAsync(string internalReference, byte[] imageBytes) { var hash = Hashing.ComputeHashSha1(imageBytes); var existingRecord = (await _imageRepository.FindAllAsync(a => a.InternalReference == internalReference)) .ToList() .SingleOrDefault(); if (existingRecord != null && existingRecord.ContentHashSha1 == hash) { // Ensure we still have the image! var existingContentRecord = await _imageContentRepository.FindOneAsync(existingRecord.Id); if (existingContentRecord == null) { await _imageContentRepository.InsertOneAsync(new ImageContentRecord { Id = existingRecord.Id, IsDeleted = 0, Content = imageBytes }); } return(existingRecord.Id); } var image = Image.Load(imageBytes); var record = new ImageRecord { Id = existingRecord?.Id ?? Guid.NewGuid(), IsDeleted = 0, InternalReference = internalReference, MimeType = image.CurrentImageFormat.MimeType, Width = image.Width, Height = image.Height, SizeInBytes = imageBytes.Length, ContentHashSha1 = hash }; var contentRecord = new ImageContentRecord { Id = record.Id, IsDeleted = 0, Content = imageBytes }; record.Touch(); contentRecord.Touch(); if (existingRecord != null) { await base.ReplaceOneAsync(record); await _imageContentRepository.ReplaceOneAsync(contentRecord); } else { await base.InsertOneAsync(record); await _imageContentRepository.InsertOneAsync(contentRecord); } return(record.Id); }