aboutsummaryrefslogtreecommitdiff
path: root/BackEnd/Timeline
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-12-19 20:08:49 +0800
committercrupest <crupest@outlook.com>2020-12-19 20:08:49 +0800
commit6ac5ba10f9c417f63a4713612a0abf5b20deb099 (patch)
treec938e87c82d2df87ed6ec102dc5eacae6b7e6390 /BackEnd/Timeline
parentb102ed3edf1330e77240708afb59ec8f91d67b41 (diff)
downloadtimeline-6ac5ba10f9c417f63a4713612a0abf5b20deb099.tar.gz
timeline-6ac5ba10f9c417f63a4713612a0abf5b20deb099.tar.bz2
timeline-6ac5ba10f9c417f63a4713612a0abf5b20deb099.zip
feat: Bookmark timeline REST api.
Diffstat (limited to 'BackEnd/Timeline')
-rw-r--r--BackEnd/Timeline/Controllers/BookmarkTimelineController.cs114
-rw-r--r--BackEnd/Timeline/Controllers/HighlightTimelineController.cs8
-rw-r--r--BackEnd/Timeline/Models/Http/BookmarkTimeline.cs23
-rw-r--r--BackEnd/Timeline/Models/Http/HighlightTimeline.cs6
-rw-r--r--BackEnd/Timeline/Startup.cs1
5 files changed, 151 insertions, 1 deletions
diff --git a/BackEnd/Timeline/Controllers/BookmarkTimelineController.cs b/BackEnd/Timeline/Controllers/BookmarkTimelineController.cs
new file mode 100644
index 00000000..9dff95f3
--- /dev/null
+++ b/BackEnd/Timeline/Controllers/BookmarkTimelineController.cs
@@ -0,0 +1,114 @@
+using AutoMapper;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Timeline.Models.Http;
+using Timeline.Models.Validation;
+using Timeline.Services;
+using Timeline.Services.Exceptions;
+
+namespace Timeline.Controllers
+{
+ /// <summary>
+ /// Api related to timeline bookmarks.
+ /// </summary>
+ [ApiController]
+ [ProducesErrorResponseType(typeof(CommonResponse))]
+ public class BookmarkTimelineController : Controller
+ {
+ private readonly IBookmarkTimelineService _service;
+
+ private readonly IMapper _mapper;
+
+ public BookmarkTimelineController(IBookmarkTimelineService service, IMapper mapper)
+ {
+ _service = service;
+ _mapper = mapper;
+ }
+
+ /// <summary>
+ /// Get bookmark list in order.
+ /// </summary>
+ /// <returns>Bookmarks.</returns>
+ [HttpGet("bookmarks")]
+ [Authorize]
+ [ProducesResponseType(200)]
+ [ProducesResponseType(401)]
+ public async Task<ActionResult<List<HttpTimeline>>> List()
+ {
+ var bookmarks = await _service.GetBookmarks(this.GetUserId());
+ return Ok(_mapper.Map<List<HttpTimeline>>(bookmarks));
+ }
+
+ /// <summary>
+ /// Add a bookmark.
+ /// </summary>
+ /// <param name="timeline">Timeline name.</param>
+ [HttpPut("bookmarks/{timeline}")]
+ [Authorize]
+ [ProducesResponseType(200)]
+ [ProducesResponseType(400)]
+ [ProducesResponseType(401)]
+ public async Task<ActionResult> Put([GeneralTimelineName] string timeline)
+ {
+ try
+ {
+ await _service.AddBookmark(this.GetUserId(), timeline);
+ return Ok();
+ }
+ catch (TimelineNotExistException)
+ {
+ return BadRequest(ErrorResponse.TimelineController.NotExist());
+ }
+ }
+
+ /// <summary>
+ /// Remove a bookmark.
+ /// </summary>
+ /// <param name="timeline">Timeline name.</param>
+ [HttpDelete("bookmarks/{timeline}")]
+ [Authorize]
+ [ProducesResponseType(200)]
+ [ProducesResponseType(400)]
+ [ProducesResponseType(401)]
+ public async Task<ActionResult> Delete([GeneralTimelineName] string timeline)
+ {
+ try
+ {
+ await _service.RemoveBookmark(this.GetUserId(), timeline);
+ return Ok();
+ }
+ catch (TimelineNotExistException)
+ {
+ return BadRequest(ErrorResponse.TimelineController.NotExist());
+ }
+ }
+
+ /// <summary>
+ /// Move a bookmark to new posisition.
+ /// </summary>
+ /// <param name="request">Request body.</param>
+ [HttpPost("bookmarkop/move")]
+ [Authorize]
+ [ProducesResponseType(200)]
+ [ProducesResponseType(400)]
+ [ProducesResponseType(401)]
+ public async Task<ActionResult> Move([FromBody] HttpBookmarkTimelineMoveRequest request)
+ {
+ try
+ {
+ await _service.MoveBookmark(this.GetUserId(), request.Timeline, request.NewPosition!.Value);
+ return Ok();
+ }
+ catch (TimelineNotExistException)
+ {
+ return BadRequest(ErrorResponse.TimelineController.NotExist());
+ }
+ catch (InvalidBookmarkException)
+ {
+ return BadRequest(new CommonResponse(ErrorCodes.BookmarkTimelineController.NonBookmark, "You can't move a non-bookmark timeline."));
+ }
+ }
+ }
+}
diff --git a/BackEnd/Timeline/Controllers/HighlightTimelineController.cs b/BackEnd/Timeline/Controllers/HighlightTimelineController.cs
index 0b6e1665..519d6161 100644
--- a/BackEnd/Timeline/Controllers/HighlightTimelineController.cs
+++ b/BackEnd/Timeline/Controllers/HighlightTimelineController.cs
@@ -46,6 +46,8 @@ namespace Timeline.Controllers
[PermissionAuthorize(UserPermission.HighlightTimelineManagement)]
[ProducesResponseType(200)]
[ProducesResponseType(400)]
+ [ProducesResponseType(401)]
+ [ProducesResponseType(403)]
public async Task<ActionResult> Put([GeneralTimelineName] string timeline)
{
try
@@ -67,6 +69,8 @@ namespace Timeline.Controllers
[PermissionAuthorize(UserPermission.HighlightTimelineManagement)]
[ProducesResponseType(200)]
[ProducesResponseType(400)]
+ [ProducesResponseType(401)]
+ [ProducesResponseType(403)]
public async Task<ActionResult> Delete([GeneralTimelineName] string timeline)
{
try
@@ -81,12 +85,14 @@ namespace Timeline.Controllers
}
/// <summary>
- /// Move a highlight position.
+ /// Move a highlight to new position.
/// </summary>
[HttpPost("highlightop/move")]
[PermissionAuthorize(UserPermission.HighlightTimelineManagement)]
[ProducesResponseType(200)]
[ProducesResponseType(400)]
+ [ProducesResponseType(401)]
+ [ProducesResponseType(403)]
public async Task<ActionResult> Move([FromBody] HttpHighlightTimelineMoveRequest body)
{
try
diff --git a/BackEnd/Timeline/Models/Http/BookmarkTimeline.cs b/BackEnd/Timeline/Models/Http/BookmarkTimeline.cs
new file mode 100644
index 00000000..14be1112
--- /dev/null
+++ b/BackEnd/Timeline/Models/Http/BookmarkTimeline.cs
@@ -0,0 +1,23 @@
+using System.ComponentModel.DataAnnotations;
+using Timeline.Models.Validation;
+
+namespace Timeline.Models.Http
+{
+ /// <summary>
+ /// Move bookmark timeline request body model.
+ /// </summary>
+ public class HttpBookmarkTimelineMoveRequest
+ {
+ /// <summary>
+ /// Timeline name.
+ /// </summary>
+ [GeneralTimelineName]
+ public string Timeline { get; set; } = default!;
+
+ /// <summary>
+ /// New position, starting at 1.
+ /// </summary>
+ [Required]
+ public long? NewPosition { get; set; }
+ }
+}
diff --git a/BackEnd/Timeline/Models/Http/HighlightTimeline.cs b/BackEnd/Timeline/Models/Http/HighlightTimeline.cs
index e5aed068..5af0e528 100644
--- a/BackEnd/Timeline/Models/Http/HighlightTimeline.cs
+++ b/BackEnd/Timeline/Models/Http/HighlightTimeline.cs
@@ -8,9 +8,15 @@ namespace Timeline.Models.Http
/// </summary>
public class HttpHighlightTimelineMoveRequest
{
+ /// <summary>
+ /// Timeline name.
+ /// </summary>
[GeneralTimelineName]
public string Timeline { get; set; } = default!;
+ /// <summary>
+ /// New position, starting at 1.
+ /// </summary>
[Required]
public long? NewPosition { get; set; }
}
diff --git a/BackEnd/Timeline/Startup.cs b/BackEnd/Timeline/Startup.cs
index d20fc54b..66c708ac 100644
--- a/BackEnd/Timeline/Startup.cs
+++ b/BackEnd/Timeline/Startup.cs
@@ -102,6 +102,7 @@ namespace Timeline
services.AddScoped<ITimelinePostService, TimelinePostService>();
services.AddScoped<IHighlightTimelineService, HighlightTimelineService>();
+ services.AddScoped<IBookmarkTimelineService, BookmarkTimelineService>();
services.AddDbContext<DatabaseContext>((services, options) =>
{