using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System.Threading.Tasks; using Timeline.Authenticate; using Timeline.Models; using Timeline.Models.Http; using Timeline.Services; namespace Timeline.Controllers { [Route("users/{username}")] [ProducesErrorResponseType(typeof(CommonResponse))] [ApiController] public class UserDetailController : Controller { public static class ErrorCodes { public const int Get_UserNotExist = -1001; public const int Patch_Forbid = -2001; public const int Patch_UserNotExist = -2002; public const int GetNickname_UserNotExist = -3001; } private readonly ILogger _logger; private readonly IUserDetailService _service; public UserDetailController(ILogger logger, IUserDetailService service) { _logger = logger; _service = service; } [HttpGet("nickname")] [UserAuthorize] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(UserDetail))] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetNickname([FromRoute] string username) { try { var nickname = await _service.GetUserNickname(username); return Ok(new UserDetail { Nickname = nickname }); } catch (UserNotExistException) { return NotFound(new CommonResponse(ErrorCodes.GetNickname_UserNotExist, "The user does not exist.")); } } [HttpGet("details")] [UserAuthorize] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(UserDetail))] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task Get([FromRoute] string username) { try { var detail = await _service.GetUserDetail(username); return Ok(detail); } catch (UserNotExistException) { return NotFound(new CommonResponse(ErrorCodes.Get_UserNotExist, "The user does not exist.")); } } [HttpPatch("details")] [Authorize] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(void))] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task Patch([FromRoute] string username, [FromBody] UserDetail detail) { if (!User.IsAdmin() && User.Identity.Name != username) return StatusCode(StatusCodes.Status403Forbidden, new CommonResponse(ErrorCodes.Patch_Forbid, "You can't change other's details unless you are admin.")); try { await _service.UpdateUserDetail(username, detail); return Ok(); } catch (UserNotExistException) { return NotFound(new CommonResponse(ErrorCodes.Patch_UserNotExist, "The user does not exist.")); } } } }