Exemple #1
0
        public Task Invoke(HttpContext httpContext, WebsiteDataContext db, IConfiguration config, IEmailService smtp)
        {
            if (httpContext.User.Identity.IsAuthenticated)
            {
                Account account = db.Accounts.Find(httpContext.User.AccountId());
                if (account.ForcePasswordReset)
                {
                    //Clear old tokens
                    List <PasswordReset> oldTokens = db.PasswordResets.Where(c => c.Account.Id == account.Id).ToList() ?? new List <PasswordReset>();
                    foreach (PasswordReset token in oldTokens)
                    {
                        token.ExpiresAt = DateTime.UtcNow;
                    }

                    // Get new token
                    PasswordReset newToken = new PasswordReset(
                        account, DateTime.UtcNow.AddMinutes(config["LoginSettings:PasswordResetTokenLength"].ToInt())
                        );

                    // Update database
                    db.PasswordResets.Add(newToken);
                    db.SaveChanges();

                    // send password reset email
                    smtp.SendPasswordResetEmailAsync(newToken, httpContext.Request.BaseUrl());

                    httpContext.SignOutAsync();
                    httpContext.Response.Redirect("/error/password-reset");
                }
            }

            return(_next(httpContext));
        }
        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();
        }