using AutoMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Net; using YABA.API.ViewModels; using YABA.Common.DTOs.Bookmarks; using YABA.Common.DTOs.Tags; using YABA.Service.Interfaces; namespace YABA.API.Controllers { [ApiVersion("1")] [Authorize, Route("api/v{version:apiVersion}/[controller]")] public class BookmarksController : ControllerBase { private readonly IBookmarkService _bookmarkService; public BookmarksController(IBookmarkService bookmarkService) { _bookmarkService = bookmarkService; } [HttpPost] [ProducesResponseType(typeof(GenericResponse), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.BadRequest)] public async Task Create([FromBody] CreateBookmarkRequestDTO request) { var result = await _bookmarkService.CreateBookmark(request); if(!result.IsSuccessful) return BadRequest(); return Ok(new GenericResponse(result)); } [HttpPost("{id}/Tags")] [ProducesResponseType(typeof(IEnumerable>),(int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NotFound)] public async Task UpdateBookmarkTags(int id, [FromBody] UpdateBookmarkTagRequest request) { if (request.Tags == null) return BadRequest(); var result = await _bookmarkService.UpdateBookmarkTags(id, request.Tags); if (result.All(x => !x.IsSuccessful)) return NotFound(); return Ok(result.Select(x => new GenericResponse(x))); } [HttpPut("{id}")] [ProducesResponseType(typeof(GenericResponse), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NotFound)] public async Task UpdateBookmark(int id, [FromBody] UpdateBookmarkRequestDTO request) { // TODO: Add support for HTTP PATCH var result = await _bookmarkService.UpdateBookmark(id, request); if (!result.IsSuccessful) return NotFound(); return Ok(new GenericResponse(result)); } [HttpGet] [ProducesResponseType(typeof(GenericResponse>), (int)HttpStatusCode.OK)] public IActionResult GetAll() { var result = _bookmarkService.GetAll(); return Ok(new GenericResponse>(result)); } [HttpGet("{id}")] [ProducesResponseType(typeof(GenericResponse), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NotFound)] public async Task Get(int id) { var result = await _bookmarkService.Get(id); if (!result.IsSuccessful) return NotFound(); return Ok(new GenericResponse(result)); } [HttpGet("{id}/Tags")] [ProducesResponseType(typeof(GenericResponse>), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NotFound)] public IActionResult GetBookmarkTags(int id) { var result = _bookmarkService.GetBookmarkTags(id); if (!result.IsSuccessful) return NotFound(); return Ok(new GenericResponse>(result)); } [HttpDelete("{id}")] [ProducesResponseType(typeof(GenericResponse), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NotFound)] public async Task Delete(int id) { var result = await _bookmarkService.DeleteBookmark(id); if (!result.IsSuccessful) return NotFound(); return Ok(new GenericResponse(result)); } [HttpDelete()] [ProducesResponseType(typeof(IEnumerable>), (int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.NotFound)] public async Task DeleteBookmarks(IEnumerable ids) { var result = await _bookmarkService.DeleteBookmarks(ids); if(result.All(x => !x.IsSuccessful)) return NotFound(); return Ok(result.Select((x) => new GenericResponse(x))); } } }