Implemented admin users crud api
This commit is contained in:
@@ -0,0 +1,73 @@
|
|||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using MoonCore.Exceptions;
|
||||||
|
using MoonCore.Extended.Abstractions;
|
||||||
|
using MoonCore.Extended.Helpers;
|
||||||
|
using MoonCore.Models;
|
||||||
|
using Moonlight.ApiServer.Database.Entities;
|
||||||
|
using Moonlight.Shared.Http.Requests.Admin.Users;
|
||||||
|
|
||||||
|
namespace Moonlight.ApiServer.Http.Controllers.Admin.Users;
|
||||||
|
|
||||||
|
[ApiController]
|
||||||
|
[Route("api/admin/users")]
|
||||||
|
public class UsersController : Controller
|
||||||
|
{
|
||||||
|
private readonly CrudHelper<User> CrudHelper;
|
||||||
|
private readonly DatabaseRepository<User> UserRepository;
|
||||||
|
|
||||||
|
public UsersController(CrudHelper<User> crudHelper, DatabaseRepository<User> userRepository)
|
||||||
|
{
|
||||||
|
CrudHelper = crudHelper;
|
||||||
|
UserRepository = userRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<IPagedData<User>> Get([FromQuery] int page, [FromQuery] int pageSize = 50)
|
||||||
|
=> await CrudHelper.Get(page, pageSize);
|
||||||
|
|
||||||
|
[HttpGet("{id}")]
|
||||||
|
public async Task<User> GetSingle(int id)
|
||||||
|
=> await CrudHelper.GetSingle(id);
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<User> Create([FromBody] CreateUserRequest request)
|
||||||
|
{
|
||||||
|
// Reformat values
|
||||||
|
request.Username = request.Username.ToLower().Trim();
|
||||||
|
request.Email = request.Email.ToLower().Trim();
|
||||||
|
|
||||||
|
// Check for users with the same values
|
||||||
|
if (UserRepository.Get().Any(x => x.Username == request.Username))
|
||||||
|
throw new HttpApiException("A user with that username already exists", 400);
|
||||||
|
|
||||||
|
if (UserRepository.Get().Any(x => x.Email == request.Email))
|
||||||
|
throw new HttpApiException("A user with that email address already exists", 400);
|
||||||
|
|
||||||
|
request.Password = HashHelper.Hash(request.Password);
|
||||||
|
|
||||||
|
return await CrudHelper.Create(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPatch("{id}")]
|
||||||
|
public async Task<User> Update([FromRoute] int id, [FromBody] UpdateUserRequest request)
|
||||||
|
{
|
||||||
|
var user = await CrudHelper.GetSingle(id);
|
||||||
|
|
||||||
|
// Reformat values
|
||||||
|
request.Username = request.Username.ToLower().Trim();
|
||||||
|
request.Email = request.Email.ToLower().Trim();
|
||||||
|
|
||||||
|
// Check for users with the same values
|
||||||
|
if (UserRepository.Get().Any(x => x.Username == request.Username && x.Id != user.Id))
|
||||||
|
throw new HttpApiException("A user with that username already exists", 400);
|
||||||
|
|
||||||
|
if (UserRepository.Get().Any(x => x.Email == request.Email && x.Id != user.Id))
|
||||||
|
throw new HttpApiException("A user with that email address already exists", 400);
|
||||||
|
|
||||||
|
return await CrudHelper.Update(user, request);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpDelete("{id}")]
|
||||||
|
public async Task Delete([FromRoute] int id)
|
||||||
|
=> await CrudHelper.Delete(id);
|
||||||
|
}
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="MoonCore" Version="1.5.8" />
|
<PackageReference Include="MoonCore" Version="1.5.8" />
|
||||||
<PackageReference Include="MoonCore.Extended" Version="1.0.2" />
|
<PackageReference Include="MoonCore.Extended" Version="1.0.4" />
|
||||||
<PackageReference Include="MoonCore.PluginFramework" Version="1.0.0" />
|
<PackageReference Include="MoonCore.PluginFramework" Version="1.0.0" />
|
||||||
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="8.0.2" />
|
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="8.0.2" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0"/>
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0"/>
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ var databaseHelper = new DatabaseHelper(
|
|||||||
|
|
||||||
builder.Services.AddSingleton(databaseHelper);
|
builder.Services.AddSingleton(databaseHelper);
|
||||||
builder.Services.AddScoped(typeof(DatabaseRepository<>));
|
builder.Services.AddScoped(typeof(DatabaseRepository<>));
|
||||||
|
builder.Services.AddScoped(typeof(CrudHelper<>));
|
||||||
|
|
||||||
builder.Services.AddDbContext<CoreDataContext>();
|
builder.Services.AddDbContext<CoreDataContext>();
|
||||||
databaseHelper.AddDbContext<CoreDataContext>();
|
databaseHelper.AddDbContext<CoreDataContext>();
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
<PackageReference Include="MoonCore" Version="1.5.8" />
|
<PackageReference Include="MoonCore" Version="1.5.8" />
|
||||||
<PackageReference Include="MoonCore.Blazor" Version="1.2.1" />
|
<PackageReference Include="MoonCore.Blazor" Version="1.2.1" />
|
||||||
<PackageReference Include="MoonCore.PluginFramework" Version="1.0.0" />
|
<PackageReference Include="MoonCore.PluginFramework" Version="1.0.0" />
|
||||||
|
<PackageReference Include="MoonCore.Blazor.Tailwind" Version="1.0.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
|
namespace Moonlight.Shared.Http.Requests.Admin.Users;
|
||||||
|
|
||||||
|
public class CreateUserRequest
|
||||||
|
{
|
||||||
|
[Required(ErrorMessage = "You need to provide an email address")]
|
||||||
|
[EmailAddress(ErrorMessage = "You need to provide a valid email address")]
|
||||||
|
public string Email { get; set; }
|
||||||
|
|
||||||
|
[Required(ErrorMessage = "You need to provide a username")]
|
||||||
|
[RegularExpression("^[a-z][a-z0-9]*$", ErrorMessage = "Usernames can only contain lowercase characters and numbers and should not start with a number")]
|
||||||
|
public string Username { get; set; }
|
||||||
|
|
||||||
|
[Required(ErrorMessage = "You need to provide a password")]
|
||||||
|
[MinLength(8, ErrorMessage = "Your password needs to be at least 8 characters long")]
|
||||||
|
[MaxLength(256, ErrorMessage = "Your password should not exceed the length of 256 characters")]
|
||||||
|
public string Password { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
|
namespace Moonlight.Shared.Http.Requests.Admin.Users;
|
||||||
|
|
||||||
|
public class UpdateUserRequest
|
||||||
|
{
|
||||||
|
[Required(ErrorMessage = "You need to provide an email address")]
|
||||||
|
[EmailAddress(ErrorMessage = "You need to provide a valid email address")]
|
||||||
|
public string Email { get; set; }
|
||||||
|
|
||||||
|
[Required(ErrorMessage = "You need to provide a username")]
|
||||||
|
[RegularExpression("^[a-z][a-z0-9]*$", ErrorMessage = "Usernames can only contain lowercase characters and numbers and should not start with a number")]
|
||||||
|
public string Username { get; set; }
|
||||||
|
|
||||||
|
public string? Password { get; set; }
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user