diff --git a/.vs/StudyLib/DesignTimeBuild/.dtbcache.v2 b/.vs/StudyLib/DesignTimeBuild/.dtbcache.v2 index c786a6f..49c74c2 100644 Binary files a/.vs/StudyLib/DesignTimeBuild/.dtbcache.v2 and b/.vs/StudyLib/DesignTimeBuild/.dtbcache.v2 differ diff --git a/.vs/StudyLib/v16/.suo b/.vs/StudyLib/v16/.suo index f67f4b0..4632310 100644 Binary files a/.vs/StudyLib/v16/.suo and b/.vs/StudyLib/v16/.suo differ diff --git a/API/Controllers/GroupCandidatesController.cs b/API/Controllers/GroupCandidatesController.cs index 46134a7..6c74876 100644 --- a/API/Controllers/GroupCandidatesController.cs +++ b/API/Controllers/GroupCandidatesController.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; namespace StudyLib.API.Controllers { - [Route("api/[controller]")] + [Route("api/groupCandidates")] [Authorize] [ApiController] public class GroupCandidatesController : ControllerBase @@ -24,18 +24,27 @@ namespace StudyLib.API.Controllers } [HttpGet("list/{groupId}")] - public async Task>> GetGroupCandidates(long groupId) + public async Task>> GetGroupCandidates(long groupId) { - return await _context.GroupCandidates.Where(g => g.Group.ID == groupId).ToListAsync(); + return await _context.GroupCandidates.Where(g => g.Group.ID == groupId).Include(g => g.User).Select(g => g.User).ToListAsync(); } [HttpPost("join-request")] - public async Task> GroupCandidate(GroupCandidate groupCandidate) + public async Task GroupCandidate(GroupCandidateSaveModel groupCandidateSaveModel) { + var user = await _context.Users.FindAsync(groupCandidateSaveModel.UserId); + var group = await _context.Groups.FindAsync(groupCandidateSaveModel.GroupId); + var groupCandidate = new GroupCandidate + { + GroupId = groupCandidateSaveModel.GroupId, + Group = group, + UserId = groupCandidateSaveModel.UserId, + User = user + }; _context.GroupCandidates.Add(groupCandidate); await _context.SaveChangesAsync(); - return CreatedAtAction("GetGroupCandidate", groupCandidate); + return NoContent(); } [HttpDelete("delete/{groupId}/{userId}")] diff --git a/API/Controllers/GroupsController.cs b/API/Controllers/GroupsController.cs index 12d3915..c403d5b 100644 --- a/API/Controllers/GroupsController.cs +++ b/API/Controllers/GroupsController.cs @@ -63,7 +63,7 @@ namespace StudyLib.API.Controllers [HttpGet("get-by-id/{id}")] public async Task> GetGroup(long id) { - var group = await _context.Groups.Where(g => g.ID == id).Include(g => g.Users).Include(g => g.Subjects).SingleOrDefaultAsync(); + var group = await _context.Groups.Where(g => g.ID == id).Include(g => g.Users).Include(g => g.Subjects).Include(g => g.GroupCandidates).SingleOrDefaultAsync(); if (group == null) { diff --git a/API/Models/GroupCandidateSaveModel.cs b/API/Models/GroupCandidateSaveModel.cs new file mode 100644 index 0000000..3f70eaa --- /dev/null +++ b/API/Models/GroupCandidateSaveModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace StudyLib.API.Models +{ + public class GroupCandidateSaveModel + { + public string UserId { get; set; } + public long GroupId { get; set; } + } +} diff --git a/API/Models/User.cs b/API/Models/User.cs index 35eefa1..7905cc1 100644 --- a/API/Models/User.cs +++ b/API/Models/User.cs @@ -9,5 +9,7 @@ namespace StudyLib.API.Models public string FullName { get; set; } public ICollection Groups { get; set; } + + public ICollection GroupCandidates { get; set; } } } diff --git a/Migrations/20201229231112_AddedGroupCandidatesToUser.Designer.cs b/Migrations/20201229231112_AddedGroupCandidatesToUser.Designer.cs new file mode 100644 index 0000000..828d28a --- /dev/null +++ b/Migrations/20201229231112_AddedGroupCandidatesToUser.Designer.cs @@ -0,0 +1,575 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using StudyLib.API.Data; + +namespace StudyLib.Migrations +{ + [DbContext(typeof(StudyLibContext))] + [Migration("20201229231112_AddedGroupCandidatesToUser")] + partial class AddedGroupCandidatesToUser + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseIdentityColumns() + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.0"); + + modelBuilder.Entity("GroupUser", b => + { + b.Property("GroupsID") + .HasColumnType("bigint"); + + b.Property("UsersId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("GroupsID", "UsersId"); + + b.HasIndex("UsersId"); + + b.ToTable("GroupUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .UseIdentityColumn(); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderDisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("LoginProvider") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("StudyLib.API.Models.Comment", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .UseIdentityColumn(); + + b.Property("SubjectId") + .HasColumnType("bigint"); + + b.Property("Text") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("ID"); + + b.HasIndex("SubjectId"); + + b.ToTable("Comments"); + }); + + modelBuilder.Entity("StudyLib.API.Models.Group", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .UseIdentityColumn(); + + b.Property("AdminId") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("Year") + .HasColumnType("int"); + + b.HasKey("ID"); + + b.ToTable("Groups"); + }); + + modelBuilder.Entity("StudyLib.API.Models.GroupCandidate", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .UseIdentityColumn(); + + b.Property("GroupId") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("ID"); + + b.HasIndex("GroupId"); + + b.HasIndex("UserId"); + + b.ToTable("GroupCandidates"); + }); + + modelBuilder.Entity("StudyLib.API.Models.SubjectDeleteRequest", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .UseIdentityColumn(); + + b.Property("SubjectId") + .HasColumnType("bigint"); + + b.HasKey("ID"); + + b.HasIndex("SubjectId"); + + b.ToTable("SubjectDeleteRequests"); + }); + + modelBuilder.Entity("StudyLib.API.Models.User", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("bit"); + + b.Property("FullName") + .HasColumnType("nvarchar(max)"); + + b.Property("LockoutEnabled") + .HasColumnType("bit"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("bit"); + + b.Property("SecurityStamp") + .HasColumnType("nvarchar(max)"); + + b.Property("TwoFactorEnabled") + .HasColumnType("bit"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("StudyLib.Models.Assignment", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .UseIdentityColumn(); + + b.Property("Deadline") + .HasColumnType("datetime2"); + + b.Property("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FinalMarkPercent") + .HasColumnType("float"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SubjectId") + .HasColumnType("bigint"); + + b.HasKey("ID"); + + b.HasIndex("SubjectId"); + + b.ToTable("Assignments"); + }); + + modelBuilder.Entity("StudyLib.Models.Subject", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .UseIdentityColumn(); + + b.Property("ExamDate") + .HasColumnType("datetime2"); + + b.Property("GroupId") + .HasColumnType("bigint"); + + b.Property("LabTeacher") + .HasColumnType("nvarchar(max)"); + + b.Property("LectureTeacher") + .HasColumnType("nvarchar(max)"); + + b.Property("MainExam") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("ID"); + + b.HasIndex("GroupId"); + + b.ToTable("Subjects"); + }); + + modelBuilder.Entity("StudyLib.Models.Test", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .UseIdentityColumn(); + + b.Property("Date") + .HasColumnType("datetime2"); + + b.Property("FinalMarkPercent") + .HasColumnType("float"); + + b.Property("Scope") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SubjectId") + .HasColumnType("bigint"); + + b.HasKey("ID"); + + b.HasIndex("SubjectId"); + + b.ToTable("Tests"); + }); + + modelBuilder.Entity("GroupUser", b => + { + b.HasOne("StudyLib.API.Models.Group", null) + .WithMany() + .HasForeignKey("GroupsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("StudyLib.API.Models.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("StudyLib.API.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("StudyLib.API.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("StudyLib.API.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("StudyLib.API.Models.User", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("StudyLib.API.Models.Comment", b => + { + b.HasOne("StudyLib.Models.Subject", "Subject") + .WithMany("Comments") + .HasForeignKey("SubjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Subject"); + }); + + modelBuilder.Entity("StudyLib.API.Models.GroupCandidate", b => + { + b.HasOne("StudyLib.API.Models.Group", "Group") + .WithMany("GroupCandidates") + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("StudyLib.API.Models.User", "User") + .WithMany("GroupCandidates") + .HasForeignKey("UserId"); + + b.Navigation("Group"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("StudyLib.API.Models.SubjectDeleteRequest", b => + { + b.HasOne("StudyLib.Models.Subject", "Subject") + .WithMany() + .HasForeignKey("SubjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Subject"); + }); + + modelBuilder.Entity("StudyLib.Models.Assignment", b => + { + b.HasOne("StudyLib.Models.Subject", "Subject") + .WithMany("Assignments") + .HasForeignKey("SubjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Subject"); + }); + + modelBuilder.Entity("StudyLib.Models.Subject", b => + { + b.HasOne("StudyLib.API.Models.Group", "Group") + .WithMany("Subjects") + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Group"); + }); + + modelBuilder.Entity("StudyLib.Models.Test", b => + { + b.HasOne("StudyLib.Models.Subject", "Subject") + .WithMany("Tests") + .HasForeignKey("SubjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Subject"); + }); + + modelBuilder.Entity("StudyLib.API.Models.Group", b => + { + b.Navigation("GroupCandidates"); + + b.Navigation("Subjects"); + }); + + modelBuilder.Entity("StudyLib.API.Models.User", b => + { + b.Navigation("GroupCandidates"); + }); + + modelBuilder.Entity("StudyLib.Models.Subject", b => + { + b.Navigation("Assignments"); + + b.Navigation("Comments"); + + b.Navigation("Tests"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Migrations/20201229231112_AddedGroupCandidatesToUser.cs b/Migrations/20201229231112_AddedGroupCandidatesToUser.cs new file mode 100644 index 0000000..80decb1 --- /dev/null +++ b/Migrations/20201229231112_AddedGroupCandidatesToUser.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace StudyLib.Migrations +{ + public partial class AddedGroupCandidatesToUser : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/Migrations/StudyLibContextModelSnapshot.cs b/Migrations/StudyLibContextModelSnapshot.cs index f7e8a55..796cb21 100644 --- a/Migrations/StudyLibContextModelSnapshot.cs +++ b/Migrations/StudyLibContextModelSnapshot.cs @@ -495,7 +495,7 @@ namespace StudyLib.Migrations .IsRequired(); b.HasOne("StudyLib.API.Models.User", "User") - .WithMany() + .WithMany("GroupCandidates") .HasForeignKey("UserId"); b.Navigation("Group"); @@ -554,6 +554,11 @@ namespace StudyLib.Migrations b.Navigation("Subjects"); }); + modelBuilder.Entity("StudyLib.API.Models.User", b => + { + b.Navigation("GroupCandidates"); + }); + modelBuilder.Entity("StudyLib.Models.Subject", b => { b.Navigation("Assignments"); diff --git a/bin/Debug/net5.0/StudyLib.dll b/bin/Debug/net5.0/StudyLib.dll index 2a52fd5..7f7a556 100644 Binary files a/bin/Debug/net5.0/StudyLib.dll and b/bin/Debug/net5.0/StudyLib.dll differ diff --git a/bin/Debug/net5.0/StudyLib.pdb b/bin/Debug/net5.0/StudyLib.pdb index bbcd879..4b9d631 100644 Binary files a/bin/Debug/net5.0/StudyLib.pdb and b/bin/Debug/net5.0/StudyLib.pdb differ diff --git a/bin/Debug/net5.0/ref/StudyLib.dll b/bin/Debug/net5.0/ref/StudyLib.dll index c99ee41..0938268 100644 Binary files a/bin/Debug/net5.0/ref/StudyLib.dll and b/bin/Debug/net5.0/ref/StudyLib.dll differ diff --git a/obj/Debug/net5.0/StudyLib.csproj.CoreCompileInputs.cache b/obj/Debug/net5.0/StudyLib.csproj.CoreCompileInputs.cache index 814fef9..a4bc5cd 100644 --- a/obj/Debug/net5.0/StudyLib.csproj.CoreCompileInputs.cache +++ b/obj/Debug/net5.0/StudyLib.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -5feba2ee88f7880eff52fc4c191e3826ad815ffb +119b850527e9f659a5a20a28f72de7822bb65ba5 diff --git a/obj/Debug/net5.0/StudyLib.csprojAssemblyReference.cache b/obj/Debug/net5.0/StudyLib.csprojAssemblyReference.cache index bff7140..3e12f52 100644 Binary files a/obj/Debug/net5.0/StudyLib.csprojAssemblyReference.cache and b/obj/Debug/net5.0/StudyLib.csprojAssemblyReference.cache differ diff --git a/obj/Debug/net5.0/StudyLib.dll b/obj/Debug/net5.0/StudyLib.dll index 2a52fd5..7f7a556 100644 Binary files a/obj/Debug/net5.0/StudyLib.dll and b/obj/Debug/net5.0/StudyLib.dll differ diff --git a/obj/Debug/net5.0/StudyLib.pdb b/obj/Debug/net5.0/StudyLib.pdb index bbcd879..4b9d631 100644 Binary files a/obj/Debug/net5.0/StudyLib.pdb and b/obj/Debug/net5.0/StudyLib.pdb differ diff --git a/obj/Debug/net5.0/ref/StudyLib.dll b/obj/Debug/net5.0/ref/StudyLib.dll index c99ee41..0938268 100644 Binary files a/obj/Debug/net5.0/ref/StudyLib.dll and b/obj/Debug/net5.0/ref/StudyLib.dll differ