コード例 #1
0
        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)));
            }
        }
コード例 #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());
        }
コード例 #3
0
        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();
        }