public async Task <IActionResult> EditItem(IFormCollection request) { try { if (string.IsNullOrEmpty(request.Str("navitem"))) { return(BadRequest(new ResponseHelper("Something went wrong, please try again later", "No nav-item data was sent"))); } NavItem updatedItem = JsonConvert.DeserializeObject <NavItem>(request.Str("navitem")); // If ID is zero, this is a new item, use the AddItem method if (updatedItem.Id == 0) { return(await AddItem(request)); } // Check whether an existing navitem has that id NavItem originalItem = await _Db.NavItems.AsNoTracking().FirstOrDefaultAsync((item) => item.Id == updatedItem.Id); if (originalItem == null) { return(NotFound(new ResponseHelper("Something went wrong, please try again later."))); } // Delete any old drop down links for the nav item List <NavItemPage> dropdowns = await _Db.NavItemPages.Where(n => n.NavItemId == updatedItem.Id).ToListAsync(); _Db.RemoveRange(dropdowns); await _Db.SaveChangesAsync(); // Mark item as updated _Db.Update(updatedItem); _Db.Entry(updatedItem).Property(i => i.OrderIndex).IsModified = false; _Db.Entry(updatedItem).Property(i => i.Section).IsModified = false; // Add new dropdowns, if any if (updatedItem.NavItemPages != null) { // Add order index to items before saving for (int i = 0; i < updatedItem.NavItemPages.Count; i++) { updatedItem.NavItemPages[i].OrderIndex = i; } _Db.AddRange(updatedItem.NavItemPages); } // Write changes to database await _Db.SaveChangesAsync(); return(Ok(updatedItem.Id)); } catch (Exception ex) { _Logger.LogError("Error updating navlink", ex.Message); _Logger.LogError(ex.StackTrace); return(BadRequest(new ResponseHelper("Something went wrong, please try again later.", ex.Message))); } }
public async Task <IActionResult> UpdateActivity(int activityId, [FromBody] ActivityArgs activityArgs) { // Check validation status - see ActivityArgs class for validation logic if (!ModelState.IsValid) { return(new BadRequestObjectResult(ModelState)); } // Check that QR code is not in use elsewhere if (!(await IsValidQrCode(activityArgs.QrCode, activityId))) { return(BadRequest(new ResponseHelper("QR code already in use."))); } // Use a transaction to avoid losing data if an exception is thrown using (var transaction = await _Db.Database.BeginTransactionAsync()) { // Retrieve existing activity - confirm its existence Activity oldActivity = await _Db.Activities.Include(a => a.ActivityImages).Where(a => a.Id == activityId).FirstOrDefaultAsync(); if (oldActivity == null) { return(NotFound(new ResponseHelper("Something went wrong. Please refresh the page and try again.", "Could not find activity in database"))); } oldActivity.TrackId = oldActivity.TrackId; oldActivity.Title = activityArgs.Title; oldActivity.Active = oldActivity.Active; oldActivity.ActivityType = activityArgs.ActivityType; oldActivity.FactFileId = activityArgs.FactFileId; oldActivity.Description = activityArgs.Description; oldActivity.Task = activityArgs.Task; oldActivity.ImageId = activityArgs.ImageId; oldActivity.CoordX = activityArgs.CoordX; oldActivity.CoordY = activityArgs.CoordY; oldActivity.QrCode = activityArgs.QrCode; // Save new activity to generate ID _Db.Update(oldActivity); await _Db.SaveChangesAsync(); // Remove old activity images _Db.RemoveRange(oldActivity.ActivityImages); // Add pivot table records for activity images _Db.AddRange(activityArgs.Images.Select(imageId => new ActivityImage { ImageId = imageId, ActivityId = oldActivity.Id })); // Save pivot table records await _Db.SaveChangesAsync(); // All database queries complete, commit the transaction transaction.Commit(); } return(Ok()); }