diff --git a/BeReadyBackend/BeReadyDbContext.cs b/BeReadyBackend/BeReadyDbContext.cs index 9a81e00..010933e 100644 --- a/BeReadyBackend/BeReadyDbContext.cs +++ b/BeReadyBackend/BeReadyDbContext.cs @@ -15,6 +15,7 @@ public class BeReadyDbContext : DbContext public DbSet UserFriends { get; set; } public DbSet UserGroups { get; set; } public DbSet UserRandomChallenges { get; set; } + public DbSet Posts { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { diff --git a/BeReadyBackend/Endpoints/Groups/AddUserToGroupEndpoint.cs b/BeReadyBackend/Endpoints/Groups/AddUserToGroupEndpoint.cs index 106d729..a53ff56 100644 --- a/BeReadyBackend/Endpoints/Groups/AddUserToGroupEndpoint.cs +++ b/BeReadyBackend/Endpoints/Groups/AddUserToGroupEndpoint.cs @@ -40,7 +40,6 @@ public class AddUserToGroupEndpoint(UserService userService, UserGroupsRepositor userGroup = mapper.Map(req); userGroup.Grade = "Member"; - userGroup.Score = 0; await userGroupsRepository.AddAsync(userGroup, ct); await Send.NoContentAsync(ct); diff --git a/BeReadyBackend/Endpoints/Groups/CreateGroupEndpoint.cs b/BeReadyBackend/Endpoints/Groups/CreateGroupEndpoint.cs index 735019b..d44e8ae 100644 --- a/BeReadyBackend/Endpoints/Groups/CreateGroupEndpoint.cs +++ b/BeReadyBackend/Endpoints/Groups/CreateGroupEndpoint.cs @@ -26,7 +26,6 @@ public class CreateGroupEndpoint( Group group = new(); mapper.Map(req, group); - group.IsFinished = false; group.CreationDate = DateTime.Now; group.UserGroups = []; @@ -41,8 +40,7 @@ public class CreateGroupEndpoint( { UserId = user.UserId, GroupId = group.Id, - Grade = "Member", - Score = 0 + Grade = "Member" }; group.UserGroups?.Add(userGroup); } @@ -51,8 +49,7 @@ public class CreateGroupEndpoint( { UserId = userId, GroupId = group.Id, - Grade = "Admin", - Score = 0 + Grade = "Admin" }; group.UserGroups?.Add(userGroup); diff --git a/BeReadyBackend/Endpoints/Groups/GetAllProofsEndpoint.cs b/BeReadyBackend/Endpoints/Groups/GetAllProofsEndpoint.cs deleted file mode 100644 index 0d45a81..0000000 --- a/BeReadyBackend/Endpoints/Groups/GetAllProofsEndpoint.cs +++ /dev/null @@ -1,39 +0,0 @@ -using BeReadyBackend.DTO.Groups; -using BeReadyBackend.Repositories; -using BeReadyBackend.Specifications.Groups; -using FastEndpoints; -using Group = BeReadyBackend.Models.Group; - -namespace BeReadyBackend.Endpoints.Groups; - -public class GroupProofRequest -{ - public int Id { get; set; } -} - -public class GetAllProofsEndpoint(UserGroupsRepository userGroupsRepository, GroupsRepository groupsRepository) : Endpoint> -{ - public override void Configure() - { - Get("/Groups/{@Id}/Proofs/", x => new { x.Id }); - } - - public override async Task HandleAsync(GroupProofRequest req, CancellationToken ct) - { - Group? group = await groupsRepository.SingleOrDefaultAsync(new GetGroupByIdSpec(req.Id), ct); - if (group is null) - { - await Send.NotFoundAsync(ct); - return; - } - - if (group.StartedVote != null && group.StartedVote.Value.AddHours(group.VoteDuration) < DateTime.Now) - { - await Send.StringAsync("Les votes ne sont pas fini", 400, cancellation: ct); - return; - } - - List usersGroup = await userGroupsRepository.ProjectToListAsync(new GetUserGroupDetailsByIdSpec(req.Id), ct); - await Send.OkAsync(usersGroup, ct); - } -} \ No newline at end of file diff --git a/BeReadyBackend/Endpoints/Groups/GetGroupRankingEndpoint.cs b/BeReadyBackend/Endpoints/Groups/GetGroupRankingEndpoint.cs deleted file mode 100644 index d3f0613..0000000 --- a/BeReadyBackend/Endpoints/Groups/GetGroupRankingEndpoint.cs +++ /dev/null @@ -1,61 +0,0 @@ -using BeReadyBackend.DTO.Groups; -using BeReadyBackend.Models; -using BeReadyBackend.Repositories; -using BeReadyBackend.Specifications.Groups; -using BeReadyBackend.Specifications.Users; -using FastEndpoints; -using Group = BeReadyBackend.Models.Group; - -namespace BeReadyBackend.Endpoints.Groups; - -public class GroupRankingRequest -{ - public int Id { get; set; } -} - -public class GetGroupRankingEndpoint( - GroupsRepository groupsRepository, - UsersRepository usersRepository, - UserGroupsRepository userGroupsRepository) - : Endpoint> -{ - public override void Configure() - { - Get("/Groups/{@Id}/GroupRank", x => new { x.Id }); - } - - public override async Task HandleAsync(GroupRankingRequest req, CancellationToken ct) - { - Group? group = await groupsRepository.SingleOrDefaultAsync(new GetGroupByIdSpec(req.Id), ct); - if (group is null) - { - await Send.NotFoundAsync(ct); - return; - } - - foreach (UserGroup member in group.UserGroups!) - { - if (member.Proof is null) member.Score -= 2; - - if (!member.VotedProofId.HasValue) continue; - User? votedUser = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(member.VotedProofId.Value), ct); - if (votedUser is not null) votedUser.Score++; - } - - await usersRepository.SaveChangesAsync(ct); - await userGroupsRepository.SaveChangesAsync(ct); - - List groupScore = await userGroupsRepository.ProjectToListAsync(new GetGroupRankSpec(req.Id), ct); - - int[] points = [5, 3, 1]; - for (int i = 0; i < groupScore.Count && i < 3; i++) - { - User? user = await usersRepository.SingleOrDefaultAsync(new GetUserByIdSpec(groupScore[i].UserId), ct); - if (user != null) user.Score += points[i]; - } - - await usersRepository.SaveChangesAsync(ct); - - await Send.OkAsync(groupScore, ct); - } -} \ No newline at end of file diff --git a/BeReadyBackend/Endpoints/Groups/PatchGroupStatusEndpoint.cs b/BeReadyBackend/Endpoints/Groups/PatchGroupStatusEndpoint.cs deleted file mode 100644 index 4be2c57..0000000 --- a/BeReadyBackend/Endpoints/Groups/PatchGroupStatusEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using BeReadyBackend.Repositories; -using BeReadyBackend.Specifications.Groups; -using FastEndpoints; -using Group = BeReadyBackend.Models.Group; - -namespace BeReadyBackend.Endpoints.Groups; - -public class StatusRequest -{ - public int GroupId { get; set; } -} - -public class PatchGroupStatusEndpoint(GroupsRepository groupsRepository) : Endpoint -{ - public override void Configure() - { - Patch("/Groups/{@GroupId}/Status/", x => new { x.GroupId }); - } - - public override async Task HandleAsync(StatusRequest req, CancellationToken ct) - { - Group? group = await groupsRepository.SingleOrDefaultAsync(new GetGroupByIdSpec(req.GroupId), ct); - - if (group is null) - { - await Send.NotFoundAsync(ct); - return; - } - - group.IsFinished = true; - await groupsRepository.SaveChangesAsync(ct); - await Send.NoContentAsync(ct); - } -} \ No newline at end of file diff --git a/BeReadyBackend/Endpoints/Groups/PatchGroupUserProofEndpoint.cs b/BeReadyBackend/Endpoints/Groups/PatchGroupUserProofEndpoint.cs deleted file mode 100644 index d945e10..0000000 --- a/BeReadyBackend/Endpoints/Groups/PatchGroupUserProofEndpoint.cs +++ /dev/null @@ -1,65 +0,0 @@ -using BeReadyBackend.Hubs; -using BeReadyBackend.Models; -using BeReadyBackend.Repositories; -using BeReadyBackend.Services; -using BeReadyBackend.Specifications.Groups; -using FastEndpoints; -using Microsoft.AspNetCore.SignalR; - -namespace BeReadyBackend.Endpoints.Groups; - -public class UserProofRequest -{ - public int GroupId { get; set; } - public IFormFile? Proof { get; set; } -} - -public class PatchGroupUserProofEndpoint(UserGroupsRepository userGroupsRepository, UserService userService, IHubContext hubContext) : Endpoint -{ - public override void Configure() - { - Patch("/Groups/{@GroupId}/Users/Proof/", x => new { x.GroupId }); - } - - public override async Task HandleAsync(UserProofRequest req, CancellationToken ct) - { - int userId = userService.GetUserIdFromToken(); - UserGroup? member = await userGroupsRepository.SingleOrDefaultAsync(new GetUserInGroupByIdsSpec(req.GroupId, userId), ct); - - if (member is null) - { - await Send.NotFoundAsync(ct); - return; - } - - if (member.Proof is not null) - { - await Send.StringAsync("Vous avez déjà déposé une photo", 400, cancellation: ct); - return; - } - - if (member.Group != null && member.Group.IsFinished) - { - await Send.StringAsync("Ce défi est terminé", 400, cancellation: ct); - return; - } - - if (req.Proof == null || req.Proof.Length == 0) - { - await Send.StringAsync("Photo non fournie", 400, cancellation: ct); - return; - } - - // Encodage base64 - using MemoryStream memoryStream = new(); - await req.Proof.CopyToAsync(memoryStream, ct); - byte[] proofBytes = memoryStream.ToArray(); - - member.Proof = Convert.ToBase64String(proofBytes); - await userGroupsRepository.SaveChangesAsync(ct); - - await hubContext.Clients.Group($"group-{req.GroupId}").SendAsync("ReceiveProof", member.Proof, cancellationToken: ct); - - await Send.NoContentAsync(ct); - } -} \ No newline at end of file diff --git a/BeReadyBackend/Endpoints/Groups/PatchVoteEndpoint.cs b/BeReadyBackend/Endpoints/Groups/PatchVoteEndpoint.cs deleted file mode 100644 index 20856fb..0000000 --- a/BeReadyBackend/Endpoints/Groups/PatchVoteEndpoint.cs +++ /dev/null @@ -1,55 +0,0 @@ -using BeReadyBackend.Models; -using BeReadyBackend.Repositories; -using BeReadyBackend.Services; -using BeReadyBackend.Specifications.Groups; -using FastEndpoints; - -namespace BeReadyBackend.Endpoints.Groups; - -public class UserVoteRequest -{ - public int GroupId { get; set; } - public int VotedProofId { get; set; } -} - -public class PatchVoteEndpoint(UserGroupsRepository userGroupsRepository, UserService userService) : Endpoint -{ - public override void Configure() - { - Patch("/Groups/{@GroupId}/Users/Vote/", x => new { x.GroupId }); - } - - public override async Task HandleAsync(UserVoteRequest req, CancellationToken ct) - { - int userId = userService.GetUserIdFromToken(); - UserGroup? member = await userGroupsRepository.SingleOrDefaultAsync(new GetUserInGroupByIdsSpec(req.GroupId, userId), ct); - - if (member is null) - { - await Send.NotFoundAsync(ct); - return; - } - - if (member.VotedProofId is not null) - { - await Send.StringAsync("Vous ne pouvez pas voter plusieurs fois", 400, cancellation: ct); - return; - } - - if (member.Group!.StartedVote is not null && member.Group.StartedVote.Value.AddHours(member.Group.VoteDuration) < DateTime.Now) - { - await Send.StringAsync("Le vote est terminé", 400, cancellation: ct); - return; - } - - if (member.Group!.StartedVote is null) - { - await Send.StringAsync("Le vote n'a pas commencé", 400, cancellation: ct); - return; - } - - member.VotedProofId = req.VotedProofId; - await userGroupsRepository.SaveChangesAsync(ct); - await Send.NoContentAsync(ct); - } -} \ No newline at end of file diff --git a/BeReadyBackend/Endpoints/Groups/StartVoteEndpoint.cs b/BeReadyBackend/Endpoints/Groups/StartVoteEndpoint.cs deleted file mode 100644 index 51e841c..0000000 --- a/BeReadyBackend/Endpoints/Groups/StartVoteEndpoint.cs +++ /dev/null @@ -1,53 +0,0 @@ -using BeReadyBackend.Hubs; -using BeReadyBackend.Models; -using BeReadyBackend.Repositories; -using BeReadyBackend.Services; -using BeReadyBackend.Specifications.Groups; -using FastEndpoints; -using Microsoft.AspNetCore.SignalR; -using Group = BeReadyBackend.Models.Group; - -namespace BeReadyBackend.Endpoints.Groups; - -public class GroupVoteRequest -{ - public int Id { get; set; } -} - -public class StartVoteEndpoint(UserGroupsRepository userGroupsRepository, GroupsRepository groupsRepository, UserService userService, IHubContext hubContext) - : Endpoint -{ - public override void Configure() - { - Post("/Groups/{@Id}/Vote/", x => new { x.Id }); - } - - public override async Task HandleAsync(GroupVoteRequest req, CancellationToken ct) - { - Group? group = await groupsRepository.SingleOrDefaultAsync(new GetGroupByIdSpec(req.Id), ct); - - if (group is null) - { - await Send.NotFoundAsync(ct); - return; - } - - if (group.IsFinished) - { - await Send.StringAsync("Le défi est terminé", 400, cancellation: ct); - return; - } - - if (group.CreationDate.AddHours(group.Duration) > DateTime.Now || !group.IsFinished) - { - await Send.StringAsync("Le défi n'est pas encore terminé", 400, cancellation: ct); - return; - } - - group.StartedVote = DateTime.Now; - await groupsRepository.SaveChangesAsync(ct); - - await hubContext.Clients.Group($"group-{req.Id}").SendAsync("StartVote", cancellationToken: ct); - await Send.NoContentAsync(ct); - } -} \ No newline at end of file diff --git a/BeReadyBackend/Endpoints/Messages/SendMessageEndpoint.cs b/BeReadyBackend/Endpoints/Messages/SendMessageEndpoint.cs index 04eba3a..d1d29d3 100644 --- a/BeReadyBackend/Endpoints/Messages/SendMessageEndpoint.cs +++ b/BeReadyBackend/Endpoints/Messages/SendMessageEndpoint.cs @@ -32,12 +32,6 @@ public class SendMessageEndpoint( return; } - if (group.IsFinished) - { - await Send.StringAsync("Le groupe est fermé", 400, cancellation: ct); - return; - } - Message message = new(); mapper.Map(req, message); message.UserId = userService.GetUserIdFromToken(); diff --git a/BeReadyBackend/Endpoints/RandomChallenges/PatchProofEndpoint.cs b/BeReadyBackend/Endpoints/RandomChallenges/PatchProofEndpoint.cs index b238a36..a7d7903 100644 --- a/BeReadyBackend/Endpoints/RandomChallenges/PatchProofEndpoint.cs +++ b/BeReadyBackend/Endpoints/RandomChallenges/PatchProofEndpoint.cs @@ -36,7 +36,7 @@ public class PatchProofEndpoint( return; } - if (randomChallenge.GeneratedAt != null && DateTime.Now > randomChallenge.GeneratedAt.Value.AddHours(randomChallenge.Duration)) + if (randomChallenge.GeneratedAt != null && DateOnly.FromDateTime(DateTime.Now) > DateOnly.FromDateTime(randomChallenge.GeneratedAt.Value)) { await Send.StringAsync("Le défi est terminé", 400, cancellation: ct); return; @@ -76,8 +76,7 @@ public class PatchProofEndpoint( userRandomChallenge.Proof = Convert.ToBase64String(proofBytes); - user.Score++; // 1pts bonus - user.TotalBonusChallenge++; // +1 challenge bonus de fait + user.TotalChallenge++; // +1 challenge bonus de fait await usersRepository.SaveChangesAsync(ct); await userRandomChallengesRepository.SaveChangesAsync(ct); diff --git a/BeReadyBackend/Endpoints/Users/CreateUserEndpoint.cs b/BeReadyBackend/Endpoints/Users/CreateUserEndpoint.cs index 9789b6b..93916bc 100644 --- a/BeReadyBackend/Endpoints/Users/CreateUserEndpoint.cs +++ b/BeReadyBackend/Endpoints/Users/CreateUserEndpoint.cs @@ -29,15 +29,8 @@ public class CreateUserEndpoint(UsersRepository usersRepository, AutoMapper.IMap user = mapper.Map(req); - user.CreationDate = DateTime.Now; user.Salt = salt; user.Password = BCrypt.Net.BCrypt.HashPassword(req.Password + salt); - user.Score = 0; - user.TotalWin = 0; - user.TotalChallenge = 0; - user.TotalPodium = 0; - user.TotalBonusChallenge = 0; - user.Series = 0; await usersRepository.AddAsync(user, ct); await Send.NoContentAsync(ct); diff --git a/BeReadyBackend/Endpoints/Users/GetAllUserProofsEndpoint.cs b/BeReadyBackend/Endpoints/Users/GetAllUserProofsEndpoint.cs index 7a89149..05da4a1 100644 --- a/BeReadyBackend/Endpoints/Users/GetAllUserProofsEndpoint.cs +++ b/BeReadyBackend/Endpoints/Users/GetAllUserProofsEndpoint.cs @@ -37,14 +37,6 @@ public class GetAllUserProofsEndpoint(UsersRepository usersRepository, UserServi }) ); - if (user.UserGroups is not null) - proofs.AddRange( - user.UserGroups.Select(x => new GetUserProofDto - { - Proof = x.Proof - }) - ); - await Send.OkAsync(proofs, ct); } } \ No newline at end of file diff --git a/BeReadyBackend/MappingProfiles/EntityToDtoMappings.cs b/BeReadyBackend/MappingProfiles/EntityToDtoMappings.cs index 280cade..f7f0290 100644 --- a/BeReadyBackend/MappingProfiles/EntityToDtoMappings.cs +++ b/BeReadyBackend/MappingProfiles/EntityToDtoMappings.cs @@ -37,32 +37,24 @@ public class EntityToDtoMappings : Profile CreateMap() .ForMember(dest => dest.ChallengeTitle, opt => opt.MapFrom(src => src.Label)) .ForMember(dest => dest.ChallengeDescription, opt => opt.MapFrom(src => src.Libelle)) - .ForMember(dest => dest.ChallengeDuration, opt => opt.MapFrom(src => src.Duration)) .ForMember(dest => dest.ChallengeStartDate, opt => opt.MapFrom(src => DateOnly.FromDateTime(src.GeneratedAt!.Value))); - - CreateMap() - .ForMember(dest => dest.ChallengeTitle, opt => opt.MapFrom(src => src.Title)) - .ForMember(dest => dest.ChallengeDescription, opt => opt.MapFrom(src => src.Description)) - .ForMember(dest => dest.ChallengeDuration, opt => opt.MapFrom(src => src.Duration)) - .ForMember(dest => dest.ChallengeStartDate, opt => opt.MapFrom(src => DateOnly.FromDateTime(src.CreationDate))); - + CreateMap() .ForMember(dest => dest.Username, opt => opt.MapFrom(src => src.Friend!.Username)) - .ForMember(dest => dest.Score, opt => opt.MapFrom(src => src.Friend!.Score)); + .ForMember(dest => dest.Score, opt => opt.MapFrom(src => src.Friend!.TotalLikes)); CreateMap() .ForMember(dest => dest.Username, opt => opt.MapFrom(src => src.User!.Username)) - .ForMember(dest => dest.Score, opt => opt.MapFrom(src => src.User!.Score)); + .ForMember(dest => dest.Score, opt => opt.MapFrom(src => src.User!.TotalLikes)); CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.UserId)) .ForMember(dest => dest.Username, opt => opt.MapFrom(src => src.User!.Username)) - .ForMember(dest => dest.Score, opt => opt.MapFrom(src => src.User!.Score)); + .ForMember(dest => dest.Score, opt => opt.MapFrom(src => src.User!.TotalLikes)); CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.GroupId)) - .ForMember(dest => dest.Label, opt => opt.MapFrom(src => src.Group!.Label)) - .ForMember(dest => dest.IsFinished, opt => opt.MapFrom(src => src.Group!.IsFinished)); + .ForMember(dest => dest.Label, opt => opt.MapFrom(src => src.Group!.Label)); CreateMap() .ForMember(dest => dest.Users, opt => opt.MapFrom(src => src.UserGroups)) diff --git a/BeReadyBackend/Migrations/20260421075849_AddedPostEntity.Designer.cs b/BeReadyBackend/Migrations/20260421075849_AddedPostEntity.Designer.cs new file mode 100644 index 0000000..ae50d3e --- /dev/null +++ b/BeReadyBackend/Migrations/20260421075849_AddedPostEntity.Designer.cs @@ -0,0 +1,450 @@ +// +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("20260421075849_AddedPostEntity")] + partial class AddedPostEntity + { + /// + 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("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + 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("Label") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + 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.Posts", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Libelle") + .HasColumnType("nvarchar(max)"); + + b.Property("Likes") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Posts"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.RandomChallenge", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("GeneratedAt") + .HasColumnType("datetime2"); + + b.Property("IsAlreadyPast") + .HasColumnType("bit"); + + b.Property("Label") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Libelle") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("RandomChallenges"); + }); + + 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() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasMaxLength(60) + .HasColumnType("nvarchar(60)"); + + b.Property("Salt") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Series") + .HasColumnType("int"); + + b.Property("TotalChallenge") + .HasColumnType("int"); + + b.Property("TotalLikes") + .HasColumnType("int"); + + b.Property("Username") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + 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.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.Property("IsAccepted") + .HasColumnType("bit"); + + 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.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.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.Posts", b => + { + b.HasOne("BeReadyBackend.Models.User", "User") + .WithMany("Posts") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.User", b => + { + b.HasOne("BeReadyBackend.Models.Designation", "Designation") + .WithMany("Users") + .HasForeignKey("DesignationId"); + + 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("UserGroups") + .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"); + + b.Navigation("UserGroups"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.RandomChallenge", b => + { + b.Navigation("UserRandomChallenges"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.User", b => + { + b.Navigation("Messages"); + + b.Navigation("Posts"); + + b.Navigation("UserAchievements"); + + b.Navigation("UserFriends"); + + b.Navigation("UserGroups"); + + b.Navigation("UserRandomChallenges"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BeReadyBackend/Migrations/20260421075849_AddedPostEntity.cs b/BeReadyBackend/Migrations/20260421075849_AddedPostEntity.cs new file mode 100644 index 0000000..df190b9 --- /dev/null +++ b/BeReadyBackend/Migrations/20260421075849_AddedPostEntity.cs @@ -0,0 +1,199 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace BeReadyBackend.Migrations +{ + /// + public partial class AddedPostEntity : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Score", + table: "Users"); + + migrationBuilder.DropColumn( + name: "TotalBonusChallenge", + table: "Users"); + + migrationBuilder.DropColumn( + name: "TotalPodium", + table: "Users"); + + migrationBuilder.DropColumn( + name: "Proof", + table: "UserGroups"); + + migrationBuilder.DropColumn( + name: "Score", + table: "UserGroups"); + + migrationBuilder.DropColumn( + name: "VotedProofId", + table: "UserGroups"); + + migrationBuilder.DropColumn( + name: "Duration", + table: "RandomChallenges"); + + migrationBuilder.DropColumn( + name: "Description", + table: "Groups"); + + migrationBuilder.DropColumn( + name: "Duration", + table: "Groups"); + + migrationBuilder.DropColumn( + name: "IsFinished", + table: "Groups"); + + migrationBuilder.DropColumn( + name: "StartedVote", + table: "Groups"); + + migrationBuilder.DropColumn( + name: "Title", + table: "Groups"); + + migrationBuilder.DropColumn( + name: "VoteDuration", + table: "Groups"); + + migrationBuilder.RenameColumn( + name: "TotalWin", + table: "Users", + newName: "TotalLikes"); + + migrationBuilder.CreateTable( + name: "Posts", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Libelle = table.Column(type: "nvarchar(max)", nullable: true), + CreationDate = table.Column(type: "datetime2", nullable: false), + Likes = table.Column(type: "int", nullable: false), + UserId = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Posts", x => x.Id); + table.ForeignKey( + name: "FK_Posts_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Posts_UserId", + table: "Posts", + column: "UserId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Posts"); + + migrationBuilder.RenameColumn( + name: "TotalLikes", + table: "Users", + newName: "TotalWin"); + + migrationBuilder.AddColumn( + name: "Score", + table: "Users", + type: "int", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "TotalBonusChallenge", + table: "Users", + type: "int", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "TotalPodium", + table: "Users", + type: "int", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "Proof", + table: "UserGroups", + type: "nvarchar(max)", + nullable: true); + + migrationBuilder.AddColumn( + name: "Score", + table: "UserGroups", + type: "int", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "VotedProofId", + table: "UserGroups", + type: "int", + nullable: true); + + migrationBuilder.AddColumn( + name: "Duration", + table: "RandomChallenges", + type: "int", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "Description", + table: "Groups", + type: "nvarchar(max)", + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "Duration", + table: "Groups", + type: "int", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "IsFinished", + table: "Groups", + type: "bit", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn( + name: "StartedVote", + table: "Groups", + type: "datetime2", + nullable: true); + + migrationBuilder.AddColumn( + name: "Title", + table: "Groups", + type: "nvarchar(max)", + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "VoteDuration", + table: "Groups", + type: "int", + nullable: false, + defaultValue: 0); + } + } +} diff --git a/BeReadyBackend/Migrations/20260421080209_EditedDatabase.Designer.cs b/BeReadyBackend/Migrations/20260421080209_EditedDatabase.Designer.cs new file mode 100644 index 0000000..b093f97 --- /dev/null +++ b/BeReadyBackend/Migrations/20260421080209_EditedDatabase.Designer.cs @@ -0,0 +1,450 @@ +// +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("20260421080209_EditedDatabase")] + partial class EditedDatabase + { + /// + 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("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + 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("Label") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + 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.Post", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Libelle") + .HasColumnType("nvarchar(max)"); + + b.Property("Likes") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Posts"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.RandomChallenge", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("GeneratedAt") + .HasColumnType("datetime2"); + + b.Property("IsAlreadyPast") + .HasColumnType("bit"); + + b.Property("Label") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Libelle") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("RandomChallenges"); + }); + + 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() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasMaxLength(60) + .HasColumnType("nvarchar(60)"); + + b.Property("Salt") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Series") + .HasColumnType("int"); + + b.Property("TotalChallenge") + .HasColumnType("int"); + + b.Property("TotalLikes") + .HasColumnType("int"); + + b.Property("Username") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + 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.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.Property("IsAccepted") + .HasColumnType("bit"); + + 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.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.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.Post", b => + { + b.HasOne("BeReadyBackend.Models.User", "User") + .WithMany("Posts") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.User", b => + { + b.HasOne("BeReadyBackend.Models.Designation", "Designation") + .WithMany("Users") + .HasForeignKey("DesignationId"); + + 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("UserGroups") + .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"); + + b.Navigation("UserGroups"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.RandomChallenge", b => + { + b.Navigation("UserRandomChallenges"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.User", b => + { + b.Navigation("Messages"); + + b.Navigation("Posts"); + + b.Navigation("UserAchievements"); + + b.Navigation("UserFriends"); + + b.Navigation("UserGroups"); + + b.Navigation("UserRandomChallenges"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BeReadyBackend/Migrations/20260421080209_EditedDatabase.cs b/BeReadyBackend/Migrations/20260421080209_EditedDatabase.cs new file mode 100644 index 0000000..54d3ee3 --- /dev/null +++ b/BeReadyBackend/Migrations/20260421080209_EditedDatabase.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace BeReadyBackend.Migrations +{ + /// + public partial class EditedDatabase : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/BeReadyBackend/Migrations/BeReadyDbContextModelSnapshot.cs b/BeReadyBackend/Migrations/BeReadyDbContextModelSnapshot.cs index cdca7de..03bbc7b 100644 --- a/BeReadyBackend/Migrations/BeReadyDbContextModelSnapshot.cs +++ b/BeReadyBackend/Migrations/BeReadyDbContextModelSnapshot.cs @@ -71,30 +71,10 @@ namespace BeReadyBackend.Migrations b.Property("CreationDate") .HasColumnType("datetime2"); - b.Property("Description") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Duration") - .HasColumnType("int"); - - b.Property("IsFinished") - .HasColumnType("bit"); - b.Property("Label") .IsRequired() .HasColumnType("nvarchar(max)"); - b.Property("StartedVote") - .HasColumnType("datetime2"); - - b.Property("Title") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("VoteDuration") - .HasColumnType("int"); - b.HasKey("Id"); b.ToTable("Groups"); @@ -130,7 +110,7 @@ namespace BeReadyBackend.Migrations b.ToTable("Messages"); }); - modelBuilder.Entity("BeReadyBackend.Models.RandomChallenge", b => + modelBuilder.Entity("BeReadyBackend.Models.Post", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -138,9 +118,33 @@ namespace BeReadyBackend.Migrations SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - b.Property("Duration") + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Libelle") + .HasColumnType("nvarchar(max)"); + + b.Property("Likes") .HasColumnType("int"); + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Posts"); + }); + + modelBuilder.Entity("BeReadyBackend.Models.RandomChallenge", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + b.Property("GeneratedAt") .HasColumnType("datetime2"); @@ -196,22 +200,13 @@ namespace BeReadyBackend.Migrations .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") + b.Property("TotalLikes") .HasColumnType("int"); b.Property("Username") @@ -270,15 +265,6 @@ namespace BeReadyBackend.Migrations .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"); @@ -323,6 +309,17 @@ namespace BeReadyBackend.Migrations b.Navigation("User"); }); + modelBuilder.Entity("BeReadyBackend.Models.Post", b => + { + b.HasOne("BeReadyBackend.Models.User", "User") + .WithMany("Posts") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + modelBuilder.Entity("BeReadyBackend.Models.User", b => { b.HasOne("BeReadyBackend.Models.Designation", "Designation") @@ -434,6 +431,8 @@ namespace BeReadyBackend.Migrations { b.Navigation("Messages"); + b.Navigation("Posts"); + b.Navigation("UserAchievements"); b.Navigation("UserFriends"); diff --git a/BeReadyBackend/Models/Group.cs b/BeReadyBackend/Models/Group.cs index 5271e24..65ea63b 100644 --- a/BeReadyBackend/Models/Group.cs +++ b/BeReadyBackend/Models/Group.cs @@ -6,14 +6,7 @@ public class Group { [Key] public int Id { get; set; } [Required, Length(2, 100)] public string? Label { get; set; } - [Required] public bool IsFinished { get; set; } - - [Required, Length(2, 200)] public string? Title { get; set; } - [Required, Length(2, 200)] public string? Description { get; set; } - [Required] public int Duration { get; set; } [Required] public DateTime CreationDate { get; set; } - public DateTime? StartedVote { get; set; } - public int VoteDuration { get; set; } = 3; public List? Messages { get; set; } public List? UserGroups { get; set; } diff --git a/BeReadyBackend/Models/Post.cs b/BeReadyBackend/Models/Post.cs new file mode 100644 index 0000000..5fcccc3 --- /dev/null +++ b/BeReadyBackend/Models/Post.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; + +namespace BeReadyBackend.Models; + +public class Post +{ + [Key] public int Id { get; set; } + [Length(2, 200)] public string? Libelle { get; set; } + [Required] public DateTime CreationDate { get; set; } + [Required] public int Likes { get; set; } = 0; + + public User? User { get; set; } + public int UserId { get; set; } +} \ No newline at end of file diff --git a/BeReadyBackend/Models/RandomChallenge.cs b/BeReadyBackend/Models/RandomChallenge.cs index 5b65b60..cc84c60 100644 --- a/BeReadyBackend/Models/RandomChallenge.cs +++ b/BeReadyBackend/Models/RandomChallenge.cs @@ -7,7 +7,6 @@ public class RandomChallenge [Key] public int Id { get; set; } [Required, Length(2, 200)] public string? Label { get; set; } [Required, Length(2, 200)] public string? Libelle { get; set; } - [Required] public int Duration { get; set; } [Required] public bool IsAlreadyPast { get; set; } public DateTime? GeneratedAt { get; set; } diff --git a/BeReadyBackend/Models/User.cs b/BeReadyBackend/Models/User.cs index 23dbf2f..56c33ab 100644 --- a/BeReadyBackend/Models/User.cs +++ b/BeReadyBackend/Models/User.cs @@ -9,21 +9,19 @@ public class User [Required, Length(2, 50)] public string? Name { get; set; } [Required, Length(2, 50)] public string? Username { get; set; } [Required, MaxLength(100)] public string? Email { get; set; } - [Required] public DateTime CreationDate { get; set; } + [Required] public DateTime CreationDate { get; set; } = DateTime.Now; [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; } + [Required] public int TotalLikes { get; set; } = 0; + [Required] public int TotalChallenge { get; set; } = 0; + [Required] public int Series { get; set; } = 0; public Designation? Designation { get; set; } public int? DesignationId { get; set; } public List? UserFriends { get; set; } public List? Messages { get; set; } + public List? Posts { get; set; } public List? UserRandomChallenges { get; set; } public List? UserAchievements { get; set; } public List? UserGroups { get; set; } diff --git a/BeReadyBackend/Models/UserGroup.cs b/BeReadyBackend/Models/UserGroup.cs index 09dfbef..acc103a 100644 --- a/BeReadyBackend/Models/UserGroup.cs +++ b/BeReadyBackend/Models/UserGroup.cs @@ -11,10 +11,6 @@ public class UserGroup 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/Program.cs b/BeReadyBackend/Program.cs index ccbd9ef..4587ae0 100644 --- a/BeReadyBackend/Program.cs +++ b/BeReadyBackend/Program.cs @@ -3,6 +3,7 @@ using AutoMapper.EquivalencyExpression; using BeReadyBackend; using BeReadyBackend.Hubs; using BeReadyBackend.MappingProfiles; +using BeReadyBackend.Models; using FastEndpoints; using FastEndpoints.Swagger; using FastEndpoints.Security; @@ -43,6 +44,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddSignalR(); diff --git a/BeReadyBackend/Repositories/PostsRepository.cs b/BeReadyBackend/Repositories/PostsRepository.cs new file mode 100644 index 0000000..49a6733 --- /dev/null +++ b/BeReadyBackend/Repositories/PostsRepository.cs @@ -0,0 +1,5 @@ +using BeReadyBackend.Models; + +namespace BeReadyBackend.Repositories; + +public class PostsRepository(BeReadyDbContext beReadyDbContext, AutoMapper.IMapper mapper) : BeReadyRepository(beReadyDbContext, mapper); \ No newline at end of file diff --git a/BeReadyBackend/Specifications/Friends/GetFriendsByUserIdSpec.cs b/BeReadyBackend/Specifications/Friends/GetFriendsByUserIdSpec.cs index 692e84c..fd70501 100644 --- a/BeReadyBackend/Specifications/Friends/GetFriendsByUserIdSpec.cs +++ b/BeReadyBackend/Specifications/Friends/GetFriendsByUserIdSpec.cs @@ -11,6 +11,6 @@ public class GetFriendsByUserIdSpec : Specification .Include(x => x.User) .Include(x => x.Friend) .Where(x => x.UserId == userId && x.IsAccepted) - .OrderByDescending(x => x.Friend!.Score); + .OrderByDescending(x => x.Friend!.TotalLikes); } } \ No newline at end of file diff --git a/BeReadyBackend/Specifications/Groups/GetGroupRankSpec.cs b/BeReadyBackend/Specifications/Groups/GetGroupRankSpec.cs deleted file mode 100644 index 07e3b24..0000000 --- a/BeReadyBackend/Specifications/Groups/GetGroupRankSpec.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Ardalis.Specification; -using BeReadyBackend.Models; - -namespace BeReadyBackend.Specifications.Groups; - -public class GetGroupRankSpec : Specification -{ - public GetGroupRankSpec(int id) - { - Query - .Where(x => x.GroupId == id) - .OrderByDescending(x => x.Score); - } -} \ No newline at end of file diff --git a/BeReadyBackend/Specifications/Users/GetUsersByScoreSpec.cs b/BeReadyBackend/Specifications/Users/GetUsersByScoreSpec.cs index fa6e6c7..6385b4b 100644 --- a/BeReadyBackend/Specifications/Users/GetUsersByScoreSpec.cs +++ b/BeReadyBackend/Specifications/Users/GetUsersByScoreSpec.cs @@ -8,7 +8,7 @@ public class GetUsersByScoreSpec : Specification public GetUsersByScoreSpec() { Query - .OrderByDescending(x => x.Score) + .OrderByDescending(x => x.TotalLikes) .Take(20); } } \ No newline at end of file