diff --git a/.gitignore b/.gitignore index 32797af..a58b48c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ /website/obj/ /unitTests/bin/ /unitTests/obj/ +/DAL/bin/ +/DAL/obj/ diff --git a/DAL/Contexts/SASGContext.cs b/DAL/Contexts/SASGContext.cs new file mode 100644 index 0000000..8824167 --- /dev/null +++ b/DAL/Contexts/SASGContext.cs @@ -0,0 +1,137 @@ +using DAL.Models; +using DAL.Models.Audits; +using Microsoft.EntityFrameworkCore; + +namespace DAL.Contexts +{ + public class SASGContext : DbContext + { + public SASGContext() + { + + } + + public SASGContext(DbContextOptions options) : base(options) + { + + } + + public virtual DbSet colors { get; set; } + public virtual DbSet events { get; set; } + public virtual DbSet grants { get; set; } + public virtual DbSet images { get; set; } + public virtual DbSet permissions { get; set; } + public virtual DbSet savedEvents { get; set; } + public virtual DbSet users { get; set; } + public virtual DbSet auditColors { get; set; } + public virtual DbSet auditEvents { get; set; } + public virtual DbSet auditGrants { get; set; } + public virtual DbSet auditImages { get; set; } + public virtual DbSet auditPermissions { get; set; } + public virtual DbSet auditSavedEvents { get; set; } + public virtual DbSet auditUsers { get; set; } + + protected override void OnModelCreating(ModelBuilder builder) + { + builder.Entity(entity => + { + entity.HasOne(e => e.updaterRelation).WithMany() + .HasForeignKey(e => e.updater).HasConstraintName("colors_users_id_fk"); + }); + + builder.Entity(entity => + { + entity.HasOne(e => e.bgColorRelation).WithMany() + .HasForeignKey(e => e.bgColorId).HasConstraintName("events_colors_id_fk"); + entity.HasOne(e => e.fgColorRelation).WithMany() + .HasForeignKey(e => e.fgColorId).HasConstraintName("events_colors_id_fk_2"); + entity.HasOne(e => e.imageRelation).WithMany() + .HasForeignKey(e => e.imageId).HasConstraintName("events_images_id_fk"); + entity.HasOne(e => e.savedEventRelation).WithMany() + .HasForeignKey(e => e.savedEventId).HasConstraintName("events_savedEvent_id_fk"); + entity.HasOne(e => e.updaterRelation).WithMany() + .HasForeignKey(e => e.updater).HasConstraintName("events_users_id_fk"); + }); + + builder.Entity(entity => + { + entity.HasOne(e => e.permissionRelation).WithMany() + .HasForeignKey(e => e.permissionId).HasConstraintName("grants_permissions_id_fk"); + entity.HasOne(e => e.updaterRelation).WithMany() + .HasForeignKey(e => e.updater).HasConstraintName("grants_users_id_fk"); + }); + + builder.Entity(entity => + { + entity.HasOne(e => e.updaterRelation).WithMany() + .HasForeignKey(e => e.updater).HasConstraintName("grants_users_id_fk"); + }); + + builder.Entity(entity => + { + entity.HasOne(e => e.updaterRelation).WithMany() + .HasForeignKey(e => e.updater).HasConstraintName("grants_users_id_fk"); + }); + + builder.Entity(entity => + { + entity.HasOne(e => e.bgColorRelation).WithMany() + .HasForeignKey(e => e.bgColorId).HasConstraintName("events_colors_id_fk"); + entity.HasOne(e => e.fgColorRelation).WithMany() + .HasForeignKey(e => e.fgColorId).HasConstraintName("events_colors_id_fk_2"); + entity.HasOne(e => e.imageRelation).WithMany() + .HasForeignKey(e => e.imageId).HasConstraintName("events_images_id_fk"); + entity.HasOne(e => e.updaterRelation).WithMany() + .HasForeignKey(e => e.updater).HasConstraintName("events_users_id_fk"); + }); + + builder.Entity(entity => + { + entity.HasOne(e => e.updaterRelation).WithMany() + .HasForeignKey(e => e.updater).HasConstraintName("events_users_id_fk"); + }); + + builder.Entity(entity => + { + entity.HasOne().WithMany(e => e.audits) + .HasForeignKey(e => e.id).IsRequired(); + }); + + builder.Entity(entity => + { + entity.HasOne().WithMany(e => e.audits) + .HasForeignKey(e => e.id).IsRequired(); + }); + + builder.Entity(entity => + { + entity.HasOne().WithMany(e => e.audits) + .HasForeignKey(e => e.id).IsRequired(); + }); + + builder.Entity(entity => + { + entity.HasOne().WithMany(e => e.audits) + .HasForeignKey(e => e.id).IsRequired(); + }); + + builder.Entity(entity => + { + entity.HasOne().WithMany(e => e.audits) + .HasForeignKey(e => e.id).IsRequired(); + }); + + builder.Entity(entity => + { + entity.HasOne().WithMany(e => e.audits) + .HasForeignKey(e => e.id).IsRequired(); + }); + + builder.Entity(entity => + { + entity.HasOne().WithMany(e => e.audits) + .HasForeignKey(e => e.id).IsRequired(); + }); + } + } +} diff --git a/DAL/DAL.csproj b/DAL/DAL.csproj new file mode 100644 index 0000000..7383529 --- /dev/null +++ b/DAL/DAL.csproj @@ -0,0 +1,18 @@ + + + + net8.0 + enable + enable + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + diff --git a/DAL/Models/Audits/AuditColor.cs b/DAL/Models/Audits/AuditColor.cs new file mode 100644 index 0000000..46fc213 --- /dev/null +++ b/DAL/Models/Audits/AuditColor.cs @@ -0,0 +1,35 @@ +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DAL.Models.Audits +{ + [Index("id", Name = "audit_colors_colors_id_fk")] + [Table("audit_colors")] + [Keyless] + public class AuditColor + { + [Column("id")] + public ulong id { get; set; } + + [Column("red")] + public byte red { get; set; } + + [Column("blue")] + public byte blue { get; set; } + + [Column("green")] + public byte green { get; set; } + + [Column("name")] + [MaxLength(64)] + public string name { get; set; } = null!; + + [Column("updated")] + [DataType("datetime")] + public DateTime updated { get; set; } + + [Column("updater")] + public ulong updater { get; set; } + } +} diff --git a/DAL/Models/Audits/AuditEvent.cs b/DAL/Models/Audits/AuditEvent.cs new file mode 100644 index 0000000..5530c96 --- /dev/null +++ b/DAL/Models/Audits/AuditEvent.cs @@ -0,0 +1,41 @@ +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DAL.Models.Audits +{ + [Table("audit_event")] + [Index("id", Name = "audit_events_events_id_fk")] + [Keyless] + public class AuditEvent + { + [Column("id")] + public ulong id { get; set; } + + [Column("savedEventId")] + public ulong savedEventId { get; set; } + + [Column("name")] + [MaxLength(64)] + public string? name { get; set; } + + [Column("bgColorId")] + public ulong? bgColorId { get; set; } + + [Column("fgColorId")] + public ulong? fgColorId { get; set; } + + [Column("imageId")] + public ulong? imageId { get; set; } + + [Column("hidden")] + public bool hidden { get; set; } + + [Column("updated")] + [DataType("datetime")] + public DateTime updated { get; set; } + + [Column("updater")] + public ulong updater { get; set; } + } +} diff --git a/DAL/Models/Audits/AuditGrant.cs b/DAL/Models/Audits/AuditGrant.cs new file mode 100644 index 0000000..cc60037 --- /dev/null +++ b/DAL/Models/Audits/AuditGrant.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DAL.Models.Audits +{ + [Table("audit_grants")] + [Index("id", Name = "audit_grants_grants_id_fk")] + [Keyless] + public class AuditGrant + { + [Column("id")] + public ulong id { get; set; } + + [Column("name")] + [MaxLength(128)] + public string name { get; set; } = null!; + + [Column("permissionId")] + public ulong permissionId { get; set; } + + [Column("updated")] + [DataType("updated")] + public DateTime updated { get; set; } + + [Column("updater")] + public ulong updater { get; set; } + } +} diff --git a/DAL/Models/Audits/AuditImage.cs b/DAL/Models/Audits/AuditImage.cs new file mode 100644 index 0000000..190e094 --- /dev/null +++ b/DAL/Models/Audits/AuditImage.cs @@ -0,0 +1,31 @@ +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DAL.Models.Audits +{ + [Table("audit_images")] + [Index("id", Name = "audit_images_images_id_fk")] + [Keyless] + public class AuditImage + { + [Key] + [Column("id")] + public ulong id { get; set; } + + [Column("name")] + [MaxLength(64)] + public string name { get; set; } = null!; + + [Column("filename")] + [MaxLength(128)] + public string filename { get; set; } = null!; + + [Column("updated")] + [DataType("datetime")] + public DateTime updated { get; set; } + + [Column("updater")] + public ulong updater { get; set; } + } +} diff --git a/DAL/Models/Audits/AuditPermission.cs b/DAL/Models/Audits/AuditPermission.cs new file mode 100644 index 0000000..8e1754e --- /dev/null +++ b/DAL/Models/Audits/AuditPermission.cs @@ -0,0 +1,26 @@ +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DAL.Models.Audits +{ + [Table("audit_permissions")] + [Index("id", Name = "audit_permissions_permissions_id_fk")] + [Keyless] + public class AuditPermission + { + [Column("id")] + public ulong id { get; set; } + + [Column("name")] + [MaxLength(64)] + public string name { get; set; } = null!; + + [Column("updated")] + [DataType("datetime")] + public DateTime updated { get; set; } + + [Column("updater")] + public ulong updater { get; set; } + } +} diff --git a/DAL/Models/Audits/AuditSavedEvent.cs b/DAL/Models/Audits/AuditSavedEvent.cs new file mode 100644 index 0000000..7695c7d --- /dev/null +++ b/DAL/Models/Audits/AuditSavedEvent.cs @@ -0,0 +1,35 @@ +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DAL.Models.Audits +{ + [Table("audit_savedEvents")] + [Index("id", Name = "audit_savedEvents_savedEvents_id_fk")] + [Keyless] + public class AuditSavedEvent + { + [Column("id")] + public ulong id { get; set; } + + [Column("name")] + [MaxLength(64)] + public string name { get; set; } = null!; + + [Column("bgColorId")] + public ulong bgColorId { get; set; } + + [Column("fgColorId")] + public ulong fgColorId { get; set; } + + [Column("imageId")] + public ulong? imageId { get; set; } + + [Column("updated")] + [DataType("datetime")] + public DateTime updated { get; set; } + + [Column("updater")] + public ulong updater { get; set; } + } +} diff --git a/DAL/Models/Audits/AuditUser.cs b/DAL/Models/Audits/AuditUser.cs new file mode 100644 index 0000000..5bd0970 --- /dev/null +++ b/DAL/Models/Audits/AuditUser.cs @@ -0,0 +1,40 @@ +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DAL.Models.Audits +{ + [Table("audit_users")] + [Index("id", Name = "audit_users_users_id_fk")] + [Keyless] + public class AuditUser + { + [Column("id")] + public ulong id { get; set; } + + [Column("firstName")] + [MaxLength(64)] + public string firstName { get; set; } = null!; + + [Column("lastName")] + [MaxLength(64)] + public string lastName { get; set; } = null!; + + [Column("phoneNumber")] + public ulong phoneNumber { get; set; } + + [Column("hashingType")] + [MaxLength(64)] + public HashingType hashingType { get; set; } + + [Column("permissionId")] + public ulong permissionId { get; set; } + + [Column("updated")] + [DataType("datetime")] + public DateTime updated { get; set; } + + [Column("updater")] + public ulong updater { get; set; } + } +} diff --git a/DAL/Models/Color.cs b/DAL/Models/Color.cs new file mode 100644 index 0000000..a2c4d65 --- /dev/null +++ b/DAL/Models/Color.cs @@ -0,0 +1,40 @@ +using DAL.Models.Audits; +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DAL.Models +{ + [Table("colors")] + [Index("updater", Name = "colors_users_id_fk")] + public class Color + { + [Key] + [Column("id")] + public ulong id { get; set; } + + [Column("red")] + public byte red { get; set; } + + [Column("blue")] + public byte blue { get; set; } + + [Column("green")] + public byte green { get; set; } + + [Column("name")] + [MaxLength(64)] + public string name { get; set; } = null!; + + [Column("updated")] + [DataType("datetime")] + public DateTime updated { get; set; } + + [Column("updater")] + public ulong updater { get; set; } + + public User updaterRelation { get; set; } = null!; + + public ICollection audits { get; set; } = new List(); + } +} diff --git a/DAL/Models/Event.cs b/DAL/Models/Event.cs new file mode 100644 index 0000000..e0abbd5 --- /dev/null +++ b/DAL/Models/Event.cs @@ -0,0 +1,54 @@ +using DAL.Models.Audits; +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DAL.Models +{ + [Table("events")] + [Index("updater", Name = "event_users_id_fk")] + [Index("bgColorId", Name = "events_colors_id_fk")] + [Index("fgColorId", Name = "events_colors_id_fk_2")] + [Index("imageId", Name = "events_images_id_fk")] + [Index("savedEventId", Name = "events_savedEvents_id_fk")] + public class Event + { + [Key] + [Column("id")] + public ulong id { get; set; } + + [Column("savedEventId")] + public ulong savedEventId { get; set; } + + [Column("name")] + [MaxLength(64)] + public string? name { get; set; } + + [Column("bgColorId")] + public ulong? bgColorId { get; set; } + + [Column("fgColorId")] + public ulong? fgColorId { get; set; } + + [Column("imageId")] + public ulong? imageId { get; set; } + + [Column("hidden")] + public bool hidden { get; set; } + + [Column("updated")] + [DataType("datetime")] + public DateTime updated { get; set; } + + [Column("updater")] + public ulong updater { get; set; } + + public User updaterRelation { get; set; } = null!; + public SavedEvent savedEventRelation { get; set; } = null!; + public Color? bgColorRelation { get; set; } + public Color? fgColorRelation { get; set; } + public Image? imageRelation { get; set; } + + public ICollection audits { get; set; } = new List(); + } +} diff --git a/DAL/Models/Grant.cs b/DAL/Models/Grant.cs new file mode 100644 index 0000000..e09d7a7 --- /dev/null +++ b/DAL/Models/Grant.cs @@ -0,0 +1,37 @@ +using DAL.Models.Audits; +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DAL.Models +{ + [Table("grants")] + [Index("updater", Name = "grants_users_id_fk")] + [Index("permissionId", Name = "grants_permissions_id_fk")] + [Index("updater", Name = "grants_users_id_fk")] + public class Grant + { + [Key] + [Column("id")] + public ulong id { get; set; } + + [Column("name")] + [MaxLength(128)] + public string name { get; set; } = null!; + + [Column("permissionId")] + public ulong permissionId { get; set; } + + [Column("updated")] + [DataType("updated")] + public DateTime updated { get; set; } + + [Column("updater")] + public ulong updater { get; set; } + + public virtual User updaterRelation { get; set; } = null!; + public virtual Permission permissionRelation { get; set; } = null!; + + public ICollection audits { get; set; } = new List(); + } +} diff --git a/DAL/Models/Image.cs b/DAL/Models/Image.cs new file mode 100644 index 0000000..683c68a --- /dev/null +++ b/DAL/Models/Image.cs @@ -0,0 +1,35 @@ +using DAL.Models.Audits; +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DAL.Models +{ + [Table("images")] + [Index("updater", Name = "images_users_id_fk")] + public class Image + { + [Key] + [Column("id")] + public ulong id { get; set; } + + [Column("name")] + [MaxLength(64)] + public string name { get; set; } = null!; + + [Column("filename")] + [MaxLength(128)] + public string filename { get; set; } = null!; + + [Column("updated")] + [DataType("datetime")] + public DateTime updated { get; set; } + + [Column("updater")] + public ulong updater { get; set; } + + public virtual User updaterRelation { get; set; } = null!; + + public ICollection audits { get; set; } = new List(); + } +} diff --git a/DAL/Models/Permission.cs b/DAL/Models/Permission.cs new file mode 100644 index 0000000..6cfdc2a --- /dev/null +++ b/DAL/Models/Permission.cs @@ -0,0 +1,31 @@ +using DAL.Models.Audits; +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DAL.Models +{ + [Table("permissions")] + [Index("updater", Name = "permissions_users_id_fk")] + public class Permission + { + [Key] + [Column("id")] + public ulong id { get; set; } + + [Column("name")] + [MaxLength(64)] + public string name { get; set; } = null!; + + [Column("updated")] + [DataType("datetime")] + public DateTime updated { get; set; } + + [Column("updater")] + public ulong updater { get; set; } + + public virtual User updaterRelation { get; set; } = null!; + + public ICollection audits { get; set; } = new List(); + } +} diff --git a/DAL/Models/SavedEvent.cs b/DAL/Models/SavedEvent.cs new file mode 100644 index 0000000..83e96c8 --- /dev/null +++ b/DAL/Models/SavedEvent.cs @@ -0,0 +1,46 @@ +using DAL.Models.Audits; +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace DAL.Models +{ + [Table("savedEvents")] + [Index("updater", Name = "savedEvents_users_id_fk")] + [Index("fgColorId", Name = "savedEvents_colors_id_fk")] + [Index("bgColorId", Name = "savedEvents_colors_id_fk_2")] + [Index("imageId", Name = "savedEvents_images_id_fk")] + public class SavedEvent + { + [Key] + [Column("id")] + public ulong id { get; set; } + + [Column("name")] + [MaxLength(64)] + public string name { get; set; } = null!; + + [Column("bgColorId")] + public ulong bgColorId { get; set; } + + [Column("fgColorId")] + public ulong fgColorId { get; set; } + + [Column("imageId")] + public ulong? imageId { get; set; } + + [Column("updated")] + [DataType("datetime")] + public DateTime updated { get; set; } + + [Column("updater")] + public ulong updater { get; set; } + + public User updaterRelation { get; set; } = null!; + public Color bgColorRelation { get; set; } = null!; + public Color fgColorRelation { get; set; } = null!; + public Image? imageRelation { get; set; } + + public ICollection audits { get; set; } = new List(); + } +} diff --git a/DAL/Models/User.cs b/DAL/Models/User.cs new file mode 100644 index 0000000..7db9777 --- /dev/null +++ b/DAL/Models/User.cs @@ -0,0 +1,61 @@ +using DAL.Models.Audits; +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text.Json.Serialization; + +namespace DAL.Models +{ + [JsonConverter(typeof(JsonStringEnumConverter))] + public enum HashingType + { + PBKDF2_SHA512_64_210000 + } + + [Table("users")] + [Index("updater", Name = "users_users_id_fk")] + [Index("permissionId", Name = "users_permissions_id_fk")] + public class User + { + [Key] + [Column("id")] + public ulong id { get; set; } + + [Column("firstName")] + [MaxLength(64)] + public string firstName { get; set; } = null!; + + [Column("lastName")] + [MaxLength(64)] + public string lastName { get; set; } = null!; + + [Column("phoneNumber")] + public ulong phoneNumber { get; set; } + + [Column("password")] + [MaxLength(1000)] + public string password { get; set; } = null!; + + [Column("salt")] + [DataType("blob")] + public byte[] salt { get; set; } = null!; + + [Column("hashingType")] + [MaxLength(64)] + public HashingType hashingType { get; set; } + + [Column("permissionId")] + public ulong permissionId { get; set; } + + [Column("updated")] + [DataType("datetime")] + public DateTime updated { get; set; } + + [Column("updater")] + public ulong updater { get; set; } + + public virtual User updaterRelation { get; set; } = null!; + + public ICollection audits { get; set; } = new List(); + } +} diff --git a/sanAntonioSeniorGolf.sln b/sanAntonioSeniorGolf.sln index 5018b72..105d0fc 100644 --- a/sanAntonioSeniorGolf.sln +++ b/sanAntonioSeniorGolf.sln @@ -4,6 +4,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "website", "website\website. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "unitTests", "unitTests\unitTests.csproj", "{089ACCAD-8117-4C24-9429-56A394AC4734}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DAL", "DAL\DAL.csproj", "{EE2CF24D-1C19-4915-A6BB-7A244F527CE4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -18,5 +20,9 @@ Global {089ACCAD-8117-4C24-9429-56A394AC4734}.Debug|Any CPU.Build.0 = Debug|Any CPU {089ACCAD-8117-4C24-9429-56A394AC4734}.Release|Any CPU.ActiveCfg = Release|Any CPU {089ACCAD-8117-4C24-9429-56A394AC4734}.Release|Any CPU.Build.0 = Release|Any CPU + {EE2CF24D-1C19-4915-A6BB-7A244F527CE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE2CF24D-1C19-4915-A6BB-7A244F527CE4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE2CF24D-1C19-4915-A6BB-7A244F527CE4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE2CF24D-1C19-4915-A6BB-7A244F527CE4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal