using MongoDB.Entities; using PrivaPub.Models.Data; using PrivaPub.StaticServices; using System.Text; using System.Text.Json; namespace PrivaPub.Data { public static class InitDb { public static async Task Init(this DbEntities dbClient, IPasswordHasher passwordHasher) { await SyncLanguages(dbClient); await UpdateNewLanguages(dbClient); //await SyncUserSettings(dbClient); //await ClearUsers(dbClient); //var botsInsertionAwaiter = InsertBots(dbClient, passwordHasher); //var updateAnswersAwaiter = UpdateAnswersLikes(dbClient); //Task.WaitAll(botsInsertionAwaiter); //await SyncShareDiscussions(dbClient); } //static async Task UpdateAnswersLikes(DbCollections dbClient) //{ // if (await dbClient.AnswersLikes.Find(al => al.AnswerId != null).AnyAsync()) return; // foreach (var answerLikes in await dbClient.AnswersLikes.Find(al => true).ToListAsync()) // { // answerLikes.AnswerId = answerLikes.Id; // answerLikes.Id = ObjectId.GenerateNewId(); // await dbClient.AnswersLikes.InsertOneAsync(answerLikes); // _ = await dbClient.AnswersLikes.DeleteOneAsync(al => al.Id == answerLikes.AnswerId); // } //} //static async Task ClearUsers(DbColl dbClient) //{ // await dbClient.Users.DeleteManyAsync(u => true); // await dbClient.UsersSettings.DeleteManyAsync(u => true); // await dbClient.Answers.DeleteManyAsync(u => true); // await dbClient.AnswersLikes.DeleteManyAsync(u => true); // await dbClient.Comments.DeleteManyAsync(u => true); // await dbClient.EmailRecoveries.DeleteManyAsync(u => true); // await dbClient.Threads.DeleteManyAsync(u => true); // await dbClient.EDiscussions.DeleteManyAsync(u => true); // await dbClient.Logs.DeleteManyAsync(u => true); // await dbClient.ShareDiscussions.De(u => true); // await dbClient.DiscussionFiles.DeleteManyAsync(u => true); // await dbClient.UsersGroups.DeleteManyAsync(u => true); //} // static async Task SyncShareDiscussions(DbColl dbClient) // { // var anyThread = await dbClient.Discussions.Match(t => true).ExecuteAnyAsync(); // var anyShareDiscussion = await dbClient.ShareDiscussions.Match(st => true).ExecuteAnyAsync(); // // if (anyThread == anyShareDiscussion) return; // // var discussions = await dbClient.Discussions.ManyAsync(t => true); // // foreach (var discussion in discussions) // { // var newShareDiscussion = new ShareDiscussion // { // DiscussionId = discussion.ID, // InvitationCode = $"{Guid.NewGuid():N}{Guid.NewGuid():N}" // }; // await newShareDiscussion.SaveAsync(); // } // } static async Task SyncLanguages(DbEntities dbClient) { if (await dbClient.Languages.ExecuteAnyAsync()) return; var languagesJson = await File.ReadAllTextAsync(Path.Combine(Directory.GetCurrentDirectory(), "Data", "languagesNative.json"), Encoding.UTF8); var languagesRows = JsonSerializer.Deserialize>(languagesJson); var languages = new List(); foreach (var languageRow in languagesRows ?? new LanguagesRow[] { }) languages.Add(new Language { EnglishName = languageRow.EnglishName, NativeName = languageRow.NativeName, International2Code = languageRow.International2Code }); await DB.SaveAsync(languages); } static async Task UpdateNewLanguages(DbEntities dbClient) { var bulgarianLanguage = await dbClient.Languages.Match(l => l.International2Code == "bg").ExecuteFirstAsync(); if (bulgarianLanguage.NativeName == "Български") return; var languagesToUpdate = new Dictionary() { { "bg", "Български" }, { "cs", "Česky" }, { "da", "Dansk" }, { "nl", "Nederlands" }, { "et", "Eesti" }, { "fi", "Suomalainen" }, { "el", "Ελληνική" }, { "hu", "Magyar" }, { "lv", "Latviešu" }, { "lt", "Lietuvių kalba" }, { "pl", "Polski" }, { "pt", "Português" }, { "ro", "Românesc" }, { "sk", "Slovenská" }, { "sl", "Slovenski" }, { "sv", "Svenska" } }; foreach (var languageToUpdate in languagesToUpdate) { var bgLang = await dbClient.Languages.Match(l => l.International2Code == languageToUpdate.Key).ExecuteFirstAsync(); bgLang.NativeName = languageToUpdate.Value; await bgLang.SaveAsync(); } } // static async Task SyncUserSettings(DbColl dbClient) // { // if (!await dbClient.Users.ExecuteAnyAsync()) return; // // var users = await dbClient.Users.ManyAsync(u => true); // var usersId = users.Select(u => u.ID).ToList(); // var usersSettings = await dbClient.UsersSettings // .ManyAsync(us => true); // // var usersWithoutSettings = users.Where(u => !usersSettings.Any(us => us.UserId == u.ID)).Select(u => u.ID).ToList(); // if (usersWithoutSettings.Count == 0) return; // // var defaultLanguage = await dbClient.Languages // .Match(l => l.International2Code == "en") // .ExecuteFirstAsync(); // foreach (var userId in usersWithoutSettings) // await DB.SaveAsync(new UserSettings // { // UserId = userId, // LanguageId = defaultLanguage.International2Code // }); // } //static async Task InsertBots(DbEntities dbClient, IPasswordHasher passwordHasher) //{ // if (await dbClient.Users.Match(u => u.UserName == "bot0").ExecuteAnyAsync()) return; // var newBots = new List(); // var newBotsUserSettings = new List(); // for (int i = 0; i < 100; i++) // newBots.Add(new User // { // HashedPassword = passwordHasher.Hash("Asdfmov13!!!"), // UserName = $"bot{i}" // }); // await newBots.SaveAsync(); // var defaultLanguage = await dbClient.Languages // .Match(l => l.International2Code == "en") // .ExecuteFirstAsync(); // foreach (var newBot in newBots) // newBotsUserSettings.Add(new() // { // UserId = newBot.ID, // LanguageId = defaultLanguage.International2Code, // }); // await newBotsUserSettings.SaveAsync(); //} } }