/// <summary> /// Add a new Partner to the database, upload image if given /// </summary> /// <param name="newPartner"></param> /// <param name="image"></param> /// <param name="imgUploadPath"></param> /// <returns></returns> public async Task AddPartner(Partner newPartner, IFormFile image, string imgUploadPath) { try { using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { // Add image to the item if (image != null) { string uploadedImgName = await ImageManager.UploadImage(image, imgUploadPath); if (uploadedImgName != null) { newPartner.Image = new PartnerImage { ImageFileName = uploadedImgName } } ; } // Add item to Database _context.Add(newPartner); await _context.SaveChangesAsync(); // Complete the transaction ts.Complete(); } } catch (Exception e) { throw e; } }
// Not using .FirstAsync() because it will just bring another variety in the code, possibly making it more complicated. // Should probably use it because it first checks if that item with the given ID is being traced by the context already // e.g. The item is queried to be deleted, which the db context traces. Then if you choose to Delete it right away, it's // already being traced and will not have to be queried again. //public async Task<Item> GetItemById(int? id) { // if (id == null) { // return null; // } // else { // return await _context.Items.FirstAsync(); // } //} /// <summary> /// Edit the Item /// </summary> /// <param name="editedItem"></param> /// <param name="imagesToRemoveIds"></param> /// <param name="imagesToAdd"></param> /// <param name="imgUploadPath"></param> /// <returns></returns> public async Task EditItem(Item editedItem, List <int> imagesToRemoveIds, ICollection <IFormFile> imagesToAdd, string imgUploadPath) { // Check if an item with Edited Item ID exists in the database if (!await ItemExists(editedItem.Id)) { return; } // Transactions should also check for the file IO, if that throws an error then it wont update the database try { using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { // Check if any images to Add and do so if (imagesToAdd != null && imagesToAdd.Any()) { // List for new Images to add List <ItemImage> newImages = new List <ItemImage>(); // upload the images to the given path List <string> uploadedImgNames = await ImageManager.UploadImages(imagesToAdd, imgUploadPath); foreach (string imgFileName in uploadedImgNames) { newImages.Add(new ItemImage { ImageFileName = imgFileName }); } AddImagesToItem(editedItem, newImages); } // Check if any images to remove and do so if (imagesToRemoveIds != null && imagesToRemoveIds.Any()) { foreach (int imageId in imagesToRemoveIds) { if (await IsImageOwnedByGivenItem(editedItem.Id, imageId)) { // Remove the image from this list and also add it to the DB queue to query when SaveChanges is called to remove it from DB as well // Have to do both because, if just removing from list. Updating thinks we didn't touch the image at all, // if we would remove the image only from the Database and not from the list right away. The list would add it back:( editedItem.Images.Remove(editedItem.Images.First(x => x.Id == imageId)); await RemoveImageWithoutSaveChanges(imageId); } } } _context.Update(editedItem); await _context.SaveChangesAsync(); ts.Complete(); } } catch (Exception e) { throw e; } }
/// <summary> /// Add Tehtud töö to the database and upload images /// </summary> /// <param name="newTehtudToo"></param> /// <param name="images"></param> /// <param name="imgUploadPath"></param> /// <returns></returns> public async Task AddTehtudToo(TehtudToo newTehtudToo, ICollection <IFormFile> images, string imgUploadPath) { try { using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { // Add images to Tehtud töö if (images != null && images.Any()) { // instantiate a new image list for Tehtud töö newTehtudToo.Images = new List <TehtudTooImage>(); // List for Images to add List <TehtudTooImage> imagesToAdd = new List <TehtudTooImage>(); List <string> uploadedImgNames = await ImageManager.UploadImages(images, imgUploadPath); foreach (string imgFileName in uploadedImgNames) { imagesToAdd.Add(new TehtudTooImage { ImageFileName = imgFileName }); } // Add images to the new Tehtud töö foreach (TehtudTooImage img in imagesToAdd) { newTehtudToo.Images.Add(img); } ; } // Add Tehtud töö to Database _context.Add(newTehtudToo); await _context.SaveChangesAsync(); // Complete the transaction ts.Complete(); } } catch (Exception e) { throw e; } }