From a4245fdd93c51559d941e9ba7b23501b65e1d0bf Mon Sep 17 00:00:00 2001 From: Veljko Tosic Date: Wed, 11 Feb 2026 02:19:42 +0100 Subject: [PATCH 1/6] Abstract base for new domain --- .../AipsCore/Domain/Abstract/DomainEntity.cs | 26 +++++++++++++++++++ .../Domain/Abstract/IAbstractRepository.cs | 12 +++++++++ .../AipsCore/Domain/Abstract/IDomainEvent.cs | 6 +++++ 3 files changed, 44 insertions(+) create mode 100644 dotnet/AipsCore/Domain/Abstract/DomainEntity.cs create mode 100644 dotnet/AipsCore/Domain/Abstract/IAbstractRepository.cs create mode 100644 dotnet/AipsCore/Domain/Abstract/IDomainEvent.cs diff --git a/dotnet/AipsCore/Domain/Abstract/DomainEntity.cs b/dotnet/AipsCore/Domain/Abstract/DomainEntity.cs new file mode 100644 index 0000000..90a43b5 --- /dev/null +++ b/dotnet/AipsCore/Domain/Abstract/DomainEntity.cs @@ -0,0 +1,26 @@ +using AipsCore.Domain.Common.ValueObjects; + +namespace AipsCore.Domain.Abstract; + +public abstract class DomainEntity where TId : DomainId +{ + private readonly List _domainEvents = []; + + public TId Id { get; init; } + + protected DomainEntity() + { + + } + + protected DomainEntity(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..c41fbd6 --- /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 TEntity : DomainEntity + where TId : DomainId +{ + Task GetByIdAsync(TId id, CancellationToken cancellationToken = default); + Task SaveAsync(TEntity entity, CancellationToken cancellationToken = default); + Task AddAsync(TEntity entity, 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 From b54c72bb42aadebe98e4235d50385a82d1cc3129 Mon Sep 17 00:00:00 2001 From: Veljko Tosic Date: Wed, 11 Feb 2026 02:21:25 +0100 Subject: [PATCH 2/6] Domain entities now inheriting from abstract entity --- dotnet/AipsCore/Domain/Models/Shape/Shape.cs | 9 ++++----- dotnet/AipsCore/Domain/Models/User/User.cs | 8 ++++---- dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.cs | 10 +++++----- .../WhiteboardMembership/WhiteboardMembership.cs | 8 ++++---- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/dotnet/AipsCore/Domain/Models/Shape/Shape.cs b/dotnet/AipsCore/Domain/Models/Shape/Shape.cs index 1fb85b9..4c78ec8 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 : DomainEntity { - 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/User.cs b/dotnet/AipsCore/Domain/Models/User/User.cs index aa7aac9..d1da7fa 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 : DomainEntity { - 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/Whiteboard.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.cs index 3613686..2ddd4cc 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 : DomainEntity { - 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/WhiteboardMembership.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs index 6cd006f..c8043b6 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 : DomainEntity { - 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; From cbacb92d98deb126705cbcdf5b1ffedfeb7eebbd Mon Sep 17 00:00:00 2001 From: Veljko Tosic Date: Wed, 11 Feb 2026 02:22:13 +0100 Subject: [PATCH 3/6] Domain repositories now implementing abstract repository interface --- .../Domain/Models/Shape/External/IShapeRepository.cs | 6 +++--- .../AipsCore/Domain/Models/User/External/IUserRepository.cs | 6 +++--- .../Models/Whiteboard/External/IWhiteboardRepository.cs | 6 ++---- .../External/IWhiteboardMembershipRepository.cs | 6 +++--- 4 files changed, 11 insertions(+), 13 deletions(-) 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/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/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/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 From c23e489db2fd828169c6d017f21bf8450e383195 Mon Sep 17 00:00:00 2001 From: Veljko Tosic Date: Wed, 11 Feb 2026 02:23:18 +0100 Subject: [PATCH 4/6] Abstract repository method changed from Save to SaveAsync --- .../Command/CreateRectangle/CreateRectangleCommandHandler.cs | 2 +- .../Models/User/Command/CreateUser/CreateUserCommandHandler.cs | 2 +- .../Command/CreateWhiteboard/CreateWhiteboardCommandHandler.cs | 2 +- .../CreateWhiteboardMembershipCommandHandler.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 Date: Wed, 11 Feb 2026 02:25:14 +0100 Subject: [PATCH 5/6] Infrastructure repositories now inherit AbstractRepository and implement concrete mapping logic --- .../Abstract/AbstractRepository.cs | 55 +++++++++++ .../Shape/Mappers/ShapeMappers.FromEntity.cs | 24 ++--- .../Shape/Mappers/ShapeMappers.ToEntity.cs | 32 +++---- .../Mappers/ShapeMappers.UpdateEntity.cs | 14 +-- .../Persistence/Shape/ShapeRepository.cs | 39 +++----- .../Persistence/User/UserRepository.cs | 69 ++++++------- .../Whiteboard/WhiteboardRepository.cs | 96 ++++++++----------- .../WhiteboardMembershipRepository.cs | 79 +++++++-------- 8 files changed, 208 insertions(+), 200 deletions(-) create mode 100644 dotnet/AipsCore/Infrastructure/Persistence/Abstract/AbstractRepository.cs diff --git a/dotnet/AipsCore/Infrastructure/Persistence/Abstract/AbstractRepository.cs b/dotnet/AipsCore/Infrastructure/Persistence/Abstract/AbstractRepository.cs new file mode 100644 index 0000000..e62137c --- /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 TEntity : DomainEntity + where TId : DomainId + where TPersistenceEntity : 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 persistenceEntity = await DbSet.FindAsync([new Guid(id.IdValue)], cancellationToken); + + return persistenceEntity != null ? MapToDomainEntity(persistenceEntity) : null; + } + + public async Task SaveAsync(TEntity entity, CancellationToken cancellationToken = default) + { + var persistenceEntity = await DbSet.FindAsync([new Guid(entity.Id.IdValue)], cancellationToken); + + if (persistenceEntity == null) + { + persistenceEntity = MapToPersistenceEntity(entity); + await DbSet.AddAsync(persistenceEntity, cancellationToken); + } + else + { + UpdatePersistenceEntity(persistenceEntity, entity); + DbSet.Update(persistenceEntity); + } + } + + public async Task AddAsync(TEntity entity, CancellationToken cancellationToken = default) + { + var persistenceEntity = MapToPersistenceEntity(entity); + + await DbSet.AddAsync(persistenceEntity, cancellationToken); + } + + protected abstract TEntity MapToDomainEntity(TPersistenceEntity persistenceEntity); + protected abstract TPersistenceEntity MapToPersistenceEntity(TEntity domainEntity); + protected abstract void UpdatePersistenceEntity(TPersistenceEntity persistenceEntity, TEntity domainEntity); +} \ 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..70a2a73 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.FromEntity.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.FromEntity.cs @@ -8,19 +8,19 @@ 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 MapToDomainEntity(Shape shape) { return shape.Type switch { - ShapeType.Rectangle => EntityToRectangle(shape), - ShapeType.Line => EntityToLine(shape), - ShapeType.Arrow => EntityToArrow(shape), - ShapeType.Text => EntityToTextShape(shape), + ShapeType.Rectangle => PersistenceEntityToRectangle(shape), + ShapeType.Line => PersistenceEntityToLine(shape), + ShapeType.Arrow => PersistenceEntityToArrow(shape), + ShapeType.Text => PersistenceEntityToTextShape(shape), _ => throw new ArgumentOutOfRangeException() }; } - public static Rectangle EntityToRectangle(Shape shape) + private static Rectangle PersistenceEntityToRectangle(Shape shape) { return Rectangle.Create( shape.Id.ToString(), @@ -30,8 +30,8 @@ public static partial class ShapeMappers shape.EndPositionX!.Value, shape.EndPositionY!.Value, shape.Thickness!.Value); } - - public static Line EntityToLine(Shape shape) + + private static Line PersistenceEntityToLine(Shape shape) { return Line.Create( shape.Id.ToString(), @@ -42,8 +42,8 @@ public static partial class ShapeMappers shape.EndPositionX!.Value, shape.EndPositionY!.Value, shape.Thickness!.Value); } - - public static Arrow EntityToArrow(Shape shape) + + private static Arrow PersistenceEntityToArrow(Shape shape) { return Arrow.Create( shape.Id.ToString(), @@ -54,8 +54,8 @@ public static partial class ShapeMappers shape.EndPositionX!.Value, shape.EndPositionY!.Value, shape.Thickness!.Value); } - - public static TextShape EntityToTextShape(Shape shape) + + private static TextShape PersistenceEntityToTextShape(Shape shape) { return TextShape.Create( shape.Id.ToString(), diff --git a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.ToEntity.cs b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.ToEntity.cs index 89edea7..3229acf 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.ToEntity.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.ToEntity.cs @@ -9,21 +9,21 @@ namespace AipsCore.Infrastructure.Persistence.Shape.Mappers; public static partial class ShapeMappers { - public static Shape ModelToEntity(Domain.Models.Shape.Shape model) + public static Shape MapToPersistenceEntity(Domain.Models.Shape.Shape model) { return model.ShapeType switch { - ShapeType.Rectangle => RectangleToEntity((Rectangle)model), - ShapeType.Line => LineToEntity((Line)model), - ShapeType.Arrow => ArrowToEntity((Arrow)model), - ShapeType.Text => TextShapeToEntity((TextShape)model), + ShapeType.Rectangle => RectangleToPersistenceEntity((Rectangle)model), + ShapeType.Line => LineToPersistenceEntity((Line)model), + ShapeType.Arrow => ArrowToPersistenceEntity((Arrow)model), + ShapeType.Text => TextShapeToPersistenceEntity((TextShape)model), _ => throw new ArgumentOutOfRangeException() }; } - public static Shape RectangleToEntity(Rectangle rectangle) + private static Shape RectangleToPersistenceEntity(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) + + private static Shape LineToPersistenceEntity(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) + + private static Shape ArrowToPersistenceEntity(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) + + private static Shape TextShapeToPersistenceEntity(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..33720ca 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.UpdateEntity.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.UpdateEntity.cs @@ -8,7 +8,7 @@ namespace AipsCore.Infrastructure.Persistence.Shape.Mappers; public static partial class ShapeMappers { - public static void UpdateEntity(Shape entity, Domain.Models.Shape.Shape model) + public static void UpdatePersistenceEntity(Shape entity, Domain.Models.Shape.Shape model) { entity.WhiteboardId = new Guid(model.WhiteboardId.IdValue); entity.PositionX = model.Position.X; @@ -32,28 +32,28 @@ public static partial class ShapeMappers }; } - public static void UpdateEntityFromRectangle(Shape entity, Rectangle rectangle) + private static void UpdateEntityFromRectangle(Shape entity, Rectangle rectangle) { entity.EndPositionX = rectangle.EndPosition.X; entity.EndPositionY = rectangle.EndPosition.Y; entity.Thickness = rectangle.BorderThickness.Value; } - - public static void UpdateEntityFromLine(Shape entity, Line line) + + private static void UpdateEntityFromLine(Shape entity, Line line) { entity.EndPositionX = line.EndPosition.X; entity.EndPositionY = line.EndPosition.Y; entity.Thickness = line.Thickness.Value; } - public static void UpdateEntityFromArrow(Shape entity, Arrow arrow) + private static void UpdateEntityFromArrow(Shape entity, Arrow arrow) { entity.EndPositionX = arrow.EndPosition.X; entity.EndPositionY = arrow.EndPosition.Y; entity.Thickness = arrow.Thickness.Value; } - - public static void UpdateEntityFromTextShape(Shape entity, TextShape textShape) + + private static void UpdateEntityFromTextShape(Shape entity, TextShape textShape) { entity.TextValue = textShape.TextShapeValue.Text; entity.TextSize = textShape.TextShapeSize.Size; diff --git a/dotnet/AipsCore/Infrastructure/Persistence/Shape/ShapeRepository.cs b/dotnet/AipsCore/Infrastructure/Persistence/Shape/ShapeRepository.cs index 62cb106..9d4fc12 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 MapToDomainEntity(Shape persistenceEntity) { - var entity = await _context.Shapes.FindAsync([new Guid(shape.Id.Value)], cancellationToken); + return ShapeMappers.MapToDomainEntity(persistenceEntity); + } - if (entity is not null) - { - ShapeMappers.UpdateEntity(entity, shape); - } - else - { - var newEntity = ShapeMappers.ModelToEntity(shape); - - await _context.Shapes.AddAsync(newEntity, cancellationToken); - } + protected override Shape MapToPersistenceEntity(Domain.Models.Shape.Shape domainEntity) + { + return ShapeMappers.MapToPersistenceEntity(domainEntity); + } + protected override void UpdatePersistenceEntity(Shape persistenceEntity, Domain.Models.Shape.Shape domainEntity) + { + ShapeMappers.UpdatePersistenceEntity(persistenceEntity, domainEntity); } } \ 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..c33edd0 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 MapToDomainEntity(User persistenceEntity) + { return Domain.Models.User.User.Create( - userEntity.Id.ToString(), - userEntity.Email, - userEntity.Username, - userEntity.CreatedAt, - userEntity.DeletedAt); + persistenceEntity.Id.ToString(), + persistenceEntity.Email, + persistenceEntity.Username, + persistenceEntity.CreatedAt, + persistenceEntity.DeletedAt + ); } - public async Task Save(Domain.Models.User.User user, CancellationToken cancellationToken = default) + protected override User MapToPersistenceEntity(Domain.Models.User.User domainEntity) { - // ReSharper disable once MethodSupportsCancellation - var userEntity = await _context.Users.FindAsync(new Guid(user.Id.IdValue)); + return new User + { + Id = new Guid(domainEntity.Id.IdValue), + Email = domainEntity.Email.EmailValue, + Username = domainEntity.Username.UsernameValue, + CreatedAt = domainEntity.CreatedAt.CreatedAtValue, + DeletedAt = domainEntity.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 UpdatePersistenceEntity(User persistenceEntity, Domain.Models.User.User domainEntity) + { + persistenceEntity.Email = domainEntity.Email.EmailValue; + persistenceEntity.Username = domainEntity.Username.UsernameValue; + persistenceEntity.CreatedAt = domainEntity.CreatedAt.CreatedAtValue; + persistenceEntity.DeletedAt = domainEntity.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..fbc36b4 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 MapToDomainEntity(Whiteboard persistenceEntity) { - 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); + persistenceEntity.Id.ToString(), + persistenceEntity.OwnerId.ToString(), + persistenceEntity.Code, + persistenceEntity.Title, + persistenceEntity.CreatedAt, + persistenceEntity.DeletedAt, + persistenceEntity.MaxParticipants, + persistenceEntity.JoinPolicy, + persistenceEntity.State + ); } - public async Task Save(Domain.Models.Whiteboard.Whiteboard whiteboard, CancellationToken cancellationToken = default) + protected override Whiteboard MapToPersistenceEntity(Domain.Models.Whiteboard.Whiteboard domainEntity) { - 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(domainEntity.Id.IdValue), + OwnerId = new Guid(domainEntity.WhiteboardOwnerId.IdValue), + Code = domainEntity.Code.CodeValue, + Title = domainEntity.Title.TitleValue, + CreatedAt = domainEntity.CreatedAt.CreatedAtValue, + DeletedAt = domainEntity.DeletedAt.DeletedAtValue, + MaxParticipants = domainEntity.MaxParticipants.MaxParticipantsValue, + JoinPolicy = domainEntity.JoinPolicy, + State = domainEntity.State + }; } + protected override void UpdatePersistenceEntity(Whiteboard persistenceEntity, Domain.Models.Whiteboard.Whiteboard domainEntity) + { + persistenceEntity.Code = domainEntity.Code.CodeValue; + persistenceEntity.Title = domainEntity.Title.TitleValue; + persistenceEntity.CreatedAt = domainEntity.CreatedAt.CreatedAtValue; + persistenceEntity.DeletedAt = domainEntity.DeletedAt.DeletedAtValue; + persistenceEntity.MaxParticipants = domainEntity.MaxParticipants.MaxParticipantsValue; + persistenceEntity.JoinPolicy = domainEntity.JoinPolicy; + persistenceEntity.State = domainEntity.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..aeaccaf 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 MapToDomainEntity(WhiteboardMembership persistenceEntity) + { return Domain.Models.WhiteboardMembership.WhiteboardMembership.Create( - whiteboardMembershipEntity.Id.ToString(), - whiteboardMembershipEntity.WhiteboardId.ToString(), - whiteboardMembershipEntity.UserId.ToString(), - whiteboardMembershipEntity.IsBanned, - whiteboardMembershipEntity.EditingEnabled, - whiteboardMembershipEntity.CanJoin, - whiteboardMembershipEntity.LastInteractedAt); + persistenceEntity.Id.ToString(), + persistenceEntity.WhiteboardId.ToString(), + persistenceEntity.UserId.ToString(), + persistenceEntity.IsBanned, + persistenceEntity.EditingEnabled, + persistenceEntity.CanJoin, + persistenceEntity.LastInteractedAt + ); } - public async Task Save(Domain.Models.WhiteboardMembership.WhiteboardMembership whiteboardMembership, CancellationToken cancellationToken = default) + protected override WhiteboardMembership MapToPersistenceEntity(Domain.Models.WhiteboardMembership.WhiteboardMembership domainEntity) { - 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(domainEntity.Id.IdValue), + WhiteboardId = new Guid(domainEntity.WhiteboardId.IdValue), + UserId = new Guid(domainEntity.UserId.IdValue), + IsBanned = domainEntity.IsBanned.IsBannedValue, + EditingEnabled = domainEntity.EditingEnabled.EditingEnabledValue, + CanJoin = domainEntity.CanJoin.CanJoinValue, + LastInteractedAt = domainEntity.LastInteractedAt.LastInteractedAtValue + }; + } + + protected override void UpdatePersistenceEntity(WhiteboardMembership persistenceEntity, Domain.Models.WhiteboardMembership.WhiteboardMembership domainEntity) + { + persistenceEntity.IsBanned = domainEntity.IsBanned.IsBannedValue; + persistenceEntity.EditingEnabled = domainEntity.EditingEnabled.EditingEnabledValue; + persistenceEntity.CanJoin = domainEntity.CanJoin.CanJoinValue; + persistenceEntity.LastInteractedAt = domainEntity.LastInteractedAt.LastInteractedAtValue; } } \ No newline at end of file From 42555120974a9e4142e2c75197b063c530466217 Mon Sep 17 00:00:00 2001 From: Veljko Tosic Date: Wed, 11 Feb 2026 13:10:39 +0100 Subject: [PATCH 6/6] Refactored to follow naming convention --- .../{DomainEntity.cs => DomainModel.cs} | 6 +- .../Domain/Abstract/IAbstractRepository.cs | 10 ++-- dotnet/AipsCore/Domain/Models/Shape/Shape.cs | 2 +- dotnet/AipsCore/Domain/Models/User/User.cs | 2 +- .../Domain/Models/Whiteboard/Whiteboard.cs | 2 +- .../WhiteboardMembership.cs | 2 +- .../Abstract/AbstractRepository.cs | 42 +++++++------- .../Shape/Mappers/ShapeMappers.FromEntity.cs | 18 +++--- .../Shape/Mappers/ShapeMappers.ToEntity.cs | 18 +++--- .../Mappers/ShapeMappers.UpdateEntity.cs | 10 ++-- .../Persistence/Shape/ShapeRepository.cs | 12 ++-- .../Persistence/User/UserRepository.cs | 34 +++++------ .../Whiteboard/WhiteboardRepository.cs | 56 +++++++++---------- .../WhiteboardMembershipRepository.cs | 42 +++++++------- 14 files changed, 128 insertions(+), 128 deletions(-) rename dotnet/AipsCore/Domain/Abstract/{DomainEntity.cs => DomainModel.cs} (79%) diff --git a/dotnet/AipsCore/Domain/Abstract/DomainEntity.cs b/dotnet/AipsCore/Domain/Abstract/DomainModel.cs similarity index 79% rename from dotnet/AipsCore/Domain/Abstract/DomainEntity.cs rename to dotnet/AipsCore/Domain/Abstract/DomainModel.cs index 90a43b5..895b030 100644 --- a/dotnet/AipsCore/Domain/Abstract/DomainEntity.cs +++ b/dotnet/AipsCore/Domain/Abstract/DomainModel.cs @@ -2,18 +2,18 @@ using AipsCore.Domain.Common.ValueObjects; namespace AipsCore.Domain.Abstract; -public abstract class DomainEntity where TId : DomainId +public abstract class DomainModel where TId : DomainId { private readonly List _domainEvents = []; public TId Id { get; init; } - protected DomainEntity() + protected DomainModel() { } - protected DomainEntity(TId id) + protected DomainModel(TId id) { Id = id; } diff --git a/dotnet/AipsCore/Domain/Abstract/IAbstractRepository.cs b/dotnet/AipsCore/Domain/Abstract/IAbstractRepository.cs index c41fbd6..ced48c2 100644 --- a/dotnet/AipsCore/Domain/Abstract/IAbstractRepository.cs +++ b/dotnet/AipsCore/Domain/Abstract/IAbstractRepository.cs @@ -2,11 +2,11 @@ using AipsCore.Domain.Common.ValueObjects; namespace AipsCore.Domain.Abstract; -public interface IAbstractRepository - where TEntity : DomainEntity +public interface IAbstractRepository + where TModel : DomainModel where TId : DomainId { - Task GetByIdAsync(TId id, CancellationToken cancellationToken = default); - Task SaveAsync(TEntity entity, CancellationToken cancellationToken = default); - Task AddAsync(TEntity entity, CancellationToken cancellationToken = default); + 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/Models/Shape/Shape.cs b/dotnet/AipsCore/Domain/Models/Shape/Shape.cs index 4c78ec8..e9050ac 100644 --- a/dotnet/AipsCore/Domain/Models/Shape/Shape.cs +++ b/dotnet/AipsCore/Domain/Models/Shape/Shape.cs @@ -7,7 +7,7 @@ using AipsCore.Domain.Models.Whiteboard.ValueObjects; namespace AipsCore.Domain.Models.Shape; -public abstract class Shape : DomainEntity +public abstract class Shape : DomainModel { public WhiteboardId WhiteboardId { get; private set; } diff --git a/dotnet/AipsCore/Domain/Models/User/User.cs b/dotnet/AipsCore/Domain/Models/User/User.cs index d1da7fa..5b113cd 100644 --- a/dotnet/AipsCore/Domain/Models/User/User.cs +++ b/dotnet/AipsCore/Domain/Models/User/User.cs @@ -4,7 +4,7 @@ using AipsCore.Domain.Models.User.ValueObjects; namespace AipsCore.Domain.Models.User; -public class User : DomainEntity +public class User : DomainModel { public Email Email { get; private set; } public Username Username { get; private set; } diff --git a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.cs b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.cs index 2ddd4cc..b774510 100644 --- a/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.cs +++ b/dotnet/AipsCore/Domain/Models/Whiteboard/Whiteboard.cs @@ -5,7 +5,7 @@ using AipsCore.Domain.Models.Whiteboard.ValueObjects; namespace AipsCore.Domain.Models.Whiteboard; -public class Whiteboard : DomainEntity +public class Whiteboard : DomainModel { public UserId WhiteboardOwnerId { get; private set; } public WhiteboardCode Code { get; private set; } diff --git a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs index c8043b6..9cc612b 100644 --- a/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs +++ b/dotnet/AipsCore/Domain/Models/WhiteboardMembership/WhiteboardMembership.cs @@ -5,7 +5,7 @@ using AipsCore.Domain.Models.WhiteboardMembership.ValueObjects; namespace AipsCore.Domain.Models.WhiteboardMembership; -public class WhiteboardMembership : DomainEntity +public class WhiteboardMembership : DomainModel { public WhiteboardId WhiteboardId { get; private set; } public UserId UserId { get; private set; } diff --git a/dotnet/AipsCore/Infrastructure/Persistence/Abstract/AbstractRepository.cs b/dotnet/AipsCore/Infrastructure/Persistence/Abstract/AbstractRepository.cs index e62137c..8d1195e 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/Abstract/AbstractRepository.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/Abstract/AbstractRepository.cs @@ -5,51 +5,51 @@ using Microsoft.EntityFrameworkCore; namespace AipsCore.Infrastructure.Persistence.Abstract; -public abstract class AbstractRepository : IAbstractRepository - where TEntity : DomainEntity +public abstract class AbstractRepository : IAbstractRepository + where TModel : DomainModel where TId : DomainId - where TPersistenceEntity : class + where TEntity : class { protected readonly AipsDbContext Context; - protected readonly DbSet DbSet; + protected readonly DbSet DbSet; protected AbstractRepository(AipsDbContext context) { Context = context; - DbSet = Context.Set(); + DbSet = Context.Set(); } - public async Task GetByIdAsync(TId id, CancellationToken cancellationToken = default) + public async Task GetByIdAsync(TId id, CancellationToken cancellationToken = default) { - var persistenceEntity = await DbSet.FindAsync([new Guid(id.IdValue)], cancellationToken); + var entity = await DbSet.FindAsync([new Guid(id.IdValue)], cancellationToken); - return persistenceEntity != null ? MapToDomainEntity(persistenceEntity) : null; + return entity != null ? MapToModel(entity) : null; } - public async Task SaveAsync(TEntity entity, CancellationToken cancellationToken = default) + public async Task SaveAsync(TModel model, CancellationToken cancellationToken = default) { - var persistenceEntity = await DbSet.FindAsync([new Guid(entity.Id.IdValue)], cancellationToken); + var entity = await DbSet.FindAsync([new Guid(model.Id.IdValue)], cancellationToken); - if (persistenceEntity == null) + if (entity == null) { - persistenceEntity = MapToPersistenceEntity(entity); - await DbSet.AddAsync(persistenceEntity, cancellationToken); + entity = MapToEntity(model); + await DbSet.AddAsync(entity, cancellationToken); } else { - UpdatePersistenceEntity(persistenceEntity, entity); - DbSet.Update(persistenceEntity); + UpdateEntity(entity, model); + DbSet.Update(entity); } } - public async Task AddAsync(TEntity entity, CancellationToken cancellationToken = default) + public async Task AddAsync(TModel model, CancellationToken cancellationToken = default) { - var persistenceEntity = MapToPersistenceEntity(entity); + var entity = MapToEntity(model); - await DbSet.AddAsync(persistenceEntity, cancellationToken); + await DbSet.AddAsync(entity, cancellationToken); } - protected abstract TEntity MapToDomainEntity(TPersistenceEntity persistenceEntity); - protected abstract TPersistenceEntity MapToPersistenceEntity(TEntity domainEntity); - protected abstract void UpdatePersistenceEntity(TPersistenceEntity persistenceEntity, TEntity domainEntity); + 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 70a2a73..9089d01 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.FromEntity.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.FromEntity.cs @@ -8,19 +8,19 @@ namespace AipsCore.Infrastructure.Persistence.Shape.Mappers; public static partial class ShapeMappers { - public static Domain.Models.Shape.Shape MapToDomainEntity(Shape shape) + public static Domain.Models.Shape.Shape MapToEntity(Shape shape) { return shape.Type switch { - ShapeType.Rectangle => PersistenceEntityToRectangle(shape), - ShapeType.Line => PersistenceEntityToLine(shape), - ShapeType.Arrow => PersistenceEntityToArrow(shape), - ShapeType.Text => PersistenceEntityToTextShape(shape), + ShapeType.Rectangle => EntityToRectangle(shape), + ShapeType.Line => EntityToLine(shape), + ShapeType.Arrow => EntityToArrow(shape), + ShapeType.Text => EntityToTextShape(shape), _ => throw new ArgumentOutOfRangeException() }; } - private static Rectangle PersistenceEntityToRectangle(Shape shape) + public static Rectangle EntityToRectangle(Shape shape) { return Rectangle.Create( shape.Id.ToString(), @@ -31,7 +31,7 @@ public static partial class ShapeMappers shape.Thickness!.Value); } - private static Line PersistenceEntityToLine(Shape shape) + public static Line EntityToLine(Shape shape) { return Line.Create( shape.Id.ToString(), @@ -43,7 +43,7 @@ public static partial class ShapeMappers shape.Thickness!.Value); } - private static Arrow PersistenceEntityToArrow(Shape shape) + public static Arrow EntityToArrow(Shape shape) { return Arrow.Create( shape.Id.ToString(), @@ -55,7 +55,7 @@ public static partial class ShapeMappers shape.Thickness!.Value); } - private static TextShape PersistenceEntityToTextShape(Shape shape) + public static TextShape EntityToTextShape(Shape shape) { return TextShape.Create( shape.Id.ToString(), diff --git a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.ToEntity.cs b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.ToEntity.cs index 3229acf..6275364 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.ToEntity.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.ToEntity.cs @@ -9,19 +9,19 @@ namespace AipsCore.Infrastructure.Persistence.Shape.Mappers; public static partial class ShapeMappers { - public static Shape MapToPersistenceEntity(Domain.Models.Shape.Shape model) + public static Shape MapToEntity(Domain.Models.Shape.Shape model) { return model.ShapeType switch { - ShapeType.Rectangle => RectangleToPersistenceEntity((Rectangle)model), - ShapeType.Line => LineToPersistenceEntity((Line)model), - ShapeType.Arrow => ArrowToPersistenceEntity((Arrow)model), - ShapeType.Text => TextShapeToPersistenceEntity((TextShape)model), + ShapeType.Rectangle => RectangleToEntity((Rectangle)model), + ShapeType.Line => LineToEntity((Line)model), + ShapeType.Arrow => ArrowToEntity((Arrow)model), + ShapeType.Text => TextShapeToEntity((TextShape)model), _ => throw new ArgumentOutOfRangeException() }; } - private static Shape RectangleToPersistenceEntity(Rectangle rectangle) + public static Shape RectangleToEntity(Rectangle rectangle) { return new Shape { @@ -38,7 +38,7 @@ public static partial class ShapeMappers }; } - private static Shape LineToPersistenceEntity(Line line) + public static Shape LineToEntity(Line line) { return new Shape { @@ -55,7 +55,7 @@ public static partial class ShapeMappers }; } - private static Shape ArrowToPersistenceEntity(Arrow arrow) + public static Shape ArrowToEntity(Arrow arrow) { return new Shape { @@ -72,7 +72,7 @@ public static partial class ShapeMappers }; } - private static Shape TextShapeToPersistenceEntity(TextShape textShape) + public static Shape TextShapeToEntity(TextShape textShape) { return new Shape { diff --git a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.UpdateEntity.cs b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.UpdateEntity.cs index 33720ca..e1e04a1 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.UpdateEntity.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/Shape/Mappers/ShapeMappers.UpdateEntity.cs @@ -8,7 +8,7 @@ namespace AipsCore.Infrastructure.Persistence.Shape.Mappers; public static partial class ShapeMappers { - public static void UpdatePersistenceEntity(Shape entity, Domain.Models.Shape.Shape model) + public static void UpdateEntity(Shape entity, Domain.Models.Shape.Shape model) { entity.WhiteboardId = new Guid(model.WhiteboardId.IdValue); entity.PositionX = model.Position.X; @@ -32,28 +32,28 @@ public static partial class ShapeMappers }; } - private static void UpdateEntityFromRectangle(Shape entity, Rectangle rectangle) + public static void UpdateEntityFromRectangle(Shape entity, Rectangle rectangle) { entity.EndPositionX = rectangle.EndPosition.X; entity.EndPositionY = rectangle.EndPosition.Y; entity.Thickness = rectangle.BorderThickness.Value; } - private static void UpdateEntityFromLine(Shape entity, Line line) + public static void UpdateEntityFromLine(Shape entity, Line line) { entity.EndPositionX = line.EndPosition.X; entity.EndPositionY = line.EndPosition.Y; entity.Thickness = line.Thickness.Value; } - private static void UpdateEntityFromArrow(Shape entity, Arrow arrow) + public static void UpdateEntityFromArrow(Shape entity, Arrow arrow) { entity.EndPositionX = arrow.EndPosition.X; entity.EndPositionY = arrow.EndPosition.Y; entity.Thickness = arrow.Thickness.Value; } - private static void UpdateEntityFromTextShape(Shape entity, TextShape textShape) + public static void UpdateEntityFromTextShape(Shape entity, TextShape textShape) { entity.TextValue = textShape.TextShapeValue.Text; entity.TextSize = textShape.TextShapeSize.Size; diff --git a/dotnet/AipsCore/Infrastructure/Persistence/Shape/ShapeRepository.cs b/dotnet/AipsCore/Infrastructure/Persistence/Shape/ShapeRepository.cs index 9d4fc12..5307714 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/Shape/ShapeRepository.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/Shape/ShapeRepository.cs @@ -14,18 +14,18 @@ public class ShapeRepository : AbstractRepository WhiteboardCodeExists(WhiteboardCode whiteboardCode) diff --git a/dotnet/AipsCore/Infrastructure/Persistence/WhiteboardMembership/WhiteboardMembershipRepository.cs b/dotnet/AipsCore/Infrastructure/Persistence/WhiteboardMembership/WhiteboardMembershipRepository.cs index aeaccaf..89e97aa 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/WhiteboardMembership/WhiteboardMembershipRepository.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/WhiteboardMembership/WhiteboardMembershipRepository.cs @@ -15,38 +15,38 @@ public class WhiteboardMembershipRepository } - protected override Domain.Models.WhiteboardMembership.WhiteboardMembership MapToDomainEntity(WhiteboardMembership persistenceEntity) + protected override Domain.Models.WhiteboardMembership.WhiteboardMembership MapToModel(WhiteboardMembership entity) { return Domain.Models.WhiteboardMembership.WhiteboardMembership.Create( - persistenceEntity.Id.ToString(), - persistenceEntity.WhiteboardId.ToString(), - persistenceEntity.UserId.ToString(), - persistenceEntity.IsBanned, - persistenceEntity.EditingEnabled, - persistenceEntity.CanJoin, - persistenceEntity.LastInteractedAt + entity.Id.ToString(), + entity.WhiteboardId.ToString(), + entity.UserId.ToString(), + entity.IsBanned, + entity.EditingEnabled, + entity.CanJoin, + entity.LastInteractedAt ); } - protected override WhiteboardMembership MapToPersistenceEntity(Domain.Models.WhiteboardMembership.WhiteboardMembership domainEntity) + protected override WhiteboardMembership MapToEntity(Domain.Models.WhiteboardMembership.WhiteboardMembership model) { return new WhiteboardMembership { - Id = new Guid(domainEntity.Id.IdValue), - WhiteboardId = new Guid(domainEntity.WhiteboardId.IdValue), - UserId = new Guid(domainEntity.UserId.IdValue), - IsBanned = domainEntity.IsBanned.IsBannedValue, - EditingEnabled = domainEntity.EditingEnabled.EditingEnabledValue, - CanJoin = domainEntity.CanJoin.CanJoinValue, - LastInteractedAt = domainEntity.LastInteractedAt.LastInteractedAtValue + 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 UpdatePersistenceEntity(WhiteboardMembership persistenceEntity, Domain.Models.WhiteboardMembership.WhiteboardMembership domainEntity) + protected override void UpdateEntity(WhiteboardMembership entity, Domain.Models.WhiteboardMembership.WhiteboardMembership model) { - persistenceEntity.IsBanned = domainEntity.IsBanned.IsBannedValue; - persistenceEntity.EditingEnabled = domainEntity.EditingEnabled.EditingEnabledValue; - persistenceEntity.CanJoin = domainEntity.CanJoin.CanJoinValue; - persistenceEntity.LastInteractedAt = domainEntity.LastInteractedAt.LastInteractedAtValue; + 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