From 7081a57485adab8d6c8c25dd57c8ad96006c7b23 Mon Sep 17 00:00:00 2001 From: JohnMwaniki Date: Thu, 5 Feb 2026 23:55:46 +0300 Subject: [PATCH 1/2] feat: Add entity's fluent configs --- .../Eventz.Infrastructure/AppDbContext.cs | 9 ++++++- .../Configurations/UserConfiguration.cs | 25 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 eventz-api/Eventz.Infrastructure/Configurations/UserConfiguration.cs diff --git a/eventz-api/Eventz.Infrastructure/AppDbContext.cs b/eventz-api/Eventz.Infrastructure/AppDbContext.cs index fdc99bf..7209230 100644 --- a/eventz-api/Eventz.Infrastructure/AppDbContext.cs +++ b/eventz-api/Eventz.Infrastructure/AppDbContext.cs @@ -1,5 +1,6 @@  using Eventz.Domain.Entitites; +using Eventz.Infrastructure.Configurations; using Microsoft.EntityFrameworkCore; namespace Eventz.Infrastructure @@ -15,6 +16,12 @@ public AppDbContext(DbContextOptions options) : base(options) public DbSet Users => Set(); - //Add Configs + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly); + + base.OnModelCreating(modelBuilder); + } + } } diff --git a/eventz-api/Eventz.Infrastructure/Configurations/UserConfiguration.cs b/eventz-api/Eventz.Infrastructure/Configurations/UserConfiguration.cs new file mode 100644 index 0000000..e2fff39 --- /dev/null +++ b/eventz-api/Eventz.Infrastructure/Configurations/UserConfiguration.cs @@ -0,0 +1,25 @@ +using Eventz.Domain.Entitites; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Eventz.Infrastructure.Configurations +{ + public class UserConfiguration: IEntityTypeConfiguration + { + public void Configure (EntityTypeBuilder builder) + { + builder.ToTable("Users"); + + builder.HasKey(x => x.Id); + builder.HasMany(u => u.Events); + builder.HasMany(u => u.Tickets); + builder.HasIndex(u => u.Email).IsUnique(); + } + + } +} From fcaf3e1c94a9665b2cc291e263e806567e396d2d Mon Sep 17 00:00:00 2001 From: JohnMwaniki Date: Sat, 7 Feb 2026 23:51:57 +0300 Subject: [PATCH 2/2] feat: modify entities and add entity configs --- eventz-api/Eventz.Domain/Entitites/Event.cs | 8 ++-- .../Entitites/EventRegistration.cs | 5 ++- eventz-api/Eventz.Domain/Entitites/User.cs | 5 +-- .../Configurations/CategoryConfiguration.cs | 16 ++++++++ .../Configurations/EventConfiguration.cs | 40 +++++++++++++++++++ .../EventRegistrationConfiguration.cs | 33 +++++++++++++++ .../Configurations/TicketConfiguration.cs | 24 +++++++++++ .../Configurations/UserConfiguration.cs | 11 ++--- .../Configurations/VenueConfiguration.cs | 24 +++++++++++ 9 files changed, 150 insertions(+), 16 deletions(-) create mode 100644 eventz-api/Eventz.Infrastructure/Configurations/CategoryConfiguration.cs create mode 100644 eventz-api/Eventz.Infrastructure/Configurations/EventConfiguration.cs create mode 100644 eventz-api/Eventz.Infrastructure/Configurations/EventRegistrationConfiguration.cs create mode 100644 eventz-api/Eventz.Infrastructure/Configurations/TicketConfiguration.cs create mode 100644 eventz-api/Eventz.Infrastructure/Configurations/VenueConfiguration.cs diff --git a/eventz-api/Eventz.Domain/Entitites/Event.cs b/eventz-api/Eventz.Domain/Entitites/Event.cs index 1177e43..fc1e381 100644 --- a/eventz-api/Eventz.Domain/Entitites/Event.cs +++ b/eventz-api/Eventz.Domain/Entitites/Event.cs @@ -16,11 +16,13 @@ public class Event public DateTime EndDate { get; set; } public int Capacity { get; set; } public bool IsPublic { get; set; } - public string OrganizerId { get; set; } + //public string OrganizerId { get; set; } public int VenueId { get; set; } public int CategoryId { get; set; } - public Venue venue { get; set; } - public Category category { get; set; } + public Venue Venue { get; set; } + public Category Category { get; set; } + + //public User Organizer { get; set; } public ICollection Registrations { get; set; } public ICollection Tickets { get; set; } diff --git a/eventz-api/Eventz.Domain/Entitites/EventRegistration.cs b/eventz-api/Eventz.Domain/Entitites/EventRegistration.cs index a01c204..d88734a 100644 --- a/eventz-api/Eventz.Domain/Entitites/EventRegistration.cs +++ b/eventz-api/Eventz.Domain/Entitites/EventRegistration.cs @@ -10,11 +10,12 @@ public class EventRegistration { public int Id { get; set; } public Guid EventRegistrationToken { get; set; } = Guid.NewGuid(); - public string UserId { get; set; } - public string EventId { get; set; } + public int UserId { get; set; } + public int EventId { get; set; } public DateTime RegisteredAt { get; set; } public bool CheckedIn { get; set; } public Event Event { get; set; } + public User User { get; set; } } } diff --git a/eventz-api/Eventz.Domain/Entitites/User.cs b/eventz-api/Eventz.Domain/Entitites/User.cs index d15b033..c6bfe3b 100644 --- a/eventz-api/Eventz.Domain/Entitites/User.cs +++ b/eventz-api/Eventz.Domain/Entitites/User.cs @@ -9,12 +9,11 @@ namespace Eventz.Domain.Entitites public class User { public int Id { get; set; } - public Guid UserToken { get; set; } = new Guid(); + public Guid UserToken { get; set; } = Guid.NewGuid(); public string UserName { get; set; } public string Email { get; set; } public string Password { get; set; } public DateTime CreatedAt { get; set; } - public List Tickets { get; set; } - public List Events { get; set; } + public List EventRegistrations { get; set; } = new List(); } } diff --git a/eventz-api/Eventz.Infrastructure/Configurations/CategoryConfiguration.cs b/eventz-api/Eventz.Infrastructure/Configurations/CategoryConfiguration.cs new file mode 100644 index 0000000..082e0cf --- /dev/null +++ b/eventz-api/Eventz.Infrastructure/Configurations/CategoryConfiguration.cs @@ -0,0 +1,16 @@ +using Eventz.Domain.Entitites; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Eventz.Infrastructure.Configurations +{ + public class CategoryConfiguration: IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("Categories"); + builder.HasKey(x => x.Id); + } + + } +} diff --git a/eventz-api/Eventz.Infrastructure/Configurations/EventConfiguration.cs b/eventz-api/Eventz.Infrastructure/Configurations/EventConfiguration.cs new file mode 100644 index 0000000..41fa924 --- /dev/null +++ b/eventz-api/Eventz.Infrastructure/Configurations/EventConfiguration.cs @@ -0,0 +1,40 @@ +using Eventz.Domain.Entitites; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Eventz.Infrastructure.Configurations +{ + public class EventConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("Events"); + builder.HasKey(e => e.Id); + builder.Property(e => e.Name) + .IsRequired() + .HasMaxLength(256); + builder.Property(e => e.Description) + .IsRequired() + .HasMaxLength(256); + builder.Property(e => e.StartDate).IsRequired(); + builder.Property(e => e.EndDate) + .IsRequired(); + + //relations + builder.HasOne(e => e.Venue) + .WithMany(v => v.Events) + .HasForeignKey(e => e.VenueId) + .OnDelete(DeleteBehavior.Restrict); + + builder.HasOne(e => e.Category) + .WithMany(v => v.Events) + .HasForeignKey(e => e.CategoryId) + .OnDelete(DeleteBehavior.Restrict); + } + } +} diff --git a/eventz-api/Eventz.Infrastructure/Configurations/EventRegistrationConfiguration.cs b/eventz-api/Eventz.Infrastructure/Configurations/EventRegistrationConfiguration.cs new file mode 100644 index 0000000..9fbeb3b --- /dev/null +++ b/eventz-api/Eventz.Infrastructure/Configurations/EventRegistrationConfiguration.cs @@ -0,0 +1,33 @@ +using Eventz.Domain.Entitites; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Eventz.Infrastructure.Configurations +{ + public class EventRegistrationConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(er => er.Id); + builder.HasIndex(er => new { er.UserId, er.EventId }).IsUnique(); + builder.Property(er => er.RegisteredAt) + .HasDefaultValueSql("GETUTCDATE()"); + + builder.HasOne(er => er.Event) + .WithMany(e => e.Registrations) + .HasForeignKey(e => e.EventId) + .OnDelete(DeleteBehavior.Cascade); + + builder.HasOne(er => er.User) + .WithMany(u => u.EventRegistrations) + .HasForeignKey(e => e.UserId) + .OnDelete(DeleteBehavior.Cascade); + } + } + +} diff --git a/eventz-api/Eventz.Infrastructure/Configurations/TicketConfiguration.cs b/eventz-api/Eventz.Infrastructure/Configurations/TicketConfiguration.cs new file mode 100644 index 0000000..7b8be7a --- /dev/null +++ b/eventz-api/Eventz.Infrastructure/Configurations/TicketConfiguration.cs @@ -0,0 +1,24 @@ +using Eventz.Domain.Entitites; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Eventz.Infrastructure.Configurations +{ + public class TicketConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("Tickets"); + builder.HasKey(t => t.Id); + builder.HasOne(t => t.Event) + .WithMany(e => e.Tickets) + .HasForeignKey(t => t.EventId) + .OnDelete(DeleteBehavior.Cascade); + } + } +} diff --git a/eventz-api/Eventz.Infrastructure/Configurations/UserConfiguration.cs b/eventz-api/Eventz.Infrastructure/Configurations/UserConfiguration.cs index e2fff39..eb581cb 100644 --- a/eventz-api/Eventz.Infrastructure/Configurations/UserConfiguration.cs +++ b/eventz-api/Eventz.Infrastructure/Configurations/UserConfiguration.cs @@ -1,11 +1,6 @@ using Eventz.Domain.Entitites; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Eventz.Infrastructure.Configurations { @@ -15,10 +10,10 @@ public void Configure (EntityTypeBuilder builder) { builder.ToTable("Users"); - builder.HasKey(x => x.Id); - builder.HasMany(u => u.Events); - builder.HasMany(u => u.Tickets); + builder.HasKey(u => u.Id); builder.HasIndex(u => u.Email).IsUnique(); + builder.Property(u => u.CreatedAt).HasDefaultValueSql("GETUTCDATE()"); + } } diff --git a/eventz-api/Eventz.Infrastructure/Configurations/VenueConfiguration.cs b/eventz-api/Eventz.Infrastructure/Configurations/VenueConfiguration.cs new file mode 100644 index 0000000..24f25b4 --- /dev/null +++ b/eventz-api/Eventz.Infrastructure/Configurations/VenueConfiguration.cs @@ -0,0 +1,24 @@ +using Eventz.Domain.Entitites; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Eventz.Infrastructure.Configurations +{ + public class VenueConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("Venues"); + builder.HasIndex(v => v.Id); + builder.HasMany(v => v.Events) + .WithOne(e => e.Venue) + .HasForeignKey(e => e.VenueId) + .OnDelete(DeleteBehavior.Restrict); + } + } +}