From a15c70237e418f86552299f34500753424d22ec9 Mon Sep 17 00:00:00 2001 From: Harnagea Ciprian-Gabriel Date: Sat, 1 Feb 2025 00:36:59 +0200 Subject: [PATCH] Logare + Inregistrare --- backend-MT/Controllers/UserController.cs | 44 +- backend-MT/Data/SeedData.cs | 30 + ...20250131205026_secondmigration.Designer.cs | 945 ++++++++++++++++++ .../20250131205026_secondmigration.cs | 305 ++++++ .../20250131220018_thirdmig.Designer.cs | 941 +++++++++++++++++ .../Migrations/20250131220018_thirdmig.cs | 29 + .../ApplicationDbContextModelSnapshot.cs | 135 +-- backend-MT/Models/User.cs | 1 - backend-MT/Program.cs | 48 +- backend-MT/Service/UserService/UserService.cs | 68 +- 10 files changed, 2335 insertions(+), 211 deletions(-) create mode 100644 backend-MT/Data/SeedData.cs create mode 100644 backend-MT/Migrations/20250131205026_secondmigration.Designer.cs create mode 100644 backend-MT/Migrations/20250131205026_secondmigration.cs create mode 100644 backend-MT/Migrations/20250131220018_thirdmig.Designer.cs create mode 100644 backend-MT/Migrations/20250131220018_thirdmig.cs diff --git a/backend-MT/Controllers/UserController.cs b/backend-MT/Controllers/UserController.cs index 53ac9b6..851b6f3 100644 --- a/backend-MT/Controllers/UserController.cs +++ b/backend-MT/Controllers/UserController.cs @@ -1,13 +1,9 @@ using backend_MT.Exceptions; -using backend_MT.Models; using backend_MT.Models.DTOs.UserDTOs; using backend_MT.Service.UserService; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Microsoft.IdentityModel.Tokens; -using System.IdentityModel.Tokens.Jwt; -using System.Security.Claims; -using System.Text; +using System.Threading.Tasks; namespace backend_MT.Controllers { @@ -16,12 +12,9 @@ namespace backend_MT.Controllers public class UserController : ControllerBase { private readonly IUserService _userService; - private readonly IConfiguration _configuration; - - public UserController(IUserService userService, IConfiguration configuration) + public UserController(IUserService userService) { _userService = userService; - _configuration = configuration; } [HttpPost("register")] @@ -45,18 +38,15 @@ public async Task Register([FromBody] RegisterDTO user) } } - [HttpPost("login")] [AllowAnonymous] public async Task Login([FromBody] LoginDTO user) { try { - var result = await _userService.LoginAsync(user); - if (result != null) + var token = await _userService.LoginAsync(user); + if (!string.IsNullOrEmpty(token)) { - var token = GenerateJwtToken(user.username); - Response.Cookies.Append("jwt", token, new CookieOptions { HttpOnly = true, @@ -64,8 +54,7 @@ public async Task Login([FromBody] LoginDTO user) SameSite = SameSiteMode.None, Expires = DateTimeOffset.UtcNow.AddMinutes(30) }); - - return Ok(new { Message = $"Autentificat ca {user.username}" }); + return Ok(new { Message = $"Authenticated as {user.username}", Token = token }); } else { @@ -85,28 +74,5 @@ public async Task Login([FromBody] LoginDTO user) return BadRequest(e.Message); } } - - private string GenerateJwtToken(string username) - { - var claims = new[] - { - new Claim(JwtRegisteredClaimNames.Sub, username), - new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), - new Claim(ClaimTypes.Name, username) - }; - - var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWT:Key"])); - var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); - - var token = new JwtSecurityToken( - issuer: _configuration["JWT:Issuer"], - audience: _configuration["JWT:Audience"], - claims: claims, - expires: DateTime.Now.AddMinutes(30), - signingCredentials: creds - ); - - return new JwtSecurityTokenHandler().WriteToken(token); - } } } diff --git a/backend-MT/Data/SeedData.cs b/backend-MT/Data/SeedData.cs new file mode 100644 index 0000000..70f6201 --- /dev/null +++ b/backend-MT/Data/SeedData.cs @@ -0,0 +1,30 @@ +using Microsoft.AspNetCore.Identity; + +namespace backend_MT.Data +{ + public static class Seed + { + public static async Task InitializeRoles(IApplicationBuilder app) + { + using (var scope = app.ApplicationServices.CreateScope()) + { + var roleManager = scope.ServiceProvider.GetRequiredService>>(); + + string[] roleNames = { "Profesor", "Elev", "Administrator" }; + + foreach (var roleName in roleNames) + { + if (!await roleManager.RoleExistsAsync(roleName)) + { + var result = await roleManager.CreateAsync(new IdentityRole(roleName)); + if (!result.Succeeded) + { + var errors = string.Join(", ", result.Errors.Select(e => e.Description)); + throw new Exception($"Failed to create role '{roleName}': {errors}"); + } + } + } + } + } + } +} diff --git a/backend-MT/Migrations/20250131205026_secondmigration.Designer.cs b/backend-MT/Migrations/20250131205026_secondmigration.Designer.cs new file mode 100644 index 0000000..97c88ef --- /dev/null +++ b/backend-MT/Migrations/20250131205026_secondmigration.Designer.cs @@ -0,0 +1,945 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using backend_MT.Data; + +#nullable disable + +namespace backend_MT.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20250131205026_secondmigration")] + partial class secondmigration + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.20") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("integer"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("backend_MT.Models.Curs", b => + { + b.Property("cursId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("cursId")); + + b.Property("denumire") + .IsRequired() + .HasColumnType("text"); + + b.Property("descriere") + .IsRequired() + .HasColumnType("text"); + + b.Property("nrSedinte") + .HasColumnType("integer"); + + b.Property("pret") + .HasColumnType("integer"); + + b.HasKey("cursId"); + + b.ToTable("curs"); + }); + + modelBuilder.Entity("backend_MT.Models.Disponibilitate", b => + { + b.Property("disponibilitateId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("disponibilitateId")); + + b.Property("oraIncepere") + .HasColumnType("interval"); + + b.Property("userId") + .HasColumnType("integer"); + + b.Property("zi") + .HasColumnType("integer"); + + b.HasKey("disponibilitateId"); + + b.HasIndex("userId"); + + b.ToTable("disponibilitate"); + }); + + modelBuilder.Entity("backend_MT.Models.Feedback", b => + { + b.Property("feedbackId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("feedbackId")); + + b.Property("mesaj") + .IsRequired() + .HasColumnType("text"); + + b.Property("sedintaId") + .HasColumnType("integer"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("feedbackId"); + + b.HasIndex("sedintaId"); + + b.HasIndex("userId"); + + b.ToTable("feedback"); + }); + + modelBuilder.Entity("backend_MT.Models.Grupa", b => + { + b.Property("grupaId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("grupaId")); + + b.Property("cursId") + .HasColumnType("integer"); + + b.Property("linkMeet") + .IsRequired() + .HasColumnType("text"); + + b.Property("nivelStudiu") + .IsRequired() + .HasColumnType("text"); + + b.Property("nume") + .IsRequired() + .HasColumnType("text"); + + b.Property("userProfesorId") + .HasColumnType("integer"); + + b.HasKey("grupaId"); + + b.HasIndex("cursId"); + + b.HasIndex("userProfesorId"); + + b.ToTable("grupa"); + }); + + modelBuilder.Entity("backend_MT.Models.Material", b => + { + b.Property("materialId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("materialId")); + + b.Property("descriere") + .IsRequired() + .HasColumnType("text"); + + b.Property("titlu") + .IsRequired() + .HasColumnType("text"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("materialId"); + + b.HasIndex("userId"); + + b.ToTable("material"); + }); + + modelBuilder.Entity("backend_MT.Models.Mesaj", b => + { + b.Property("mesajId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("mesajId")); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("emitatorId") + .HasColumnType("integer"); + + b.Property("mesajText") + .IsRequired() + .HasColumnType("text"); + + b.Property("receptorId") + .HasColumnType("integer"); + + b.Property("tipMesaj") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("mesajId"); + + b.HasIndex("UserId"); + + b.HasIndex("emitatorId"); + + b.HasIndex("receptorId"); + + b.ToTable("mesaj"); + }); + + modelBuilder.Entity("backend_MT.Models.Notificare", b => + { + b.Property("notificareId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("notificareId")); + + b.Property("data") + .HasColumnType("timestamp with time zone"); + + b.Property("mesaj") + .IsRequired() + .HasColumnType("text"); + + b.Property("tipNotificare") + .IsRequired() + .HasColumnType("text"); + + b.Property("titlu") + .IsRequired() + .HasColumnType("text"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("notificareId"); + + b.HasIndex("userId"); + + b.ToTable("notificare"); + }); + + modelBuilder.Entity("backend_MT.Models.ParticipareGrupa", b => + { + b.Property("participareGrupaId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("participareGrupaId")); + + b.Property("grupaId") + .HasColumnType("integer"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("participareGrupaId"); + + b.HasIndex("grupaId"); + + b.HasIndex("userId"); + + b.ToTable("participareGrupa"); + }); + + modelBuilder.Entity("backend_MT.Models.Plata", b => + { + b.Property("plataId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("plataId")); + + b.Property("cursId") + .HasColumnType("integer"); + + b.Property("data") + .HasColumnType("timestamp with time zone"); + + b.Property("suma") + .HasColumnType("integer"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("plataId"); + + b.HasIndex("cursId"); + + b.HasIndex("userId"); + + b.ToTable("plata"); + }); + + modelBuilder.Entity("backend_MT.Models.Prezenta", b => + { + b.Property("prezentaId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("prezentaId")); + + b.Property("sedintaId") + .HasColumnType("integer"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("prezentaId"); + + b.HasIndex("sedintaId"); + + b.HasIndex("userId"); + + b.ToTable("prezenta"); + }); + + modelBuilder.Entity("backend_MT.Models.RaspunsTema", b => + { + b.Property("raspunsTemaId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("raspunsTemaId")); + + b.Property("fisier") + .IsRequired() + .HasColumnType("text"); + + b.Property("punctaj") + .HasColumnType("integer"); + + b.Property("temaId") + .HasColumnType("integer"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("raspunsTemaId"); + + b.HasIndex("temaId"); + + b.HasIndex("userId"); + + b.ToTable("raspunsTema"); + }); + + modelBuilder.Entity("backend_MT.Models.Sedinta", b => + { + b.Property("sedintaId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("sedintaId")); + + b.Property("grupaId") + .HasColumnType("integer"); + + b.Property("oraIncepere") + .HasColumnType("timestamp with time zone"); + + b.Property("oraIncheiere") + .HasColumnType("timestamp with time zone"); + + b.Property("titlu") + .IsRequired() + .HasColumnType("text"); + + b.Property("zi") + .HasColumnType("timestamp with time zone"); + + b.HasKey("sedintaId"); + + b.HasIndex("grupaId"); + + b.ToTable("sedinta"); + }); + + modelBuilder.Entity("backend_MT.Models.Support", b => + { + b.Property("supportId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("supportId")); + + b.Property("mesaj") + .IsRequired() + .HasColumnType("text"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("supportId"); + + b.HasIndex("userId"); + + b.ToTable("support"); + }); + + modelBuilder.Entity("backend_MT.Models.Tema", b => + { + b.Property("temaId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("temaId")); + + b.Property("descriere") + .IsRequired() + .HasColumnType("text"); + + b.Property("fisier") + .IsRequired() + .HasColumnType("text"); + + b.Property("titlu") + .IsRequired() + .HasColumnType("text"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("temaId"); + + b.HasIndex("userId"); + + b.ToTable("tema"); + }); + + modelBuilder.Entity("backend_MT.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("nivel") + .HasColumnType("text"); + + b.Property("nrTelefon") + .IsRequired() + .HasColumnType("text"); + + b.Property("nume") + .IsRequired() + .HasColumnType("text"); + + b.Property("pozaProfil") + .IsRequired() + .HasColumnType("text"); + + b.Property("prenume") + .IsRequired() + .HasColumnType("text"); + + b.Property("profesorVerificat") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("backend_MT.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("backend_MT.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("backend_MT.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("backend_MT.Models.Disponibilitate", b => + { + b.HasOne("backend_MT.Models.User", "user") + .WithMany("disponibilitate") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Feedback", b => + { + b.HasOne("backend_MT.Models.Sedinta", "sedinta") + .WithMany("feedbackuri") + .HasForeignKey("sedintaId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", "user") + .WithMany("feedbackuri") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("sedinta"); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Grupa", b => + { + b.HasOne("backend_MT.Models.Curs", "curs") + .WithMany() + .HasForeignKey("cursId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", "userProfesor") + .WithMany("grupa") + .HasForeignKey("userProfesorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("curs"); + + b.Navigation("userProfesor"); + }); + + modelBuilder.Entity("backend_MT.Models.Material", b => + { + b.HasOne("backend_MT.Models.User", "user") + .WithMany("materiale") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Mesaj", b => + { + b.HasOne("backend_MT.Models.User", null) + .WithMany("mesaje") + .HasForeignKey("UserId"); + + b.HasOne("backend_MT.Models.User", "emitator") + .WithMany() + .HasForeignKey("emitatorId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", "receptor") + .WithMany() + .HasForeignKey("receptorId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("emitator"); + + b.Navigation("receptor"); + }); + + modelBuilder.Entity("backend_MT.Models.Notificare", b => + { + b.HasOne("backend_MT.Models.User", "user") + .WithMany("notificari") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.ParticipareGrupa", b => + { + b.HasOne("backend_MT.Models.Grupa", "grupa") + .WithMany("participariGrupa") + .HasForeignKey("grupaId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", "user") + .WithMany("participariGrupa") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("grupa"); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Plata", b => + { + b.HasOne("backend_MT.Models.Curs", "curs") + .WithMany() + .HasForeignKey("cursId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", "user") + .WithMany("plati") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("curs"); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Prezenta", b => + { + b.HasOne("backend_MT.Models.Sedinta", "sedinta") + .WithMany("prezente") + .HasForeignKey("sedintaId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", "user") + .WithMany("prezente") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("sedinta"); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.RaspunsTema", b => + { + b.HasOne("backend_MT.Models.Tema", "tema") + .WithMany("raspunsuriTema") + .HasForeignKey("temaId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", "user") + .WithMany("raspunsuriTema") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("tema"); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Sedinta", b => + { + b.HasOne("backend_MT.Models.Grupa", "grupa") + .WithMany() + .HasForeignKey("grupaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("grupa"); + }); + + modelBuilder.Entity("backend_MT.Models.Support", b => + { + b.HasOne("backend_MT.Models.User", "user") + .WithMany("supporturi") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Tema", b => + { + b.HasOne("backend_MT.Models.User", "user") + .WithMany("teme") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Grupa", b => + { + b.Navigation("participariGrupa"); + }); + + modelBuilder.Entity("backend_MT.Models.Sedinta", b => + { + b.Navigation("feedbackuri"); + + b.Navigation("prezente"); + }); + + modelBuilder.Entity("backend_MT.Models.Tema", b => + { + b.Navigation("raspunsuriTema"); + }); + + modelBuilder.Entity("backend_MT.Models.User", b => + { + b.Navigation("disponibilitate"); + + b.Navigation("feedbackuri"); + + b.Navigation("grupa"); + + b.Navigation("materiale"); + + b.Navigation("mesaje"); + + b.Navigation("notificari"); + + b.Navigation("participariGrupa"); + + b.Navigation("plati"); + + b.Navigation("prezente"); + + b.Navigation("raspunsuriTema"); + + b.Navigation("supporturi"); + + b.Navigation("teme"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/backend-MT/Migrations/20250131205026_secondmigration.cs b/backend-MT/Migrations/20250131205026_secondmigration.cs new file mode 100644 index 0000000..572935d --- /dev/null +++ b/backend-MT/Migrations/20250131205026_secondmigration.cs @@ -0,0 +1,305 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace backend_MT.Migrations +{ + /// + public partial class secondmigration : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_grupa_AspNetUsers_userId", + table: "grupa"); + + migrationBuilder.DropForeignKey( + name: "FK_notificare_AspNetUsers_userId", + table: "notificare"); + + migrationBuilder.DropForeignKey( + name: "FK_notificare_grupa_grupaId", + table: "notificare"); + + migrationBuilder.DropTable( + name: "abonament"); + + migrationBuilder.DropTable( + name: "predare"); + + migrationBuilder.DropIndex( + name: "IX_notificare_grupaId", + table: "notificare"); + + migrationBuilder.DropColumn( + name: "grupaId", + table: "notificare"); + + migrationBuilder.DropColumn( + name: "receptorId", + table: "notificare"); + + migrationBuilder.DropColumn( + name: "Email", + table: "AspNetUsers"); + + migrationBuilder.DropColumn( + name: "UserName", + table: "AspNetUsers"); + + migrationBuilder.RenameColumn( + name: "userId", + table: "grupa", + newName: "userProfesorId"); + + migrationBuilder.RenameIndex( + name: "IX_grupa_userId", + table: "grupa", + newName: "IX_grupa_userProfesorId"); + + migrationBuilder.RenameColumn( + name: "username", + table: "AspNetUsers", + newName: "UserName"); + + migrationBuilder.RenameColumn( + name: "email", + table: "AspNetUsers", + newName: "Email"); + + migrationBuilder.AlterColumn( + name: "userId", + table: "notificare", + type: "integer", + nullable: false, + defaultValue: 0, + oldClrType: typeof(int), + oldType: "integer", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "UserName", + table: "AspNetUsers", + type: "character varying(256)", + maxLength: 256, + nullable: true, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AlterColumn( + name: "Email", + table: "AspNetUsers", + type: "character varying(256)", + maxLength: 256, + nullable: true, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AddForeignKey( + name: "FK_grupa_AspNetUsers_userProfesorId", + table: "grupa", + column: "userProfesorId", + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_notificare_AspNetUsers_userId", + table: "notificare", + column: "userId", + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_grupa_AspNetUsers_userProfesorId", + table: "grupa"); + + migrationBuilder.DropForeignKey( + name: "FK_notificare_AspNetUsers_userId", + table: "notificare"); + + migrationBuilder.RenameColumn( + name: "userProfesorId", + table: "grupa", + newName: "userId"); + + migrationBuilder.RenameIndex( + name: "IX_grupa_userProfesorId", + table: "grupa", + newName: "IX_grupa_userId"); + + migrationBuilder.RenameColumn( + name: "UserName", + table: "AspNetUsers", + newName: "username"); + + migrationBuilder.RenameColumn( + name: "Email", + table: "AspNetUsers", + newName: "email"); + + migrationBuilder.AlterColumn( + name: "userId", + table: "notificare", + type: "integer", + nullable: true, + oldClrType: typeof(int), + oldType: "integer"); + + migrationBuilder.AddColumn( + name: "grupaId", + table: "notificare", + type: "integer", + nullable: true); + + migrationBuilder.AddColumn( + name: "receptorId", + table: "notificare", + type: "integer", + nullable: false, + defaultValue: 0); + + migrationBuilder.AlterColumn( + name: "username", + table: "AspNetUsers", + type: "text", + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "character varying(256)", + oldMaxLength: 256, + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "email", + table: "AspNetUsers", + type: "text", + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "character varying(256)", + oldMaxLength: 256, + oldNullable: true); + + migrationBuilder.AddColumn( + name: "Email", + table: "AspNetUsers", + type: "character varying(256)", + maxLength: 256, + nullable: true); + + migrationBuilder.AddColumn( + name: "UserName", + table: "AspNetUsers", + type: "character varying(256)", + maxLength: 256, + nullable: true); + + migrationBuilder.CreateTable( + name: "abonament", + columns: table => new + { + abonamentId = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + cursId = table.Column(type: "integer", nullable: false), + userId = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_abonament", x => x.abonamentId); + table.ForeignKey( + name: "FK_abonament_AspNetUsers_userId", + column: x => x.userId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_abonament_curs_cursId", + column: x => x.cursId, + principalTable: "curs", + principalColumn: "cursId", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "predare", + columns: table => new + { + predareId = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + cursId = table.Column(type: "integer", nullable: false), + userId = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_predare", x => x.predareId); + table.ForeignKey( + name: "FK_predare_AspNetUsers_userId", + column: x => x.userId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_predare_curs_cursId", + column: x => x.cursId, + principalTable: "curs", + principalColumn: "cursId", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_notificare_grupaId", + table: "notificare", + column: "grupaId"); + + migrationBuilder.CreateIndex( + name: "IX_abonament_cursId", + table: "abonament", + column: "cursId"); + + migrationBuilder.CreateIndex( + name: "IX_abonament_userId", + table: "abonament", + column: "userId"); + + migrationBuilder.CreateIndex( + name: "IX_predare_cursId", + table: "predare", + column: "cursId"); + + migrationBuilder.CreateIndex( + name: "IX_predare_userId", + table: "predare", + column: "userId"); + + migrationBuilder.AddForeignKey( + name: "FK_grupa_AspNetUsers_userId", + table: "grupa", + column: "userId", + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_notificare_AspNetUsers_userId", + table: "notificare", + column: "userId", + principalTable: "AspNetUsers", + principalColumn: "Id"); + + migrationBuilder.AddForeignKey( + name: "FK_notificare_grupa_grupaId", + table: "notificare", + column: "grupaId", + principalTable: "grupa", + principalColumn: "grupaId"); + } + } +} diff --git a/backend-MT/Migrations/20250131220018_thirdmig.Designer.cs b/backend-MT/Migrations/20250131220018_thirdmig.Designer.cs new file mode 100644 index 0000000..19e7aca --- /dev/null +++ b/backend-MT/Migrations/20250131220018_thirdmig.Designer.cs @@ -0,0 +1,941 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using backend_MT.Data; + +#nullable disable + +namespace backend_MT.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20250131220018_thirdmig")] + partial class thirdmig + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.20") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("RoleId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("text"); + + b.Property("ClaimValue") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("ProviderKey") + .HasColumnType("text"); + + b.Property("ProviderDisplayName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("RoleId") + .HasColumnType("integer"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("LoginProvider") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("backend_MT.Models.Curs", b => + { + b.Property("cursId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("cursId")); + + b.Property("denumire") + .IsRequired() + .HasColumnType("text"); + + b.Property("descriere") + .IsRequired() + .HasColumnType("text"); + + b.Property("nrSedinte") + .HasColumnType("integer"); + + b.Property("pret") + .HasColumnType("integer"); + + b.HasKey("cursId"); + + b.ToTable("curs"); + }); + + modelBuilder.Entity("backend_MT.Models.Disponibilitate", b => + { + b.Property("disponibilitateId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("disponibilitateId")); + + b.Property("oraIncepere") + .HasColumnType("interval"); + + b.Property("userId") + .HasColumnType("integer"); + + b.Property("zi") + .HasColumnType("integer"); + + b.HasKey("disponibilitateId"); + + b.HasIndex("userId"); + + b.ToTable("disponibilitate"); + }); + + modelBuilder.Entity("backend_MT.Models.Feedback", b => + { + b.Property("feedbackId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("feedbackId")); + + b.Property("mesaj") + .IsRequired() + .HasColumnType("text"); + + b.Property("sedintaId") + .HasColumnType("integer"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("feedbackId"); + + b.HasIndex("sedintaId"); + + b.HasIndex("userId"); + + b.ToTable("feedback"); + }); + + modelBuilder.Entity("backend_MT.Models.Grupa", b => + { + b.Property("grupaId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("grupaId")); + + b.Property("cursId") + .HasColumnType("integer"); + + b.Property("linkMeet") + .IsRequired() + .HasColumnType("text"); + + b.Property("nivelStudiu") + .IsRequired() + .HasColumnType("text"); + + b.Property("nume") + .IsRequired() + .HasColumnType("text"); + + b.Property("userProfesorId") + .HasColumnType("integer"); + + b.HasKey("grupaId"); + + b.HasIndex("cursId"); + + b.HasIndex("userProfesorId"); + + b.ToTable("grupa"); + }); + + modelBuilder.Entity("backend_MT.Models.Material", b => + { + b.Property("materialId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("materialId")); + + b.Property("descriere") + .IsRequired() + .HasColumnType("text"); + + b.Property("titlu") + .IsRequired() + .HasColumnType("text"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("materialId"); + + b.HasIndex("userId"); + + b.ToTable("material"); + }); + + modelBuilder.Entity("backend_MT.Models.Mesaj", b => + { + b.Property("mesajId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("mesajId")); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("emitatorId") + .HasColumnType("integer"); + + b.Property("mesajText") + .IsRequired() + .HasColumnType("text"); + + b.Property("receptorId") + .HasColumnType("integer"); + + b.Property("tipMesaj") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("mesajId"); + + b.HasIndex("UserId"); + + b.HasIndex("emitatorId"); + + b.HasIndex("receptorId"); + + b.ToTable("mesaj"); + }); + + modelBuilder.Entity("backend_MT.Models.Notificare", b => + { + b.Property("notificareId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("notificareId")); + + b.Property("data") + .HasColumnType("timestamp with time zone"); + + b.Property("mesaj") + .IsRequired() + .HasColumnType("text"); + + b.Property("tipNotificare") + .IsRequired() + .HasColumnType("text"); + + b.Property("titlu") + .IsRequired() + .HasColumnType("text"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("notificareId"); + + b.HasIndex("userId"); + + b.ToTable("notificare"); + }); + + modelBuilder.Entity("backend_MT.Models.ParticipareGrupa", b => + { + b.Property("participareGrupaId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("participareGrupaId")); + + b.Property("grupaId") + .HasColumnType("integer"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("participareGrupaId"); + + b.HasIndex("grupaId"); + + b.HasIndex("userId"); + + b.ToTable("participareGrupa"); + }); + + modelBuilder.Entity("backend_MT.Models.Plata", b => + { + b.Property("plataId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("plataId")); + + b.Property("cursId") + .HasColumnType("integer"); + + b.Property("data") + .HasColumnType("timestamp with time zone"); + + b.Property("suma") + .HasColumnType("integer"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("plataId"); + + b.HasIndex("cursId"); + + b.HasIndex("userId"); + + b.ToTable("plata"); + }); + + modelBuilder.Entity("backend_MT.Models.Prezenta", b => + { + b.Property("prezentaId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("prezentaId")); + + b.Property("sedintaId") + .HasColumnType("integer"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("prezentaId"); + + b.HasIndex("sedintaId"); + + b.HasIndex("userId"); + + b.ToTable("prezenta"); + }); + + modelBuilder.Entity("backend_MT.Models.RaspunsTema", b => + { + b.Property("raspunsTemaId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("raspunsTemaId")); + + b.Property("fisier") + .IsRequired() + .HasColumnType("text"); + + b.Property("punctaj") + .HasColumnType("integer"); + + b.Property("temaId") + .HasColumnType("integer"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("raspunsTemaId"); + + b.HasIndex("temaId"); + + b.HasIndex("userId"); + + b.ToTable("raspunsTema"); + }); + + modelBuilder.Entity("backend_MT.Models.Sedinta", b => + { + b.Property("sedintaId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("sedintaId")); + + b.Property("grupaId") + .HasColumnType("integer"); + + b.Property("oraIncepere") + .HasColumnType("timestamp with time zone"); + + b.Property("oraIncheiere") + .HasColumnType("timestamp with time zone"); + + b.Property("titlu") + .IsRequired() + .HasColumnType("text"); + + b.Property("zi") + .HasColumnType("timestamp with time zone"); + + b.HasKey("sedintaId"); + + b.HasIndex("grupaId"); + + b.ToTable("sedinta"); + }); + + modelBuilder.Entity("backend_MT.Models.Support", b => + { + b.Property("supportId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("supportId")); + + b.Property("mesaj") + .IsRequired() + .HasColumnType("text"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("supportId"); + + b.HasIndex("userId"); + + b.ToTable("support"); + }); + + modelBuilder.Entity("backend_MT.Models.Tema", b => + { + b.Property("temaId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("temaId")); + + b.Property("descriere") + .IsRequired() + .HasColumnType("text"); + + b.Property("fisier") + .IsRequired() + .HasColumnType("text"); + + b.Property("titlu") + .IsRequired() + .HasColumnType("text"); + + b.Property("userId") + .HasColumnType("integer"); + + b.HasKey("temaId"); + + b.HasIndex("userId"); + + b.ToTable("tema"); + }); + + modelBuilder.Entity("backend_MT.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AccessFailedCount") + .HasColumnType("integer"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("PasswordHash") + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property("SecurityStamp") + .HasColumnType("text"); + + b.Property("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("nivel") + .HasColumnType("text"); + + b.Property("nume") + .IsRequired() + .HasColumnType("text"); + + b.Property("pozaProfil") + .IsRequired() + .HasColumnType("text"); + + b.Property("prenume") + .IsRequired() + .HasColumnType("text"); + + b.Property("profesorVerificat") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("backend_MT.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("backend_MT.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("backend_MT.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("backend_MT.Models.Disponibilitate", b => + { + b.HasOne("backend_MT.Models.User", "user") + .WithMany("disponibilitate") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Feedback", b => + { + b.HasOne("backend_MT.Models.Sedinta", "sedinta") + .WithMany("feedbackuri") + .HasForeignKey("sedintaId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", "user") + .WithMany("feedbackuri") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("sedinta"); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Grupa", b => + { + b.HasOne("backend_MT.Models.Curs", "curs") + .WithMany() + .HasForeignKey("cursId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", "userProfesor") + .WithMany("grupa") + .HasForeignKey("userProfesorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("curs"); + + b.Navigation("userProfesor"); + }); + + modelBuilder.Entity("backend_MT.Models.Material", b => + { + b.HasOne("backend_MT.Models.User", "user") + .WithMany("materiale") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Mesaj", b => + { + b.HasOne("backend_MT.Models.User", null) + .WithMany("mesaje") + .HasForeignKey("UserId"); + + b.HasOne("backend_MT.Models.User", "emitator") + .WithMany() + .HasForeignKey("emitatorId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", "receptor") + .WithMany() + .HasForeignKey("receptorId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("emitator"); + + b.Navigation("receptor"); + }); + + modelBuilder.Entity("backend_MT.Models.Notificare", b => + { + b.HasOne("backend_MT.Models.User", "user") + .WithMany("notificari") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.ParticipareGrupa", b => + { + b.HasOne("backend_MT.Models.Grupa", "grupa") + .WithMany("participariGrupa") + .HasForeignKey("grupaId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", "user") + .WithMany("participariGrupa") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("grupa"); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Plata", b => + { + b.HasOne("backend_MT.Models.Curs", "curs") + .WithMany() + .HasForeignKey("cursId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", "user") + .WithMany("plati") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("curs"); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Prezenta", b => + { + b.HasOne("backend_MT.Models.Sedinta", "sedinta") + .WithMany("prezente") + .HasForeignKey("sedintaId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", "user") + .WithMany("prezente") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("sedinta"); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.RaspunsTema", b => + { + b.HasOne("backend_MT.Models.Tema", "tema") + .WithMany("raspunsuriTema") + .HasForeignKey("temaId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("backend_MT.Models.User", "user") + .WithMany("raspunsuriTema") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("tema"); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Sedinta", b => + { + b.HasOne("backend_MT.Models.Grupa", "grupa") + .WithMany() + .HasForeignKey("grupaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("grupa"); + }); + + modelBuilder.Entity("backend_MT.Models.Support", b => + { + b.HasOne("backend_MT.Models.User", "user") + .WithMany("supporturi") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Tema", b => + { + b.HasOne("backend_MT.Models.User", "user") + .WithMany("teme") + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("user"); + }); + + modelBuilder.Entity("backend_MT.Models.Grupa", b => + { + b.Navigation("participariGrupa"); + }); + + modelBuilder.Entity("backend_MT.Models.Sedinta", b => + { + b.Navigation("feedbackuri"); + + b.Navigation("prezente"); + }); + + modelBuilder.Entity("backend_MT.Models.Tema", b => + { + b.Navigation("raspunsuriTema"); + }); + + modelBuilder.Entity("backend_MT.Models.User", b => + { + b.Navigation("disponibilitate"); + + b.Navigation("feedbackuri"); + + b.Navigation("grupa"); + + b.Navigation("materiale"); + + b.Navigation("mesaje"); + + b.Navigation("notificari"); + + b.Navigation("participariGrupa"); + + b.Navigation("plati"); + + b.Navigation("prezente"); + + b.Navigation("raspunsuriTema"); + + b.Navigation("supporturi"); + + b.Navigation("teme"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/backend-MT/Migrations/20250131220018_thirdmig.cs b/backend-MT/Migrations/20250131220018_thirdmig.cs new file mode 100644 index 0000000..0188716 --- /dev/null +++ b/backend-MT/Migrations/20250131220018_thirdmig.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace backend_MT.Migrations +{ + /// + public partial class thirdmig : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "nrTelefon", + table: "AspNetUsers"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "nrTelefon", + table: "AspNetUsers", + type: "text", + nullable: false, + defaultValue: ""); + } + } +} diff --git a/backend-MT/Migrations/ApplicationDbContextModelSnapshot.cs b/backend-MT/Migrations/ApplicationDbContextModelSnapshot.cs index 1aa9461..b70a6e2 100644 --- a/backend-MT/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/backend-MT/Migrations/ApplicationDbContextModelSnapshot.cs @@ -154,29 +154,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("AspNetUserTokens", (string)null); }); - modelBuilder.Entity("backend_MT.Models.Abonament", b => - { - b.Property("abonamentId") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("abonamentId")); - - b.Property("cursId") - .HasColumnType("integer"); - - b.Property("userId") - .HasColumnType("integer"); - - b.HasKey("abonamentId"); - - b.HasIndex("cursId"); - - b.HasIndex("userId"); - - b.ToTable("abonament"); - }); - modelBuilder.Entity("backend_MT.Models.Curs", b => { b.Property("cursId") @@ -278,14 +255,14 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("text"); - b.Property("userId") + b.Property("userProfesorId") .HasColumnType("integer"); b.HasKey("grupaId"); b.HasIndex("cursId"); - b.HasIndex("userId"); + b.HasIndex("userProfesorId"); b.ToTable("grupa"); }); @@ -363,16 +340,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("data") .HasColumnType("timestamp with time zone"); - b.Property("grupaId") - .HasColumnType("integer"); - b.Property("mesaj") .IsRequired() .HasColumnType("text"); - b.Property("receptorId") - .HasColumnType("integer"); - b.Property("tipNotificare") .IsRequired() .HasColumnType("text"); @@ -381,13 +352,11 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("text"); - b.Property("userId") + b.Property("userId") .HasColumnType("integer"); b.HasKey("notificareId"); - b.HasIndex("grupaId"); - b.HasIndex("userId"); b.ToTable("notificare"); @@ -445,29 +414,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("plata"); }); - modelBuilder.Entity("backend_MT.Models.Predare", b => - { - b.Property("predareId") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("predareId")); - - b.Property("cursId") - .HasColumnType("integer"); - - b.Property("userId") - .HasColumnType("integer"); - - b.HasKey("predareId"); - - b.HasIndex("cursId"); - - b.HasIndex("userId"); - - b.ToTable("predare"); - }); - modelBuilder.Entity("backend_MT.Models.Prezenta", b => { b.Property("prezentaId") @@ -659,17 +605,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(256) .HasColumnType("character varying(256)"); - b.Property("email") - .IsRequired() - .HasColumnType("text"); - b.Property("nivel") .HasColumnType("text"); - b.Property("nrTelefon") - .IsRequired() - .HasColumnType("text"); - b.Property("nume") .IsRequired() .HasColumnType("text"); @@ -685,10 +623,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("profesorVerificat") .HasColumnType("boolean"); - b.Property("username") - .IsRequired() - .HasColumnType("text"); - b.HasKey("Id"); b.HasIndex("NormalizedEmail") @@ -752,25 +686,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired(); }); - modelBuilder.Entity("backend_MT.Models.Abonament", b => - { - b.HasOne("backend_MT.Models.Curs", "curs") - .WithMany("abonamente") - .HasForeignKey("cursId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.HasOne("backend_MT.Models.User", "user") - .WithMany("abonamente") - .HasForeignKey("userId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.Navigation("curs"); - - b.Navigation("user"); - }); - modelBuilder.Entity("backend_MT.Models.Disponibilitate", b => { b.HasOne("backend_MT.Models.User", "user") @@ -809,15 +724,15 @@ protected override void BuildModel(ModelBuilder modelBuilder) .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("backend_MT.Models.User", "user") + b.HasOne("backend_MT.Models.User", "userProfesor") .WithMany("grupa") - .HasForeignKey("userId") + .HasForeignKey("userProfesorId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("curs"); - b.Navigation("user"); + b.Navigation("userProfesor"); }); modelBuilder.Entity("backend_MT.Models.Material", b => @@ -856,15 +771,11 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("backend_MT.Models.Notificare", b => { - b.HasOne("backend_MT.Models.Grupa", "grupa") - .WithMany() - .HasForeignKey("grupaId"); - b.HasOne("backend_MT.Models.User", "user") .WithMany("notificari") - .HasForeignKey("userId"); - - b.Navigation("grupa"); + .HasForeignKey("userId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); b.Navigation("user"); }); @@ -907,25 +818,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("user"); }); - modelBuilder.Entity("backend_MT.Models.Predare", b => - { - b.HasOne("backend_MT.Models.Curs", "curs") - .WithMany() - .HasForeignKey("cursId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("backend_MT.Models.User", "user") - .WithMany("predare") - .HasForeignKey("userId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("curs"); - - b.Navigation("user"); - }); - modelBuilder.Entity("backend_MT.Models.Prezenta", b => { b.HasOne("backend_MT.Models.Sedinta", "sedinta") @@ -997,11 +889,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("user"); }); - modelBuilder.Entity("backend_MT.Models.Curs", b => - { - b.Navigation("abonamente"); - }); - modelBuilder.Entity("backend_MT.Models.Grupa", b => { b.Navigation("participariGrupa"); @@ -1021,8 +908,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("backend_MT.Models.User", b => { - b.Navigation("abonamente"); - b.Navigation("disponibilitate"); b.Navigation("feedbackuri"); @@ -1039,8 +924,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("plati"); - b.Navigation("predare"); - b.Navigation("prezente"); b.Navigation("raspunsuriTema"); diff --git a/backend-MT/Models/User.cs b/backend-MT/Models/User.cs index 9f5a832..e444897 100644 --- a/backend-MT/Models/User.cs +++ b/backend-MT/Models/User.cs @@ -12,7 +12,6 @@ public class User : IdentityUser//Ce e cu ? e doar pentru un rol public string prenume { get; set; } public string? nivel { get; set; } public string pozaProfil { get; set; } - public string nrTelefon { get; set; } public ICollection? participariGrupa { get; set; } public ICollection? plati { get; set; } public ICollection? supporturi { get; set; } diff --git a/backend-MT/Program.cs b/backend-MT/Program.cs index 4c5e495..71ea2db 100644 --- a/backend-MT/Program.cs +++ b/backend-MT/Program.cs @@ -57,8 +57,6 @@ .AddEntityFrameworkStores() .AddDefaultTokenProviders(); -builder.Services.AddScoped(); - // Configure Entity Framework Core with SQL Server if (!builder.Environment.IsEnvironment("Test")) { @@ -95,6 +93,39 @@ }); }); +builder.Services.AddAuthentication(options => { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; +}).AddJwtBearer(o => +{ + o.TokenValidationParameters = new TokenValidationParameters() + { + ValidateActor = true, + ValidateAudience = true, + ValidateLifetime = true, + ValidateIssuerSigningKey = true, + ValidIssuer = builder.Configuration["Jwt:Issuer"], + ValidAudience = builder.Configuration["Jwt:Audience"], + IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])), + RoleClaimType = ClaimTypes.Role + }; +}); + +builder.Services.AddAuthorization(); + +builder.Services.AddCors(options => +{ + options.AddPolicy("AllowFrontendApp", policy => + { + policy.SetIsOriginAllowed(origin => + new Uri(origin).Host == "localhost") // Allow all localhost origins + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); +}); + + // Repositories builder.Services.AddScoped(); @@ -123,11 +154,14 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); var app = builder.Build(); +app.UseCors("AllowFrontendApp"); + // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { @@ -135,11 +169,17 @@ app.UseSwaggerUI(); } +await Seed.InitializeRoles(app); + +if (!app.Environment.IsDevelopment()) +{ + app.UseHttpsRedirection(); +} + app.UseHttpsRedirection(); +app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.UseAuthentication(); app.Run(); - -public partial class Program { } diff --git a/backend-MT/Service/UserService/UserService.cs b/backend-MT/Service/UserService/UserService.cs index ce83dee..e84f05f 100644 --- a/backend-MT/Service/UserService/UserService.cs +++ b/backend-MT/Service/UserService/UserService.cs @@ -2,30 +2,11 @@ using backend_MT.Models; using backend_MT.Service.UserService; using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Identity.UI.Services; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.IdentityModel.Tokens; -using backend_MT.Models; -using backend_MT.Models.DTOs; -using backend_MT.Models.DTOs.UserDTOs; -using backend_MT.Models.Roles; -using backend_MT.Repositories; -using backend_MT.Services; -using System; -using System.ComponentModel; -using System.Drawing; using System.IdentityModel.Tokens.Jwt; -using System.Net; -using System.Numerics; -using System.Reflection.PortableExecutable; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; using System.Security.Claims; using System.Text; -using System.Web; using static backend_MT.Models.Roles.Role; -using static System.Net.Mime.MediaTypeNames; using backend_MT.Exceptions; namespace backend_MT.Services @@ -40,6 +21,7 @@ public UserService(UserManager userManager, SignInManager signInMana _userManager = userManager; _signInManager = signInManager; } + public async Task RegisterAsync(RegisterDTO newUser) { var user = new User @@ -51,7 +33,8 @@ public async Task RegisterAsync(RegisterDTO newUser) PhoneNumber = newUser.nrTelefon, pozaProfil = newUser.pozaProfil, nivel = newUser.nivel, - profesorVerificat = newUser.profesorVerificat, + profesorVerificat = false, + EmailConfirmed = true }; var result = await _userManager.CreateAsync(user, newUser.parola); @@ -69,49 +52,52 @@ public async Task LoginAsync(LoginDTO login) var user = await _userManager.FindByNameAsync(login.username); if (user == null) { - throw new NotFoundException("Nu exista userul"); + throw new NotFoundException("User not found"); } - if (user.EmailConfirmed == false) + if (!user.EmailConfirmed) { - throw new NotFoundException("Emailul nu a fost confirmat, va rugam sa verificati emailul pentru link-ul de confirmare"); + throw new NotFoundException("Email not confirmed. Please check your email for the confirmation link."); } + var result = await _signInManager.PasswordSignInAsync(login.username, login.parola, login.remember, lockoutOnFailure: false); if (result.Succeeded) { - return TokenHandler(user, await _userManager.GetRolesAsync(user)); + var roles = await _userManager.GetRolesAsync(user); + return GenerateToken(user, roles); } else if (result.IsLockedOut) { - throw new LockedOutException("Prea multe incercari de logare in ultima perioada, contul este blocat."); + throw new LockedOutException("Too many failed login attempts. Your account is locked."); } else { - throw new WrongDetailsException("User sau parola gresita"); + throw new WrongDetailsException("Incorrect username or password"); } } - public string TokenHandler(User user, IList Role) + private string GenerateToken(User user, IList roles) { - var claims = new List - { - new Claim(ClaimTypes.NameIdentifier , user.UserName), - new Claim("id", user.Id.ToString()), - new Claim(ClaimTypes.Name , user.nume), - new Claim(ClaimTypes.Email , user.Email), - new Claim(ClaimTypes.MobilePhone , user.PhoneNumber), - new Claim(ClaimTypes.Role,Role.FirstOrDefault(Roles.Elev.ToString())) - }; + { + new Claim(ClaimTypes.NameIdentifier, user.UserName), + new Claim("id", user.Id.ToString()), + new Claim(ClaimTypes.Name, user.nume), + new Claim(ClaimTypes.Email, user.Email), + new Claim(ClaimTypes.MobilePhone, user.PhoneNumber) + }; + + var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("rGSSVGNjKoM4qq41wHcssBm4JDzDxfc93rfcAy+id0I=")); + var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); + var token = new JwtSecurityToken( issuer: "https://localhost:7215/", audience: "https://localhost:7215/", claims: claims, expires: DateTime.Now.AddDays(7), notBefore: DateTime.Now, - signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes("rGSSVGNjKoM4qq41wHcssBm4JDzDxfc93rfcAy+id0I=")), - SecurityAlgorithms.HmacSha256) - ); - var x = new JwtSecurityTokenHandler().WriteToken(token); - return x; + signingCredentials: creds + ); + + return new JwtSecurityTokenHandler().WriteToken(token); } } }