diff --git a/.idea/.idea.BeReadyBackend/.idea/dataSources.xml b/.idea/.idea.BeReadyBackend/.idea/dataSources.xml new file mode 100644 index 0000000..d84601c --- /dev/null +++ b/.idea/.idea.BeReadyBackend/.idea/dataSources.xml @@ -0,0 +1,12 @@ + + + + + sqlserver.jb + true + com.jetbrains.jdbc.sqlserver.SqlServerDriver + Server=romaric-thibault.fr,1433 + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/config/applicationhost.config b/.idea/config/applicationhost.config new file mode 100644 index 0000000..1849da7 --- /dev/null +++ b/.idea/config/applicationhost.config @@ -0,0 +1,983 @@ + + + + + + +
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BeReadyBackend/BeReadyBackend.csproj b/BeReadyBackend/BeReadyBackend.csproj index d7c0365..58002fa 100644 --- a/BeReadyBackend/BeReadyBackend.csproj +++ b/BeReadyBackend/BeReadyBackend.csproj @@ -17,4 +17,8 @@ + + + + diff --git a/BeReadyBackend/BeReadyBackend.http b/BeReadyBackend/BeReadyBackend.http deleted file mode 100644 index c8117d2..0000000 --- a/BeReadyBackend/BeReadyBackend.http +++ /dev/null @@ -1,6 +0,0 @@ -@BeReadyBackend_HostAddress = http://localhost:5235 - -GET {{BeReadyBackend_HostAddress}}/weatherforecast/ -Accept: application/json - -### diff --git a/BeReadyBackend/BeReadyDbContext.cs b/BeReadyBackend/BeReadyDbContext.cs new file mode 100644 index 0000000..c1236a7 --- /dev/null +++ b/BeReadyBackend/BeReadyDbContext.cs @@ -0,0 +1,46 @@ +using BeReadyBackend.Models; +using Microsoft.EntityFrameworkCore; + +namespace BeReadyBackend; + +public class BeReadyDbContext : DbContext +{ + public DbSet Achievements { get; set; } + public DbSet Designations { get; set; } + public DbSet Groups { get; set; } + public DbSet Messages { get; set; } + public DbSet RandomChallenges { get; set; } + public DbSet Status { get; set; } + public DbSet Users { get; set; } + public DbSet UserAchievements { get; set; } + public DbSet UserFriends { get; set; } + public DbSet UserGroups { get; set; } + public DbSet UserRandomChallenges { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + string connectionString = + "Server=romaric-thibault.fr;" + + "Database=beready;" + + "User Id=beready;" + + "Password=beready;" + + "TrustServerCertificate=true;"; + + optionsBuilder.UseSqlServer(connectionString); + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity() + .HasOne(x => x.User) + .WithMany(x => x.UserFriends) + .HasForeignKey(x => x.UserId) + .OnDelete(DeleteBehavior.Restrict); + + modelBuilder.Entity() + .HasOne(x => x.Friend) + .WithMany() + .HasForeignKey(x => x.FriendId) + .OnDelete(DeleteBehavior.Restrict); + } +} \ No newline at end of file diff --git a/BeReadyBackend/Migrations/20260220174541_InitialDatabase.Designer.cs b/BeReadyBackend/Migrations/20260220174541_InitialDatabase.Designer.cs new file mode 100644 index 0000000..25b1729 --- /dev/null +++ b/BeReadyBackend/Migrations/20260220174541_InitialDatabase.Designer.cs @@ -0,0 +1,473 @@ +// +using System; +using BeReadyBackend; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace BeReadyBackend.Migrations +{ + [DbContext(typeof(BeReadyDbContext))] + [Migration("20260220174541_InitialDatabase")] + partial class InitialDatabase + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.20") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("BeReadyBackend.Models.Achievement", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Label") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Achievements"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Designation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Label") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Designations"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Group", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Duration") + .HasColumnType("int"); + + b.Property("Label") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("StatusId") + .HasColumnType("int"); + + b.Property("Title") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("StatusId"); + + b.ToTable("Groups"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Message", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("GroupId") + .HasColumnType("int"); + + b.Property("Libelle") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SendDate") + .HasColumnType("datetime2"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("GroupId"); + + b.HasIndex("UserId"); + + b.ToTable("Messages"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.RandomChallenge", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Duration") + .HasColumnType("int"); + + b.Property("IsAlreadyPast") + .HasColumnType("bit"); + + b.Property("Libelle") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("RandomChallenges"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Status", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Label") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Status"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("DesignationId") + .HasColumnType("int"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Password") + .IsRequired() + .HasMaxLength(60) + .HasColumnType("nvarchar(60)"); + + b.Property("Salt") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Score") + .HasColumnType("int"); + + b.Property("Series") + .HasColumnType("int"); + + b.Property("TotalBonusChallenge") + .HasColumnType("int"); + + b.Property("TotalChallenge") + .HasColumnType("int"); + + b.Property("TotalPodium") + .HasColumnType("int"); + + b.Property("TotalWin") + .HasColumnType("int"); + + b.Property("Username") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("DesignationId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserAchievement", b => + { + b.Property("UserId") + .HasColumnType("int"); + + b.Property("AchievementId") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.HasKey("UserId", "AchievementId"); + + b.HasIndex("AchievementId"); + + b.ToTable("UserAchievements"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserFriend", b => + { + b.Property("UserId") + .HasColumnType("int"); + + b.Property("FriendId") + .HasColumnType("int"); + + b.HasKey("UserId", "FriendId"); + + b.HasIndex("FriendId"); + + b.ToTable("UserFriends"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserGroup", b => + { + b.Property("UserId") + .HasColumnType("int"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.Property("Grade") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Proof") + .HasColumnType("nvarchar(max)"); + + b.Property("Score") + .HasColumnType("int"); + + b.Property("VotedProofId") + .HasColumnType("int"); + + b.HasKey("UserId", "GroupId"); + + b.HasIndex("GroupId"); + + b.ToTable("UserGroups"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserRandomChallenge", b => + { + b.Property("UserId") + .HasColumnType("int"); + + b.Property("RandomChallengeId") + .HasColumnType("int"); + + b.Property("Proof") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "RandomChallengeId"); + + b.HasIndex("RandomChallengeId"); + + b.ToTable("UserRandomChallenges"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Group", b => + { + b.HasOne("BeReadyBackend.Models.Status", "Status") + .WithMany("Groups") + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Message", b => + { + b.HasOne("BeReadyBackend.Models.Group", "Group") + .WithMany("Messages") + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BeReadyBackend.Models.User", "User") + .WithMany("Messages") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Group"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.User", b => + { + b.HasOne("BeReadyBackend.Models.Designation", "Designation") + .WithMany("Users") + .HasForeignKey("DesignationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Designation"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserAchievement", b => + { + b.HasOne("BeReadyBackend.Models.Achievement", "Achievement") + .WithMany("UserAchievements") + .HasForeignKey("AchievementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BeReadyBackend.Models.User", "User") + .WithMany("UserAchievements") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Achievement"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserFriend", b => + { + b.HasOne("BeReadyBackend.Models.User", "Friend") + .WithMany() + .HasForeignKey("FriendId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("BeReadyBackend.Models.User", "User") + .WithMany("UserFriends") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Friend"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserGroup", b => + { + b.HasOne("BeReadyBackend.Models.Group", "Group") + .WithMany() + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BeReadyBackend.Models.User", "User") + .WithMany("UserGroups") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Group"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserRandomChallenge", b => + { + b.HasOne("BeReadyBackend.Models.RandomChallenge", "RandomChallenge") + .WithMany("UserRandomChallenges") + .HasForeignKey("RandomChallengeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BeReadyBackend.Models.User", "User") + .WithMany("UserRandomChallenges") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("RandomChallenge"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Achievement", b => + { + b.Navigation("UserAchievements"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Designation", b => + { + b.Navigation("Users"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Group", b => + { + b.Navigation("Messages"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.RandomChallenge", b => + { + b.Navigation("UserRandomChallenges"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Status", b => + { + b.Navigation("Groups"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.User", b => + { + b.Navigation("Messages"); + + b.Navigation("UserAchievements"); + + b.Navigation("UserFriends"); + + b.Navigation("UserGroups"); + + b.Navigation("UserRandomChallenges"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BeReadyBackend/Migrations/20260220174541_InitialDatabase.cs b/BeReadyBackend/Migrations/20260220174541_InitialDatabase.cs new file mode 100644 index 0000000..1766bcf --- /dev/null +++ b/BeReadyBackend/Migrations/20260220174541_InitialDatabase.cs @@ -0,0 +1,332 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace BeReadyBackend.Migrations +{ + /// + public partial class InitialDatabase : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Achievements", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Label = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Achievements", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Designations", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Label = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Designations", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "RandomChallenges", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Libelle = table.Column(type: "nvarchar(max)", nullable: false), + Duration = table.Column(type: "int", nullable: false), + IsAlreadyPast = table.Column(type: "bit", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_RandomChallenges", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Status", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Label = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Status", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Users", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + FirstName = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), + Name = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), + Username = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false), + Email = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), + CreationDate = table.Column(type: "datetime2", nullable: false), + Password = table.Column(type: "nvarchar(60)", maxLength: 60, nullable: false), + Salt = table.Column(type: "nvarchar(max)", nullable: false), + Score = table.Column(type: "int", nullable: false), + TotalWin = table.Column(type: "int", nullable: false), + TotalChallenge = table.Column(type: "int", nullable: false), + TotalPodium = table.Column(type: "int", nullable: false), + TotalBonusChallenge = table.Column(type: "int", nullable: false), + Series = table.Column(type: "int", nullable: false), + DesignationId = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Users", x => x.Id); + table.ForeignKey( + name: "FK_Users_Designations_DesignationId", + column: x => x.DesignationId, + principalTable: "Designations", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Groups", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Label = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), + StatusId = table.Column(type: "int", nullable: false), + Title = table.Column(type: "nvarchar(max)", nullable: false), + Description = table.Column(type: "nvarchar(max)", nullable: false), + Duration = table.Column(type: "int", nullable: false), + CreationDate = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Groups", x => x.Id); + table.ForeignKey( + name: "FK_Groups_Status_StatusId", + column: x => x.StatusId, + principalTable: "Status", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "UserAchievements", + columns: table => new + { + UserId = table.Column(type: "int", nullable: false), + AchievementId = table.Column(type: "int", nullable: false), + IsActive = table.Column(type: "bit", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_UserAchievements", x => new { x.UserId, x.AchievementId }); + table.ForeignKey( + name: "FK_UserAchievements_Achievements_AchievementId", + column: x => x.AchievementId, + principalTable: "Achievements", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_UserAchievements_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "UserFriends", + columns: table => new + { + UserId = table.Column(type: "int", nullable: false), + FriendId = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_UserFriends", x => new { x.UserId, x.FriendId }); + table.ForeignKey( + name: "FK_UserFriends_Users_FriendId", + column: x => x.FriendId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_UserFriends_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "UserRandomChallenges", + columns: table => new + { + UserId = table.Column(type: "int", nullable: false), + RandomChallengeId = table.Column(type: "int", nullable: false), + Proof = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_UserRandomChallenges", x => new { x.UserId, x.RandomChallengeId }); + table.ForeignKey( + name: "FK_UserRandomChallenges_RandomChallenges_RandomChallengeId", + column: x => x.RandomChallengeId, + principalTable: "RandomChallenges", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_UserRandomChallenges_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Messages", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Libelle = table.Column(type: "nvarchar(max)", nullable: false), + SendDate = table.Column(type: "datetime2", nullable: false), + UserId = table.Column(type: "int", nullable: false), + GroupId = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Messages", x => x.Id); + table.ForeignKey( + name: "FK_Messages_Groups_GroupId", + column: x => x.GroupId, + principalTable: "Groups", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Messages_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "UserGroups", + columns: table => new + { + UserId = table.Column(type: "int", nullable: false), + GroupId = table.Column(type: "int", nullable: false), + Proof = table.Column(type: "nvarchar(max)", nullable: true), + Grade = table.Column(type: "nvarchar(max)", nullable: false), + VotedProofId = table.Column(type: "int", nullable: true), + Score = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_UserGroups", x => new { x.UserId, x.GroupId }); + table.ForeignKey( + name: "FK_UserGroups_Groups_GroupId", + column: x => x.GroupId, + principalTable: "Groups", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_UserGroups_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Groups_StatusId", + table: "Groups", + column: "StatusId"); + + migrationBuilder.CreateIndex( + name: "IX_Messages_GroupId", + table: "Messages", + column: "GroupId"); + + migrationBuilder.CreateIndex( + name: "IX_Messages_UserId", + table: "Messages", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_UserAchievements_AchievementId", + table: "UserAchievements", + column: "AchievementId"); + + migrationBuilder.CreateIndex( + name: "IX_UserFriends_FriendId", + table: "UserFriends", + column: "FriendId"); + + migrationBuilder.CreateIndex( + name: "IX_UserGroups_GroupId", + table: "UserGroups", + column: "GroupId"); + + migrationBuilder.CreateIndex( + name: "IX_UserRandomChallenges_RandomChallengeId", + table: "UserRandomChallenges", + column: "RandomChallengeId"); + + migrationBuilder.CreateIndex( + name: "IX_Users_DesignationId", + table: "Users", + column: "DesignationId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Messages"); + + migrationBuilder.DropTable( + name: "UserAchievements"); + + migrationBuilder.DropTable( + name: "UserFriends"); + + migrationBuilder.DropTable( + name: "UserGroups"); + + migrationBuilder.DropTable( + name: "UserRandomChallenges"); + + migrationBuilder.DropTable( + name: "Achievements"); + + migrationBuilder.DropTable( + name: "Groups"); + + migrationBuilder.DropTable( + name: "RandomChallenges"); + + migrationBuilder.DropTable( + name: "Users"); + + migrationBuilder.DropTable( + name: "Status"); + + migrationBuilder.DropTable( + name: "Designations"); + } + } +} diff --git a/BeReadyBackend/Migrations/BeReadyDbContextModelSnapshot.cs b/BeReadyBackend/Migrations/BeReadyDbContextModelSnapshot.cs new file mode 100644 index 0000000..5ade79c --- /dev/null +++ b/BeReadyBackend/Migrations/BeReadyDbContextModelSnapshot.cs @@ -0,0 +1,470 @@ +// +using System; +using BeReadyBackend; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace BeReadyBackend.Migrations +{ + [DbContext(typeof(BeReadyDbContext))] + partial class BeReadyDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.20") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("BeReadyBackend.Models.Achievement", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Label") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Achievements"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Designation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Label") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Designations"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Group", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Duration") + .HasColumnType("int"); + + b.Property("Label") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("StatusId") + .HasColumnType("int"); + + b.Property("Title") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("StatusId"); + + b.ToTable("Groups"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Message", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("GroupId") + .HasColumnType("int"); + + b.Property("Libelle") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SendDate") + .HasColumnType("datetime2"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("GroupId"); + + b.HasIndex("UserId"); + + b.ToTable("Messages"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.RandomChallenge", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Duration") + .HasColumnType("int"); + + b.Property("IsAlreadyPast") + .HasColumnType("bit"); + + b.Property("Libelle") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("RandomChallenges"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Status", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Label") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Status"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("DesignationId") + .HasColumnType("int"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Password") + .IsRequired() + .HasMaxLength(60) + .HasColumnType("nvarchar(60)"); + + b.Property("Salt") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Score") + .HasColumnType("int"); + + b.Property("Series") + .HasColumnType("int"); + + b.Property("TotalBonusChallenge") + .HasColumnType("int"); + + b.Property("TotalChallenge") + .HasColumnType("int"); + + b.Property("TotalPodium") + .HasColumnType("int"); + + b.Property("TotalWin") + .HasColumnType("int"); + + b.Property("Username") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("DesignationId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserAchievement", b => + { + b.Property("UserId") + .HasColumnType("int"); + + b.Property("AchievementId") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.HasKey("UserId", "AchievementId"); + + b.HasIndex("AchievementId"); + + b.ToTable("UserAchievements"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserFriend", b => + { + b.Property("UserId") + .HasColumnType("int"); + + b.Property("FriendId") + .HasColumnType("int"); + + b.HasKey("UserId", "FriendId"); + + b.HasIndex("FriendId"); + + b.ToTable("UserFriends"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserGroup", b => + { + b.Property("UserId") + .HasColumnType("int"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.Property("Grade") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Proof") + .HasColumnType("nvarchar(max)"); + + b.Property("Score") + .HasColumnType("int"); + + b.Property("VotedProofId") + .HasColumnType("int"); + + b.HasKey("UserId", "GroupId"); + + b.HasIndex("GroupId"); + + b.ToTable("UserGroups"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserRandomChallenge", b => + { + b.Property("UserId") + .HasColumnType("int"); + + b.Property("RandomChallengeId") + .HasColumnType("int"); + + b.Property("Proof") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "RandomChallengeId"); + + b.HasIndex("RandomChallengeId"); + + b.ToTable("UserRandomChallenges"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Group", b => + { + b.HasOne("BeReadyBackend.Models.Status", "Status") + .WithMany("Groups") + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Message", b => + { + b.HasOne("BeReadyBackend.Models.Group", "Group") + .WithMany("Messages") + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BeReadyBackend.Models.User", "User") + .WithMany("Messages") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Group"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.User", b => + { + b.HasOne("BeReadyBackend.Models.Designation", "Designation") + .WithMany("Users") + .HasForeignKey("DesignationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Designation"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserAchievement", b => + { + b.HasOne("BeReadyBackend.Models.Achievement", "Achievement") + .WithMany("UserAchievements") + .HasForeignKey("AchievementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BeReadyBackend.Models.User", "User") + .WithMany("UserAchievements") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Achievement"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserFriend", b => + { + b.HasOne("BeReadyBackend.Models.User", "Friend") + .WithMany() + .HasForeignKey("FriendId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("BeReadyBackend.Models.User", "User") + .WithMany("UserFriends") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Friend"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserGroup", b => + { + b.HasOne("BeReadyBackend.Models.Group", "Group") + .WithMany() + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BeReadyBackend.Models.User", "User") + .WithMany("UserGroups") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Group"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.UserRandomChallenge", b => + { + b.HasOne("BeReadyBackend.Models.RandomChallenge", "RandomChallenge") + .WithMany("UserRandomChallenges") + .HasForeignKey("RandomChallengeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BeReadyBackend.Models.User", "User") + .WithMany("UserRandomChallenges") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("RandomChallenge"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Achievement", b => + { + b.Navigation("UserAchievements"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Designation", b => + { + b.Navigation("Users"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Group", b => + { + b.Navigation("Messages"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.RandomChallenge", b => + { + b.Navigation("UserRandomChallenges"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.Status", b => + { + b.Navigation("Groups"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.User", b => + { + b.Navigation("Messages"); + + b.Navigation("UserAchievements"); + + b.Navigation("UserFriends"); + + b.Navigation("UserGroups"); + + b.Navigation("UserRandomChallenges"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BeReadyBackend/Models/Achievement.cs b/BeReadyBackend/Models/Achievement.cs new file mode 100644 index 0000000..36e1c17 --- /dev/null +++ b/BeReadyBackend/Models/Achievement.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace BeReadyBackend.Models; + +public class Achievement +{ + [Key] public int Id { get; set; } + [Required] public string? Label { get; set; } + + public List? UserAchievements { get; set; } +} \ No newline at end of file diff --git a/BeReadyBackend/Models/Designation.cs b/BeReadyBackend/Models/Designation.cs new file mode 100644 index 0000000..db6c576 --- /dev/null +++ b/BeReadyBackend/Models/Designation.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace BeReadyBackend.Models; + +public class Designation +{ + [Key] public int Id { get; set; } + [Required] public string? Label { get; set; } + + public List? Users { get; set; } +} \ No newline at end of file diff --git a/BeReadyBackend/Models/Group.cs b/BeReadyBackend/Models/Group.cs new file mode 100644 index 0000000..f852bf7 --- /dev/null +++ b/BeReadyBackend/Models/Group.cs @@ -0,0 +1,19 @@ +using System.ComponentModel.DataAnnotations; + +namespace BeReadyBackend.Models; + +public class Group +{ + [Key] public int Id { get; set; } + [Required, MaxLength(100)] public string? Label { get; set; } + + public Status? Status { get; set; } + [Required] public int StatusId { get; set; } + + [Required] public string? Title { get; set; } + [Required] public string? Description { get; set; } + [Required] public int Duration { get; set; } + [Required] public DateTime CreationDate { get; set; } + + public List? Messages { get; set; } +} \ No newline at end of file diff --git a/BeReadyBackend/Models/Message.cs b/BeReadyBackend/Models/Message.cs new file mode 100644 index 0000000..aa18bc6 --- /dev/null +++ b/BeReadyBackend/Models/Message.cs @@ -0,0 +1,16 @@ +using System.ComponentModel.DataAnnotations; + +namespace BeReadyBackend.Models; + +public class Message +{ + [Key] public int Id { get; set; } + [Required] public string? Libelle { get; set; } + [Required] public DateTime SendDate { get; set; } + + public User? User { get; set; } + [Required] public int UserId { get; set; } + + public Group? Group { get; set; } + [Required] public int GroupId { get; set; } +} \ No newline at end of file diff --git a/BeReadyBackend/Models/RandomChallenge.cs b/BeReadyBackend/Models/RandomChallenge.cs new file mode 100644 index 0000000..cc272c7 --- /dev/null +++ b/BeReadyBackend/Models/RandomChallenge.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; + +namespace BeReadyBackend.Models; + +public class RandomChallenge +{ + [Key] public int Id { get; set; } + [Required] public string? Libelle { get; set; } + [Required] public int Duration {get; set;} + [Required] public bool IsAlreadyPast { get; set; } + + public List? UserRandomChallenges { get; set; } +} \ No newline at end of file diff --git a/BeReadyBackend/Models/Status.cs b/BeReadyBackend/Models/Status.cs new file mode 100644 index 0000000..ec291ff --- /dev/null +++ b/BeReadyBackend/Models/Status.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace BeReadyBackend.Models; + +public class Status +{ + [Key] public int Id { get; set; } + [Required] public string? Label { get; set; } + + public List? Groups { get; set; } +} \ No newline at end of file diff --git a/BeReadyBackend/Models/User.cs b/BeReadyBackend/Models/User.cs new file mode 100644 index 0000000..0e74ff8 --- /dev/null +++ b/BeReadyBackend/Models/User.cs @@ -0,0 +1,30 @@ +using System.ComponentModel.DataAnnotations; + +namespace BeReadyBackend.Models; + +public class User +{ + [Key] public int Id { get; set; } + [Required, MaxLength(50)] public string? FirstName { get; set; } + [Required, MaxLength(50)] public string? Name { get; set; } + [Required, MaxLength(50)] public string? Username { get; set; } + [Required, MaxLength(100)] public string? Email { get; set; } + [Required] public DateTime CreationDate { get; set; } + [Required, MaxLength(60)] public string? Password { get; set; } + [Required] public string? Salt { get; set; } + [Required, ] public int Score { get; set; } + [Required] public int TotalWin { get; set; } + [Required] public int TotalChallenge { get; set; } + [Required] public int TotalPodium { get; set; } + [Required] public int TotalBonusChallenge { get; set; } + [Required] public int Series { get; set; } + + public Designation? Designation { get; set; } + [Required] public int DesignationId { get; set; } + + public List? UserFriends { get; set; } + public List? Messages { get; set; } + public List? UserRandomChallenges { get; set; } + public List? UserAchievements { get; set; } + public List? UserGroups { get; set; } +} \ No newline at end of file diff --git a/BeReadyBackend/Models/UserAchievement.cs b/BeReadyBackend/Models/UserAchievement.cs new file mode 100644 index 0000000..8a1c732 --- /dev/null +++ b/BeReadyBackend/Models/UserAchievement.cs @@ -0,0 +1,16 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.EntityFrameworkCore; + +namespace BeReadyBackend.Models; + +[PrimaryKey(nameof(UserId), nameof(AchievementId))] +public class UserAchievement +{ + public User? User { get; set; } + [Required] public int UserId { get; set; } + + public Achievement? Achievement { get; set; } + [Required] public int AchievementId { get; set; } + + [Required] public bool IsActive { get; set; } +} \ No newline at end of file diff --git a/BeReadyBackend/Models/UserFriend.cs b/BeReadyBackend/Models/UserFriend.cs new file mode 100644 index 0000000..995f50e --- /dev/null +++ b/BeReadyBackend/Models/UserFriend.cs @@ -0,0 +1,13 @@ +using Microsoft.EntityFrameworkCore; + +namespace BeReadyBackend.Models; + +[PrimaryKey(nameof(UserId), nameof(FriendId))] +public class UserFriend +{ + public User? User { get; set; } + public int UserId { get; set; } + + public User? Friend { get; set; } + public int FriendId { get; set; } +} \ No newline at end of file diff --git a/BeReadyBackend/Models/UserGroup.cs b/BeReadyBackend/Models/UserGroup.cs new file mode 100644 index 0000000..f0f1f91 --- /dev/null +++ b/BeReadyBackend/Models/UserGroup.cs @@ -0,0 +1,20 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.EntityFrameworkCore; + +namespace BeReadyBackend.Models; + +[PrimaryKey(nameof(UserId), nameof(GroupId))] +public class UserGroup +{ + public User? User { get; set; } + [Required] public int UserId { get; set; } + + public Group? Group { get; set; } + [Required] public int GroupId { get; set; } + + public string? Proof { get; set; } + + [Required] public string? Grade { get; set; } + public int? VotedProofId { get; set; } + [Required] public int Score { get; set; } +} \ No newline at end of file diff --git a/BeReadyBackend/Models/UserRandomChallenge.cs b/BeReadyBackend/Models/UserRandomChallenge.cs new file mode 100644 index 0000000..c1d6aef --- /dev/null +++ b/BeReadyBackend/Models/UserRandomChallenge.cs @@ -0,0 +1,16 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.EntityFrameworkCore; + +namespace BeReadyBackend.Models; + +[PrimaryKey(nameof(UserId), nameof(RandomChallengeId))] +public class UserRandomChallenge +{ + public User? User { get; set; } + [Required] public int UserId { get; set; } + + public RandomChallenge? RandomChallenge { get; set; } + [Required] public int RandomChallengeId { get; set; } + + public string? Proof { get; set; } +} \ No newline at end of file diff --git a/obj/--Context.EntityFrameworkCore.targets b/obj/--Context.EntityFrameworkCore.targets new file mode 100644 index 0000000..7d6485d --- /dev/null +++ b/obj/--Context.EntityFrameworkCore.targets @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + +