using EonaCat.DoxaApi.Attributes; using Microsoft.AspNetCore.Mvc; using SampleApi.Models; namespace SampleApi.Controllers { [ApiController] [Route("api/users")] [DoxaApiGroup("Users")] public class UsersController : ControllerBase { private static readonly List _users = new() { new User { Id = Guid.NewGuid(), Name = "Ada Lovelace", Email = "ada@example.com", Role = UserRole.Admin, CreatedAt = DateTime.UtcNow }, new User { Id = Guid.NewGuid(), Name = "Alan Turing", Email = "alan@example.com", Role = UserRole.Member, CreatedAt = DateTime.UtcNow }, }; [HttpGet] public ActionResult> GetUsers([FromQuery] UserRole? role, [FromQuery] int page = 1) { var query = _users.AsEnumerable(); if (role is not null) { query = query.Where(u => u.Role == role); } return Ok(query.ToList()); } [HttpGet("{id}")] public ActionResult GetById(Guid id) { var user = _users.FirstOrDefault(u => u.Id == id); return user is null ? NotFound() : Ok(user); } [HttpPost] [DoxaApiExample(""" { "name": "Grace Hopper", "email": "grace@example.com", "role": "Member", "address": { "street": "1 Compiler Way", "city": "Arlington", "postalCode": "22201", "country": "US" } } """)] public ActionResult Create([FromBody] CreateUserRequest request) { var user = new User { Id = Guid.NewGuid(), Name = request.Name, Email = request.Email, Role = request.Role, Address = request.Address, CreatedAt = DateTime.UtcNow }; _users.Add(user); return CreatedAtAction(nameof(GetById), new { id = user.Id }, user); } [HttpPatch("{id}")] public ActionResult Update(Guid id, [FromBody] UpdateUserRequest request) { var user = _users.FirstOrDefault(u => u.Id == id); if (user is null) { return NotFound(); } if (request.Name is not null) { user.Name = request.Name; } if (request.Email is not null) { user.Email = request.Email; } if (request.Role is not null) { user.Role = request.Role.Value; } return Ok(user); } [HttpDelete("{id}")] [Obsolete("Use POST /api/users/{id}/archive instead.")] public IActionResult Delete(Guid id) { var user = _users.FirstOrDefault(u => u.Id == id); if (user is null) { return NotFound(); } _users.Remove(user); return NoContent(); } } }