93 lines
3.0 KiB
C#
93 lines
3.0 KiB
C#
using Management.Data;
|
|
using Management.Security;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
namespace Management.Controllers.Admin;
|
|
|
|
/// <summary>
|
|
/// Admin endpoints for client (organization) management.
|
|
/// Requires Admin role.
|
|
///
|
|
/// ENDPOINTS:
|
|
/// GET /api/admin/clients - List clients
|
|
/// GET /api/admin/clients/{id} - Get client
|
|
/// POST /api/admin/clients - Create client
|
|
/// PUT /api/admin/clients/{id} - Update client
|
|
/// DELETE /api/admin/clients/{id} - Deactivate client
|
|
/// </summary>
|
|
[ApiController]
|
|
[Route("api/admin/clients")]
|
|
public sealed class AdminClientsController : AdminControllerBase
|
|
{
|
|
public AdminClientsController(SqlService sql, ClientContext client, ILogger<AdminClientsController> log)
|
|
: base(sql, client, log) { }
|
|
|
|
/// <summary>
|
|
/// List all clients with optional filtering.
|
|
/// </summary>
|
|
[HttpGet]
|
|
public Task<IActionResult> List(
|
|
[FromQuery] string? status,
|
|
[FromQuery] int page = 1,
|
|
[FromQuery] int pageSize = 50,
|
|
CancellationToken ct = default)
|
|
=> CallProc("spAdminClients", "list", new { status, page, pageSize }, ct);
|
|
|
|
/// <summary>
|
|
/// Get client by ID.
|
|
/// </summary>
|
|
[HttpGet("{clientId}")]
|
|
public Task<IActionResult> Get(string clientId, CancellationToken ct)
|
|
=> CallProc("spAdminClients", "get", new { clientId }, ct);
|
|
|
|
/// <summary>
|
|
/// Create a new client.
|
|
/// </summary>
|
|
[HttpPost]
|
|
public Task<IActionResult> Create([FromBody] CreateClientRequest request, CancellationToken ct)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(request?.ClientName))
|
|
return Task.FromResult(ValidationError("clientName is required"));
|
|
|
|
Logger.LogWarning("[Admin] CreateClient | Name={Name} | By={User}", request.ClientName, Client.Email);
|
|
return CallProc("spAdminClients", "create", new { clientName = request.ClientName.Trim() }, ct);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Update client.
|
|
/// </summary>
|
|
[HttpPut("{clientId}")]
|
|
public Task<IActionResult> Update(string clientId, [FromBody] UpdateClientRequest request, CancellationToken ct)
|
|
{
|
|
Logger.LogWarning("[Admin] UpdateClient | Id={Id} | By={User}", clientId, Client.Email);
|
|
return CallProc("spAdminClients", "update", new
|
|
{
|
|
clientId,
|
|
clientName = request?.ClientName?.Trim(),
|
|
status = request?.Status
|
|
}, ct);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Deactivate client (soft delete).
|
|
/// </summary>
|
|
[HttpDelete("{clientId}")]
|
|
public Task<IActionResult> Delete(string clientId, CancellationToken ct)
|
|
{
|
|
Logger.LogWarning("[Admin] DeleteClient | Id={Id} | By={User}", clientId, Client.Email);
|
|
return CallProc("spAdminClients", "delete", new { clientId }, ct);
|
|
}
|
|
}
|
|
|
|
// DTOs
|
|
public sealed class CreateClientRequest
|
|
{
|
|
public string? ClientName { get; set; }
|
|
}
|
|
|
|
public sealed class UpdateClientRequest
|
|
{
|
|
public string? ClientName { get; set; }
|
|
public string? Status { get; set; }
|
|
}
|