From 3fc0cd57711b41e3a65e24e30ceaa3f95d7d4415 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 12 Apr 2022 17:36:34 +0800 Subject: ... --- .../Timeline/Controllers/TimelineBookmarkV2Controller.cs | 5 +++-- BackEnd/Timeline/Controllers/TimelinePostV2Controller.cs | 5 +++-- .../Models/Validation/PositiveIntegerAttribute.cs | 12 ++++++++++++ FrontEnd/src/http/timeline.ts | 16 +++++++++++++--- 4 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 BackEnd/Timeline/Models/Validation/PositiveIntegerAttribute.cs diff --git a/BackEnd/Timeline/Controllers/TimelineBookmarkV2Controller.cs b/BackEnd/Timeline/Controllers/TimelineBookmarkV2Controller.cs index c2130b5a..2b31f43e 100644 --- a/BackEnd/Timeline/Controllers/TimelineBookmarkV2Controller.cs +++ b/BackEnd/Timeline/Controllers/TimelineBookmarkV2Controller.cs @@ -32,7 +32,8 @@ namespace Timeline.Controllers [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status422UnprocessableEntity)] [HttpGet] - public async Task>> ListAsync([FromRoute][Username] string username, [FromQuery] int? page, [FromQuery] int? pageSize) + public async Task>> ListAsync([FromRoute][Username] string username, + [FromQuery][PositiveInteger] int? page, [FromQuery][PositiveInteger] int? pageSize) { var userId = await _userService.GetUserIdByUsernameAsync(username); if (!UserHasPermission(UserPermission.UserBookmarkManagement) && !await _timelineBookmarkService.CanReadBookmarksAsync(userId, GetOptionalAuthUserId())) @@ -47,7 +48,7 @@ namespace Timeline.Controllers [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status422UnprocessableEntity)] [HttpGet("{index}")] - public async Task> GetAsync([FromRoute][Username] string username, [FromRoute] int index) + public async Task> GetAsync([FromRoute][Username] string username, [FromRoute][PositiveInteger] int index) { var userId = await _userService.GetUserIdByUsernameAsync(username); if (!UserHasPermission(UserPermission.UserBookmarkManagement) && !await _timelineBookmarkService.CanReadBookmarksAsync(userId, GetOptionalAuthUserId())) diff --git a/BackEnd/Timeline/Controllers/TimelinePostV2Controller.cs b/BackEnd/Timeline/Controllers/TimelinePostV2Controller.cs index 435ffece..c80cda17 100644 --- a/BackEnd/Timeline/Controllers/TimelinePostV2Controller.cs +++ b/BackEnd/Timeline/Controllers/TimelinePostV2Controller.cs @@ -43,14 +43,15 @@ namespace Timeline.Controllers [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status422UnprocessableEntity)] - public async Task>> ListAsync([FromRoute][Username] string owner, [FromRoute][TimelineName] string timeline, [FromQuery] DateTime? modifiedSince, [FromQuery][Range(0, int.MaxValue)] int? page, [FromQuery][Range(1, int.MaxValue)] int? numberPerPage) + public async Task>> ListAsync([FromRoute][Username] string owner, [FromRoute][TimelineName] string timeline, [FromQuery] DateTime? modifiedSince, + [FromQuery][PositiveInteger] int? page, [FromQuery][PositiveInteger] int? pageSize) { var timelineId = await _timelineService.GetTimelineIdAsync(owner, timeline); if (!UserHasPermission(UserPermission.AllTimelineManagement) && !await _timelineService.HasReadPermissionAsync(timelineId, GetOptionalAuthUserId())) { return Forbid(); } - var postPage = await _postService.GetPostsV2Async(timelineId, modifiedSince, page, numberPerPage); + var postPage = await _postService.GetPostsV2Async(timelineId, modifiedSince, page, pageSize); var items = await _mapper.MapListAsync(postPage.Items, Url, User); return postPage.WithItems(items); } diff --git a/BackEnd/Timeline/Models/Validation/PositiveIntegerAttribute.cs b/BackEnd/Timeline/Models/Validation/PositiveIntegerAttribute.cs new file mode 100644 index 00000000..78e2f0b4 --- /dev/null +++ b/BackEnd/Timeline/Models/Validation/PositiveIntegerAttribute.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Timeline.Models.Validation +{ + public class PositiveIntegerAttribute : RangeAttribute + { + public PositiveIntegerAttribute() : base(1, int.MaxValue) + { + } + } +} + diff --git a/FrontEnd/src/http/timeline.ts b/FrontEnd/src/http/timeline.ts index 0e1ceb81..d9e679ea 100644 --- a/FrontEnd/src/http/timeline.ts +++ b/FrontEnd/src/http/timeline.ts @@ -133,7 +133,9 @@ export interface IHttpTimelineClient { ): Promise; listPost( ownerUsername: string, - timelineName: string + timelineName: string, + page?: number, + pageSize?: number ): Promise>; generatePostDataUrl( ownerUsername: string, @@ -235,11 +237,19 @@ export class HttpTimelineClient implements IHttpTimelineClient { listPost( ownerUsername: string, - timelineName: string + timelineName: string, + page?: number, + pageSize?: number ): Promise> { return axios .get>( - `${apiBaseUrl}/v2/timelines/${ownerUsername}/${timelineName}/posts` + applyQueryParameters( + `${apiBaseUrl}/v2/timelines/${ownerUsername}/${timelineName}/posts`, + { + page, + pageSize, + } + ) ) .then(extractResponseData); } -- cgit v1.2.3