Fix db seeding, migration, repository services
This commit is contained in:
		
							parent
							
								
									872dc1e263
								
							
						
					
					
						commit
						6b87902ca7
					
				
					 22 changed files with 606 additions and 64 deletions
				
			
		| 
						 | 
				
			
			@ -32,7 +32,6 @@ public class RoleRepository(CSR.Infrastructure.Persistence.CSRDbContext context)
 | 
			
		|||
  {
 | 
			
		||||
    var roleEntity = new CSR.Infrastructure.Persistence.Role
 | 
			
		||||
    {
 | 
			
		||||
      Id = role.Id,
 | 
			
		||||
      Name = role.Name
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue