Changeset b38c39c


Ignore:
Timestamp:
10/27/25 21:50:02 (11 months ago)
Author:
stefansaveski <stefansaveski19@…>
Branches:
master
Children:
ff202cf
Parents:
cab02ad
Message:

Add user-related entities and enforce one-to-one mappings

Enhanced the User model with new entities: ContactInfo,
EnrollmentInfo, and HighSchool, establishing one-to-one
relationships. Updated UserDTO with additional fields and
introduced enums for type, quota, and major. Modified
UserRepository and AuthService to handle new entities.

Updated database schema with unique constraints on UserId
for related tables and added EF Core migration
20251027191028_dbRelations. Adjusted JSON serialization
to prevent circular references.

Location:
iknow-api
Files:
2 added
8 edited

Legend:

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

    rcab02ad rb38c39c  
    2626                var userData = await _userService.GetUserData(token);
    2727                if (userData == null) return Ok(new { info = "can't get info" });
    28                 return Ok(new { Token = userData });
     28                return Ok(new { User = userData });
    2929            }
    3030            return null;
  • iknow-api/DTOs/UserDTO.cs

    rcab02ad rb38c39c  
    2222        public DateTime Bday { get; set; }
    2323        public UserRole Role { get; set; }
     24        public float gpa { get; set; }
     25        public type tip { get; set; }
     26        public string city { get; set; } = string.Empty;
     27        public string address { get; set; } = string.Empty;
     28        public string municipality { get; set; } = string.Empty;
     29        public string phoneNumber { get; set; } = string.Empty;
     30        public string microsoftEmail { get; set; } = string.Empty;
     31        public int enrollmentYear { get; set; }
     32        public quota quotaType { get; set; }
     33        public major majorType { get; set; }
     34
    2435    }
    2536
     
    4455        Student
    4556    }
     57    public enum type
     58    {
     59        strucen, gimnazija
     60    }
     61    public enum quota
     62    {
     63        drzavna, privatna, stipendija
     64    }
     65    public enum major
     66    {
     67        SIIS, PIT, KN, KI, IMB, IE, SSP, SEIS
     68    }
    4669}
  • iknow-api/Migrations/AppDbContextModelSnapshot.cs

    rcab02ad rb38c39c  
    5151                    b.HasKey("Id");
    5252
    53                     b.HasIndex("UserId");
     53                    b.HasIndex("UserId")
     54                        .IsUnique();
    5455
    5556                    b.ToTable("ContactInfo");
     
    7576                    b.HasKey("Id");
    7677
    77                     b.HasIndex("UserId");
     78                    b.HasIndex("UserId")
     79                        .IsUnique();
    7880
    7981                    b.ToTable("EnrollmentInfo");
     
    99101                    b.HasKey("Id");
    100102
    101                     b.HasIndex("UserId");
     103                    b.HasIndex("UserId")
     104                        .IsUnique();
    102105
    103106                    b.ToTable("HighSchool");
     
    144147                {
    145148                    b.HasOne("iknow_api.Models.User", "User")
    146                         .WithMany()
    147                         .HasForeignKey("UserId")
     149                        .WithOne("ContactInfo")
     150                        .HasForeignKey("iknow_api.Models.ContactInfo", "UserId")
    148151                        .OnDelete(DeleteBehavior.Cascade)
    149152                        .IsRequired();
     
    155158                {
    156159                    b.HasOne("iknow_api.Models.User", "User")
    157                         .WithMany()
    158                         .HasForeignKey("UserId")
     160                        .WithOne("EnrollmentInfo")
     161                        .HasForeignKey("iknow_api.Models.EnrollmentInfo", "UserId")
    159162                        .OnDelete(DeleteBehavior.Cascade)
    160163                        .IsRequired();
     
    166169                {
    167170                    b.HasOne("iknow_api.Models.User", "User")
    168                         .WithMany()
    169                         .HasForeignKey("UserId")
     171                        .WithOne("HighSchool")
     172                        .HasForeignKey("iknow_api.Models.HighSchool", "UserId")
    170173                        .OnDelete(DeleteBehavior.Cascade)
    171174                        .IsRequired();
     
    173176                    b.Navigation("User");
    174177                });
     178
     179            modelBuilder.Entity("iknow_api.Models.User", b =>
     180                {
     181                    b.Navigation("ContactInfo");
     182
     183                    b.Navigation("EnrollmentInfo");
     184
     185                    b.Navigation("HighSchool");
     186                });
    175187#pragma warning restore 612, 618
    176188        }
  • iknow-api/Models/User.cs

    rcab02ad rb38c39c  
    2121        public DateTime CreatedAt { get; set; }
    2222        public UserRole Role { get; set; }
     23        public HighSchool? HighSchool { get; set; }
     24        public ContactInfo? ContactInfo { get; set; }
     25        public EnrollmentInfo? EnrollmentInfo { get; set; }
     26
    2327    }
    2428}
  • iknow-api/Program.cs

    rcab02ad rb38c39c  
    11using System.Text;
     2using System.Text.Json.Serialization;
    23using iknow_api.Data;
    34using iknow_api.Repositories;
     
    3334});
    3435// Add services to the container.
    35 builder.Services.AddControllers();
     36builder.Services.AddControllers()
     37    .AddJsonOptions(options =>
     38    {
     39        options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
     40    });
    3641builder.Services.AddOpenApi();
    3742
  • iknow-api/Repository/Implementations/UserRepository.cs

    rcab02ad rb38c39c  
    2525        }
    2626       
    27         public async Task<User> GetUserByIdAsync(int id)
     27        public async Task<User?> GetUserByIdAsync(int id)
    2828        {
    29             return await _context.User.FirstOrDefaultAsync(u => u.Id == id);
     29            return await _context.User
     30                .Include(u => u.ContactInfo)
     31                .Include(u => u.EnrollmentInfo)
     32                .Include(u => u.HighSchool)
     33                .FirstOrDefaultAsync(u => u.Id == id);
    3034        }
    3135
     
    3640            await _context.SaveChangesAsync();
    3741        }
     42        public async Task AddContactAsync(ContactInfo contactInfo)
     43        {
     44            _context.ContactInfo.Add(contactInfo);
     45            await _context.SaveChangesAsync();
     46        }
     47        public async Task AddEnrollmentAsync(EnrollmentInfo enrollment)
     48        {
     49            _context.EnrollmentInfo.Add(enrollment);
     50            await _context.SaveChangesAsync();
     51        }   
     52        public async Task AddHighSchoolAsync(HighSchool highSchool)
     53        {
     54            _context.HighSchool.Add(highSchool);
     55            await _context.SaveChangesAsync();
     56        }       
    3857
    3958        public async Task<int> GetUsersCountAsync()
  • iknow-api/Repository/Interface/IUserRepository.cs

    rcab02ad rb38c39c  
    77        Task<User?> GetUserByUsernameAsync(string username);
    88        Task AddUserAsync(User user);
     9        Task AddContactAsync(ContactInfo contactInfo);
     10        Task AddEnrollmentAsync(EnrollmentInfo enrollment);
     11        Task AddHighSchoolAsync(HighSchool highSchool);
    912        Task<int> GetUsersCountAsync();
    1013        Task<User> GetUserByIdAsync(int id);
  • iknow-api/Services/Implementations/AuthService.cs

    rcab02ad rb38c39c  
    4040
    4141            await _userRepository.AddUserAsync(user);
     42            int userId = user.Id;
     43            var contactInfo = new ContactInfo
     44            {
     45                UserId = userId,
     46                city = registerDto.city,
     47                address = registerDto.address,
     48                municipality = registerDto.municipality,
     49                phoneNumber = registerDto.phoneNumber,
     50                microsoftEmail = registerDto.microsoftEmail
     51            };
     52            await _userRepository.AddContactAsync(contactInfo);
     53            var enrollmentInfo = new EnrollmentInfo
     54            {
     55                UserId = userId,
     56                enrollmentYear = registerDto.enrollmentYear,
     57                quota = (Models.quota)registerDto.quotaType,
     58                major = (Models.major)registerDto.majorType
     59            };
     60            await _userRepository.AddEnrollmentAsync(enrollmentInfo);
     61            await _userRepository.AddHighSchoolAsync(new HighSchool
     62            {
     63                UserId = userId,
     64                GPA = registerDto.gpa,
     65                tip = (Models.type)registerDto.tip
     66            });
    4267            return true;
    4368        }
Note: See TracChangeset for help on using the changeset viewer.