diff --git a/Memphis.API/Controllers/NewsController.cs b/Memphis.API/Controllers/NewsController.cs index 917c1ee..91ce40d 100644 --- a/Memphis.API/Controllers/NewsController.cs +++ b/Memphis.API/Controllers/NewsController.cs @@ -76,7 +76,7 @@ public async Task>> CreateNews(NewsPayload payload) { Title = payload.Title, Content = payload.Content, - Author = user, + Author = $"{user.FirstName} {user.LastName}", }); await _context.SaveChangesAsync(); string newData = JsonConvert.SerializeObject(result.Entity); @@ -103,8 +103,7 @@ public async Task>>> GetNews(int page = 1, int { try { - var result = await _context.News - .Include(x => x.Author).OrderBy(x => x.Created) + var result = await _context.News.OrderBy(x => x.Created) .Skip((page - 1) * size).ToListAsync(); return Ok(new Response> { diff --git a/Memphis.Shared/Enums/FileType.cs b/Memphis.Shared/Enums/FileType.cs index 471a14d..eaedbf6 100644 --- a/Memphis.Shared/Enums/FileType.cs +++ b/Memphis.Shared/Enums/FileType.cs @@ -2,7 +2,12 @@ public enum FileType { - ALL, + POLICY, + SOP, + LOA, + REFERENCE, + MISC, + CLIENT, TRAINING_STAFF, STAFF, SENIOR_STAFF diff --git a/Memphis.Shared/Migrations/20250403200925_News.Designer.cs b/Memphis.Shared/Migrations/20250403200925_News.Designer.cs new file mode 100644 index 0000000..d5e6054 --- /dev/null +++ b/Memphis.Shared/Migrations/20250403200925_News.Designer.cs @@ -0,0 +1,1614 @@ +// +using System; +using Memphis.Shared.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Memphis.Shared.Migrations +{ + [DbContext(typeof(DatabaseContext))] + [Migration("20250403200925_News")] + partial class News + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.3") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Memphis.Shared.Models.Airport", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Altimeter") + .HasColumnType("text"); + + b.Property("Arrivals") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Departures") + .HasColumnType("integer"); + + b.Property("FlightRules") + .HasColumnType("text"); + + b.Property("Icao") + .IsRequired() + .HasColumnType("text"); + + b.Property("MetarRaw") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Temperature") + .HasColumnType("text"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("Visibility") + .HasColumnType("text"); + + b.Property("Wind") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Icao"); + + b.HasIndex("Name"); + + b.ToTable("Airports"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Certification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Level") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Solo") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("Certification"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Comment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Confidential") + .HasColumnType("boolean"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text"); + + b.Property("SubmitterId") + .HasColumnType("integer"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SubmitterId"); + + b.HasIndex("UserId"); + + b.ToTable("Comments"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EmailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.Property("To") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("EmailLogs"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Event", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BannerUrl") + .HasColumnType("text"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("Host") + .IsRequired() + .HasColumnType("text"); + + b.Property("IsOpen") + .HasColumnType("boolean"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Start"); + + b.HasIndex("Title"); + + b.ToTable("Events"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EventPosition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Available") + .HasColumnType("boolean"); + + b.Property("EventId") + .HasColumnType("integer"); + + b.Property("MinRating") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("EventId"); + + b.ToTable("EventPositions"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EventRegistration", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("EventId") + .HasColumnType("integer"); + + b.Property("EventPositionId") + .HasColumnType("integer"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("EventId"); + + b.HasIndex("EventPositionId"); + + b.HasIndex("Start"); + + b.HasIndex("Status"); + + b.HasIndex("UserId"); + + b.ToTable("EventRegistrations"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Exam", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Link") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Exams"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.ExamRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("ExamId") + .HasColumnType("integer"); + + b.Property("InstructorId") + .HasColumnType("integer"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("text"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StudentId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ExamId"); + + b.HasIndex("InstructorId"); + + b.HasIndex("StudentId"); + + b.ToTable("ExamRequests"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Facility", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Identifier") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Facilities"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Feedback", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Cid") + .HasColumnType("integer"); + + b.Property("ControllerCallsign") + .IsRequired() + .HasColumnType("text"); + + b.Property("ControllerId") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Level") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Reply") + .HasColumnType("text"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("ControllerId"); + + b.ToTable("Feedback"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.File", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("FileUrl") + .HasColumnType("text"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("Version") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Hours", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CenterHours") + .HasColumnType("double precision"); + + b.Property("DeliveryHours") + .HasColumnType("double precision"); + + b.Property("GroundHours") + .HasColumnType("double precision"); + + b.Property("Month") + .HasColumnType("integer"); + + b.Property("TowerHours") + .HasColumnType("double precision"); + + b.Property("TraconHours") + .HasColumnType("double precision"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Year") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Month"); + + b.HasIndex("UserId"); + + b.HasIndex("Year"); + + b.ToTable("Hours"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.News", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Author") + .IsRequired() + .HasColumnType("text"); + + b.Property("Content") + .IsRequired() + .HasColumnType("text"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("News"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Notification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Link") + .IsRequired() + .HasColumnType("text"); + + b.Property("Read") + .HasColumnType("boolean"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Read"); + + b.HasIndex("Title"); + + b.HasIndex("UserId"); + + b.ToTable("Notifications"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.OnlineController", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Callsign") + .IsRequired() + .HasColumnType("text"); + + b.Property("Cid") + .HasColumnType("integer"); + + b.Property("Duration") + .IsRequired() + .HasColumnType("text"); + + b.Property("Frequency") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Rating") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("OnlineControllers"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Ots", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Facility") + .IsRequired() + .HasColumnType("text"); + + b.Property("InstructorId") + .HasColumnType("integer"); + + b.Property("MilestoneId") + .HasColumnType("integer"); + + b.Property("Result") + .HasColumnType("integer"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("SubmitterId") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Facility"); + + b.HasIndex("InstructorId"); + + b.HasIndex("MilestoneId"); + + b.HasIndex("Result"); + + b.HasIndex("Status"); + + b.HasIndex("SubmitterId"); + + b.HasIndex("UserId"); + + b.ToTable("Ots"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("NameShort") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Roles"); + + b.HasData( + new + { + Id = 1, + Email = "atm@memphisartcc.com", + Name = "Air Traffic Manager", + NameShort = "ATM" + }, + new + { + Id = 2, + Email = "datm@memphisartcc.com", + Name = "Deputy Air Traffic Manager", + NameShort = "DATM" + }, + new + { + Id = 3, + Email = "ta@memphisartcc.com", + Name = "Training Administrator", + NameShort = "TA" + }, + new + { + Id = 4, + Email = "ata@memphisartcc.com", + Name = "Assistant Training Administrator", + NameShort = "ATA" + }, + new + { + Id = 5, + Email = "wm@memphisartcc.com", + Name = "Webmaster", + NameShort = "WM" + }, + new + { + Id = 6, + Email = "awm@memphisartcc.com", + Name = "Assistant Webmaster", + NameShort = "AWM" + }, + new + { + Id = 7, + Email = "ec@memphisartcc.com", + Name = "Events Coordinator", + NameShort = "EC" + }, + new + { + Id = 8, + Email = "aec@memphisartcc.com", + Name = "Assistant Events Coordinator", + NameShort = "AEC" + }, + new + { + Id = 9, + Email = "fe@memphisartcc.com", + Name = "Facility Engineer", + NameShort = "FE" + }, + new + { + Id = 10, + Email = "afe@memphisartcc.com", + Name = "Assistant Facility Engineer", + NameShort = "AFE" + }, + new + { + Id = 11, + Email = "web@memphisartcc.com", + Name = "Web Team", + NameShort = "WEB" + }, + new + { + Id = 12, + Email = "events@memphisartcc.com", + Name = "Events Team", + NameShort = "EVENTS" + }, + new + { + Id = 13, + Email = "facilities@memphisartcc.com", + Name = "Facilities Team", + NameShort = "FACILITIES" + }, + new + { + Id = 14, + Email = "socialmedia@memphisartcc.com", + Name = "Social Media Team", + NameShort = "SOCIAL" + }, + new + { + Id = 15, + Email = "instructors@memphisartcc.com", + Name = "Instructor", + NameShort = "INS" + }, + new + { + Id = 16, + Email = "mentors@memphisartcc.com", + Name = "Mentor", + NameShort = "MTR" + }); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Session", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Callsign") + .IsRequired() + .HasColumnType("text"); + + b.Property("Duration") + .HasColumnType("interval"); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("Frequency") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Callsign"); + + b.HasIndex("End"); + + b.HasIndex("Frequency"); + + b.HasIndex("Name"); + + b.HasIndex("Start"); + + b.HasIndex("UserId"); + + b.ToTable("Sessions"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Settings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("LastUpdated") + .HasColumnType("timestamp with time zone"); + + b.Property("RequiredHours") + .HasColumnType("integer"); + + b.Property("VisitingOpen") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("Settings"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.SoloCert", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Center") + .HasColumnType("integer"); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("SubmittedId") + .HasColumnType("integer"); + + b.Property("Tier2") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SubmittedId"); + + b.HasIndex("UserId"); + + b.ToTable("SoloCerts"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.StaffingRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Cid") + .HasColumnType("integer"); + + b.Property("Duration") + .HasColumnType("interval"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("EstimatedPilots") + .HasColumnType("integer"); + + b.Property("FullName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Organization") + .IsRequired() + .HasColumnType("text"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("StaffingRequests"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingMilestone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Code") + .IsRequired() + .HasColumnType("text"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("Facility") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Track") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.ToTable("TrainingMilestones"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingSchedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("InstructorId") + .HasColumnType("integer"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("StudentId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("InstructorId"); + + b.HasIndex("StudentId"); + + b.ToTable("TrainingSchedules"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingScheduleEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.Property("TrainingScheduleId") + .HasColumnType("integer"); + + b.Property("TrainingTypeId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("TrainingScheduleId"); + + b.HasIndex("TrainingTypeId"); + + b.HasIndex("UserId"); + + b.ToTable("TrainingScheduleEntries"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingTicket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("End") + .HasColumnType("timestamp with time zone"); + + b.Property("MilestoneId") + .HasColumnType("integer"); + + b.Property("Performance") + .HasColumnType("integer"); + + b.Property("Start") + .HasColumnType("timestamp with time zone"); + + b.Property("TrainerId") + .HasColumnType("integer"); + + b.Property("TrainingNotes") + .IsRequired() + .HasColumnType("text"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("UserNotes") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("MilestoneId"); + + b.HasIndex("Performance"); + + b.HasIndex("TrainerId"); + + b.HasIndex("UserId"); + + b.ToTable("TrainingTickets"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("TrainingTypes"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CanRegisterForEvents") + .HasColumnType("boolean"); + + b.Property("CanRequestTraining") + .HasColumnType("boolean"); + + b.Property("CenterId") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("DiscordId") + .HasColumnType("text"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("text"); + + b.Property("GroundId") + .HasColumnType("integer"); + + b.Property("Initials") + .IsRequired() + .HasColumnType("text"); + + b.Property("Joined") + .HasColumnType("timestamp with time zone"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Rating") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("TowerId") + .HasColumnType("integer"); + + b.Property("TraconId") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.Property("Visitor") + .HasColumnType("boolean"); + + b.Property("VisitorFrom") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("CenterId"); + + b.HasIndex("Email"); + + b.HasIndex("FirstName"); + + b.HasIndex("GroundId"); + + b.HasIndex("LastName"); + + b.HasIndex("Rating"); + + b.HasIndex("Status"); + + b.HasIndex("TowerId"); + + b.HasIndex("TraconId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.VisitingApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Cid") + .HasColumnType("integer"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("DenialReason") + .HasColumnType("text"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("text"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Rating") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Updated") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("VisitingApplications"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.WebsiteLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Action") + .IsRequired() + .HasColumnType("text"); + + b.Property("Cid") + .HasColumnType("text"); + + b.Property("Ip") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("NewData") + .IsRequired() + .HasColumnType("text"); + + b.Property("OldData") + .IsRequired() + .HasColumnType("text"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("WebsiteLogs"); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.Property("RolesId") + .HasColumnType("integer"); + + b.Property("UsersId") + .HasColumnType("integer"); + + b.HasKey("RolesId", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("RoleUser"); + }); + + modelBuilder.Entity("TrainingScheduleTrainingType", b => + { + b.Property("SchedulesId") + .HasColumnType("integer"); + + b.Property("TrainingTypesId") + .HasColumnType("integer"); + + b.HasKey("SchedulesId", "TrainingTypesId"); + + b.HasIndex("TrainingTypesId"); + + b.ToTable("TrainingScheduleTrainingType"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Comment", b => + { + b.HasOne("Memphis.Shared.Models.User", "Submitter") + .WithMany() + .HasForeignKey("SubmitterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Submitter"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EventPosition", b => + { + b.HasOne("Memphis.Shared.Models.Event", "Event") + .WithMany() + .HasForeignKey("EventId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Event"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.EventRegistration", b => + { + b.HasOne("Memphis.Shared.Models.Event", "Event") + .WithMany() + .HasForeignKey("EventId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.EventPosition", "EventPosition") + .WithMany() + .HasForeignKey("EventPositionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Event"); + + b.Navigation("EventPosition"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.ExamRequest", b => + { + b.HasOne("Memphis.Shared.Models.Exam", "Exam") + .WithMany() + .HasForeignKey("ExamId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "Instructor") + .WithMany() + .HasForeignKey("InstructorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "Student") + .WithMany() + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Exam"); + + b.Navigation("Instructor"); + + b.Navigation("Student"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Feedback", b => + { + b.HasOne("Memphis.Shared.Models.User", "Controller") + .WithMany() + .HasForeignKey("ControllerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Controller"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Hours", b => + { + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Notification", b => + { + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Ots", b => + { + b.HasOne("Memphis.Shared.Models.User", "Instructor") + .WithMany() + .HasForeignKey("InstructorId"); + + b.HasOne("Memphis.Shared.Models.TrainingMilestone", "Milestone") + .WithMany() + .HasForeignKey("MilestoneId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "Submitter") + .WithMany() + .HasForeignKey("SubmitterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Instructor"); + + b.Navigation("Milestone"); + + b.Navigation("Submitter"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.Session", b => + { + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.SoloCert", b => + { + b.HasOne("Memphis.Shared.Models.User", "Submitted") + .WithMany() + .HasForeignKey("SubmittedId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Submitted"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingSchedule", b => + { + b.HasOne("Memphis.Shared.Models.User", "Instructor") + .WithMany() + .HasForeignKey("InstructorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "Student") + .WithMany() + .HasForeignKey("StudentId"); + + b.Navigation("Instructor"); + + b.Navigation("Student"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingScheduleEntry", b => + { + b.HasOne("Memphis.Shared.Models.TrainingSchedule", "TrainingSchedule") + .WithMany() + .HasForeignKey("TrainingScheduleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.TrainingType", "TrainingType") + .WithMany() + .HasForeignKey("TrainingTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("TrainingSchedule"); + + b.Navigation("TrainingType"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.TrainingTicket", b => + { + b.HasOne("Memphis.Shared.Models.TrainingMilestone", "Milestone") + .WithMany() + .HasForeignKey("MilestoneId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "Trainer") + .WithMany() + .HasForeignKey("TrainerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Milestone"); + + b.Navigation("Trainer"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Memphis.Shared.Models.User", b => + { + b.HasOne("Memphis.Shared.Models.Certification", "Center") + .WithMany() + .HasForeignKey("CenterId"); + + b.HasOne("Memphis.Shared.Models.Certification", "Ground") + .WithMany() + .HasForeignKey("GroundId"); + + b.HasOne("Memphis.Shared.Models.Certification", "Tower") + .WithMany() + .HasForeignKey("TowerId"); + + b.HasOne("Memphis.Shared.Models.Certification", "Tracon") + .WithMany() + .HasForeignKey("TraconId"); + + b.Navigation("Center"); + + b.Navigation("Ground"); + + b.Navigation("Tower"); + + b.Navigation("Tracon"); + }); + + modelBuilder.Entity("RoleUser", b => + { + b.HasOne("Memphis.Shared.Models.Role", null) + .WithMany() + .HasForeignKey("RolesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("TrainingScheduleTrainingType", b => + { + b.HasOne("Memphis.Shared.Models.TrainingSchedule", null) + .WithMany() + .HasForeignKey("SchedulesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Memphis.Shared.Models.TrainingType", null) + .WithMany() + .HasForeignKey("TrainingTypesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Memphis.Shared/Migrations/20250403200925_News.cs b/Memphis.Shared/Migrations/20250403200925_News.cs new file mode 100644 index 0000000..85bf55d --- /dev/null +++ b/Memphis.Shared/Migrations/20250403200925_News.cs @@ -0,0 +1,61 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Memphis.Shared.Migrations +{ + /// + public partial class News : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_News_Users_AuthorId", + table: "News"); + + migrationBuilder.DropIndex( + name: "IX_News_AuthorId", + table: "News"); + + migrationBuilder.DropColumn( + name: "AuthorId", + table: "News"); + + migrationBuilder.AddColumn( + name: "Author", + table: "News", + type: "text", + nullable: false, + defaultValue: ""); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Author", + table: "News"); + + migrationBuilder.AddColumn( + name: "AuthorId", + table: "News", + type: "integer", + nullable: false, + defaultValue: 0); + + migrationBuilder.CreateIndex( + name: "IX_News_AuthorId", + table: "News", + column: "AuthorId"); + + migrationBuilder.AddForeignKey( + name: "FK_News_Users_AuthorId", + table: "News", + column: "AuthorId", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/Memphis.Shared/Migrations/DatabaseContextModelSnapshot.cs b/Memphis.Shared/Migrations/DatabaseContextModelSnapshot.cs index a8fde28..4946d2f 100644 --- a/Memphis.Shared/Migrations/DatabaseContextModelSnapshot.cs +++ b/Memphis.Shared/Migrations/DatabaseContextModelSnapshot.cs @@ -495,8 +495,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("AuthorId") - .HasColumnType("integer"); + b.Property("Author") + .IsRequired() + .HasColumnType("text"); b.Property("Content") .IsRequired() @@ -514,8 +515,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.HasIndex("AuthorId"); - b.ToTable("News"); }); @@ -1405,17 +1404,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("User"); }); - modelBuilder.Entity("Memphis.Shared.Models.News", b => - { - b.HasOne("Memphis.Shared.Models.User", "Author") - .WithMany() - .HasForeignKey("AuthorId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Author"); - }); - modelBuilder.Entity("Memphis.Shared.Models.Notification", b => { b.HasOne("Memphis.Shared.Models.User", "User") diff --git a/Memphis.Shared/Models/News.cs b/Memphis.Shared/Models/News.cs index b3d8a25..d8551b0 100644 --- a/Memphis.Shared/Models/News.cs +++ b/Memphis.Shared/Models/News.cs @@ -5,7 +5,7 @@ public class News public int Id { get; set; } public required string Title { get; set; } public required string Content { get; set; } - public required User Author { get; set; } + public required string Author { get; set; } public DateTimeOffset Created { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset Updated { get; set; } = DateTimeOffset.UtcNow; }