Changeset c2f79d7
- Timestamp:
- 12/08/25 21:51:12 (10 months ago)
- Branches:
- master
- Children:
- bb656bc
- Parents:
- a92a2a4
- Location:
- iknow-api
- Files:
-
- 3 added
- 2 deleted
- 14 edited
-
Controllers/AuthController.cs (modified) (2 diffs)
-
DTOs/UserDTO.cs (modified) (4 diffs)
-
Data/AppDbContext.cs (modified) (3 diffs)
-
Migrations/20251030124902_new.Designer.cs (deleted)
-
Migrations/20251030124902_new.cs (deleted)
-
Migrations/20251208203846_InitialCreate.Designer.cs (added)
-
Migrations/20251208203846_InitialCreate.cs (added)
-
Migrations/AppDbContextModelSnapshot.cs (modified) (10 diffs)
-
Models/EnrollmentInfo.cs (modified) (1 diff)
-
Models/PassedSubject.cs (added)
-
Models/SemesterSubjects.cs (modified) (1 diff)
-
Models/User.cs (modified) (1 diff)
-
Program.cs (modified) (1 diff)
-
Repository/Implementations/UserRepository.cs (modified) (2 diffs)
-
Repository/Interface/IUserRepository.cs (modified) (2 diffs)
-
Services/Implementations/AuthService.cs (modified) (1 diff)
-
Services/Interfaces/IAuthService.cs (modified) (2 diffs)
-
appsettings.Development.json (modified) (1 diff)
-
appsettings.json (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
iknow-api/Controllers/AuthController.cs
ra92a2a4 rc2f79d7 37 37 public async Task<IActionResult> Register([FromBody] RegisterDto request) 38 38 { 39 var result = await _authService.RegisterAsync(request); 40 if (!result) return BadRequest("User already exists"); 41 return Ok("User registered successfully"); 39 //Console.WriteLine(request); 40 41 try 42 { 43 var result = await _authService.RegisterAsync(request); 44 return Ok("User registered successfully"); 45 } 46 catch (InvalidOperationException ex) 47 { 48 return BadRequest(new { message = ex.Message }); 49 } 50 catch (Exception ex) 51 { 52 return StatusCode(500, new { message = "An error occurred during registration", error = ex.Message }); 53 } 42 54 } 43 55 … … 65 77 { return BadRequest(new { message = "No token found!" }); } 66 78 } 79 67 80 } 68 81 } -
iknow-api/DTOs/UserDTO.cs
ra92a2a4 rc2f79d7 1 namespace iknow_api.DTOs 1 using System.Text.Json.Serialization; 2 3 namespace iknow_api.DTOs 2 4 { 3 5 // Login DTO … … 25 27 public UserRole Role { get; set; } 26 28 public float gpa { get; set; } 27 public Type tip { get; set; }29 public HighSchoolType tip { get; set; } 28 30 public string city { get; set; } = string.Empty; 29 31 public string address { get; set; } = string.Empty; … … 57 59 Student 58 60 } 59 public enum Type61 public enum HighSchoolType 60 62 { 61 63 strucen, gimnazija … … 65 67 drzavna, privatna, stipendija 66 68 } 67 public enum Major68 {69 SIIS, PIT, KN, KI, IMB, IE, SSP, SEIS70 }71 69 } -
iknow-api/Data/AppDbContext.cs
ra92a2a4 rc2f79d7 17 17 public DbSet<Subject> Subjects { get; set; } 18 18 public DbSet<DependencySubject> DependencySubjects { get; set; } 19 public DbSet<Major> Majors { get; set; } 20 public DbSet<PassedSubject> PassedSubjects { get; set; } 19 21 20 22 … … 22 24 { 23 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 24 34 25 35 // ------------------------- … … 128 138 .HasForeignKey(ss => ss.EnrolledSemesterId) 129 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); 130 152 } 131 153 -
iknow-api/Migrations/AppDbContextModelSnapshot.cs
ra92a2a4 rc2f79d7 57 57 }); 58 58 59 modelBuilder.Entity("iknow_api.Models.DependencySubject", b => 60 { 61 b.Property<int>("SubjectId") 62 .HasColumnType("integer"); 63 64 b.Property<int>("DependencyId") 65 .HasColumnType("integer"); 66 67 b.HasKey("SubjectId", "DependencyId"); 68 69 b.HasIndex("DependencyId"); 70 71 b.ToTable("DependencySubjects"); 72 }); 73 74 modelBuilder.Entity("iknow_api.Models.Documents", b => 75 { 76 b.Property<int>("Id") 77 .ValueGeneratedOnAdd() 78 .HasColumnType("integer"); 79 80 NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); 81 82 b.Property<string>("body") 83 .HasColumnType("text"); 84 85 b.Property<int>("cost") 86 .HasColumnType("integer"); 87 88 b.Property<string>("name") 89 .HasColumnType("text"); 90 91 b.HasKey("Id"); 92 93 b.ToTable("Documents"); 94 }); 95 96 modelBuilder.Entity("iknow_api.Models.EnrolledSemesters", b => 97 { 98 b.Property<int>("Id") 99 .ValueGeneratedOnAdd() 100 .HasColumnType("integer"); 101 102 NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); 103 104 b.Property<int>("MajorId") 105 .HasColumnType("integer"); 106 107 b.Property<int>("QuotaType") 108 .HasColumnType("integer"); 109 110 b.Property<int>("Type") 111 .HasColumnType("integer"); 112 113 b.Property<int>("UserId") 114 .HasColumnType("integer"); 115 116 b.Property<int>("Year") 117 .HasColumnType("integer"); 118 119 b.HasKey("Id"); 120 121 b.HasIndex("MajorId"); 122 123 b.HasIndex("UserId"); 124 125 b.ToTable("EnrolledSemesters"); 126 }); 127 59 128 modelBuilder.Entity("iknow_api.Models.EnrollmentInfo", b => 60 129 { … … 65 134 NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); 66 135 136 b.Property<int>("MajorId") 137 .HasColumnType("integer"); 138 67 139 b.Property<int>("UserId") 68 140 .HasColumnType("integer"); … … 71 143 .HasColumnType("integer"); 72 144 73 b.Property<int>("major") 74 .HasColumnType("integer"); 75 76 b.HasKey("Id"); 145 b.Property<int>("quota") 146 .HasColumnType("integer"); 147 148 b.HasKey("Id"); 149 150 b.HasIndex("MajorId"); 77 151 78 152 b.HasIndex("UserId") … … 107 181 }); 108 182 183 modelBuilder.Entity("iknow_api.Models.Major", b => 184 { 185 b.Property<int>("Id") 186 .ValueGeneratedOnAdd() 187 .HasColumnType("integer"); 188 189 NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); 190 191 b.Property<string>("Name") 192 .HasColumnType("text"); 193 194 b.HasKey("Id"); 195 196 b.ToTable("Majors"); 197 198 b.HasData( 199 new 200 { 201 Id = 1, 202 Name = "PIT" 203 }, 204 new 205 { 206 Id = 2, 207 Name = "SIIS" 208 }, 209 new 210 { 211 Id = 3, 212 Name = "SEIS" 213 }, 214 new 215 { 216 Id = 4, 217 Name = "KN" 218 }); 219 }); 220 221 modelBuilder.Entity("iknow_api.Models.MajorSubjects", b => 222 { 223 b.Property<int>("MajorId") 224 .HasColumnType("integer"); 225 226 b.Property<int>("SubjectId") 227 .HasColumnType("integer"); 228 229 b.Property<int>("Akreditacija") 230 .HasColumnType("integer"); 231 232 b.Property<int>("MandatorySemester") 233 .HasColumnType("integer"); 234 235 b.HasKey("MajorId", "SubjectId"); 236 237 b.HasIndex("SubjectId"); 238 239 b.ToTable("MajorSubjects"); 240 }); 241 242 modelBuilder.Entity("iknow_api.Models.PassedSubject", b => 243 { 244 b.Property<int>("Id") 245 .ValueGeneratedOnAdd() 246 .HasColumnType("integer"); 247 248 NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); 249 250 b.Property<DateTime>("DatePassed") 251 .HasColumnType("timestamp with time zone"); 252 253 b.Property<int>("Grade") 254 .HasColumnType("integer"); 255 256 b.Property<int>("SemesterSubjectId") 257 .HasColumnType("integer"); 258 259 b.HasKey("Id"); 260 261 b.HasIndex("SemesterSubjectId") 262 .IsUnique(); 263 264 b.ToTable("PassedSubjects"); 265 }); 266 267 modelBuilder.Entity("iknow_api.Models.Payment", b => 268 { 269 b.Property<int>("UserId") 270 .HasColumnType("integer"); 271 272 b.Property<int>("EnrollmentInfoId") 273 .HasColumnType("integer"); 274 275 b.Property<int>("Id") 276 .HasColumnType("integer"); 277 278 b.HasKey("UserId", "EnrollmentInfoId"); 279 280 b.HasIndex("EnrollmentInfoId"); 281 282 b.ToTable("Payment"); 283 }); 284 109 285 modelBuilder.Entity("iknow_api.Models.RefreshToken", b => 110 286 { … … 134 310 }); 135 311 312 modelBuilder.Entity("iknow_api.Models.SemesterSubject", b => 313 { 314 b.Property<int>("Id") 315 .ValueGeneratedOnAdd() 316 .HasColumnType("integer"); 317 318 NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); 319 320 b.Property<int>("EnrolledSemesterId") 321 .HasColumnType("integer"); 322 323 b.Property<int>("ProfessorId") 324 .HasColumnType("integer"); 325 326 b.Property<int>("SubjectId") 327 .HasColumnType("integer"); 328 329 b.Property<int>("UserId") 330 .HasColumnType("integer"); 331 332 b.HasKey("Id"); 333 334 b.HasIndex("EnrolledSemesterId"); 335 336 b.HasIndex("ProfessorId"); 337 338 b.HasIndex("SubjectId"); 339 340 b.HasIndex("UserId"); 341 342 b.ToTable("SemesterSubject"); 343 }); 344 345 modelBuilder.Entity("iknow_api.Models.Subject", b => 346 { 347 b.Property<int>("Id") 348 .ValueGeneratedOnAdd() 349 .HasColumnType("integer"); 350 351 NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); 352 353 b.Property<int?>("AwardedCredits") 354 .HasColumnType("integer"); 355 356 b.Property<string>("Code") 357 .HasColumnType("text"); 358 359 b.Property<int?>("DependencyCredit") 360 .HasColumnType("integer"); 361 362 b.Property<string>("Name") 363 .HasColumnType("text"); 364 365 b.HasKey("Id"); 366 367 b.ToTable("Subjects"); 368 }); 369 136 370 modelBuilder.Entity("iknow_api.Models.User", b => 137 371 { … … 174 408 }); 175 409 410 modelBuilder.Entity("iknow_api.Models.UserDocuments", b => 411 { 412 b.Property<int>("UserId") 413 .HasColumnType("integer"); 414 415 b.Property<int>("DocumentId") 416 .HasColumnType("integer"); 417 418 b.HasKey("UserId", "DocumentId"); 419 420 b.HasIndex("DocumentId"); 421 422 b.ToTable("UserDocuments"); 423 }); 424 176 425 modelBuilder.Entity("iknow_api.Models.ContactInfo", b => 177 426 { … … 185 434 }); 186 435 436 modelBuilder.Entity("iknow_api.Models.DependencySubject", b => 437 { 438 b.HasOne("iknow_api.Models.Subject", "Dependency") 439 .WithMany("Dependents") 440 .HasForeignKey("DependencyId") 441 .OnDelete(DeleteBehavior.Restrict) 442 .IsRequired(); 443 444 b.HasOne("iknow_api.Models.Subject", "Subject") 445 .WithMany("Dependencies") 446 .HasForeignKey("SubjectId") 447 .OnDelete(DeleteBehavior.Restrict) 448 .IsRequired(); 449 450 b.Navigation("Dependency"); 451 452 b.Navigation("Subject"); 453 }); 454 455 modelBuilder.Entity("iknow_api.Models.EnrolledSemesters", b => 456 { 457 b.HasOne("iknow_api.Models.Major", "Major") 458 .WithMany() 459 .HasForeignKey("MajorId") 460 .OnDelete(DeleteBehavior.Cascade) 461 .IsRequired(); 462 463 b.HasOne("iknow_api.Models.User", "User") 464 .WithMany() 465 .HasForeignKey("UserId") 466 .OnDelete(DeleteBehavior.Cascade) 467 .IsRequired(); 468 469 b.Navigation("Major"); 470 471 b.Navigation("User"); 472 }); 473 187 474 modelBuilder.Entity("iknow_api.Models.EnrollmentInfo", b => 188 475 { 476 b.HasOne("iknow_api.Models.Major", "Major") 477 .WithMany() 478 .HasForeignKey("MajorId") 479 .OnDelete(DeleteBehavior.Cascade) 480 .IsRequired(); 481 189 482 b.HasOne("iknow_api.Models.User", "User") 190 483 .WithOne("EnrollmentInfo") … … 193 486 .IsRequired(); 194 487 488 b.Navigation("Major"); 489 195 490 b.Navigation("User"); 196 491 }); … … 207 502 }); 208 503 504 modelBuilder.Entity("iknow_api.Models.MajorSubjects", b => 505 { 506 b.HasOne("iknow_api.Models.Major", "Majors") 507 .WithMany("Subjects") 508 .HasForeignKey("MajorId") 509 .OnDelete(DeleteBehavior.Cascade) 510 .IsRequired(); 511 512 b.HasOne("iknow_api.Models.Subject", "Subjects") 513 .WithMany("Majors") 514 .HasForeignKey("SubjectId") 515 .OnDelete(DeleteBehavior.Cascade) 516 .IsRequired(); 517 518 b.Navigation("Majors"); 519 520 b.Navigation("Subjects"); 521 }); 522 523 modelBuilder.Entity("iknow_api.Models.PassedSubject", b => 524 { 525 b.HasOne("iknow_api.Models.SemesterSubject", "SemesterSubject") 526 .WithOne("PassedSubject") 527 .HasForeignKey("iknow_api.Models.PassedSubject", "SemesterSubjectId") 528 .OnDelete(DeleteBehavior.Cascade) 529 .IsRequired(); 530 531 b.Navigation("SemesterSubject"); 532 }); 533 534 modelBuilder.Entity("iknow_api.Models.Payment", b => 535 { 536 b.HasOne("iknow_api.Models.EnrolledSemesters", "EnrolledSemesters") 537 .WithMany("Users") 538 .HasForeignKey("EnrollmentInfoId") 539 .OnDelete(DeleteBehavior.Cascade) 540 .IsRequired(); 541 542 b.HasOne("iknow_api.Models.User", "User") 543 .WithMany("EnrolledSemesters") 544 .HasForeignKey("UserId") 545 .OnDelete(DeleteBehavior.Cascade) 546 .IsRequired(); 547 548 b.Navigation("EnrolledSemesters"); 549 550 b.Navigation("User"); 551 }); 552 209 553 modelBuilder.Entity("iknow_api.Models.RefreshToken", b => 210 554 { … … 218 562 }); 219 563 564 modelBuilder.Entity("iknow_api.Models.SemesterSubject", b => 565 { 566 b.HasOne("iknow_api.Models.EnrolledSemesters", "EnrolledSemester") 567 .WithMany("SemesterSubjects") 568 .HasForeignKey("EnrolledSemesterId") 569 .OnDelete(DeleteBehavior.Restrict) 570 .IsRequired(); 571 572 b.HasOne("iknow_api.Models.User", "Professor") 573 .WithMany("TeachingSubjects") 574 .HasForeignKey("ProfessorId") 575 .OnDelete(DeleteBehavior.Restrict) 576 .IsRequired(); 577 578 b.HasOne("iknow_api.Models.Subject", "Subject") 579 .WithMany("SemesterSubjects") 580 .HasForeignKey("SubjectId") 581 .OnDelete(DeleteBehavior.Restrict) 582 .IsRequired(); 583 584 b.HasOne("iknow_api.Models.User", "User") 585 .WithMany("EnrolledSemesterUserSubjects") 586 .HasForeignKey("UserId") 587 .OnDelete(DeleteBehavior.Restrict) 588 .IsRequired(); 589 590 b.Navigation("EnrolledSemester"); 591 592 b.Navigation("Professor"); 593 594 b.Navigation("Subject"); 595 596 b.Navigation("User"); 597 }); 598 599 modelBuilder.Entity("iknow_api.Models.UserDocuments", b => 600 { 601 b.HasOne("iknow_api.Models.Documents", "Documents") 602 .WithMany("User") 603 .HasForeignKey("DocumentId") 604 .OnDelete(DeleteBehavior.Cascade) 605 .IsRequired(); 606 607 b.HasOne("iknow_api.Models.User", "User") 608 .WithMany("Documents") 609 .HasForeignKey("UserId") 610 .OnDelete(DeleteBehavior.Cascade) 611 .IsRequired(); 612 613 b.Navigation("Documents"); 614 615 b.Navigation("User"); 616 }); 617 618 modelBuilder.Entity("iknow_api.Models.Documents", b => 619 { 620 b.Navigation("User"); 621 }); 622 623 modelBuilder.Entity("iknow_api.Models.EnrolledSemesters", b => 624 { 625 b.Navigation("SemesterSubjects"); 626 627 b.Navigation("Users"); 628 }); 629 630 modelBuilder.Entity("iknow_api.Models.Major", b => 631 { 632 b.Navigation("Subjects"); 633 }); 634 635 modelBuilder.Entity("iknow_api.Models.SemesterSubject", b => 636 { 637 b.Navigation("PassedSubject"); 638 }); 639 640 modelBuilder.Entity("iknow_api.Models.Subject", b => 641 { 642 b.Navigation("Dependencies"); 643 644 b.Navigation("Dependents"); 645 646 b.Navigation("Majors"); 647 648 b.Navigation("SemesterSubjects"); 649 }); 650 220 651 modelBuilder.Entity("iknow_api.Models.User", b => 221 652 { 222 653 b.Navigation("ContactInfo"); 223 654 655 b.Navigation("Documents"); 656 657 b.Navigation("EnrolledSemesterUserSubjects"); 658 659 b.Navigation("EnrolledSemesters"); 660 224 661 b.Navigation("EnrollmentInfo"); 225 662 226 663 b.Navigation("HighSchool"); 664 665 b.Navigation("TeachingSubjects"); 227 666 }); 228 667 #pragma warning restore 612, 618 -
iknow-api/Models/EnrollmentInfo.cs
ra92a2a4 rc2f79d7 11 11 public int Id { get; set; } 12 12 public int enrollmentYear { get; set; } 13 public Quota quota; 13 // CS1597 fix: no semicolon after accessor block 14 public Quota quota { get; set; } 14 15 public int MajorId { get; set; } 15 16 public Major? Major { get; set; } -
iknow-api/Models/SemesterSubjects.cs
ra92a2a4 rc2f79d7 14 14 public Subject? Subject { get; set; } 15 15 public User? Professor { get; set; } 16 public PassedSubject? PassedSubject { get; set; } 16 17 } 17 18 } -
iknow-api/Models/User.cs
ra92a2a4 rc2f79d7 7 7 Admin, 8 8 Professor, 9 St rudent9 Student 10 10 } 11 11 -
iknow-api/Program.cs
ra92a2a4 rc2f79d7 38 38 { 39 39 options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; 40 options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; 41 options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); 40 42 }); 41 43 builder.Services.AddOpenApi(); -
iknow-api/Repository/Implementations/UserRepository.cs
ra92a2a4 rc2f79d7 1 1 using iknow_api.Models; 2 2 using iknow_api.Data; 3 using iknow_api.Models;4 3 using Microsoft.EntityFrameworkCore; 5 4 … … 64 63 return await _context.User.CountAsync(); 65 64 } 65 66 66 } 67 67 } -
iknow-api/Repository/Interface/IUserRepository.cs
ra92a2a4 rc2f79d7 1 using iknow_api.Models;1 using iknow_api.Models; 2 2 namespace iknow_api.Repositories 3 3 { … … 11 11 Task AddHighSchoolAsync(HighSchool highSchool); 12 12 Task<int> GetUsersCountAsync(); 13 Task<User > GetUserByIdAsync(int id);13 Task<User?> GetUserByIdAsync(int id); 14 14 Task<User?> GetOnlyUserByIdAsync(int id); 15 15 -
iknow-api/Services/Implementations/AuthService.cs
ra92a2a4 rc2f79d7 29 29 public async Task<bool> RegisterAsync(RegisterDto registerDto) 30 30 { 31 // Debug: Log all incoming DTO values 32 Console.WriteLine("=== RegisterDto Debug Info ==="); 33 Console.WriteLine($"Name: {registerDto.Name}"); 34 Console.WriteLine($"Email: {registerDto.Email}"); 35 Console.WriteLine($"majorType: {registerDto.majorType}"); 36 Console.WriteLine($"enrollmentYear: {registerDto.enrollmentYear}"); 37 Console.WriteLine($"quotaType: {registerDto.quotaType}"); 38 Console.WriteLine($"Role: {registerDto.Role}"); 39 Console.WriteLine($"tip: {registerDto.tip}"); 40 Console.WriteLine("=============================="); 41 42 // Check if user already exists 31 43 if (await _userRepository.UserExistsAsync(registerDto.Email)) 32 return false;44 throw new InvalidOperationException("User with this email already exists"); 33 45 34 46 var user = new User -
iknow-api/Services/Interfaces/IAuthService.cs
ra92a2a4 rc2f79d7 1 1 using iknow_api.DTOs; 2 using iknow_api. DTOs;2 using iknow_api.Models; 3 3 namespace iknow_api.Services 4 4 { … … 9 9 Task<int> GetUsersCountAsync(); 10 10 Task<AuthResultDto> GenerateNewJWT(VerifyRefreshTokenDto token); 11 11 12 } 12 13 } -
iknow-api/appsettings.Development.json
ra92a2a4 rc2f79d7 7 7 }, 8 8 "ConnectionStrings": { 9 "DefaultConnection": "Host=localhost;Port=5432;Database=myappdb;Username=postgres;Password= newpassword"9 "DefaultConnection": "Host=localhost;Port=5432;Database=myappdb;Username=postgres;Password=user" 10 10 } 11 11 } -
iknow-api/appsettings.json
ra92a2a4 rc2f79d7 7 7 }, 8 8 "ConnectionStrings": { 9 "DefaultConnection": "Host=localhost;Port=5 5432;Database=myappdb;Username=postgres;Password=newpassword"9 "DefaultConnection": "Host=localhost;Port=5432;Database=myappdb;Username=postgres;Password=user" 10 10 }, 11 11 "Jwt": {
Note:
See TracChangeset
for help on using the changeset viewer.
