Fix db seeding, migration, repository services

This commit is contained in:
danial23 2025-05-19 22:22:33 -04:00
parent 872dc1e263
commit 6b87902ca7
Signed by: danial23
SSH key fingerprint: SHA256:IJ8VP0j2WMUVweTYnzUUnEjNgPnGx+mAt+RhqWZ01bU
22 changed files with 606 additions and 64 deletions

View file

@ -1,12 +1,12 @@
namespace Csr.Infrastructure.Persistence.Repositories;
namespace CSR.Infrastructure.Persistence.Repositories;
using CSR.Domain.Entities;
using CSR.Application.Interfaces;
using Microsoft.EntityFrameworkCore;
public class UserRepository(CSR.Infrastructure.Persistence.CSRDbContext context) : IUserRepository
public class UserRepository(CSRDbContext context) : IUserRepository
{
private readonly CSR.Infrastructure.Persistence.CSRDbContext _context = context;
private readonly CSRDbContext _context = context;
public async Task<User?> GetByIdAsync(int id)
{
@ -35,23 +35,97 @@ public class UserRepository(CSR.Infrastructure.Persistence.CSRDbContext context)
}
public async Task AddAsync(User user)
public async Task<User?> GetByUsernameAsync(string username)
{
var userEntity = new CSR.Infrastructure.Persistence.User
var userEntity = await _context.Users
.Include(u => u.Role)
.SingleOrDefaultAsync(u => u.Username == username);
if (userEntity == null)
{
return null; // No entity found, return null domain model
}
var user = User.LoadExisting(
userEntity.Id,
userEntity.Username,
userEntity.Email,
userEntity.PasswordHash,
userEntity.RoleId,
Role.LoadExisting(
userEntity.Role.Id,
userEntity.Role.Name
)
);
return user;
}
public async Task<IEnumerable<User>?> GetAllByRoleIdAsync(int roleId)
{
var roleEntity = await _context.Roles
.Include(r => r.Users)
.FirstOrDefaultAsync(r => r.Id == roleId);
if (roleEntity == null)
{
return null; // No entity found, return null
}
var users = roleEntity.Users
.Select(userEntity => User.LoadExisting(
userEntity.Id,
userEntity.Username,
userEntity.Email,
userEntity.PasswordHash,
userEntity.RoleId,
Role.LoadExisting(
userEntity.Role.Id,
userEntity.Role.Name
)
));
return users;
}
public async Task<User?> AddAsync(User user)
{
var roleEntity = await _context.Roles
.SingleOrDefaultAsync(r => r.Id == user.RoleId)
?? throw new InvalidOperationException($"Role with ID {user.RoleId} does not exist.");
var userEntity = new Persistence.User
{
Username = user.Username,
Email = user.Email,
PasswordHash = user.PasswordHash,
RoleId = user.RoleId,
Role = new CSR.Infrastructure.Persistence.Role
{
Id = user.Role.Id,
Name = user.Role.Name
}
Role = roleEntity
};
_context.Users.Add(userEntity);
try
{
_context.Users.Add(userEntity);
}
catch (DbUpdateException)
{
return null;
}
await _context.SaveChangesAsync();
return User.LoadExisting(
userEntity.Id,
userEntity.Username,
userEntity.Email,
userEntity.PasswordHash,
userEntity.RoleId,
Role.LoadExisting(
userEntity.Role.Id,
userEntity.Role.Name
)
);
}
@ -73,7 +147,7 @@ public class UserRepository(CSR.Infrastructure.Persistence.CSRDbContext context)
userEntity.Email = user.Email;
userEntity.PasswordHash = user.PasswordHash;
userEntity.RoleId = user.RoleId;
userEntity.Role = new CSR.Infrastructure.Persistence.Role { Id = user.Role.Id, Name = user.Role.Name };
userEntity.Role = new Persistence.Role { Id = user.Role.Id, Name = user.Role.Name };
// Prevent EF from trying to update the Role entity
_context.Entry(userEntity.Role).State = EntityState.Unchanged;
@ -85,18 +159,13 @@ public class UserRepository(CSR.Infrastructure.Persistence.CSRDbContext context)
public async Task DeleteAsync(int id)
{
var userEntity = new CSR.Infrastructure.Persistence.User
var userEntity = new Persistence.User
{
Id = id,
Username = string.Empty,
Email = string.Empty,
PasswordHash = string.Empty,
RoleId = 0,
Role = new CSR.Infrastructure.Persistence.Role
{
Id = 0,
Name = string.Empty
}
RoleId = 0
};
_context.Users.Remove(userEntity);