diff --git a/DotBased.AspNet.Authority.EFCore/Repositories/UserRepository.cs b/DotBased.AspNet.Authority.EFCore/Repositories/UserRepository.cs index 6a1dcf2..599f5d0 100644 --- a/DotBased.AspNet.Authority.EFCore/Repositories/UserRepository.cs +++ b/DotBased.AspNet.Authority.EFCore/Repositories/UserRepository.cs @@ -78,7 +78,7 @@ public class UserRepository(IDbContextFactory contextFactory) try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); - var usr = context.Users.FirstOrDefault(u => u.Id == user.Id); + var usr = await context.Users.FirstOrDefaultAsync(u => u.Id == user.Id, cancellationToken: cancellationToken); if (usr == null) { return Result.Failed("User not found!"); @@ -104,7 +104,7 @@ public class UserRepository(IDbContextFactory contextFactory) try { await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); - var usr = context.Users.FirstOrDefault(u => u.Id == user.Id); + var usr = await context.Users.FirstOrDefaultAsync(u => u.Id == user.Id, cancellationToken: cancellationToken); if (usr == null) { return Result.Failed("User not found!"); @@ -119,28 +119,99 @@ public class UserRepository(IDbContextFactory contextFactory) } } - public Task> GetUserByEmailAsync(string email, CancellationToken cancellationToken = default) + public async Task> GetUserByEmailAsync(string email, CancellationToken cancellationToken = default) { - throw new NotImplementedException(); + try + { + await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); + var usr = await context.Users.FirstOrDefaultAsync(u => u.EmailAddress == email, cancellationToken: cancellationToken); + return Result.HandleResult(usr, "User not found by given email address."); + } + catch (Exception e) + { + return Result.Failed("An error occured while getting the user.", e); + } } - public Task SetVersionAsync(AuthorityUser user, long version, CancellationToken cancellationToken = default) + public async Task SetVersionAsync(AuthorityUser user, long version, CancellationToken cancellationToken = default) { - throw new NotImplementedException(); + try + { + await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); + var usr = await context.Users.FirstOrDefaultAsync(u => u.Id == user.Id, cancellationToken); + if (usr == null) + { + return Result.Failed("Failed to find user with given id!"); + } + + if (usr.Version != user.Version) + { + return Result.Failed("Stored user version doesn't match current user version!"); + } + + usr.Version = version; + context.Users.Update(usr); + var saveResult = await context.SaveChangesAsync(cancellationToken); + return saveResult <= 0 ? Result.Failed("Failed to update user!") : Result.Ok(); + } + catch (Exception e) + { + return Result.Failed("An error occured while updating the version.", e); + } } - public Task> GetVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default) + public async Task> GetVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default) { - throw new NotImplementedException(); + try + { + await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); + var usrVersion = await context.Users.Where(u => u.Id == user.Id).Select(u => u.Version).FirstOrDefaultAsync(cancellationToken); + return Result.HandleResult(usrVersion, "Failed to get user version!"); + } + catch (Exception e) + { + return Result.Failed("An error occured while getting the user version.", e); + } } - public Task SetSecurityVersionAsync(AuthorityUser user, long version, CancellationToken cancellationToken = default) + public async Task SetSecurityVersionAsync(AuthorityUser user, long securityVersion, CancellationToken cancellationToken = default) { - throw new NotImplementedException(); + try + { + await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); + var usr = await context.Users.FirstOrDefaultAsync(u => u.Id == user.Id, cancellationToken); + if (usr == null) + { + return Result.Failed("Failed to find user with given id!"); + } + + if (usr.SecurityVersion != user.SecurityVersion) + { + return Result.Failed("Stored user version doesn't match current user version!"); + } + + usr.SecurityVersion = securityVersion; + context.Users.Update(usr); + var saveResult = await context.SaveChangesAsync(cancellationToken); + return saveResult <= 0 ? Result.Failed("Failed to update user!") : Result.Ok(); + } + catch (Exception e) + { + return Result.Failed("An error occured while updating the security version.", e); + } } - public Task> GetSecurityVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default) + public async Task> GetSecurityVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default) { - throw new NotImplementedException(); + try + { + await using var context = await contextFactory.CreateDbContextAsync(cancellationToken); + var usrVersion = await context.Users.Where(u => u.Id == user.Id).Select(u => u.SecurityVersion).FirstOrDefaultAsync(cancellationToken); + return Result.HandleResult(usrVersion, "Failed to get user security version!"); + } + catch (Exception e) + { + return Result.Failed("An error occured while getting the user security version.", e); + } } } \ No newline at end of file diff --git a/DotBased.AspNet.Authority/Repositories/IUserRepository.cs b/DotBased.AspNet.Authority/Repositories/IUserRepository.cs index 01c4165..0107a76 100755 --- a/DotBased.AspNet.Authority/Repositories/IUserRepository.cs +++ b/DotBased.AspNet.Authority/Repositories/IUserRepository.cs @@ -12,6 +12,6 @@ public interface IUserRepository public Task> GetUserByEmailAsync(string email, CancellationToken cancellationToken = default); public Task SetVersionAsync(AuthorityUser user, long version, CancellationToken cancellationToken = default); public Task> GetVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default); - public Task SetSecurityVersionAsync(AuthorityUser user, long version, CancellationToken cancellationToken = default); + public Task SetSecurityVersionAsync(AuthorityUser user, long securityVersion, CancellationToken cancellationToken = default); public Task> GetSecurityVersionAsync(AuthorityUser user, CancellationToken cancellationToken = default); } \ No newline at end of file