diff --git a/dotnet/AipsCore/Application/Models/Shape/Command/CreateRectangle/CreateRectangleCommandHandler.cs b/dotnet/AipsCore/Application/Models/Shape/Command/CreateRectangle/CreateRectangleCommandHandler.cs index 50a7d7c..c03b948 100644 --- a/dotnet/AipsCore/Application/Models/Shape/Command/CreateRectangle/CreateRectangleCommandHandler.cs +++ b/dotnet/AipsCore/Application/Models/Shape/Command/CreateRectangle/CreateRectangleCommandHandler.cs @@ -28,7 +28,7 @@ public class CreateRectangleCommandHandler : ICommandHandler where TId : DomainId +{ + private readonly List _domainEvents = []; + + public TId Id { get; init; } + + protected DomainModel() + { + + } + + protected DomainModel(TId id) + { + Id = id; + } + + public IReadOnlyList GetDomainEvents() => _domainEvents.ToList(); + + public void ClearDomainEvents() => _domainEvents.Clear(); + + protected void RaiseDomainEvent(IDomainEvent domainEvent) => _domainEvents.Add(domainEvent); +} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Abstract/IAbstractRepository.cs b/dotnet/AipsCore/Domain/Abstract/IAbstractRepository.cs new file mode 100644 index 0000000..ced48c2 --- /dev/null +++ b/dotnet/AipsCore/Domain/Abstract/IAbstractRepository.cs @@ -0,0 +1,12 @@ +using AipsCore.Domain.Common.ValueObjects; + +namespace AipsCore.Domain.Abstract; + +public interface IAbstractRepository + where TModel : DomainModel + where TId : DomainId +{ + Task GetByIdAsync(TId id, CancellationToken cancellationToken = default); + Task SaveAsync(TModel model, CancellationToken cancellationToken = default); + Task AddAsync(TModel model, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Abstract/IDomainEvent.cs b/dotnet/AipsCore/Domain/Abstract/IDomainEvent.cs new file mode 100644 index 0000000..75209ae --- /dev/null +++ b/dotnet/AipsCore/Domain/Abstract/IDomainEvent.cs @@ -0,0 +1,6 @@ +namespace AipsCore.Domain.Abstract; + +public interface IDomainEvent +{ + +} \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/Shape/External/IShapeRepository.cs b/dotnet/AipsCore/Domain/Models/Shape/External/IShapeRepository.cs index f9c0d40..d8ede47 100644 --- a/dotnet/AipsCore/Domain/Models/Shape/External/IShapeRepository.cs +++ b/dotnet/AipsCore/Domain/Models/Shape/External/IShapeRepository.cs @@ -1,9 +1,9 @@ +using AipsCore.Domain.Abstract; using AipsCore.Domain.Models.Shape.ValueObjects; namespace AipsCore.Domain.Models.Shape.External; -public interface IShapeRepository +public interface IShapeRepository : IAbstractRepository { - Task Get(ShapeId id, CancellationToken cancellationToken = default); - Task Add(Shape shape, CancellationToken cancellationToken = default); + } \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/Shape/Shape.cs b/dotnet/AipsCore/Domain/Models/Shape/Shape.cs index 1fb85b9..e9050ac 100644 --- a/dotnet/AipsCore/Domain/Models/Shape/Shape.cs +++ b/dotnet/AipsCore/Domain/Models/Shape/Shape.cs @@ -1,3 +1,4 @@ +using AipsCore.Domain.Abstract; using AipsCore.Domain.Common.ValueObjects; using AipsCore.Domain.Models.Shape.Enums; using AipsCore.Domain.Models.Shape.ValueObjects; @@ -6,10 +7,8 @@ using AipsCore.Domain.Models.Whiteboard.ValueObjects; namespace AipsCore.Domain.Models.Shape; -public abstract class Shape +public abstract class Shape : DomainModel { - public ShapeId Id { get; init; } - public WhiteboardId WhiteboardId { get; private set; } public UserId AuthorId { get; private set; } @@ -21,8 +20,8 @@ public abstract class Shape public Color Color { get; private set; } protected Shape(ShapeId id, WhiteboardId whiteboardId, UserId authorId, Position position, Color color) + : base(id) { - Id = id; Position = position; Color = color; AuthorId = authorId; @@ -35,10 +34,10 @@ public abstract class Shape int positionX, int positionY, string color, UserId authorId) { - AuthorId = authorId; Id = new ShapeId(id); Position = new Position(positionX, positionY); Color = new Color(color); + AuthorId = authorId; WhiteboardId = new WhiteboardId(whiteboardId); } } \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/User/External/IUserRepository.cs b/dotnet/AipsCore/Domain/Models/User/External/IUserRepository.cs index c776a74..7a9f154 100644 --- a/dotnet/AipsCore/Domain/Models/User/External/IUserRepository.cs +++ b/dotnet/AipsCore/Domain/Models/User/External/IUserRepository.cs @@ -1,9 +1,9 @@ +using AipsCore.Domain.Abstract; using AipsCore.Domain.Models.User.ValueObjects; namespace AipsCore.Domain.Models.User.External; -public interface IUserRepository +public interface IUserRepository : IAbstractRepository { - Task Get(UserId userId, CancellationToken cancellationToken = default); - Task Save(User user, CancellationToken cancellationToken = default); + } \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/User/User.cs b/dotnet/AipsCore/Domain/Models/User/User.cs index aa7aac9..5b113cd 100644 --- a/dotnet/AipsCore/Domain/Models/User/User.cs +++ b/dotnet/AipsCore/Domain/Models/User/User.cs @@ -1,19 +1,19 @@ -using AipsCore.Domain.Common.ValueObjects; +using AipsCore.Domain.Abstract; +using AipsCore.Domain.Common.ValueObjects; using AipsCore.Domain.Models.User.ValueObjects; namespace AipsCore.Domain.Models.User; -public class User +public class User : DomainModel { - public UserId Id { get; private set; } public Email Email { get; private set; } public Username Username { get; private set; } public UserCreatedAt CreatedAt { get; private set; } public UserDeletedAt DeletedAt { get; private set; } public User(UserId id, Email email, Username username, UserCreatedAt createdAt, UserDeletedAt deletedAt) + : base(id) { - Id = id; Email = email; Username = username; CreatedAt = createdAt; diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/External/IWhiteboardRepository.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/External/IWhiteboardRepository.cs index 9de5e1f..0fcfe36 100644 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/External/IWhiteboardRepository.cs +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/External/IWhiteboardRepository.cs @@ -1,11 +1,9 @@ +using AipsCore.Domain.Abstract; using AipsCore.Domain.Models.Whiteboard.ValueObjects; namespace AipsCore.Domain.Models.Whiteboard.External; -public interface IWhiteboardRepository +public interface IWhiteboardRepository : IAbstractRepository { - Task Get(WhiteboardId whiteboardId, CancellationToken cancellationToken = default); - Task Save(Whiteboard whiteboard, CancellationToken cancellationToken = default); Task WhiteboardCodeExists(WhiteboardCode whiteboardCode); - } \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.cs index 3613686..b774510 100644 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.cs +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.cs @@ -1,12 +1,12 @@ -using AipsCore.Domain.Models.User.ValueObjects; +using AipsCore.Domain.Abstract; +using AipsCore.Domain.Models.User.ValueObjects; using AipsCore.Domain.Models.Whiteboard.Enums; using AipsCore.Domain.Models.Whiteboard.ValueObjects; namespace AipsCore.Domain.Models.Whiteboard; -public class Whiteboard +public class Whiteboard : DomainModel { - public WhiteboardId Id { get; private set; } public UserId WhiteboardOwnerId { get; private set; } public WhiteboardCode Code { get; private set; } public WhiteboardTitle Title { get; private set; } @@ -26,8 +26,8 @@ public class Whiteboard WhiteboardMaxParticipants maxParticipants, WhiteboardJoinPolicy joinPolicy, WhiteboardState state) + : base(id) { - Id = id; WhiteboardOwnerId = whiteboardOwner.Id; Code = code; Title = title; @@ -48,8 +48,8 @@ public class Whiteboard WhiteboardMaxParticipants maxParticipants, WhiteboardJoinPolicy joinPolicy, WhiteboardState state) + : base(id) { - Id = id; WhiteboardOwnerId = whiteboardOwnerId; Code = code; Title = title; diff --git a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/External/IWhiteboardMembershipRepository.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/External/IWhiteboardMembershipRepository.cs index 2d70762..f4641f3 100644 --- a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/External/IWhiteboardMembershipRepository.cs +++ b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/External/IWhiteboardMembershipRepository.cs @@ -1,9 +1,9 @@ +using AipsCore.Domain.Abstract; using AipsCore.Domain.Models.WhiteboardMembership.ValueObjects; namespace AipsCore.Domain.Models.WhiteboardMembership.External; -public interface IWhiteboardMembershipRepository +public interface IWhiteboardMembershipRepository : IAbstractRepository { - Task Get(WhiteboardMembershipId whiteboardMembershipId, CancellationToken cancellationToken = default); - Task Save(WhiteboardMembership whiteboardMembership, CancellationToken cancellationToken = default); + } \ No newline at end of file diff --git a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs index 6cd006f..9cc612b 100644 --- a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs +++ b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs @@ -1,12 +1,12 @@ +using AipsCore.Domain.Abstract; using AipsCore.Domain.Models.User.ValueObjects; using AipsCore.Domain.Models.Whiteboard.ValueObjects; using AipsCore.Domain.Models.WhiteboardMembership.ValueObjects; namespace AipsCore.Domain.Models.WhiteboardMembership; -public class WhiteboardMembership +public class WhiteboardMembership : DomainModel { - public WhiteboardMembershipId Id { get; private set; } public WhiteboardId WhiteboardId { get; private set; } public UserId UserId { get; private set; } public WhiteboardMembershipIsBanned IsBanned { get; private set; } @@ -22,8 +22,8 @@ public class WhiteboardMembership WhiteboardMembershipEditingEnabled editingEnabled, WhiteboardMembershipCanJoin canJoin, WhiteboardMembershipLastInteractedAt lastInteractedAt) + : base(id) { - Id = id; WhiteboardId = owner.Id; UserId = user.Id; IsBanned = isBanned; @@ -40,8 +40,8 @@ public class WhiteboardMembership WhiteboardMembershipEditingEnabled editingEnabled, WhiteboardMembershipCanJoin canJoin, WhiteboardMembershipLastInteractedAt lastInteractedAt) + : base(id) { - Id = id; WhiteboardId = ownerId; UserId = userId; IsBanned = isBanned; diff --git a/dotnet/AipsCore/Infrastructure/Persistence/Abstract/AbstractRepository.cs b/dotnet/AipsCore/Infrastructure/Persistence/Abstract/AbstractRepository.cs new file mode 100644 index 0000000..8d1195e --- /dev/null +++ b/dotnet/AipsCore/Infrastructure/Persistence/Abstract/AbstractRepository.cs @@ -0,0 +1,55 @@ +using AipsCore.Domain.Abstract; +using AipsCore.Domain.Common.ValueObjects; +using AipsCore.Infrastructure.Persistence.Db; +using Microsoft.EntityFrameworkCore; + +namespace AipsCore.Infrastructure.Persistence.Abstract; + +public abstract class AbstractRepository : IAbstractRepository + where TModel : DomainModel + where TId : DomainId + where TEntity : class +{ + protected readonly AipsDbContext Context; + protected readonly DbSet DbSet; + + protected AbstractRepository(AipsDbContext context) + { + Context = context; + DbSet = Context.Set(); + } + + public async Task GetByIdAsync(TId id, CancellationToken cancellationToken = default) + { + var entity = await DbSet.FindAsync([new Guid(id.IdValue)], cancellationToken); + + return entity != null ? MapToModel(entity) : null; + } + + public async Task SaveAsync(TModel model, CancellationToken cancellationToken = default) + { + var entity = await DbSet.FindAsync([new Guid(model.Id.IdValue)], cancellationToken); + + if (entity == null) + { + entity = MapToEntity(model); + await DbSet.AddAsync(entity, cancellationToken); + } + else + { + UpdateEntity(entity, model); + DbSet.Update(entity); + } + } + + public async Task AddAsync(TModel model, CancellationToken cancellationToken = default) + { + var entity = MapToEntity(model); + + await DbSet.AddAsync(entity, cancellationToken); + } + + protected abstract TModel MapToModel(TEntity entity); + protected abstract TEntity MapToEntity(TModel model); + protected abstract void UpdateEntity(TEntity entity, TModel model); +} \ No newline at end of file diff --git a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.FromEntity.cs b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.FromEntity.cs index ace1f77..9089d01 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.FromEntity.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.FromEntity.cs @@ -8,7 +8,7 @@ namespace AipsCore.Infrastructure.Persistence.Shape.Mappers; public static partial class ShapeMappers { - public static Domain.Models.Shape.Shape EntityToModel(Shape shape) + public static Domain.Models.Shape.Shape MapToEntity(Shape shape) { return shape.Type switch { @@ -30,7 +30,7 @@ public static partial class ShapeMappers shape.EndPositionX!.Value, shape.EndPositionY!.Value, shape.Thickness!.Value); } - + public static Line EntityToLine(Shape shape) { return Line.Create( @@ -42,7 +42,7 @@ public static partial class ShapeMappers shape.EndPositionX!.Value, shape.EndPositionY!.Value, shape.Thickness!.Value); } - + public static Arrow EntityToArrow(Shape shape) { return Arrow.Create( @@ -54,7 +54,7 @@ public static partial class ShapeMappers shape.EndPositionX!.Value, shape.EndPositionY!.Value, shape.Thickness!.Value); } - + public static TextShape EntityToTextShape(Shape shape) { return TextShape.Create( diff --git a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.ToEntity.cs b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.ToEntity.cs index 89edea7..6275364 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.ToEntity.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.ToEntity.cs @@ -9,7 +9,7 @@ namespace AipsCore.Infrastructure.Persistence.Shape.Mappers; public static partial class ShapeMappers { - public static Shape ModelToEntity(Domain.Models.Shape.Shape model) + public static Shape MapToEntity(Domain.Models.Shape.Shape model) { return model.ShapeType switch { @@ -23,7 +23,7 @@ public static partial class ShapeMappers public static Shape RectangleToEntity(Rectangle rectangle) { - return new Shape() + return new Shape { Id = new Guid(rectangle.Id.Value), Type = rectangle.ShapeType, @@ -37,10 +37,10 @@ public static partial class ShapeMappers Thickness = rectangle.BorderThickness.Value, }; } - + public static Shape LineToEntity(Line line) { - return new Shape() + return new Shape { Id = new Guid(line.Id.Value), Type = line.ShapeType, @@ -54,10 +54,10 @@ public static partial class ShapeMappers Thickness = line.Thickness.Value, }; } - + public static Shape ArrowToEntity(Arrow arrow) { - return new Shape() + return new Shape { Id = new Guid(arrow.Id.Value), Type = arrow.ShapeType, @@ -71,10 +71,10 @@ public static partial class ShapeMappers Thickness = arrow.Thickness.Value, }; } - + public static Shape TextShapeToEntity(TextShape textShape) { - return new Shape() + return new Shape { Id = new Guid(textShape.Id.Value), Type = textShape.ShapeType, diff --git a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.UpdateEntity.cs b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.UpdateEntity.cs index 12083e9..e1e04a1 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.UpdateEntity.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.UpdateEntity.cs @@ -38,7 +38,7 @@ public static partial class ShapeMappers entity.EndPositionY = rectangle.EndPosition.Y; entity.Thickness = rectangle.BorderThickness.Value; } - + public static void UpdateEntityFromLine(Shape entity, Line line) { entity.EndPositionX = line.EndPosition.X; @@ -52,7 +52,7 @@ public static partial class ShapeMappers entity.EndPositionY = arrow.EndPosition.Y; entity.Thickness = arrow.Thickness.Value; } - + public static void UpdateEntityFromTextShape(Shape entity, TextShape textShape) { entity.TextValue = textShape.TextShapeValue.Text; diff --git a/dotnet/AipsCore/Infrastructure/Persistence/Shape/ShapeRepository.cs b/dotnet/AipsCore/Infrastructure/Persistence/Shape/ShapeRepository.cs index 62cb106..5307714 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/Shape/ShapeRepository.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/Shape/ShapeRepository.cs @@ -1,42 +1,31 @@ using AipsCore.Domain.Models.Shape.External; using AipsCore.Domain.Models.Shape.ValueObjects; +using AipsCore.Infrastructure.Persistence.Abstract; using AipsCore.Infrastructure.Persistence.Db; using AipsCore.Infrastructure.Persistence.Shape.Mappers; namespace AipsCore.Infrastructure.Persistence.Shape; -public class ShapeRepository : IShapeRepository +public class ShapeRepository : AbstractRepository, IShapeRepository { - private readonly AipsDbContext _context; - - public ShapeRepository(AipsDbContext context) + public ShapeRepository(AipsDbContext context) + : base(context) { - _context = context; - } - - public async Task Get(ShapeId id, CancellationToken cancellationToken = default) - { - var entity = await _context.Shapes.FindAsync([new Guid(id.Value)], cancellationToken); - if (entity is null) return null; - - return ShapeMappers.EntityToModel(entity); } - public async Task Add(Domain.Models.Shape.Shape shape, CancellationToken cancellationToken = default) + protected override Domain.Models.Shape.Shape MapToModel(Shape entity) { - var entity = await _context.Shapes.FindAsync([new Guid(shape.Id.Value)], cancellationToken); + return ShapeMappers.MapToEntity(entity); + } - if (entity is not null) - { - ShapeMappers.UpdateEntity(entity, shape); - } - else - { - var newEntity = ShapeMappers.ModelToEntity(shape); - - await _context.Shapes.AddAsync(newEntity, cancellationToken); - } + protected override Shape MapToEntity(Domain.Models.Shape.Shape model) + { + return ShapeMappers.MapToEntity(model); + } + protected override void UpdateEntity(Shape entity, Domain.Models.Shape.Shape model) + { + ShapeMappers.UpdateEntity(entity, model); } } \ No newline at end of file diff --git a/dotnet/AipsCore/Infrastructure/Persistence/User/UserRepository.cs b/dotnet/AipsCore/Infrastructure/Persistence/User/UserRepository.cs index 9db91e3..2e4a126 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/User/UserRepository.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/User/UserRepository.cs @@ -1,58 +1,45 @@ using AipsCore.Domain.Models.User.External; using AipsCore.Domain.Models.User.ValueObjects; +using AipsCore.Infrastructure.Persistence.Abstract; using AipsCore.Infrastructure.Persistence.Db; namespace AipsCore.Infrastructure.Persistence.User; -public class UserRepository : IUserRepository +public class UserRepository : AbstractRepository, IUserRepository { - private readonly AipsDbContext _context; - - public UserRepository(AipsDbContext context) + public UserRepository(AipsDbContext context) + : base(context) { - _context = context; } - - public async Task Get(UserId userId, CancellationToken cancellationToken = default) - { - var userEntity = await _context.Users.FindAsync([new Guid(userId.IdValue), cancellationToken], cancellationToken: cancellationToken); - if (userEntity is null) return null; - + protected override Domain.Models.User.User MapToModel(User entity) + { return Domain.Models.User.User.Create( - userEntity.Id.ToString(), - userEntity.Email, - userEntity.Username, - userEntity.CreatedAt, - userEntity.DeletedAt); + entity.Id.ToString(), + entity.Email, + entity.Username, + entity.CreatedAt, + entity.DeletedAt + ); } - public async Task Save(Domain.Models.User.User user, CancellationToken cancellationToken = default) + protected override User MapToEntity(Domain.Models.User.User model) { - // ReSharper disable once MethodSupportsCancellation - var userEntity = await _context.Users.FindAsync(new Guid(user.Id.IdValue)); + return new User + { + Id = new Guid(model.Id.IdValue), + Email = model.Email.EmailValue, + Username = model.Username.UsernameValue, + CreatedAt = model.CreatedAt.CreatedAtValue, + DeletedAt = model.DeletedAt.DeletedAtValue + }; + } - if (userEntity is not null) - { - userEntity.Email = user.Email.EmailValue; - userEntity.Username = user.Username.UsernameValue; - userEntity.CreatedAt = user.CreatedAt.CreatedAtValue; - userEntity.DeletedAt = user.DeletedAt.DeletedAtValue; - - _context.Users.Update(userEntity); - } - else - { - userEntity = new User() - { - Id = new Guid(user.Id.IdValue), - Email = user.Email.EmailValue, - Username = user.Username.UsernameValue, - CreatedAt = user.CreatedAt.CreatedAtValue, - DeletedAt = user.DeletedAt.DeletedAtValue - }; - - _context.Users.Add(userEntity); - } + protected override void UpdateEntity(User entity, Domain.Models.User.User model) + { + entity.Email = model.Email.EmailValue; + entity.Username = model.Username.UsernameValue; + entity.CreatedAt = model.CreatedAt.CreatedAtValue; + entity.DeletedAt = model.DeletedAt.DeletedAtValue; } } \ No newline at end of file diff --git a/dotnet/AipsCore/Infrastructure/Persistence/Whiteboard/WhiteboardRepository.cs b/dotnet/AipsCore/Infrastructure/Persistence/Whiteboard/WhiteboardRepository.cs index 5d447f5..d606cee 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/Whiteboard/WhiteboardRepository.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/Whiteboard/WhiteboardRepository.cs @@ -1,76 +1,64 @@ using AipsCore.Domain.Models.Whiteboard.External; using AipsCore.Domain.Models.Whiteboard.ValueObjects; +using AipsCore.Infrastructure.Persistence.Abstract; using AipsCore.Infrastructure.Persistence.Db; using Microsoft.EntityFrameworkCore; namespace AipsCore.Infrastructure.Persistence.Whiteboard; -public class WhiteboardRepository : IWhiteboardRepository +public class WhiteboardRepository + : AbstractRepository, IWhiteboardRepository { - private readonly AipsDbContext _context; - - public WhiteboardRepository(AipsDbContext context) + public WhiteboardRepository(AipsDbContext context) + : base(context) { - _context = context; + } - - public async Task Get(WhiteboardId whiteboardId, CancellationToken cancellationToken = default) + + protected override Domain.Models.Whiteboard.Whiteboard MapToModel(Whiteboard entity) { - var whiteboardEntity = await _context.Whiteboards.FindAsync([new Guid(whiteboardId.IdValue), cancellationToken], cancellationToken: cancellationToken); - - if (whiteboardEntity is null) return null; - return Domain.Models.Whiteboard.Whiteboard.Create( - whiteboardEntity.Id.ToString(), - whiteboardEntity.OwnerId.ToString(), - whiteboardEntity.Code, - whiteboardEntity.Title, - whiteboardEntity.CreatedAt, - whiteboardEntity.DeletedAt, - whiteboardEntity.MaxParticipants, - whiteboardEntity.JoinPolicy, - whiteboardEntity.State); + entity.Id.ToString(), + entity.OwnerId.ToString(), + entity.Code, + entity.Title, + entity.CreatedAt, + entity.DeletedAt, + entity.MaxParticipants, + entity.JoinPolicy, + entity.State + ); } - public async Task Save(Domain.Models.Whiteboard.Whiteboard whiteboard, CancellationToken cancellationToken = default) + protected override Whiteboard MapToEntity(Domain.Models.Whiteboard.Whiteboard model) { - var whiteboardEntity = await _context.Whiteboards.FindAsync(new Guid(whiteboard.Id.IdValue)); - - if (whiteboardEntity is not null) + return new Whiteboard { - whiteboardEntity.OwnerId = new Guid(whiteboard.WhiteboardOwnerId.IdValue); - whiteboardEntity.Code = whiteboard.Code.CodeValue; - whiteboardEntity.Title = whiteboard.Title.TitleValue; - whiteboardEntity.CreatedAt = whiteboard.CreatedAt.CreatedAtValue; - whiteboardEntity.DeletedAt = whiteboard.DeletedAt.DeletedAtValue; - whiteboardEntity.MaxParticipants = whiteboard.MaxParticipants.MaxParticipantsValue; - whiteboardEntity.JoinPolicy = whiteboard.JoinPolicy; - whiteboardEntity.State = whiteboard.State; - - _context.Whiteboards.Update(whiteboardEntity); - } - else - { - whiteboardEntity = new Whiteboard() - { - Id = new Guid(whiteboard.Id.IdValue), - OwnerId = new Guid(whiteboard.WhiteboardOwnerId.IdValue), - Code = whiteboard.Code.CodeValue, - Title = whiteboard.Title.TitleValue, - CreatedAt = whiteboard.CreatedAt.CreatedAtValue, - DeletedAt = whiteboard.DeletedAt.DeletedAtValue, - MaxParticipants = whiteboard.MaxParticipants.MaxParticipantsValue, - JoinPolicy = whiteboard.JoinPolicy, - State = whiteboard.State - }; - - _context.Whiteboards.Add(whiteboardEntity); - } + Id = new Guid(model.Id.IdValue), + OwnerId = new Guid(model.WhiteboardOwnerId.IdValue), + Code = model.Code.CodeValue, + Title = model.Title.TitleValue, + CreatedAt = model.CreatedAt.CreatedAtValue, + DeletedAt = model.DeletedAt.DeletedAtValue, + MaxParticipants = model.MaxParticipants.MaxParticipantsValue, + JoinPolicy = model.JoinPolicy, + State = model.State + }; } + protected override void UpdateEntity(Whiteboard entity, Domain.Models.Whiteboard.Whiteboard model) + { + entity.Code = model.Code.CodeValue; + entity.Title = model.Title.TitleValue; + entity.CreatedAt = model.CreatedAt.CreatedAtValue; + entity.DeletedAt = model.DeletedAt.DeletedAtValue; + entity.MaxParticipants = model.MaxParticipants.MaxParticipantsValue; + entity.JoinPolicy = model.JoinPolicy; + entity.State = model.State; + } + public async Task WhiteboardCodeExists(WhiteboardCode whiteboardCode) { - var codeExists = await _context.Whiteboards.AnyAsync(w => w.Code == whiteboardCode.CodeValue); - return codeExists; + return await Context.Whiteboards.AnyAsync(w => w.Code == whiteboardCode.CodeValue); } } \ No newline at end of file diff --git a/dotnet/AipsCore/Infrastructure/Persistence/WhiteboardMembership/WhiteboardMembershipRepository.cs b/dotnet/AipsCore/Infrastructure/Persistence/WhiteboardMembership/WhiteboardMembershipRepository.cs index 1913283..89e97aa 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/WhiteboardMembership/WhiteboardMembershipRepository.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/WhiteboardMembership/WhiteboardMembershipRepository.cs @@ -1,63 +1,52 @@ using AipsCore.Domain.Models.WhiteboardMembership.External; using AipsCore.Domain.Models.WhiteboardMembership.ValueObjects; +using AipsCore.Infrastructure.Persistence.Abstract; using AipsCore.Infrastructure.Persistence.Db; namespace AipsCore.Infrastructure.Persistence.WhiteboardMembership; -public class WhiteboardMembershipRepository : IWhiteboardMembershipRepository +public class WhiteboardMembershipRepository + : AbstractRepository, + IWhiteboardMembershipRepository { - private readonly AipsDbContext _context; - public WhiteboardMembershipRepository(AipsDbContext context) + : base(context) { - _context = context; - } - - public async Task Get(WhiteboardMembershipId whiteboardMembershipId, CancellationToken cancellationToken = default) - { - var whiteboardMembershipEntity = await _context.WhiteboardMemberships.FindAsync(new Guid(whiteboardMembershipId.IdValue)); - if (whiteboardMembershipEntity is null) return null; + } + protected override Domain.Models.WhiteboardMembership.WhiteboardMembership MapToModel(WhiteboardMembership entity) + { return Domain.Models.WhiteboardMembership.WhiteboardMembership.Create( - whiteboardMembershipEntity.Id.ToString(), - whiteboardMembershipEntity.WhiteboardId.ToString(), - whiteboardMembershipEntity.UserId.ToString(), - whiteboardMembershipEntity.IsBanned, - whiteboardMembershipEntity.EditingEnabled, - whiteboardMembershipEntity.CanJoin, - whiteboardMembershipEntity.LastInteractedAt); + entity.Id.ToString(), + entity.WhiteboardId.ToString(), + entity.UserId.ToString(), + entity.IsBanned, + entity.EditingEnabled, + entity.CanJoin, + entity.LastInteractedAt + ); } - public async Task Save(Domain.Models.WhiteboardMembership.WhiteboardMembership whiteboardMembership, CancellationToken cancellationToken = default) + protected override WhiteboardMembership MapToEntity(Domain.Models.WhiteboardMembership.WhiteboardMembership model) { - var whiteboardMembershipEntity = await _context.WhiteboardMemberships.FindAsync(new Guid(whiteboardMembership.Id.IdValue)); - - if (whiteboardMembershipEntity is not null) + return new WhiteboardMembership { - whiteboardMembershipEntity.IsBanned = whiteboardMembership.IsBanned.IsBannedValue; - whiteboardMembershipEntity.EditingEnabled = whiteboardMembership.EditingEnabled.EditingEnabledValue; - whiteboardMembershipEntity.CanJoin = whiteboardMembership.CanJoin.CanJoinValue; - whiteboardMembershipEntity.LastInteractedAt = whiteboardMembership.LastInteractedAt.LastInteractedAtValue; - - _context.Update(whiteboardMembershipEntity); - } - else - { - whiteboardMembershipEntity = new WhiteboardMembership() - { - Id = new Guid(whiteboardMembership.Id.IdValue), - WhiteboardId = new Guid(whiteboardMembership.WhiteboardId.IdValue), - Whiteboard = null, - UserId = new Guid(whiteboardMembership.UserId.IdValue), - User = null, - IsBanned = whiteboardMembership.IsBanned.IsBannedValue, - EditingEnabled = whiteboardMembership.EditingEnabled.EditingEnabledValue, - CanJoin = whiteboardMembership.CanJoin.CanJoinValue, - LastInteractedAt = whiteboardMembership.LastInteractedAt.LastInteractedAtValue - }; - - _context.Add(whiteboardMembershipEntity); - } + Id = new Guid(model.Id.IdValue), + WhiteboardId = new Guid(model.WhiteboardId.IdValue), + UserId = new Guid(model.UserId.IdValue), + IsBanned = model.IsBanned.IsBannedValue, + EditingEnabled = model.EditingEnabled.EditingEnabledValue, + CanJoin = model.CanJoin.CanJoinValue, + LastInteractedAt = model.LastInteractedAt.LastInteractedAtValue + }; + } + + protected override void UpdateEntity(WhiteboardMembership entity, Domain.Models.WhiteboardMembership.WhiteboardMembership model) + { + entity.IsBanned = model.IsBanned.IsBannedValue; + entity.EditingEnabled = model.EditingEnabled.EditingEnabledValue; + entity.CanJoin = model.CanJoin.CanJoinValue; + entity.LastInteractedAt = model.LastInteractedAt.LastInteractedAtValue; } } \ No newline at end of file