From 58ef5833b3f77f321c587dd86448c888029016ce Mon Sep 17 00:00:00 2001 From: ivarlovlie Date: Thu, 22 Dec 2022 14:44:26 +0100 Subject: feat: Many things - Working Login/Logout - Groundwork for web components - Loading web-components with version tag - Load temporal-polyfill globally --- code/api/Endpoints/Account/CreateEndpoint.cs | 2 +- code/api/Endpoints/Account/DeleteEndpoint.cs | 17 +++++++++++++ code/api/Endpoints/Account/LoginEndpoint.cs | 8 +++---- code/api/Endpoints/Account/LogoutEndpoint.cs | 2 +- code/api/Endpoints/Base.cs | 36 ---------------------------- code/api/Endpoints/EndpointBase.cs | 24 +++++++++++++++++++ code/api/Endpoints/_Root/SessionEndpoint.cs | 4 ++-- 7 files changed, 48 insertions(+), 45 deletions(-) create mode 100644 code/api/Endpoints/Account/DeleteEndpoint.cs delete mode 100644 code/api/Endpoints/Base.cs create mode 100644 code/api/Endpoints/EndpointBase.cs (limited to 'code/api/Endpoints') diff --git a/code/api/Endpoints/Account/CreateEndpoint.cs b/code/api/Endpoints/Account/CreateEndpoint.cs index 41ffe96..4cea8f1 100644 --- a/code/api/Endpoints/Account/CreateEndpoint.cs +++ b/code/api/Endpoints/Account/CreateEndpoint.cs @@ -1,6 +1,6 @@ namespace I2R.Storage.Api.Endpoints.Account; -public class CreateEndpoint : Base +public class CreateEndpoint : EndpointBase { private readonly AppDatabase _database; private readonly UserService _userService; diff --git a/code/api/Endpoints/Account/DeleteEndpoint.cs b/code/api/Endpoints/Account/DeleteEndpoint.cs new file mode 100644 index 0000000..75a508a --- /dev/null +++ b/code/api/Endpoints/Account/DeleteEndpoint.cs @@ -0,0 +1,17 @@ +namespace I2R.Storage.Api.Endpoints.Account; + +public class DeleteEndpoint : EndpointBase +{ + private readonly UserService _userService; + + public DeleteEndpoint(UserService userService) { + _userService = userService; + } + + [HttpDelete("~/account/delete")] + public async Task Handle() { + await _userService.MarkUserAsDeletedAsync(LoggedInUser.Id, LoggedInUser.Id); + await _userService.LogOutUserAsync(HttpContext); + return Ok(); + } +} \ No newline at end of file diff --git a/code/api/Endpoints/Account/LoginEndpoint.cs b/code/api/Endpoints/Account/LoginEndpoint.cs index 0ffed0f..4f8e434 100644 --- a/code/api/Endpoints/Account/LoginEndpoint.cs +++ b/code/api/Endpoints/Account/LoginEndpoint.cs @@ -1,8 +1,6 @@ -using I2R.Storage.Api.Endpoints._Root; - namespace I2R.Storage.Api.Endpoints.Account; -public class LoginEndpoint : Base +public class LoginEndpoint : EndpointBase { private readonly AppDatabase _database; private readonly UserService _userService; @@ -25,11 +23,11 @@ public class LoginEndpoint : Base public async Task Handle([FromBody] Request request) { var user = _database.Users.FirstOrDefault(c => c.Username == request.Username); if (user == default) { - return BadRequest(_localizer["Invalid username or password"]); + return KnownProblem(_localizer["Invalid username or password"]); } if (!PasswordHelper.Verify(request.Password, user.Password)) { - return BadRequest(_localizer["Invalid username or password"]); + return KnownProblem(_localizer["Invalid username or password"]); } await _userService.LogInUserAsync(HttpContext, user.DefaultClaims()); diff --git a/code/api/Endpoints/Account/LogoutEndpoint.cs b/code/api/Endpoints/Account/LogoutEndpoint.cs index 064fa9f..de03e8e 100644 --- a/code/api/Endpoints/Account/LogoutEndpoint.cs +++ b/code/api/Endpoints/Account/LogoutEndpoint.cs @@ -1,6 +1,6 @@ namespace I2R.Storage.Api.Endpoints.Account; -public class LogoutEndpoint : Base +public class LogoutEndpoint : EndpointBase { private readonly UserService _userService; diff --git a/code/api/Endpoints/Base.cs b/code/api/Endpoints/Base.cs deleted file mode 100644 index 211d1f6..0000000 --- a/code/api/Endpoints/Base.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Security.Claims; - -namespace I2R.Storage.Api.Endpoints; - -[ApiController] -[Authorize] -public class Base : ControllerBase -{ - public class LoggedInUserModel - { - public string Username { get; set; } - public Guid Id { get; set; } - public EUserRole Role { get; set; } - - public class Public - { - public string Id { get; set; } - public string Username { get; set; } - public string Role { get; set; } - } - - public Public ForThePeople(HttpContext httpContext) { - return new Public() { - Id = httpContext.User.FindFirstValue(AppClaims.USER_ID), - Username = httpContext.User.FindFirstValue(AppClaims.USERNAME), - Role = httpContext.User.FindFirstValue(AppClaims.USER_ROLE) - }; - } - } - - public LoggedInUserModel LoggedInUser => new LoggedInUserModel() { - Id = HttpContext.User.FindFirstValue(AppClaims.USER_ID).AsGuid(), - Username = HttpContext.User.FindFirstValue(AppClaims.USERNAME), - Role = UserRole.FromString(HttpContext.User.FindFirstValue(AppClaims.USER_ROLE)) - }; -} \ No newline at end of file diff --git a/code/api/Endpoints/EndpointBase.cs b/code/api/Endpoints/EndpointBase.cs new file mode 100644 index 0000000..a16f40f --- /dev/null +++ b/code/api/Endpoints/EndpointBase.cs @@ -0,0 +1,24 @@ +namespace I2R.Storage.Api.Endpoints; + +[ApiController] +[Authorize] +public class EndpointBase : ControllerBase +{ + protected LoggedInUserModel LoggedInUser => new(User); + + [NonAction] + protected ActionResult KnownProblem(string title = default, string subtitle = default, Dictionary errors = default) { + return BadRequest(new KnownProblemModel { + Title = title, + Subtitle = subtitle, + Errors = errors, + TraceId = HttpContext.TraceIdentifier + }); + } + + [NonAction] + protected ActionResult KnownProblem(KnownProblemModel problem) { + problem.TraceId = HttpContext.TraceIdentifier; + return BadRequest(problem); + } +} \ No newline at end of file diff --git a/code/api/Endpoints/_Root/SessionEndpoint.cs b/code/api/Endpoints/_Root/SessionEndpoint.cs index 8d6ca56..c596dce 100644 --- a/code/api/Endpoints/_Root/SessionEndpoint.cs +++ b/code/api/Endpoints/_Root/SessionEndpoint.cs @@ -1,9 +1,9 @@ namespace I2R.Storage.Api.Endpoints._Root; -public class SessionEndpoint : Base +public class SessionEndpoint : EndpointBase { [HttpGet("~/session")] public ActionResult Handle() { - return LoggedInUser.ForThePeople(HttpContext); + return LoggedInUserModel.ForThePeople(HttpContext); } } \ No newline at end of file -- cgit v1.3