private static List <DbDocItem> GetAllChildren(DbMynaContext dbContext, DbUser user, DbDocItem docItem) { var ret = new List <DbDocItem>(); foreach (var child in GetChildren(dbContext, user, docItem)) { ret.Add(child); if (IsContainer(child)) { ret.AddRange(GetAllChildren(dbContext, user, child)); } } return(ret); }
private static List <DbDocItem> GetPath(DbMynaContext dbContext, DbUser user, DbDocItem item) { var ret = new List <DbDocItem>(); while (item != null && item.ParentId.HasValue) { item = GetItemById(dbContext, user, item.ParentId.Value); if (item != null) { ret.Add(item); } } return(ret); }
private static DbDocItem GetItemById(DbMynaContext dbContext, DbUser user, long?id) { DbDocItem item = null; if (id.HasValue) { return(dbContext.DbDocItems.SingleOrDefault( item => item.OwnerId == user.Id && item.Id == id.Value)); } else { item = dbContext.DbDocItems.SingleOrDefault( item => item.OwnerId == user.Id && item.Type == DbDocItemType.Volume); } return(item); }
private static void MigrateSkatUserResults(DbMynaContext destContext, string userName, long userId) { var userSkatResults = destContext.DbSkatResults .Where(r => r.Player1 == userName || r.Player2 == userName || r.Player3 == userName || r.Player4 == userName) .Select(r => r.Id); if (userSkatResults.Any()) { foreach (var skatResultId in userSkatResults) { destContext.DbUserSkatResults.Add(new DbUserSkatResult { DbUserId = userId, DbSkatResultId = skatResultId }); } destContext.SaveChanges(); } }
public DateTime?UpdateNote(IPwdManService pwdManService, string authenticationToken, NoteModel noteModel) { logger.LogDebug("Update note ID {noteModel.Id}...", noteModel.Id); var user = pwdManService.GetUserFromToken(authenticationToken); var dbContext = pwdManService.GetDbContext(); var note = dbContext.DbNotes.SingleOrDefault( (n) => n.Id == noteModel.Id && n.DbUserId == user.Id); if (note != null && (note.Title != noteModel.Title || note.Content != noteModel.Content)) { note.Title = noteModel.Title; note.Content = noteModel.Content; note.ModifiedUtc = DateTime.UtcNow; dbContext.SaveChanges(); return(DbMynaContext.GetUtcDateTime(note.ModifiedUtc).Value); } return(null); }
public NoteModel GetNote(IPwdManService pwdManService, string authenticationToken, long id) { logger.LogDebug("Get note for ID {id}...", id); var user = pwdManService.GetUserFromToken(authenticationToken); var dbContext = pwdManService.GetDbContext(); var note = dbContext.DbNotes.SingleOrDefault( (n) => n.Id == id && n.DbUserId == user.Id); if (note != null) { return(new NoteModel { Id = note.Id, LastModifiedUtc = DbMynaContext.GetUtcDateTime(note.ModifiedUtc).Value, Title = note.Title, Content = note.Content }); } return(null); }
public List <HighScore> GetHighScores() { var opt = GetOptions(); var ret = new List <HighScore>(); var del = new List <DbTetrisHighScore>(); var dbContext = GetDbContext(); var highScores = dbContext.DbTetrisHighScore.OrderByDescending(sc => sc.Score); foreach (var hs in highScores) { var highScore = new HighScore { Name = hs.Name, Created = DbMynaContext.GetUtcDateTime(hs.Created).Value, Level = hs.Level, Lines = hs.Lines, Score = hs.Score }; var diff = DateTime.UtcNow - highScore.Created; if (diff.TotalDays > opt.KeepHighscores) { del.Add(hs); continue; } ret.Add(highScore); if (ret.Count >= 10) { break; } } if (del.Any()) { dbContext.DbTetrisHighScore.RemoveRange(del); dbContext.SaveChanges(); } return(ret); }
private static void MigrateDbContexts(ILogger logger, DbMynaContext srcContext, DbMynaContext destContext) { if (destContext.DbUsers.Any()) { logger.LogWarning("Destination database already contains users. Migration aborted."); return; } logger.LogInformation("Migrate Users..."); var users = srcContext.DbUsers.Include(u => u.Roles).Include(u => u.PasswordFile).OrderBy(u => u.Id); foreach (var user in users) { var pgUser = new DbUser { Name = user.Name, PasswordHash = user.PasswordHash, Salt = user.Salt, Email = user.Email, Requires2FA = user.Requires2FA, LoginTries = user.LoginTries, LastLoginTryUtc = user.LastLoginTryUtc, RegisteredUtc = user.RegisteredUtc, LogoutUtc = user.LogoutUtc, TOTPKey = user.TOTPKey, PasswordFileId = null, PasswordFile = null, Roles = null, UseLongLivedToken = user.UseLongLivedToken, AllowResetPassword = user.AllowResetPassword, Photo = user.Photo, StorageQuota = user.StorageQuota }; if (user.Roles != null) { pgUser.Roles = new List <DbRole>(); foreach (var role in user.Roles) { pgUser.Roles.Add(new DbRole { Name = role.Name }); } } if (user.PasswordFile != null) { pgUser.PasswordFile = new DbPasswordFile { Content = user.PasswordFile.Content, LastWrittenUtc = user.PasswordFile.LastWrittenUtc }; } destContext.DbUsers.Add(pgUser); } destContext.SaveChanges(); logger.LogInformation("Migrate Chats..."); var chats = srcContext.DbChats.Include(c => c.DbUser).OrderBy(c => c.Id); foreach (var chat in chats) { var pgUser = destContext.DbUsers.Single(u => u.Name == chat.DbUser.Name); destContext.DbChats.Add(new DbChat { DbUser = pgUser, Message = chat.Message, CreatedUtc = chat.CreatedUtc }); } destContext.SaveChanges(); logger.LogInformation("Migrate Diaries..."); var diaries = srcContext.DbDiaries.Include(d => d.DbUser).OrderBy(d => d.Id); foreach (var diary in diaries) { var pgUser = destContext.DbUsers.Single(u => u.Name == diary.DbUser.Name); destContext.DbDiaries.Add(new DbDiary { DbUser = pgUser, Entry = diary.Entry, Date = diary.Date }); } destContext.SaveChanges(); logger.LogInformation("Migrate Notes..."); var notes = srcContext.DbNotes.Include(n => n.DbUser).OrderBy(n => n.Id); foreach (var note in notes) { var pgUser = destContext.DbUsers.Single(u => u.Name == note.DbUser.Name); destContext.DbNotes.Add(new DbNote { DbUser = pgUser, Content = note.Content, Title = note.Title, ModifiedUtc = note.ModifiedUtc }); } destContext.SaveChanges(); logger.LogInformation("Migrate LoginIpAddresses..."); var loginIpAddresses = srcContext.DbLoginIpAddresses.Include(ip => ip.DbUser).OrderBy(ip => ip.Id); foreach (var loginIpAddress in loginIpAddresses) { var pgUser = destContext.DbUsers.Single(u => u.Name == loginIpAddress.DbUser.Name); destContext.DbLoginIpAddresses.Add(new DbLoginIpAddress { DbUser = pgUser, IpAddress = loginIpAddress.IpAddress, LastUsedUtc = loginIpAddress.LastUsedUtc, Succeeded = loginIpAddress.Succeeded, Failed = loginIpAddress.Failed }); } destContext.SaveChanges(); logger.LogInformation("Migrate Registrations..."); var registrations = srcContext.DbRegistrations.Include(r => r.ConfirmedBy).OrderBy(r => r.Id); foreach (var registration in registrations) { DbUser pgUser = null; if (registration.ConfirmedBy != null) { pgUser = destContext.DbUsers.Single(u => u.Name == registration.ConfirmedBy.Name); } destContext.DbRegistrations.Add(new DbRegistration { ConfirmedBy = pgUser, ConfirmedUtc = registration.ConfirmedUtc, Email = registration.Email, IpAddress = registration.IpAddress, RequestedUtc = registration.RequestedUtc, Token = registration.Token }); } destContext.SaveChanges(); logger.LogInformation("Migrate ResetPasswords..."); var resetPasswords = srcContext.DbResetPasswords.OrderBy(r => r.Id); foreach (var resetPassword in resetPasswords) { destContext.DbResetPasswords.Add(new DbResetPassword { Email = resetPassword.Email, IpAddress = resetPassword.IpAddress, RequestedUtc = resetPassword.RequestedUtc, Token = resetPassword.Token }); } destContext.SaveChanges(); logger.LogInformation("Migrate Settings..."); var settings = srcContext.DbSettings.OrderBy(s => s.Id); foreach (var setting in settings) { destContext.DbSettings.Add(new DbSetting { Key = setting.Key, Value = setting.Value }); } destContext.SaveChanges(); logger.LogInformation("Migrate SkatResults..."); var idmap = new Dictionary <long, long>(); var skatResults = srcContext.DbSkatResults.OrderBy(r => r.Id); foreach (var skatResult in skatResults) { var pgSkatResult = new DbSkatResult { StartedUtc = skatResult.StartedUtc, EndedUtc = skatResult.EndedUtc, Player1 = skatResult.Player1, Player2 = skatResult.Player2, Player3 = skatResult.Player3, Player4 = skatResult.Player4 }; destContext.DbSkatResults.Add(pgSkatResult); destContext.SaveChanges(); idmap[skatResult.Id] = pgSkatResult.Id; } logger.LogInformation("Migrate SkatGameHistories..."); var skatGameHistories = srcContext.DbSkatGameHistories.OrderBy(h => h.Id); foreach (var skatGameHistory in skatGameHistories) { var pgSkatGameHistoy = new DbSkatGameHistory { DbSkatResultId = idmap[skatGameHistory.DbSkatResultId], History = skatGameHistory.History }; destContext.DbSkatGameHistories.Add(pgSkatGameHistoy); destContext.SaveChanges(); } logger.LogInformation("Migrate TetrisHighScores..."); var tetrisHighScores = srcContext.DbTetrisHighScore.OrderBy(h => h.Id); foreach (var tetrisHighScore in tetrisHighScores) { destContext.DbTetrisHighScore.Add(new DbTetrisHighScore { Created = tetrisHighScore.Created, Level = tetrisHighScore.Level, Lines = tetrisHighScore.Lines, Name = tetrisHighScore.Name, Score = tetrisHighScore.Score }); } destContext.SaveChanges(); logger.LogInformation("Migrate UserSkatResults..."); var skatUsers = destContext.DbUsers.ToList(); foreach (var skatUser in skatUsers) { MigrateSkatUserResults(destContext, skatUser.Name, skatUser.Id); } logger.LogInformation("Migrate SkatReservations..."); var reservations = srcContext.DbSkatReservations.Include(r => r.ReservedBy).OrderBy(r => r.Id); foreach (var reservation in reservations) { DbUser pgUser = null; if (reservation.ReservedBy != null) { pgUser = destContext.DbUsers.Single(u => u.Name == reservation.ReservedBy.Name); } destContext.DbSkatReservations.Add(new DbSkatReservation { Duration = reservation.Duration, Player1 = reservation.Player1, Player2 = reservation.Player2, Player3 = reservation.Player3, Player4 = reservation.Player4, ReservedBy = pgUser, ReservedUtc = reservation.ReservedUtc, EndUtc = reservation.EndUtc }); } destContext.SaveChanges(); logger.LogInformation("Migrate DocItems..."); var pgAllUsers = destContext.DbUsers.ToList(); foreach (var pgUser in pgAllUsers) { var sqliteUser = srcContext.DbUsers.SingleOrDefault(u => u.Name == pgUser.Name); if (sqliteUser == null) { continue; } var docItems = new Queue <DbDocItem>(); var volume = DocumentService.GetVolume(srcContext, sqliteUser); if (volume != null) { docItems.Enqueue(volume); } var idMap = new Dictionary <long, long>(); var ids = new List <long>(); while (docItems.Any()) { var docItem = docItems.Dequeue(); ids.Add(docItem.Id); foreach (var child in DocumentService.GetChildren(srcContext, sqliteUser, docItem)) { docItems.Enqueue(child); } } foreach (var id in ids) { var docItem = srcContext.DbDocItems .Include(item => item.Content) .Single(item => item.Id == id && item.OwnerId == sqliteUser.Id); long?parentId = null; if (docItem.ParentId.HasValue) { parentId = idMap[docItem.ParentId.Value]; } var pgDocItem = new DbDocItem { Name = docItem.Name, Type = docItem.Type, OwnerId = pgUser.Id, Size = docItem.Size, Children = docItem.Children, ParentId = parentId }; if (docItem.Content != null) { pgDocItem.Content = new DbDocContent { Data = docItem.Content.Data }; } destContext.DbDocItems.Add(pgDocItem); destContext.SaveChanges(); idMap[docItem.Id] = pgDocItem.Id; } } logger.LogInformation("Migration succeeded."); }
public static List <DbDocItem> GetChildren(DbMynaContext dbContext, DbUser user, DbDocItem item) { return(dbContext.DbDocItems.Where(child => child.OwnerId == user.Id && child.ParentId == item.Id).ToList <DbDocItem>()); }
public static DbDocItem GetVolume(DbMynaContext dbContext, DbUser user) { return(GetItemById(dbContext, user, null)); }