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()); }
public static void Seed(WebsiteDataContext context) { // Check whether database has already got data in it. Config cfg = context.Config.Find(1); if (cfg != null) { return; } //------------------------------------------------------------------ StreamReader mediaJson = new StreamReader(Path.Combine(basePath, "media.json")); List <MediaSeeder> media = JsonConvert.DeserializeObject <List <MediaSeeder> >(mediaJson.ReadToEnd()); mediaJson.Close(); List <ImageMedia> images = media.Where(m => m.MediaType.Category == MediaCategory.Image).Select(m => (ImageMedia)m.ToBaseMedia()).ToList(); List <AudioMedia> audios = media.Where(m => m.MediaType.Category == MediaCategory.Audio).Select(m => (AudioMedia)m.ToBaseMedia()).ToList(); context.AddRangeWithIdentityInsert(images, "Media"); context.AddRangeWithIdentityInsert(audios, "Media"); //------------------------------------------------------------------ StreamReader categoriesJson = new StreamReader(Path.Combine(basePath, "categories.json")); List <FactFileCategory> categories = JsonConvert.DeserializeObject <List <FactFileCategory> >(categoriesJson.ReadToEnd()); categoriesJson.Close(); context.AddRangeWithIdentityInsert(categories, "FactFileCategories"); //----------------------------------------------------------------- StreamReader entriesJson = new StreamReader(Path.Combine(basePath, "entries.json")); List <EntrySeeder> entries = JsonConvert.DeserializeObject <List <EntrySeeder> >(entriesJson.ReadToEnd()); entriesJson.Close(); context.AddRangeWithIdentityInsert(entries.Select(e => e.ToFactFileEntry()), "FactFileEntries"); context.AddRange(entries.Select(e => e.GetFactFileEntryImages())?.Aggregate((l1, l2) => l2 != null ? l1.Concat(l2).ToList() : l1)); context.AddRange(entries.Select(e => e.GetFactFileNuggets())?.Aggregate((l1, l2) => l2 != null ? l1.Concat(l2).ToList() : l1)); //------------------------------------------------------------------ StreamReader tracksJson = new StreamReader(Path.Combine(basePath, "tracks.json")); List <TrackSeeder> tracks = JsonConvert.DeserializeObject <List <TrackSeeder> >(tracksJson.ReadToEnd()); tracksJson.Close(); context.AddRangeWithIdentityInsert(tracks.Select(t => t.ToTrack()), "Tracks"); context.AddRangeWithIdentityInsert(tracks.Select(t => t.GetActivities())?.Aggregate((l1, l2) => l2 != null ? l1.Concat(l2).ToList() : l1), "Activities"); context.AddRange(tracks.Select(t => t.GetActivityImages())?.Aggregate((l1, l2) => l2 != null ? l1.Concat(l2).ToList() : l1)); //------------------------------------------------------------------- StreamReader quizzesJson = new StreamReader(Path.Combine(basePath, "quizzes.json")); List <QuizSeeder> quizzes = JsonConvert.DeserializeObject <List <QuizSeeder> >(quizzesJson.ReadToEnd()); quizzesJson.Close(); context.AddRangeWithIdentityInsert(quizzes.Select(q => q.ToQuiz()), "Quizzes"); // Intially we cannot save correct answer IDs due to foreign key constraint. Will save without and add later. context.AddRangeWithIdentityInsert(quizzes.Select(q => q.GetQuestions(includeCorrectAnswers: false))?.Aggregate((l1, l2) => l2 != null ? l1.Concat(l2).ToList() : l1), "QuizQuestions"); context.AddRangeWithIdentityInsert(quizzes.Select(q => q.GetAnswers())?.Aggregate((l1, l2) => l2 != null ? l1.Concat(l2).ToList() : l1), "QuizAnswers"); //-------------------------------------------------------------------- context.Add(new Config { MasterUnlockCode = "quizmaster" }); context.SaveChanges(); // Detach all entries from the tracker so that we can update questions with their correct answer IDs. List <EntityEntry> entityEntries = context.ChangeTracker.Entries().ToList(); foreach (var entry in entityEntries) { entry.State = EntityState.Detached; } context.UpdateRange(quizzes.Select(q => q.GetQuestions(includeCorrectAnswers: true))?.Aggregate((l1, l2) => l2 != null ? l1.Concat(l2).ToList() : l1)); // Save the database with the added correct answer IDs. context.SaveChanges(); }