diff --git a/dotnet/AipsCore/Infrastructure/DI/PersistenceRegistrationExtensions.cs b/dotnet/AipsCore/Infrastructure/DI/PersistenceRegistrationExtensions.cs index 80c2909..182f7e7 100644 --- a/dotnet/AipsCore/Infrastructure/DI/PersistenceRegistrationExtensions.cs +++ b/dotnet/AipsCore/Infrastructure/DI/PersistenceRegistrationExtensions.cs @@ -1,6 +1,7 @@ using AipsCore.Domain.Abstract; using AipsCore.Domain.Models.User.External; using AipsCore.Domain.Models.Whiteboard.External; +using AipsCore.Domain.Models.WhiteboardMembership.External; using AipsCore.Infrastructure.DI.Configuration; using AipsCore.Infrastructure.Persistence.Db; using AipsCore.Infrastructure.Persistence.User; @@ -26,6 +27,7 @@ public static class PersistenceRegistrationExtensions services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); return services; } diff --git a/dotnet/AipsCore/Infrastructure/Persistence/Db/AipsDbContext.cs b/dotnet/AipsCore/Infrastructure/Persistence/Db/AipsDbContext.cs index cf01403..35e96ef 100644 --- a/dotnet/AipsCore/Infrastructure/Persistence/Db/AipsDbContext.cs +++ b/dotnet/AipsCore/Infrastructure/Persistence/Db/AipsDbContext.cs @@ -6,6 +6,7 @@ public class AipsDbContext : DbContext { public DbSet Users { get; set; } public DbSet Whiteboards { get; set; } + public DbSet WhiteboardMemberships { get; set; } public AipsDbContext(DbContextOptions options) : base(options) diff --git a/dotnet/AipsCore/Infrastructure/Persistence/WhiteboardMembership/WhiteboardMembership.cs b/dotnet/AipsCore/Infrastructure/Persistence/WhiteboardMembership/WhiteboardMembership.cs new file mode 100644 index 0000000..c2cd8d8 --- /dev/null +++ b/dotnet/AipsCore/Infrastructure/Persistence/WhiteboardMembership/WhiteboardMembership.cs @@ -0,0 +1,25 @@ +using System.ComponentModel.DataAnnotations; + +namespace AipsCore.Infrastructure.Persistence.WhiteboardMembership; + +public class WhiteboardMembership +{ + [Key] + public Guid Id { get; set; } + + public Guid WhiteboardId { get; set; } + + public Whiteboard.Whiteboard? Whiteboard { get; set; } = null!; + + public Guid UserId { get; set; } + + public User.User? User { get; set; } = null!; + + public bool IsBanned { get; set; } + + public bool EditingEnabled { get; set; } + + public bool CanJoin { get; set; } + + public DateTime LastInteractedAt { get; set; } +} \ No newline at end of file diff --git a/dotnet/AipsCore/Infrastructure/Persistence/WhiteboardMembership/WhiteboardMembershipRepository.cs b/dotnet/AipsCore/Infrastructure/Persistence/WhiteboardMembership/WhiteboardMembershipRepository.cs new file mode 100644 index 0000000..1913283 --- /dev/null +++ b/dotnet/AipsCore/Infrastructure/Persistence/WhiteboardMembership/WhiteboardMembershipRepository.cs @@ -0,0 +1,63 @@ +using AipsCore.Domain.Models.WhiteboardMembership.External; +using AipsCore.Domain.Models.WhiteboardMembership.ValueObjects; +using AipsCore.Infrastructure.Persistence.Db; + +namespace AipsCore.Infrastructure.Persistence.WhiteboardMembership; + +public class WhiteboardMembershipRepository : IWhiteboardMembershipRepository +{ + private readonly AipsDbContext _context; + + public WhiteboardMembershipRepository(AipsDbContext 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; + + return Domain.Models.WhiteboardMembership.WhiteboardMembership.Create( + whiteboardMembershipEntity.Id.ToString(), + whiteboardMembershipEntity.WhiteboardId.ToString(), + whiteboardMembershipEntity.UserId.ToString(), + whiteboardMembershipEntity.IsBanned, + whiteboardMembershipEntity.EditingEnabled, + whiteboardMembershipEntity.CanJoin, + whiteboardMembershipEntity.LastInteractedAt); + } + + public async Task Save(Domain.Models.WhiteboardMembership.WhiteboardMembership whiteboardMembership, CancellationToken cancellationToken = default) + { + var whiteboardMembershipEntity = await _context.WhiteboardMemberships.FindAsync(new Guid(whiteboardMembership.Id.IdValue)); + + if (whiteboardMembershipEntity is not null) + { + 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); + } + } +} \ No newline at end of file