auth changes

This commit is contained in:
2024-03-28 19:17:46 +01:00
Unverified
parent 0d9a42dd24
commit fcca2119a5
45 changed files with 6588 additions and 55 deletions

View File

@@ -0,0 +1,26 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
namespace WatchIt.Shared.Models.Accounts.Authenticate
{
public class AuthenticateRequest
{
#region PROPERTIES
[JsonPropertyName("username_or_email")]
public string UsernameOrEmail { get; set; }
[JsonPropertyName("password")]
public string Password { get; set; }
[JsonPropertyName("remember_me")]
public bool RememberMe { get; set; }
#endregion
}
}

View File

@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
namespace WatchIt.Shared.Models.Accounts.Authenticate
{
public class AuthenticateResponse
{
#region PROPERTIES
[JsonPropertyName("access_token")]
public required string AccessToken { get; init; }
[JsonPropertyName("refresh_token")]
public required string RefreshToken { get; init; }
#endregion
}
}

View File

@@ -0,0 +1,27 @@
using FluentValidation;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
namespace WatchIt.Shared.Models.Accounts.Register
{
public class RegisterRequest
{
#region PROPERTIES
[JsonPropertyName("username")]
public string Username { get; set; }
[JsonPropertyName("email")]
public string Email { get; set; }
[JsonPropertyName("password")]
public string Password { get; set; }
#endregion
}
}

View File

@@ -0,0 +1,44 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using WatchIt.Database.Model.Account;
namespace WatchIt.Shared.Models.Accounts.Register
{
public class RegisterResponse
{
#region PROPERTIES
[JsonPropertyName("id")]
public required long Id { get; init; }
[JsonPropertyName("username")]
public required string Username { get; init; }
[JsonPropertyName("email")]
public required string Email { get; init; }
[JsonPropertyName("creation_date")]
public required DateTime CreationDate { get; init; }
#endregion
#region CONVERTION
public static implicit operator RegisterResponse(Account account) => new RegisterResponse
{
Id = account.Id,
Username = account.Username,
Email = account.Email,
CreationDate = account.CreationDate
};
#endregion
}
}

View File

@@ -0,0 +1,107 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WatchIt.Shared.Models
{
public class RequestResult
{
#region PROPERTIES
public RequestResultStatus Status { get; }
public IEnumerable<string> ValidationMessages { get; init; }
#endregion
#region CONSTRUCTORS
internal RequestResult(RequestResultStatus status) => Status = status;
public static RequestResult Ok() => new RequestResult(RequestResultStatus.Ok);
public static RequestResult<T> Ok<T>() => new RequestResult<T>(RequestResultStatus.Ok);
public static RequestResult<T> Ok<T>(T data) => new RequestResult<T>(RequestResultStatus.Ok) { Data = data };
public static RequestResult<T> Created<T>(string location, T resource) => new RequestResult<T>(RequestResultStatus.Created) { NewResourceLocation = location, Data = resource };
public static RequestResult NoContent() => new RequestResult(RequestResultStatus.NoContent);
public static RequestResult<T> NoContent<T>() => new RequestResult<T>(RequestResultStatus.NoContent);
public static RequestResult BadRequest(params string[] validationErrors) => new RequestResult(RequestResultStatus.BadRequest) { ValidationMessages = validationErrors };
public static RequestResult<T> BadRequest<T>(params string[] validationErrors) => new RequestResult<T>(RequestResultStatus.BadRequest) { ValidationMessages = validationErrors };
public static RequestResult Unauthorized(params string[] validationErrors) => new RequestResult(RequestResultStatus.Unauthorized) { ValidationMessages = validationErrors };
public static RequestResult<T> Unauthorized<T>(params string[] validationErrors) => new RequestResult<T>(RequestResultStatus.Unauthorized) { ValidationMessages = validationErrors };
public static RequestResult Forbidden() => new RequestResult(RequestResultStatus.Forbidden);
public static RequestResult<T> Forbidden<T>() => new RequestResult<T>(RequestResultStatus.Forbidden);
public static RequestResult NotFound() => new RequestResult(RequestResultStatus.NotFound);
public static RequestResult<T> NotFound<T>() => new RequestResult<T>(RequestResultStatus.NotFound);
public static RequestResult Conflict() => new RequestResult(RequestResultStatus.Conflict);
public static RequestResult<T> Conflict<T>() => new RequestResult<T>(RequestResultStatus.Conflict);
#endregion
#region CONVERSION
public static implicit operator ActionResult(RequestResult result) => result.Status switch
{
RequestResultStatus.Ok => HandleOk(result),
RequestResultStatus.NoContent => HandleNoContent(),
RequestResultStatus.BadRequest => HandleBadRequest(result),
RequestResultStatus.Unauthorized => HandleUnauthorized(result),
RequestResultStatus.Forbidden => HandleForbidden(),
RequestResultStatus.NotFound => HandleNotFound(),
RequestResultStatus.Conflict => HandleConflict(),
};
protected static ActionResult HandleOk(RequestResult result) => new OkResult();
protected static ActionResult HandleNoContent() => new NoContentResult();
protected static ActionResult HandleBadRequest(RequestResult result) => new BadRequestObjectResult(result.ValidationMessages);
protected static ActionResult HandleUnauthorized(RequestResult result) => new UnauthorizedObjectResult(result.ValidationMessages);
protected static ActionResult HandleForbidden() => new ForbidResult();
protected static ActionResult HandleNotFound() => new NotFoundResult();
protected static ActionResult HandleConflict() => new ConflictResult();
#endregion
}
public class RequestResult<T> : RequestResult
{
#region PROPERTIES
public T? Data { get; init; }
public string? NewResourceLocation { get; init; }
#endregion
#region CONSTRUCTORS
internal RequestResult(RequestResultStatus type) : base(type) { }
#endregion
#region CONVERSION
public static implicit operator ActionResult(RequestResult<T> result) => result.Status switch
{
RequestResultStatus.Ok => HandleOk(result),
RequestResultStatus.Created => HandleCreated(result),
RequestResultStatus.NoContent => HandleNoContent(),
RequestResultStatus.BadRequest => HandleBadRequest(result),
RequestResultStatus.Unauthorized => HandleUnauthorized(result),
RequestResultStatus.Forbidden => HandleForbidden(),
RequestResultStatus.NotFound => HandleNotFound(),
RequestResultStatus.Conflict => HandleConflict(),
};
private static ActionResult HandleOk(RequestResult<T> result) => result.Data is null ? new OkResult() : new OkObjectResult(result.Data);
private static ActionResult HandleCreated(RequestResult<T> result) => new CreatedResult(result.NewResourceLocation, result.Data);
#endregion
}
}

View File

@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WatchIt.Shared.Models
{
public enum RequestResultStatus
{
Ok = 200,
Created = 201,
NoContent = 204,
BadRequest = 400,
Unauthorized = 401,
Forbidden = 403,
NotFound = 404,
Conflict = 409,
}
}

View File

@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FluentValidation" Version="11.9.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\WatchIt.Database\WatchIt.Database.Model\WatchIt.Database.Model.csproj" />
</ItemGroup>
</Project>