source: iknow-api/Data/AppDbContext.cs@ bb656bc

Last change on this file since bb656bc was c2f79d7, checked in by Stefan-Saveski <stefan@…>, 10 months ago

Refactor and enhance application structure

Enhanced error handling in AuthController with detailed exception handling for user registration. Updated UserDTO to improve JSON serialization and renamed enums for clarity. Introduced new entities (Major, PassedSubject, etc.) and seeded initial data in AppDbContext.

Replaced legacy migrations with 20251208203846_InitialCreate, reflecting the updated schema. Fixed typographical errors and improved JSON serialization in Program.cs with case-insensitive property matching and enum handling.

Refactored repository interfaces for better null safety. Improved debugging in AuthService and updated connection strings. Added the PassedSubject entity and cleaned up redundant code and unused imports for better maintainability.

  • Property mode set to 100644
File size: 6.0 KB
Line 
1using Microsoft.EntityFrameworkCore;
2using iknow_api.Models;
3
4namespace iknow_api.Data
5{
6 public class AppDbContext : DbContext
7 {
8 public AppDbContext(DbContextOptions<AppDbContext> options)
9 : base(options) { }
10
11 public DbSet<User> User { get; set; }
12 public DbSet<ContactInfo> ContactInfo { get; set; }
13 public DbSet<HighSchool> HighSchool { get; set; }
14 public DbSet<EnrollmentInfo> EnrollmentInfo { get; set; }
15 public DbSet<RefreshToken> RefreshToken { get; set; }
16
17 public DbSet<Subject> Subjects { get; set; }
18 public DbSet<DependencySubject> DependencySubjects { get; set; }
19 public DbSet<Major> Majors { get; set; }
20 public DbSet<PassedSubject> PassedSubjects { get; set; }
21
22
23 protected override void OnModelCreating(ModelBuilder modelBuilder)
24 {
25 base.OnModelCreating(modelBuilder);
26
27 modelBuilder.Entity<Major>().HasData(
28 new Major { Id = 1, Name = "PIT" },
29 new Major { Id = 2, Name = "SIIS" },
30 new Major { Id = 3, Name = "SEIS" },
31 new Major { Id = 4, Name = "KN" }
32 );
33
34
35 // -------------------------
36 // DependencySubject (self-referencing many-to-many)
37 // -------------------------
38 modelBuilder.Entity<DependencySubject>()
39 .HasKey(ds => new { ds.SubjectId, ds.DependencyId });
40
41 modelBuilder.Entity<DependencySubject>()
42 .HasOne(ds => ds.Subject)
43 .WithMany(s => s.Dependencies)
44 .HasForeignKey(ds => ds.SubjectId)
45 .OnDelete(DeleteBehavior.Restrict);
46
47 modelBuilder.Entity<DependencySubject>()
48 .HasOne(ds => ds.Dependency)
49 .WithMany(s => s.Dependents)
50 .HasForeignKey(ds => ds.DependencyId)
51 .OnDelete(DeleteBehavior.Restrict);
52
53 // -------------------------
54 // MajorSubjects (many-to-many)
55 // -------------------------
56 modelBuilder.Entity<MajorSubjects>()
57 .HasKey(ab => new { ab.MajorId, ab.SubjectId });
58
59 modelBuilder.Entity<MajorSubjects>()
60 .HasOne(ab => ab.Majors)
61 .WithMany(a => a.Subjects)
62 .HasForeignKey(ab => ab.MajorId)
63 .OnDelete(DeleteBehavior.Cascade);
64
65 modelBuilder.Entity<MajorSubjects>()
66 .HasOne(ab => ab.Subjects)
67 .WithMany(b => b.Majors)
68 .HasForeignKey(ab => ab.SubjectId)
69 .OnDelete(DeleteBehavior.Cascade);
70
71 // -------------------------
72 // UserDocuments (many-to-many)
73 // -------------------------
74 modelBuilder.Entity<UserDocuments>()
75 .HasKey(ab => new { ab.UserId, ab.DocumentId });
76
77 modelBuilder.Entity<UserDocuments>()
78 .HasOne(ab => ab.User)
79 .WithMany(a => a.Documents)
80 .HasForeignKey(ab => ab.UserId)
81 .OnDelete(DeleteBehavior.Cascade);
82
83 modelBuilder.Entity<UserDocuments>()
84 .HasOne(ab => ab.Documents)
85 .WithMany(b => b.User)
86 .HasForeignKey(ab => ab.DocumentId)
87 .OnDelete(DeleteBehavior.Cascade);
88
89 // -------------------------
90 // Payment (user enrollment)
91 // -------------------------
92 modelBuilder.Entity<Payment>()
93 .HasKey(ab => new { ab.UserId, ab.EnrollmentInfoId });
94
95 modelBuilder.Entity<Payment>()
96 .HasOne(ab => ab.User)
97 .WithMany(a => a.EnrolledSemesters)
98 .HasForeignKey(ab => ab.UserId)
99 .OnDelete(DeleteBehavior.Cascade);
100
101 modelBuilder.Entity<Payment>()
102 .HasOne(ab => ab.EnrolledSemesters)
103 .WithMany(b => b.Users)
104 .HasForeignKey(ab => ab.EnrollmentInfoId)
105 .OnDelete(DeleteBehavior.Cascade);
106
107 // -------------------------
108 // SemesterSubject (student enrollments and professor assignments)
109 // -------------------------
110 modelBuilder.Entity<SemesterSubject>()
111 .HasKey(ss => ss.Id); // or composite key if you prefer {UserId, EnrolledSemesterId, SubjectId}
112
113 // Student enrollment
114 modelBuilder.Entity<SemesterSubject>()
115 .HasOne(ss => ss.User)
116 .WithMany(u => u.EnrolledSemesterUserSubjects)
117 .HasForeignKey(ss => ss.UserId)
118 .OnDelete(DeleteBehavior.Restrict);
119
120 // Professor teaching
121 modelBuilder.Entity<SemesterSubject>()
122 .HasOne(ss => ss.Professor)
123 .WithMany(u => u.TeachingSubjects)
124 .HasForeignKey(ss => ss.ProfessorId)
125 .OnDelete(DeleteBehavior.Restrict);
126
127 // Subject relation
128 modelBuilder.Entity<SemesterSubject>()
129 .HasOne(ss => ss.Subject)
130 .WithMany(s => s.SemesterSubjects)
131 .HasForeignKey(ss => ss.SubjectId)
132 .OnDelete(DeleteBehavior.Restrict);
133
134 // EnrolledSemester relation
135 modelBuilder.Entity<SemesterSubject>()
136 .HasOne(ss => ss.EnrolledSemester)
137 .WithMany(es => es.SemesterSubjects)
138 .HasForeignKey(ss => ss.EnrolledSemesterId)
139 .OnDelete(DeleteBehavior.Restrict);
140
141 // -------------------------
142 // PassedSubject (one-to-one with SemesterSubject)
143 // -------------------------
144 modelBuilder.Entity<PassedSubject>()
145 .HasKey(ps => ps.Id);
146
147 modelBuilder.Entity<PassedSubject>()
148 .HasOne(ps => ps.SemesterSubject)
149 .WithOne(ss => ss.PassedSubject)
150 .HasForeignKey<PassedSubject>(ps => ps.SemesterSubjectId)
151 .OnDelete(DeleteBehavior.Cascade);
152 }
153
154 }
155}
Note: See TracBrowser for help on using the repository browser.