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)));
            }
        }
Exemplo n.º 2
0
        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());
        }