2023-12-05 16:32:34 +10:00
using AutoMapper ;
using FluentValidation ;
using Microsoft.AspNetCore.Authorization ;
using Microsoft.AspNetCore.Mvc ;
using Microsoft.EntityFrameworkCore ;
using PARR.API.Contracts.V1 ;
using PARR.API.Contracts.V1.Requests ;
using PARR.API.Contracts.V1.Requests.Queries ;
using PARR.API.Contracts.V1.Responses ;
using PARR.API.Contracts.V1.Responses.Base ;
using PARR.API.Controllers.V1.Base ;
using PARR.API.Extensions ;
using PARR.API.Services.Interfaces ;
2026-04-30 10:35:31 +10:00
using PARR.Core.Repositories.Interfaces ;
2026-04-14 09:56:31 +10:00
using PARR.Domain.Common.Pagination ;
2026-04-14 12:01:49 +10:00
using PARR.Domain.Common.Roles ;
2026-04-30 10:35:31 +10:00
using PARR.Domain.Entities ;
2023-12-05 16:32:34 +10:00
namespace PARR.API.Controllers.V1
{
/// <summary>
/// Управление пользователями
/// </summary>
[Authorize(Roles = ParrRoles.Administrator.Role)]
public class UserController : BaseApiController
{
private readonly IMapper mapper ;
2026-04-30 10:35:31 +10:00
private readonly IUserRepository userService ;
2023-12-05 16:32:34 +10:00
private readonly IValidator < UserRequest > validator ;
private readonly IUriService uriService ;
2023-12-05 16:51:58 +10:00
private readonly ILogger < UserController > logger ;
2023-12-05 16:32:34 +10:00
public UserController (
IMapper mapper ,
2026-04-30 10:35:31 +10:00
IUserRepository userService ,
2023-12-05 16:32:34 +10:00
IValidator < UserRequest > validator ,
2023-12-05 16:51:58 +10:00
IUriService uriService ,
ILogger < UserController > logger
2023-12-05 16:32:34 +10:00
)
{
this . mapper = mapper ;
this . userService = userService ;
this . validator = validator ;
this . uriService = uriService ;
2023-12-05 16:51:58 +10:00
this . logger = logger ;
2023-12-05 16:32:34 +10:00
}
/// <summary>
/// Список пользователей постранично
/// </summary>
/// <param name="paginationQuery"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.User.GetAll)]
public async Task < IActionResult > GetAll ( [ FromQuery ] PaginationQuery paginationQuery )
{
var paginationFilter = mapper . Map < PaginationFilter > ( paginationQuery ) ;
IQueryable < User > query = userService . Get ( )
. Include ( t = > t . Roles ) . ThenInclude ( t = > t . Role )
. OrderBy ( t = > t . Name ) ;
var users = await userService . GetPage ( query , paginationFilter ) . ToListAsync ( ) ;
if ( ! users . Any ( ) )
return NoContent ( ) ;
var userResponse = mapper . Map < List < UserResponse > > ( users ) ;
var paginationResponse = new PagedResponse < UserResponse > ( userResponse , true ) . GetPaginatedProps ( paginationFilter , query ) ;
return Ok ( paginationResponse ) ;
}
/// <summary>
/// Получить пользователя по id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.User.Get)]
public async Task < IActionResult > GetById ( [ FromRoute ] Guid id )
{
var user = await userService . Get ( )
. Include ( t = > t . Roles ) . ThenInclude ( t = > t . Role )
. FirstOrDefaultAsync ( t = > t . Id = = id ) ;
if ( user = = null )
return NotFound ( ) ;
var response = mapper . Map < UserResponse > ( user ) ;
return Ok ( new Response < UserResponse > ( response , true ) ) ;
}
/// <summary>
/// Удалить пользователя
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete(ApiRoutes.User.Delete)]
public async Task < IActionResult > Delete ( [ FromRoute ] Guid id )
{
var user = await userService . GetAsync ( id ) ;
if ( user = = null )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = $"Ошибка при удалении пользователя. Н е найден пользователь с id: {id}" } } ) ) ;
if ( ! userService . Delete ( user ) | | ! await userService . CommitAsync ( ) )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = $"Ошибка при удалении пользователя." } } ) ) ;
2023-12-05 16:51:58 +10:00
logger . LogInformation ( $"Пользователь {User.Identity?.Name} удалил пользователя: {user.Id}, {user.Ip}, {user.Name}" ) ;
2023-12-05 16:32:34 +10:00
return NoContent ( ) ;
}
/// <summary>
/// Создать пользователя
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost(ApiRoutes.User.Create)]
public async Task < IActionResult > Create ( [ FromBody ] UserRequest request )
{
var resultValidate = await validator . ValidateAsync ( request ) ;
if ( ! resultValidate . IsValid )
return BadRequest ( new Response ( resultValidate . Errors ) ) ;
var existIp = await userService . Get ( ) . FirstOrDefaultAsync ( t = > t . Ip = = request . Ip ) ;
if ( existIp ! = null )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { FieldName = nameof ( request . Ip ) , Message = $"Ip {request.Ip} занят другим пользователем." } } ) ) ;
var user = new User
{
Id = Guid . NewGuid ( ) ,
Ip = request . Ip ,
Name = request . Name ,
Description = request . Description
} ;
if ( ! await userService . CreateAsync ( user ) | | ! await userService . CommitAsync ( ) )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = "Ошибка при создани пользователя." } } ) ) ;
2023-12-05 16:51:58 +10:00
logger . LogInformation ( $"Пользователь {User.Identity?.Name} добавил пользователя: {user.Id}, {user.Ip}, {user.Name}" ) ;
2023-12-05 16:32:34 +10:00
var locationUri = uriService . GetUri ( ApiRoutes . User . Get , ApiRoutes . User . getParam , user . Id ) ;
return Created ( locationUri , new Response < UserResponse > ( mapper . Map < UserResponse > ( user ) , true ) ) ;
}
/// <summary>
/// Обновить пользователя
/// </summary>
/// <param name="id"></param>
/// <param name="request"></param>
/// <returns></returns>
[HttpPut(ApiRoutes.User.Update)]
public async Task < IActionResult > Update ( [ FromRoute ] Guid id , [ FromBody ] UserRequest request )
{
var resultValidate = await validator . ValidateAsync ( request ) ;
if ( ! resultValidate . IsValid )
return BadRequest ( new Response ( resultValidate . Errors ) ) ;
var orig = await userService . Get ( )
. Include ( t = > t . Roles ) . ThenInclude ( t = > t . Role )
. FirstOrDefaultAsync ( t = > t . Id = = id ) ;
if ( orig = = null )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = "Ошибка при изменении пользователя." } } ) ) ;
//хочет изменить свой ip
if ( orig . Ip ! = request . Ip )
{
var existIp = await userService . Get ( ) . FirstOrDefaultAsync ( t = > t . Ip = = request . Ip ) ;
if ( existIp ! = null )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { FieldName = nameof ( request . Ip ) , Message = $"Ip {request.Ip} занят другим пользователем." } } ) ) ;
}
orig . Ip = request . Ip ;
orig . Name = request . Name ;
orig . Description = request . Description ;
if ( ! await userService . CommitAsync ( ) )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = "Ошибка при изменении пользователя." } } ) ) ;
2023-12-05 16:51:58 +10:00
logger . LogInformation ( $"Пользователь {User.Identity?.Name} обновил пользователя: {orig.Id}, {orig.Ip}, {orig.Name}" ) ;
2023-12-05 16:32:34 +10:00
return Ok ( new Response < UserResponse > ( mapper . Map < UserResponse > ( orig ) , true ) ) ;
}
}
}