Changeset aee2b88 for iknow-api


Ignore:
Timestamp:
12/16/25 23:05:19 (9 months ago)
Author:
Stefan-Saveski <stefansaveski19@…>
Branches:
master
Children:
bb02e3a
Parents:
61fd94e
Message:

Upgraded database, added get subjects and get passed subjects.

Location:
iknow-api
Files:
1 added
14 edited
2 moved

Legend:

Unmodified
Added
Removed
  • iknow-api/Controllers/UserController.cs

    r61fd94e raee2b88  
    3131
    3232        }
    33         //"semesters": [
    34         //    {
    35         //      "id": 1,
    36         //      "semester": "Зимски(2025/2026)",
    37         //      "direction": "PIT23(2023)",
    38         //      "quota": "Не плаќа-Редовен(2023)",
    39         //      "note": "",
    40         //      "studentCom": "Ги имам си...",
    41         //      "sum": "0,30",
    42         //      "paid": "0,00",
    43         //      "ukim": "",
    44         //      "createdOn": "22.09.2025",
    45         //      "dateChanged": "22.09.2025",
    46         //      "credits": "0,01",
    47         //      "type": "Ред.",
    48         //      "doc": "Не",
    49         //      "doc1": "Не",
    50         //      "verified": "Не",
    51         //      "taxes": "0,00",
    52         //      "signatures": "0/5",
    53         //      "status": "валиден",
    54         //      "completed": "Не"
    55         //    },
    56         //    ]
    57         //}
    5833        [Authorize]
    5934        [HttpGet("getSemesters")]
     
    6742                var userData = await _userService.GetUserSemesters(token);
    6843                var results = new List<object>();
    69                
    70                 for(int i=0; i<userData.Count; i++)
     44
     45                for (int i = 0; i < userData.Count; i++)
    7146                {
    7247                    var newResult = new
    7348                    {
    7449                        id = userData[i].Id,
    75                         //semester = (userData[i].Type == 0 ? "Зимски" : "Летен") + $"({userData[i].Year}/{userData[i].Year + 1})",
     50                        semester = (userData[i].Semester.Type == 0 ? "Зимски" : "Летен") + $"({userData[i].Semester.Year}/{userData[i].Semester.Year + 1})",
    7651                        direction = userData[i].Major?.Name ?? "",
    7752                        quota = userData[i].QuotaType.ToString(),
     
    9974            }
    10075            return null;
    101 
    102         }
    103                 //        {
    104                 //    "user": [
    105                 //        {
    106                 //            "id": 2,
    107                 //            "userId": 1,
    108                 //            "user": null,
    109                 //            "year": 2025,
    110                 //            "type": 1,
    111                 //            "quotaType": "privatna",
    112                 //            "majorId": 1,
    113                 //            "major": {
    114                 //                "id": 1,
    115                 //                "name": "PIT(2023)",
    116                 //                "subjects": null
    117                 //            },
    118                 //            "users": null,
    119                 //            "semesterSubjects": null
    120                 //        },
    121                 //        {
    122                 //    "id": 1,
    123                 //            "userId": 1,
    124                 //            "user": null,
    125                 //            "year": 2025,
    126                 //            "type": 0,
    127                 //            "quotaType": "privatna",
    128                 //            "majorId": 1,
    129                 //            "major": {
    130                 //        "id": 1,
    131                 //                "name": "PIT(2023)",
    132                 //                "subjects": null
    133                 //            },
    134                 //            "users": null,
    135                 //            "semesterSubjects": null
    136                 //        }
    137                 //    ]
    138                 //}
     76        }
     77
     78        [Authorize]
     79        [HttpGet("getSubjects")]
     80        public async Task<IActionResult> getSubjects()
     81        {
     82            var authHeader = Request.Headers["Authorization"].ToString();
     83            var token = authHeader.Substring("Bearer ".Length).Trim();
     84            // token = your JWT
     85            var userData = await _userService.GetUserSemesters(token);
     86            var results = new List<object>();
     87            var random = new Random();
     88            for (int i = 0; i < userData.Count; i++)
     89            {
     90                var newResult = new
     91                {
     92                    id = userData[i].Id,
     93                    name = (userData[i].Semester.Type == 0 ? "Зимски" : "Летен") + $"({userData[i].Semester.Year}/{userData[i].Semester.Year + 1})",
     94                    status = "валиден",
     95                    serviceNumber = 1000000 + random.Next(10000, 100000)
     96                };
     97                results.Add(newResult);
     98            }
     99               
     100           
     101            var subjectsBySemester = new Dictionary<string, List<object>>();
     102
     103            foreach (var enrollment in userData)
     104            {
     105                // Create semester key like "winter_2025_2026" or "summer_2025_2026"
     106                var semesterType = enrollment.Semester.Type == 0 ? "winter" : "summer";
     107                var semesterKey = $"{semesterType}_{enrollment.Semester.Year}_{enrollment.Semester.Year + 1}";
     108
     109                // Initialize list if this semester key doesn't exist
     110                if (!subjectsBySemester.ContainsKey(semesterKey))
     111                {
     112                    subjectsBySemester[semesterKey] = new List<object>();
     113                }
     114
     115                // Add subjects from this semester enrollment
     116                if (enrollment.SemesterSubjects != null)
     117                {
     118                    foreach (var semesterSubject in enrollment.SemesterSubjects)
     119                    {
     120                        var subject = semesterSubject.Subject;
     121                        if (subject != null)
     122                        {
     123                            var subjectData = new
     124                            {
     125                                id = subject.Id,
     126                                code = subject.Code ?? "",
     127                                hours = "2+4", // You may need to add this to your Subject model
     128                                kojPat = 1, // You may need to add this field
     129                                name = subject.Name ?? "",
     130                                semester = 5, // You may need to calculate or add this field
     131                                status = "Зад.", // Determine based on PassedSubject or other logic
     132                                signature = semesterSubject.Signature ? "Да" : "Не",
     133                                group = "", // You may need to add this field
     134                                professor = semesterSubject.Professor?.Name + " " + semesterSubject.Professor?.Surname ?? "",
     135                            };
     136                            subjectsBySemester[semesterKey].Add(subjectData);
     137                        }
     138                    }
     139                }
     140               
     141            }
     142            var currentSemester = userData.FirstOrDefault(); // Get the most recent/current semester
     143            var semesterTypeGlobal = currentSemester.Semester.Type == 0 ? "winter" : "summer";
     144            var semesterData = new
     145            {
     146                id = $"{semesterTypeGlobal}_{currentSemester.Semester.Year}_{currentSemester.Semester.Year + 1}",
     147                name = (currentSemester.Semester.Type == 0 ? "Зимски" : "Летен") + $" ({currentSemester.Semester.Year}/{currentSemester.Semester.Year + 1})",
     148                status = "валиден",
     149                serviceNumber = (1000000 + random.Next(10000, 100000)).ToString(),
     150                ticketNumber = random.Next(100000, 1000000).ToString(),
     151                debt = "0,00",
     152                financialInfo = new
     153                {
     154                    sum = 1,
     155                    paid = "0,00",
     156                    due = "0,00",
     157                    materialCosts = "Осигурување, Административна такса, Тетратки (испити), зимски семестар: 1000,00",
     158                    credits = "30,00",
     159                    totalCredits = "30,00",
     160                    MKSA = "750,00",
     161                    electronicRegistration = "100,00",
     162                    eUKIM = "350,00",
     163                    bankProvision = "25,00",
     164                    total = "2226,00"
     165                }
     166            };
     167            if (userData == null) return Ok(new { info = "can't get info" });
     168            //return Ok(new { semester = userData });
     169            return Ok(new { semesters = results, currentSemestar = semesterData, subjectsBySemester = subjectsBySemester });
     170        }
     171
     172        [Authorize]
     173        [HttpGet("getPassedSubjects")]
     174        public async Task<IActionResult> getPassedSubjects()
     175        {
     176            var authHeader = Request.Headers["Authorization"].ToString();
     177            if (!authHeader.StartsWith("Bearer "))
     178                return Unauthorized();
     179
     180            var token = authHeader.Substring("Bearer ".Length).Trim();
     181            var passedSubjects = await _userService.GetUserPassedSubjects(token);
     182
     183            if (passedSubjects == null || !passedSubjects.Any())
     184                return Ok(new { info = "No passed subjects found", passedSubjects = new List<object>() });
     185
     186            var results = new List<object>();
     187
     188            foreach (var passed in passedSubjects)
     189            {
     190                if (passed.SemesterSubject?.Subject != null)
     191                {
     192                    var result = new
     193                    {
     194                        id = passed.Id,
     195                        subjectId = passed.SemesterSubject.Subject.Id,
     196                        code = passed.SemesterSubject.Subject.Code ?? "",
     197                        subject = passed.SemesterSubject.Subject.Name ?? "",
     198                        credits = passed.SemesterSubject.Subject.AwardedCredits ?? 0,
     199                        grade = (int)passed.Grade,
     200                        gradeText = passed.Grade.ToString(),
     201                        date = passed.DatePassed.ToString("dd.MM.yyyy"),
     202                        semester = passed.SemesterSubject.EnrolledSemester?.Semester != null
     203                            ? (passed.SemesterSubject.EnrolledSemester.Semester.Type == 0 ? "Зимски" : "Летен") +
     204                              $" ({passed.SemesterSubject.EnrolledSemester.Semester.Year}/{passed.SemesterSubject.EnrolledSemester.Semester.Year + 1})"
     205                            : "",
     206                        professor = passed.SemesterSubject.Professor != null
     207                            ? $"{passed.SemesterSubject.Professor.Name} {passed.SemesterSubject.Professor.Surname}".Trim()
     208                            : ""
     209                    };
     210                    results.Add(result);
     211                }
     212            }
     213
     214            return Ok(new { passedSubjects = results });
     215        }
     216
    139217    }
    140218}
  • iknow-api/Data/AppDbContext.cs

    r61fd94e raee2b88  
    2525        public DbSet<Documents> Documents { get; set; }
    2626        public DbSet<Payment> Payments { get; set; }
     27        public DbSet<ProfessorSubjects> ProfessorSubjects { get; set; }
    2728
    2829
     
    165166                .HasForeignKey(es => es.Id)
    166167                .OnDelete(DeleteBehavior.Restrict);
     168
     169            // -------------------------
     170            // ProfessorSubjects (many-to-many: Professor -> Semester -> Subject)
     171            // -------------------------
     172            modelBuilder.Entity<ProfessorSubjects>()
     173                .HasKey(ps => new { ps.ProfessorId, ps.SemesterId, ps.SubjectId });
     174
     175            modelBuilder.Entity<ProfessorSubjects>()
     176                .HasOne(ps => ps.Professor)
     177                .WithMany()
     178                .HasForeignKey(ps => ps.ProfessorId)
     179                .OnDelete(DeleteBehavior.Cascade);
     180
     181            modelBuilder.Entity<ProfessorSubjects>()
     182                .HasOne(ps => ps.Semester)
     183                .WithMany()
     184                .HasForeignKey(ps => ps.SemesterId)
     185                .OnDelete(DeleteBehavior.Cascade);
     186
     187            modelBuilder.Entity<ProfessorSubjects>()
     188                .HasOne(ps => ps.Subject)
     189                .WithMany()
     190                .HasForeignKey(ps => ps.SubjectId)
     191                .OnDelete(DeleteBehavior.Cascade);
    167192        }
    168193
  • iknow-api/Migrations/20251216191800_InitialCreate.Designer.cs

    r61fd94e raee2b88  
    1313{
    1414    [DbContext(typeof(AppDbContext))]
    15     [Migration("20251211135004_inital")]
    16     partial class inital
     15    [Migration("20251216191800_InitialCreate")]
     16    partial class InitialCreate
    1717    {
    1818        /// <inheritdoc />
     
    2828            modelBuilder.Entity("iknow_api.Models.ActiveSemesters", b =>
    2929                {
    30                     b.Property<int>("id")
    31                         .ValueGeneratedOnAdd()
    32                         .HasColumnType("integer");
    33 
    34                     NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("id"));
     30                    b.Property<int>("Id")
     31                        .ValueGeneratedOnAdd()
     32                        .HasColumnType("integer");
     33
     34                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
    3535
    3636                    b.Property<int>("Type")
    3737                        .HasColumnType("integer");
    3838
    39                     b.Property<int>("year")
    40                         .HasColumnType("integer");
    41 
    42                     b.HasKey("id");
     39                    b.Property<int>("Year")
     40                        .HasColumnType("integer");
     41
     42                    b.HasKey("Id");
    4343
    4444                    b.ToTable("ActiveSemesters");
     
    130130                        .HasColumnType("integer");
    131131
    132                     b.Property<string>("Node")
     132                    b.Property<string>("Note")
    133133                        .HasColumnType("text");
    134134
     
    136136                        .HasColumnType("integer");
    137137
     138                    b.Property<int>("SemesterId")
     139                        .HasColumnType("integer");
     140
    138141                    b.Property<string>("StudentComment")
    139142                        .HasColumnType("text");
     
    142145                        .HasColumnType("integer");
    143146
    144                     b.Property<DateTime>("Veryfied")
     147                    b.Property<DateTime>("Verified")
    145148                        .HasColumnType("timestamp with time zone");
    146149
     
    162165                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
    163166
     167                    b.Property<int>("EnrollmentYear")
     168                        .HasColumnType("integer");
     169
    164170                    b.Property<int>("MajorId")
    165171                        .HasColumnType("integer");
    166172
     173                    b.Property<int>("Quota")
     174                        .HasColumnType("integer");
     175
    167176                    b.Property<string>("StudyStatus")
    168177                        .HasColumnType("text");
     
    172181
    173182                    b.Property<int>("UserId")
    174                         .HasColumnType("integer");
    175 
    176                     b.Property<int>("enrollmentYear")
    177                         .HasColumnType("integer");
    178 
    179                     b.Property<int>("quota")
    180183                        .HasColumnType("integer");
    181184
     
    325328                });
    326329
     330            modelBuilder.Entity("iknow_api.Models.ProfessorSubjects", b =>
     331                {
     332                    b.Property<int>("ProfessorId")
     333                        .HasColumnType("integer");
     334
     335                    b.Property<int>("SemesterId")
     336                        .HasColumnType("integer");
     337
     338                    b.Property<int>("SubjectId")
     339                        .HasColumnType("integer");
     340
     341                    b.HasKey("ProfessorId", "SemesterId", "SubjectId");
     342
     343                    b.HasIndex("SemesterId");
     344
     345                    b.HasIndex("SubjectId");
     346
     347                    b.ToTable("ProfessorSubjects");
     348                });
     349
    327350            modelBuilder.Entity("iknow_api.Models.RefreshToken", b =>
    328351                {
     
    616639                });
    617640
     641            modelBuilder.Entity("iknow_api.Models.ProfessorSubjects", b =>
     642                {
     643                    b.HasOne("iknow_api.Models.User", "Professor")
     644                        .WithMany()
     645                        .HasForeignKey("ProfessorId")
     646                        .OnDelete(DeleteBehavior.Cascade)
     647                        .IsRequired();
     648
     649                    b.HasOne("iknow_api.Models.ActiveSemesters", "Semester")
     650                        .WithMany()
     651                        .HasForeignKey("SemesterId")
     652                        .OnDelete(DeleteBehavior.Cascade)
     653                        .IsRequired();
     654
     655                    b.HasOne("iknow_api.Models.Subject", "Subject")
     656                        .WithMany()
     657                        .HasForeignKey("SubjectId")
     658                        .OnDelete(DeleteBehavior.Cascade)
     659                        .IsRequired();
     660
     661                    b.Navigation("Professor");
     662
     663                    b.Navigation("Semester");
     664
     665                    b.Navigation("Subject");
     666                });
     667
    618668            modelBuilder.Entity("iknow_api.Models.RefreshToken", b =>
    619669                {
  • iknow-api/Migrations/20251216191800_InitialCreate.cs

    r61fd94e raee2b88  
    1010{
    1111    /// <inheritdoc />
    12     public partial class inital : Migration
     12    public partial class InitialCreate : Migration
    1313    {
    1414        /// <inheritdoc />
     
    1919                columns: table => new
    2020                {
    21                     id = table.Column<int>(type: "integer", nullable: false)
    22                         .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
    23                     year = table.Column<int>(type: "integer", nullable: false),
     21                    Id = table.Column<int>(type: "integer", nullable: false)
     22                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
     23                    Year = table.Column<int>(type: "integer", nullable: false),
    2424                    Type = table.Column<int>(type: "integer", nullable: false)
    2525                },
    2626                constraints: table =>
    2727                {
    28                     table.PrimaryKey("PK_ActiveSemesters", x => x.id);
     28                    table.PrimaryKey("PK_ActiveSemesters", x => x.Id);
    2929                });
    3030
     
    181181                    MajorId = table.Column<int>(type: "integer", nullable: false),
    182182                    StudentComment = table.Column<string>(type: "text", nullable: true),
    183                     Node = table.Column<string>(type: "text", nullable: true),
     183                    Note = table.Column<string>(type: "text", nullable: true),
    184184                    CratedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
    185185                    LastChange = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
    186                     Veryfied = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
     186                    Verified = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
     187                    SemesterId = table.Column<int>(type: "integer", nullable: false)
    187188                },
    188189                constraints: table =>
     
    193194                        column: x => x.Id,
    194195                        principalTable: "ActiveSemesters",
    195                         principalColumn: "id",
     196                        principalColumn: "Id",
    196197                        onDelete: ReferentialAction.Restrict);
    197198                    table.ForeignKey(
     
    215216                    Id = table.Column<int>(type: "integer", nullable: false)
    216217                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
    217                     enrollmentYear = table.Column<int>(type: "integer", nullable: false),
    218                     quota = table.Column<int>(type: "integer", nullable: false),
     218                    EnrollmentYear = table.Column<int>(type: "integer", nullable: false),
     219                    Quota = table.Column<int>(type: "integer", nullable: false),
    219220                    MajorId = table.Column<int>(type: "integer", nullable: false),
    220221                    UserId = table.Column<int>(type: "integer", nullable: false),
     
    256257                        name: "FK_HighSchool_User_UserId",
    257258                        column: x => x.UserId,
     259                        principalTable: "User",
     260                        principalColumn: "Id",
     261                        onDelete: ReferentialAction.Cascade);
     262                });
     263
     264            migrationBuilder.CreateTable(
     265                name: "ProfessorSubjects",
     266                columns: table => new
     267                {
     268                    ProfessorId = table.Column<int>(type: "integer", nullable: false),
     269                    SemesterId = table.Column<int>(type: "integer", nullable: false),
     270                    SubjectId = table.Column<int>(type: "integer", nullable: false)
     271                },
     272                constraints: table =>
     273                {
     274                    table.PrimaryKey("PK_ProfessorSubjects", x => new { x.ProfessorId, x.SemesterId, x.SubjectId });
     275                    table.ForeignKey(
     276                        name: "FK_ProfessorSubjects_ActiveSemesters_SemesterId",
     277                        column: x => x.SemesterId,
     278                        principalTable: "ActiveSemesters",
     279                        principalColumn: "Id",
     280                        onDelete: ReferentialAction.Cascade);
     281                    table.ForeignKey(
     282                        name: "FK_ProfessorSubjects_Subjects_SubjectId",
     283                        column: x => x.SubjectId,
     284                        principalTable: "Subjects",
     285                        principalColumn: "Id",
     286                        onDelete: ReferentialAction.Cascade);
     287                    table.ForeignKey(
     288                        name: "FK_ProfessorSubjects_User_ProfessorId",
     289                        column: x => x.ProfessorId,
    258290                        principalTable: "User",
    259291                        principalColumn: "Id",
     
    466498
    467499            migrationBuilder.CreateIndex(
     500                name: "IX_ProfessorSubjects_SemesterId",
     501                table: "ProfessorSubjects",
     502                column: "SemesterId");
     503
     504            migrationBuilder.CreateIndex(
     505                name: "IX_ProfessorSubjects_SubjectId",
     506                table: "ProfessorSubjects",
     507                column: "SubjectId");
     508
     509            migrationBuilder.CreateIndex(
    468510                name: "IX_RefreshToken_UserId",
    469511                table: "RefreshToken",
     
    521563
    522564            migrationBuilder.DropTable(
     565                name: "ProfessorSubjects");
     566
     567            migrationBuilder.DropTable(
    523568                name: "RefreshToken");
    524569
  • iknow-api/Migrations/AppDbContextModelSnapshot.cs

    r61fd94e raee2b88  
    2525            modelBuilder.Entity("iknow_api.Models.ActiveSemesters", b =>
    2626                {
    27                     b.Property<int>("id")
    28                         .ValueGeneratedOnAdd()
    29                         .HasColumnType("integer");
    30 
    31                     NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("id"));
     27                    b.Property<int>("Id")
     28                        .ValueGeneratedOnAdd()
     29                        .HasColumnType("integer");
     30
     31                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
    3232
    3333                    b.Property<int>("Type")
    3434                        .HasColumnType("integer");
    3535
    36                     b.Property<int>("year")
    37                         .HasColumnType("integer");
    38 
    39                     b.HasKey("id");
     36                    b.Property<int>("Year")
     37                        .HasColumnType("integer");
     38
     39                    b.HasKey("Id");
    4040
    4141                    b.ToTable("ActiveSemesters");
     
    127127                        .HasColumnType("integer");
    128128
    129                     b.Property<string>("Node")
     129                    b.Property<string>("Note")
    130130                        .HasColumnType("text");
    131131
     
    133133                        .HasColumnType("integer");
    134134
     135                    b.Property<int>("SemesterId")
     136                        .HasColumnType("integer");
     137
    135138                    b.Property<string>("StudentComment")
    136139                        .HasColumnType("text");
     
    139142                        .HasColumnType("integer");
    140143
    141                     b.Property<DateTime>("Veryfied")
     144                    b.Property<DateTime>("Verified")
    142145                        .HasColumnType("timestamp with time zone");
    143146
     
    159162                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
    160163
     164                    b.Property<int>("EnrollmentYear")
     165                        .HasColumnType("integer");
     166
    161167                    b.Property<int>("MajorId")
    162168                        .HasColumnType("integer");
    163169
     170                    b.Property<int>("Quota")
     171                        .HasColumnType("integer");
     172
    164173                    b.Property<string>("StudyStatus")
    165174                        .HasColumnType("text");
     
    169178
    170179                    b.Property<int>("UserId")
    171                         .HasColumnType("integer");
    172 
    173                     b.Property<int>("enrollmentYear")
    174                         .HasColumnType("integer");
    175 
    176                     b.Property<int>("quota")
    177180                        .HasColumnType("integer");
    178181
     
    322325                });
    323326
     327            modelBuilder.Entity("iknow_api.Models.ProfessorSubjects", b =>
     328                {
     329                    b.Property<int>("ProfessorId")
     330                        .HasColumnType("integer");
     331
     332                    b.Property<int>("SemesterId")
     333                        .HasColumnType("integer");
     334
     335                    b.Property<int>("SubjectId")
     336                        .HasColumnType("integer");
     337
     338                    b.HasKey("ProfessorId", "SemesterId", "SubjectId");
     339
     340                    b.HasIndex("SemesterId");
     341
     342                    b.HasIndex("SubjectId");
     343
     344                    b.ToTable("ProfessorSubjects");
     345                });
     346
    324347            modelBuilder.Entity("iknow_api.Models.RefreshToken", b =>
    325348                {
     
    613636                });
    614637
     638            modelBuilder.Entity("iknow_api.Models.ProfessorSubjects", b =>
     639                {
     640                    b.HasOne("iknow_api.Models.User", "Professor")
     641                        .WithMany()
     642                        .HasForeignKey("ProfessorId")
     643                        .OnDelete(DeleteBehavior.Cascade)
     644                        .IsRequired();
     645
     646                    b.HasOne("iknow_api.Models.ActiveSemesters", "Semester")
     647                        .WithMany()
     648                        .HasForeignKey("SemesterId")
     649                        .OnDelete(DeleteBehavior.Cascade)
     650                        .IsRequired();
     651
     652                    b.HasOne("iknow_api.Models.Subject", "Subject")
     653                        .WithMany()
     654                        .HasForeignKey("SubjectId")
     655                        .OnDelete(DeleteBehavior.Cascade)
     656                        .IsRequired();
     657
     658                    b.Navigation("Professor");
     659
     660                    b.Navigation("Semester");
     661
     662                    b.Navigation("Subject");
     663                });
     664
    615665            modelBuilder.Entity("iknow_api.Models.RefreshToken", b =>
    616666                {
  • iknow-api/Models/ActiveSemester.cs

    r61fd94e raee2b88  
    1 using Microsoft.VisualBasic;
     1
     2
     3
    24
    35namespace iknow_api.Models
     
    911    public class ActiveSemesters
    1012    {
    11         public int id { get; set; }
    12         public int year { get; set; }
     13        public int Id { get; set; }
     14        public int Year { get; set; }
    1315        public sType Type { get; set; }
    1416        public ICollection<EnrolledSemesters>? EnrolledSemesters { get; set; }
  • iknow-api/Models/EnrolledSemesters.cs

    r61fd94e raee2b88  
    55    public class EnrolledSemesters
    66    {
     7        //Add type of semester winter/summer
    78        public int Id { get; set; }
    89        public int UserId { get; set; }
     
    1112        public int MajorId { get; set; }
    1213        public string? StudentComment { get; set; }
    13         public string? Node { get; set; }
     14        public string? Note { get; set; }
    1415        public DateTime CratedAt { get; set; }
    1516        public DateTime LastChange { get; set; }
    16         public DateTime Veryfied { get; set; }
     17        public DateTime Verified { get; set; }
     18        public int SemesterId { get; set; }
    1719        public ActiveSemesters? Semester { get; set; }
    1820        public Major? Major { get; set; }
  • iknow-api/Models/EnrollmentInfo.cs

    r61fd94e raee2b88  
    1212    {
    1313        public int Id { get; set; }
    14         public int enrollmentYear { get; set; }
    15         public Quota quota { get; set; }
     14        public int EnrollmentYear { get; set; }
     15        public Quota Quota { get; set; }
    1616        public int MajorId { get; set; }
    1717        public Major? Major { get; set; }
  • iknow-api/Models/Subjects.cs

    r61fd94e raee2b88  
    1212        public ICollection<MajorSubjects>? Majors { get; set; }
    1313        public ICollection<SemesterSubject>? SemesterSubjects { get; set; }
     14       
    1415    }
    1516}
  • iknow-api/Repository/Implementations/UserRepository.cs

    r61fd94e raee2b88  
    6666        {
    6767            return await _context.EnrolledSemesters
     68                .AsNoTracking()
    6869                .Include(es => es.Major)
     70                .Include(es => es.Semester)
     71                .Include(es => es.SemesterSubjects)
     72                    .ThenInclude(ss => ss.Subject)
     73                .Include(es => es.SemesterSubjects)
     74                    .ThenInclude(ss => ss.Professor)
    6975                .Where(es => es.UserId == id)
     76                .AsSplitQuery() // This helps avoid cartesian explosion
     77                .ToListAsync();
     78        }
     79
     80        public async Task<List<PassedSubject>> GetUserPassedSubjectsAsync(int id)
     81        {
     82            return await _context.PassedSubjects
     83                .AsNoTracking()
     84                .Include(ps => ps.SemesterSubject)
     85                    .ThenInclude(ss => ss.Subject)
     86                .Include(ps => ps.SemesterSubject)
     87                    .ThenInclude(ss => ss.EnrolledSemester)
     88                        .ThenInclude(es => es.Semester)
     89                .Include(ps => ps.SemesterSubject)
     90                    .ThenInclude(ss => ss.Professor)
     91                .Where(ps => ps.SemesterSubject.UserId == id)
    7092                .ToListAsync();
    7193        }
  • iknow-api/Repository/Interface/IUserRepository.cs

    r61fd94e raee2b88  
    1414        Task<List<EnrolledSemesters>?> GetUserSemestersAsync(int id);
    1515        Task<User?> GetOnlyUserByIdAsync(int id);
    16 
     16        Task<List<PassedSubject>> GetUserPassedSubjectsAsync(int id);
    1717    }
    1818}
  • iknow-api/Services/Implementations/AuthService.cs

    r61fd94e raee2b88  
    8888                {
    8989                    UserId = userId,
    90                     enrollmentYear = registerDto.enrollmentYear,
    91                     quota = (Models.Quota)registerDto.quotaType,
     90                    EnrollmentYear = registerDto.enrollmentYear,
     91                    Quota = (Models.Quota)registerDto.quotaType,
    9292                    MajorId = registerDto.majorType,
    9393                    StudyStatus = registerDto.studyStatus,
  • iknow-api/Services/Implementations/UserService.cs

    r61fd94e raee2b88  
    4848        }
    4949
     50        public async Task<List<PassedSubject>> GetUserPassedSubjects(string JWT)
     51        {
     52            var userId = ExtractUserIdFromJwt(JWT);
     53            if (userId == null)
     54                return null;
     55
     56            var passedSubjects = await _userRepository.GetUserPassedSubjectsAsync(userId.Value);
     57            if (passedSubjects == null)
     58                return null;
     59            else
     60                return passedSubjects;
     61        }
     62
    5063        private int? ExtractUserIdFromJwt(string token)
    5164        {
  • iknow-api/Services/Interfaces/IUserService.cs

    r61fd94e raee2b88  
    77        Task<User> GetUserData(string userId);
    88        Task<List<EnrolledSemesters>> GetUserSemesters(string userId);
     9        Task<List<PassedSubject>> GetUserPassedSubjects(string userId);
    910    }
    1011}
  • iknow-api/appsettings.Development.json

    r61fd94e raee2b88  
    77  },
    88  "ConnectionStrings": {
    9     "DefaultConnection": "Host=ep-blue-glitter-ag6m81xo-pooler.c-2.eu-central-1.aws.neon.tech; Database=neondb; Username=neondb_owner; Password=npg_SxbBZmtw4I7P; SSL Mode=VerifyFull; Channel Binding=Require;"
     9    "DefaultConnection": "Host=ep-divine-term-aghfotgc-pooler.c-2.eu-central-1.aws.neon.tech; Database=neondb; Username=neondb_owner; Password=npg_SxbBZmtw4I7P; SSL Mode=VerifyFull; Channel Binding=Require;"
    1010  }
    1111}
  • iknow-api/appsettings.json

    r61fd94e raee2b88  
    77  },
    88  "ConnectionStrings": {
    9     "DefaultConnection": "Host=ep-blue-glitter-ag6m81xo-pooler.c-2.eu-central-1.aws.neon.tech; Database=neondb; Username=neondb_owner; Password=npg_SxbBZmtw4I7P; SSL Mode=VerifyFull; Channel Binding=Require;"
     9    "DefaultConnection": "Host=ep-divine-term-aghfotgc-pooler.c-2.eu-central-1.aws.neon.tech; Database=neondb; Username=neondb_owner; Password=npg_SxbBZmtw4I7P; SSL Mode=VerifyFull; Channel Binding=Require;"
    1010  },
    1111  "Jwt": {
Note: See TracChangeset for help on using the changeset viewer.