diff --git a/LeaderboardBackend.Test/Controllers/CategoriesControllerTest.cs b/LeaderboardBackend.Test/Controllers/CategoriesControllerTest.cs index 21e9639c..942188e1 100644 --- a/LeaderboardBackend.Test/Controllers/CategoriesControllerTest.cs +++ b/LeaderboardBackend.Test/Controllers/CategoriesControllerTest.cs @@ -46,9 +46,10 @@ public async Task GetCategory_Ok_CategoryExists() .Setup(x => x.GetCategory(It.IsAny())) .Returns(Task.FromResult(new Category { Id = 1 })); - ActionResult response = await _controller.GetCategory((long)1); + ActionResult response = await _controller.GetCategory(1); + Category? category = Helpers.GetValueFromObjectResult(response.Result); - Assert.NotNull(response.Value); - Assert.AreEqual(1, response.Value?.Id); + Assert.NotNull(category); + Assert.AreEqual(1, category!.Id); } } diff --git a/LeaderboardBackend.Test/Controllers/LeaderboardsControllerTest.cs b/LeaderboardBackend.Test/Controllers/LeaderboardsControllerTest.cs index 6a1ff455..fb0d7ac0 100644 --- a/LeaderboardBackend.Test/Controllers/LeaderboardsControllerTest.cs +++ b/LeaderboardBackend.Test/Controllers/LeaderboardsControllerTest.cs @@ -5,6 +5,7 @@ using Moq; using NUnit.Framework; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; namespace LeaderboardBackend.Test.Controllers; @@ -69,7 +70,9 @@ public async Task GetLeaderboards_Ok_ListExists() .Returns(Task.FromResult(mockList)); ActionResult> response = await _controller.GetLeaderboards(new long[] { 1, 2 }); + List? leaderboards = Helpers.GetValueFromObjectResult>(response); - Assert.AreEqual(new ulong[] { 1, 2 }, response.Value?.ConvertAll(l => l.Id)); + Assert.NotNull(leaderboards); + Assert.AreEqual(new ulong[] { 1, 2 }, leaderboards!.Select(l => l.Id)); } } diff --git a/LeaderboardBackend.Test/Controllers/UsersControllerTests.cs b/LeaderboardBackend.Test/Controllers/UsersControllerTests.cs index ec168646..4a082770 100644 --- a/LeaderboardBackend.Test/Controllers/UsersControllerTests.cs +++ b/LeaderboardBackend.Test/Controllers/UsersControllerTests.cs @@ -40,24 +40,26 @@ public void Setup() } [Test] - public async Task GetUser_NotFound_UserDoesNotExist() + public async Task GetUserById_NotFound_UserDoesNotExist() { _userServiceMock - .Setup(x => x.GetUser(It.IsAny())) + .Setup(x => x.GetUserById(It.IsAny())) .Returns(Task.FromResult(null)); - ActionResult response = await _controller.GetUser(defaultUserId); + ActionResult response = await _controller.GetUserById(defaultUserId); + Helpers.AssertResponseNotFound(response); } [Test] - public async Task GetUser_Ok_UserExists() + public async Task GetUserById_Ok_UserExists() { _userServiceMock - .Setup(x => x.GetUser(defaultUserId)) + .Setup(x => x.GetUserById(defaultUserId)) .Returns(Task.FromResult(defaultUser)); - ActionResult response = await _controller.GetUser(defaultUserId); + ActionResult response = await _controller.GetUserById(defaultUserId); + User? user = Helpers.GetValueFromObjectResult(response); Assert.NotNull(user); diff --git a/LeaderboardBackend.Test/Services/UserServiceTests.cs b/LeaderboardBackend.Test/Services/UserServiceTests.cs index 31a68522..10e84702 100644 --- a/LeaderboardBackend.Test/Services/UserServiceTests.cs +++ b/LeaderboardBackend.Test/Services/UserServiceTests.cs @@ -46,7 +46,7 @@ public async Task GetUser_GetsAnExistingUser() { await _userService.CreateUser(_user); - User? getUser = await _userService.GetUser(_user.Id); + User? getUser = await _userService.GetUserById(_user.Id); Assert.NotNull(getUser); Assert.AreEqual(getUser, _user); } @@ -54,7 +54,7 @@ public async Task GetUser_GetsAnExistingUser() [Test] public async Task GetUser_ReturnsNullForNonExistingID() { - User? result = await _userService.GetUser(new Guid()); + User? result = await _userService.GetUserById(new Guid()); Assert.Null(result); } diff --git a/LeaderboardBackend/Controllers/UsersController.cs b/LeaderboardBackend/Controllers/UsersController.cs index 95282dd9..6a263e44 100644 --- a/LeaderboardBackend/Controllers/UsersController.cs +++ b/LeaderboardBackend/Controllers/UsersController.cs @@ -21,16 +21,16 @@ public UsersController(IUserService userService, IAuthService authService) _authService = authService; } - /// Gets a User. + /// Gets a User by ID. /// The User's ID. It must be a GUID. /// The User with the provided ID. /// If no User is found with the provided ID. [ApiConventionMethod(typeof(Conventions), nameof(Conventions.Get))] - [HttpGet("{id}")] - public async Task> GetUser(Guid id) + [HttpGet("{id:guid}")] + public async Task> GetUserById(Guid id) { - User? user = await _userService.GetUser(id); + User? user = await _userService.GetUserById(id); if (user == null) { return NotFound(); @@ -80,7 +80,7 @@ public async Task> Register([FromBody] RegisterRequest body) }; await _userService.CreateUser(newUser); - return CreatedAtAction(nameof(GetUser), new { id = newUser.Id }, newUser); + return CreatedAtAction(nameof(GetUserById), new { id = newUser.Id }, newUser); } /// Logs a new user in. diff --git a/LeaderboardBackend/Migrations/20220324144053_Users_CompleteFields.Designer.cs b/LeaderboardBackend/Migrations/20220324144053_Users_CompleteFields.Designer.cs new file mode 100644 index 00000000..71b6b28d --- /dev/null +++ b/LeaderboardBackend/Migrations/20220324144053_Users_CompleteFields.Designer.cs @@ -0,0 +1,382 @@ +// +using System; +using LeaderboardBackend.Models.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace LeaderboardBackend.Migrations +{ + [DbContext(typeof(ApplicationContext))] + [Migration("20220324144053_Users_CompleteFields")] + partial class Users_CompleteFields + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Ban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BannedUserId") + .HasColumnType("uuid") + .HasColumnName("banned_user_id"); + + b.Property("BanningUserId") + .HasColumnType("uuid") + .HasColumnName("banning_user_id"); + + b.Property("LeaderboardId") + .HasColumnType("bigint") + .HasColumnName("leaderboard_id"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("text") + .HasColumnName("reason"); + + b.Property("Time") + .HasColumnType("timestamp with time zone") + .HasColumnName("time"); + + b.HasKey("Id") + .HasName("pk_bans"); + + b.HasIndex("BannedUserId") + .HasDatabaseName("ix_bans_banned_user_id"); + + b.HasIndex("BanningUserId") + .HasDatabaseName("ix_bans_banning_user_id"); + + b.HasIndex("LeaderboardId") + .HasDatabaseName("ix_bans_leaderboard_id"); + + b.ToTable("bans", (string)null); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("LeaderboardId") + .HasColumnType("bigint") + .HasColumnName("leaderboard_id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("PlayersMax") + .HasColumnType("integer") + .HasColumnName("players_max"); + + b.Property("PlayersMin") + .HasColumnType("integer") + .HasColumnName("players_min"); + + b.Property("Rules") + .HasColumnType("text") + .HasColumnName("rules"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.HasKey("Id") + .HasName("pk_categories"); + + b.HasIndex("LeaderboardId") + .HasDatabaseName("ix_categories_leaderboard_id"); + + b.ToTable("categories", (string)null); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Judgement", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Approved") + .HasColumnType("boolean") + .HasColumnName("approved"); + + b.Property("ApproverId") + .HasColumnType("uuid") + .HasColumnName("approver_id"); + + b.Property("Note") + .IsRequired() + .HasColumnType("text") + .HasColumnName("note"); + + b.Property("RunId") + .HasColumnType("uuid") + .HasColumnName("run_id"); + + b.Property("timestamp") + .HasColumnType("timestamp with time zone") + .HasColumnName("timestamp"); + + b.HasKey("Id") + .HasName("pk_judgements"); + + b.HasIndex("ApproverId") + .HasDatabaseName("ix_judgements_approver_id"); + + b.HasIndex("RunId") + .HasDatabaseName("ix_judgements_run_id"); + + b.ToTable("judgements", (string)null); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Leaderboard", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Rules") + .HasColumnType("text") + .HasColumnName("rules"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.HasKey("Id") + .HasName("pk_leaderboards"); + + b.ToTable("leaderboards", (string)null); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Modship", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("LeaderboardId") + .HasColumnType("bigint") + .HasColumnName("leaderboard_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_modships"); + + b.HasIndex("LeaderboardId") + .HasDatabaseName("ix_modships_leaderboard_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_modships_user_id"); + + b.ToTable("modships", (string)null); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Run", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("Played") + .HasColumnType("timestamp with time zone") + .HasColumnName("played"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("Submitted") + .HasColumnType("timestamp with time zone") + .HasColumnName("submitted"); + + b.HasKey("Id") + .HasName("pk_runs"); + + b.ToTable("runs", (string)null); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("About") + .HasColumnType("text") + .HasColumnName("about"); + + b.Property("Admin") + .HasColumnType("boolean") + .HasColumnName("admin"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text") + .HasColumnName("email"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text") + .HasColumnName("password"); + + b.Property("Username") + .IsRequired() + .HasColumnType("text") + .HasColumnName("username"); + + b.HasKey("Id") + .HasName("pk_users"); + + b.ToTable("users", (string)null); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Ban", b => + { + b.HasOne("LeaderboardBackend.Models.Entities.User", "BannedUser") + .WithMany("BansReceived") + .HasForeignKey("BannedUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_bans_users_banned_user_id"); + + b.HasOne("LeaderboardBackend.Models.Entities.User", "BanningUser") + .WithMany("BansGiven") + .HasForeignKey("BanningUserId") + .HasConstraintName("fk_bans_users_banning_user_id"); + + b.HasOne("LeaderboardBackend.Models.Entities.Leaderboard", "Leaderboard") + .WithMany("Bans") + .HasForeignKey("LeaderboardId") + .HasConstraintName("fk_bans_leaderboards_leaderboard_id"); + + b.Navigation("BannedUser"); + + b.Navigation("BanningUser"); + + b.Navigation("Leaderboard"); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Category", b => + { + b.HasOne("LeaderboardBackend.Models.Entities.Leaderboard", "Leaderboard") + .WithMany("Categories") + .HasForeignKey("LeaderboardId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_categories_leaderboards_leaderboard_id"); + + b.Navigation("Leaderboard"); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Judgement", b => + { + b.HasOne("LeaderboardBackend.Models.Entities.User", "Approver") + .WithMany() + .HasForeignKey("ApproverId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_judgements_users_approver_id"); + + b.HasOne("LeaderboardBackend.Models.Entities.Run", "Run") + .WithMany("Judgements") + .HasForeignKey("RunId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_judgements_runs_run_id"); + + b.Navigation("Approver"); + + b.Navigation("Run"); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Modship", b => + { + b.HasOne("LeaderboardBackend.Models.Entities.Leaderboard", "Leaderboard") + .WithMany("Modships") + .HasForeignKey("LeaderboardId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_modships_leaderboards_leaderboard_id"); + + b.HasOne("LeaderboardBackend.Models.Entities.User", "User") + .WithMany("Modships") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_modships_users_user_id"); + + b.Navigation("Leaderboard"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Leaderboard", b => + { + b.Navigation("Bans"); + + b.Navigation("Categories"); + + b.Navigation("Modships"); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Run", b => + { + b.Navigation("Judgements"); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.User", b => + { + b.Navigation("BansGiven"); + + b.Navigation("BansReceived"); + + b.Navigation("Modships"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/LeaderboardBackend/Migrations/20220324144053_Users_CompleteFields.cs b/LeaderboardBackend/Migrations/20220324144053_Users_CompleteFields.cs new file mode 100644 index 00000000..7affabdb --- /dev/null +++ b/LeaderboardBackend/Migrations/20220324144053_Users_CompleteFields.cs @@ -0,0 +1,36 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace LeaderboardBackend.Migrations +{ + public partial class Users_CompleteFields : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "about", + table: "users", + type: "text", + nullable: true); + + migrationBuilder.AddColumn( + name: "admin", + table: "users", + type: "boolean", + nullable: false, + defaultValue: false); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "about", + table: "users"); + + migrationBuilder.DropColumn( + name: "admin", + table: "users"); + } + } +} diff --git a/LeaderboardBackend/Migrations/ApplicationContextModelSnapshot.cs b/LeaderboardBackend/Migrations/ApplicationContextModelSnapshot.cs index 0ff48187..3ec1e646 100644 --- a/LeaderboardBackend/Migrations/ApplicationContextModelSnapshot.cs +++ b/LeaderboardBackend/Migrations/ApplicationContextModelSnapshot.cs @@ -1,6 +1,6 @@ -// +// using System; -using LeaderboardBackend.Models.Entities; +using LeaderboardBackend.Models.Entities; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; @@ -10,363 +10,371 @@ namespace LeaderboardBackend.Migrations { - [DbContext(typeof(ApplicationContext))] - partial class ApplicationContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { + [DbContext(typeof(ApplicationContext))] + partial class ApplicationContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { #pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.1") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("LeaderboardBackend.Models.Entities.Ban", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("BannedUserId") - .HasColumnType("uuid") - .HasColumnName("banned_user_id"); - - b.Property("BanningUserId") - .HasColumnType("uuid") - .HasColumnName("banning_user_id"); - - b.Property("LeaderboardId") - .HasColumnType("bigint") - .HasColumnName("leaderboard_id"); - - b.Property("Reason") - .IsRequired() - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Time") - .HasColumnType("timestamp with time zone") - .HasColumnName("time"); - - b.HasKey("Id") - .HasName("pk_bans"); - - b.HasIndex("BannedUserId") - .HasDatabaseName("ix_bans_banned_user_id"); - - b.HasIndex("BanningUserId") - .HasDatabaseName("ix_bans_banning_user_id"); - - b.HasIndex("LeaderboardId") - .HasDatabaseName("ix_bans_leaderboard_id"); - - b.ToTable("bans", (string)null); - }); - - modelBuilder.Entity("LeaderboardBackend.Models.Entities.Category", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("LeaderboardId") - .HasColumnType("bigint") - .HasColumnName("leaderboard_id"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name"); - - b.Property("PlayersMax") - .HasColumnType("integer") - .HasColumnName("players_max"); - - b.Property("PlayersMin") - .HasColumnType("integer") - .HasColumnName("players_min"); - - b.Property("Rules") - .HasColumnType("text") - .HasColumnName("rules"); - - b.Property("Slug") - .IsRequired() - .HasColumnType("text") - .HasColumnName("slug"); - - b.HasKey("Id") - .HasName("pk_categories"); - - b.HasIndex("LeaderboardId") - .HasDatabaseName("ix_categories_leaderboard_id"); - - b.ToTable("categories", (string)null); - }); - - modelBuilder.Entity("LeaderboardBackend.Models.Entities.Judgement", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Approved") - .HasColumnType("boolean") - .HasColumnName("approved"); - - b.Property("ApproverId") - .HasColumnType("uuid") - .HasColumnName("approver_id"); - - b.Property("Note") - .IsRequired() - .HasColumnType("text") - .HasColumnName("note"); - - b.Property("RunId") - .HasColumnType("uuid") - .HasColumnName("run_id"); - - b.Property("timestamp") - .HasColumnType("timestamp with time zone") - .HasColumnName("timestamp"); - - b.HasKey("Id") - .HasName("pk_judgements"); - - b.HasIndex("ApproverId") - .HasDatabaseName("ix_judgements_approver_id"); - - b.HasIndex("RunId") - .HasDatabaseName("ix_judgements_run_id"); - - b.ToTable("judgements", (string)null); - }); - - modelBuilder.Entity("LeaderboardBackend.Models.Entities.Leaderboard", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name"); - - b.Property("Rules") - .HasColumnType("text") - .HasColumnName("rules"); - - b.Property("Slug") - .IsRequired() - .HasColumnType("text") - .HasColumnName("slug"); - - b.HasKey("Id") - .HasName("pk_leaderboards"); - - b.ToTable("leaderboards", (string)null); - }); - - modelBuilder.Entity("LeaderboardBackend.Models.Entities.Modship", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("LeaderboardId") - .HasColumnType("bigint") - .HasColumnName("leaderboard_id"); - - b.Property("UserId") - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.HasKey("Id") - .HasName("pk_modships"); - - b.HasIndex("LeaderboardId") - .HasDatabaseName("ix_modships_leaderboard_id"); - - b.HasIndex("UserId") - .HasDatabaseName("ix_modships_user_id"); - - b.ToTable("modships", (string)null); - }); - - modelBuilder.Entity("LeaderboardBackend.Models.Entities.Run", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("id"); - - b.Property("Played") - .HasColumnType("timestamp with time zone") - .HasColumnName("played"); - - b.Property("Status") - .HasColumnType("integer") - .HasColumnName("status"); - - b.Property("Submitted") - .HasColumnType("timestamp with time zone") - .HasColumnName("submitted"); - - b.HasKey("Id") - .HasName("pk_runs"); - - b.ToTable("runs", (string)null); - }); - - modelBuilder.Entity("LeaderboardBackend.Models.Entities.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("id"); - - b.Property("Email") - .IsRequired() - .HasColumnType("text") - .HasColumnName("email"); - - b.Property("Password") - .IsRequired() - .HasColumnType("text") - .HasColumnName("password"); - - b.Property("Username") - .IsRequired() - .HasColumnType("text") - .HasColumnName("username"); - - b.HasKey("Id") - .HasName("pk_users"); - - b.ToTable("users", (string)null); - }); - - modelBuilder.Entity("LeaderboardBackend.Models.Entities.Ban", b => - { - b.HasOne("LeaderboardBackend.Models.Entities.User", "BannedUser") - .WithMany("BansReceived") - .HasForeignKey("BannedUserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_bans_users_banned_user_id"); - - b.HasOne("LeaderboardBackend.Models.Entities.User", "BanningUser") - .WithMany("BansGiven") - .HasForeignKey("BanningUserId") - .HasConstraintName("fk_bans_users_banning_user_id"); - - b.HasOne("LeaderboardBackend.Models.Entities.Leaderboard", "Leaderboard") - .WithMany("Bans") - .HasForeignKey("LeaderboardId") - .HasConstraintName("fk_bans_leaderboards_leaderboard_id"); - - b.Navigation("BannedUser"); - - b.Navigation("BanningUser"); - - b.Navigation("Leaderboard"); - }); - - modelBuilder.Entity("LeaderboardBackend.Models.Entities.Category", b => - { - b.HasOne("LeaderboardBackend.Models.Entities.Leaderboard", "Leaderboard") - .WithMany("Categories") - .HasForeignKey("LeaderboardId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_categories_leaderboards_leaderboard_id"); - - b.Navigation("Leaderboard"); - }); - - modelBuilder.Entity("LeaderboardBackend.Models.Entities.Judgement", b => - { - b.HasOne("LeaderboardBackend.Models.Entities.User", "Approver") - .WithMany() - .HasForeignKey("ApproverId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_judgements_users_approver_id"); - - b.HasOne("LeaderboardBackend.Models.Entities.Run", "Run") - .WithMany("Judgements") - .HasForeignKey("RunId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_judgements_runs_run_id"); - - b.Navigation("Approver"); - - b.Navigation("Run"); - }); - - modelBuilder.Entity("LeaderboardBackend.Models.Entities.Modship", b => - { - b.HasOne("LeaderboardBackend.Models.Entities.Leaderboard", "Leaderboard") - .WithMany("Modships") - .HasForeignKey("LeaderboardId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_modships_leaderboards_leaderboard_id"); - - b.HasOne("LeaderboardBackend.Models.Entities.User", "User") - .WithMany("Modships") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_modships_users_user_id"); - - b.Navigation("Leaderboard"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("LeaderboardBackend.Models.Entities.Leaderboard", b => - { - b.Navigation("Bans"); - - b.Navigation("Categories"); - - b.Navigation("Modships"); - }); - - modelBuilder.Entity("LeaderboardBackend.Models.Entities.Run", b => - { - b.Navigation("Judgements"); - }); - - modelBuilder.Entity("LeaderboardBackend.Models.Entities.User", b => - { - b.Navigation("BansGiven"); - - b.Navigation("BansReceived"); - - b.Navigation("Modships"); - }); + modelBuilder + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Ban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BannedUserId") + .HasColumnType("uuid") + .HasColumnName("banned_user_id"); + + b.Property("BanningUserId") + .HasColumnType("uuid") + .HasColumnName("banning_user_id"); + + b.Property("LeaderboardId") + .HasColumnType("bigint") + .HasColumnName("leaderboard_id"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("text") + .HasColumnName("reason"); + + b.Property("Time") + .HasColumnType("timestamp with time zone") + .HasColumnName("time"); + + b.HasKey("Id") + .HasName("pk_bans"); + + b.HasIndex("BannedUserId") + .HasDatabaseName("ix_bans_banned_user_id"); + + b.HasIndex("BanningUserId") + .HasDatabaseName("ix_bans_banning_user_id"); + + b.HasIndex("LeaderboardId") + .HasDatabaseName("ix_bans_leaderboard_id"); + + b.ToTable("bans", (string)null); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("LeaderboardId") + .HasColumnType("bigint") + .HasColumnName("leaderboard_id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("PlayersMax") + .HasColumnType("integer") + .HasColumnName("players_max"); + + b.Property("PlayersMin") + .HasColumnType("integer") + .HasColumnName("players_min"); + + b.Property("Rules") + .HasColumnType("text") + .HasColumnName("rules"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.HasKey("Id") + .HasName("pk_categories"); + + b.HasIndex("LeaderboardId") + .HasDatabaseName("ix_categories_leaderboard_id"); + + b.ToTable("categories", (string)null); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Judgement", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Approved") + .HasColumnType("boolean") + .HasColumnName("approved"); + + b.Property("ApproverId") + .HasColumnType("uuid") + .HasColumnName("approver_id"); + + b.Property("Note") + .IsRequired() + .HasColumnType("text") + .HasColumnName("note"); + + b.Property("RunId") + .HasColumnType("uuid") + .HasColumnName("run_id"); + + b.Property("timestamp") + .HasColumnType("timestamp with time zone") + .HasColumnName("timestamp"); + + b.HasKey("Id") + .HasName("pk_judgements"); + + b.HasIndex("ApproverId") + .HasDatabaseName("ix_judgements_approver_id"); + + b.HasIndex("RunId") + .HasDatabaseName("ix_judgements_run_id"); + + b.ToTable("judgements", (string)null); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Leaderboard", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Rules") + .HasColumnType("text") + .HasColumnName("rules"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.HasKey("Id") + .HasName("pk_leaderboards"); + + b.ToTable("leaderboards", (string)null); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Modship", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("LeaderboardId") + .HasColumnType("bigint") + .HasColumnName("leaderboard_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_modships"); + + b.HasIndex("LeaderboardId") + .HasDatabaseName("ix_modships_leaderboard_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_modships_user_id"); + + b.ToTable("modships", (string)null); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Run", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("Played") + .HasColumnType("timestamp with time zone") + .HasColumnName("played"); + + b.Property("Status") + .HasColumnType("integer") + .HasColumnName("status"); + + b.Property("Submitted") + .HasColumnType("timestamp with time zone") + .HasColumnName("submitted"); + + b.HasKey("Id") + .HasName("pk_runs"); + + b.ToTable("runs", (string)null); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("About") + .HasColumnType("text") + .HasColumnName("about"); + + b.Property("Admin") + .HasColumnType("boolean") + .HasColumnName("admin"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text") + .HasColumnName("email"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text") + .HasColumnName("password"); + + b.Property("Username") + .IsRequired() + .HasColumnType("text") + .HasColumnName("username"); + + b.HasKey("Id") + .HasName("pk_users"); + + b.ToTable("users", (string)null); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Ban", b => + { + b.HasOne("LeaderboardBackend.Models.Entities.User", "BannedUser") + .WithMany("BansReceived") + .HasForeignKey("BannedUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_bans_users_banned_user_id"); + + b.HasOne("LeaderboardBackend.Models.Entities.User", "BanningUser") + .WithMany("BansGiven") + .HasForeignKey("BanningUserId") + .HasConstraintName("fk_bans_users_banning_user_id"); + + b.HasOne("LeaderboardBackend.Models.Entities.Leaderboard", "Leaderboard") + .WithMany("Bans") + .HasForeignKey("LeaderboardId") + .HasConstraintName("fk_bans_leaderboards_leaderboard_id"); + + b.Navigation("BannedUser"); + + b.Navigation("BanningUser"); + + b.Navigation("Leaderboard"); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Category", b => + { + b.HasOne("LeaderboardBackend.Models.Entities.Leaderboard", "Leaderboard") + .WithMany("Categories") + .HasForeignKey("LeaderboardId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_categories_leaderboards_leaderboard_id"); + + b.Navigation("Leaderboard"); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Judgement", b => + { + b.HasOne("LeaderboardBackend.Models.Entities.User", "Approver") + .WithMany() + .HasForeignKey("ApproverId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_judgements_users_approver_id"); + + b.HasOne("LeaderboardBackend.Models.Entities.Run", "Run") + .WithMany("Judgements") + .HasForeignKey("RunId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_judgements_runs_run_id"); + + b.Navigation("Approver"); + + b.Navigation("Run"); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Modship", b => + { + b.HasOne("LeaderboardBackend.Models.Entities.Leaderboard", "Leaderboard") + .WithMany("Modships") + .HasForeignKey("LeaderboardId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_modships_leaderboards_leaderboard_id"); + + b.HasOne("LeaderboardBackend.Models.Entities.User", "User") + .WithMany("Modships") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_modships_users_user_id"); + + b.Navigation("Leaderboard"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Leaderboard", b => + { + b.Navigation("Bans"); + + b.Navigation("Categories"); + + b.Navigation("Modships"); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.Run", b => + { + b.Navigation("Judgements"); + }); + + modelBuilder.Entity("LeaderboardBackend.Models.Entities.User", b => + { + b.Navigation("BansGiven"); + + b.Navigation("BansReceived"); + + b.Navigation("Modships"); + }); #pragma warning restore 612, 618 - } - } + } + } } diff --git a/LeaderboardBackend/Models/Entities/User.cs b/LeaderboardBackend/Models/Entities/User.cs index 8d3faf54..6167489f 100644 --- a/LeaderboardBackend/Models/Entities/User.cs +++ b/LeaderboardBackend/Models/Entities/User.cs @@ -36,6 +36,13 @@ public class User [JsonIgnore] public string Password { get; set; } = null!; + /// User's about text. I.e. a personal description. + public string? About { get; set; } + + /// User's admin status. + [Required] + public bool Admin { get; set; } = false; + [JsonIgnore] [InverseProperty("BanningUser")] public List? BansGiven { get; set; } diff --git a/LeaderboardBackend/Services/IUserService.cs b/LeaderboardBackend/Services/IUserService.cs index 53158e14..302a9a2e 100644 --- a/LeaderboardBackend/Services/IUserService.cs +++ b/LeaderboardBackend/Services/IUserService.cs @@ -5,7 +5,7 @@ namespace LeaderboardBackend.Services; public interface IUserService { - Task GetUser(Guid id); + Task GetUserById(Guid id); Task GetUserByEmail(string email); Task GetUserByName(string name); Task GetUserFromClaims(ClaimsPrincipal claims); diff --git a/LeaderboardBackend/Services/UserService.cs b/LeaderboardBackend/Services/UserService.cs index 4e35f458..ca0c2629 100644 --- a/LeaderboardBackend/Services/UserService.cs +++ b/LeaderboardBackend/Services/UserService.cs @@ -1,4 +1,4 @@ -using LeaderboardBackend.Models.Entities; +using LeaderboardBackend.Models.Entities; using Microsoft.EntityFrameworkCore; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; @@ -14,7 +14,7 @@ public UserService(ApplicationContext applicationContext, IConfiguration config) _applicationContext = applicationContext; } - public async Task GetUser(Guid id) + public async Task GetUserById(Guid id) { return await _applicationContext.Users.FindAsync(id); } @@ -28,7 +28,7 @@ public UserService(ApplicationContext applicationContext, IConfiguration config) { // We save a username with casing, but match without. // Effectively you can't have two separate users named e.g. "cool" and "cOoL". - return await _applicationContext.Users.SingleOrDefaultAsync(u => u.Username != null && u.Username.ToLower() == name.ToLower()); + return await _applicationContext.Users.FirstOrDefaultAsync(u => u.Username != null && u.Username.ToLower() == name.ToLower()); } public async Task GetUserFromClaims(ClaimsPrincipal claims)