From 2f36e9a1c8d6db2a808f874134c9cb7d57c3ef16 Mon Sep 17 00:00:00 2001 From: 杨宇千 Date: Thu, 7 Nov 2019 22:06:06 +0800 Subject: Complete PersonalTimelineController and write attribute test. --- Timeline/Controllers/PersonalTimelineController.cs | 86 +++++++++++++--------- 1 file changed, 51 insertions(+), 35 deletions(-) (limited to 'Timeline/Controllers') diff --git a/Timeline/Controllers/PersonalTimelineController.cs b/Timeline/Controllers/PersonalTimelineController.cs index 1535a0b2..f006ad47 100644 --- a/Timeline/Controllers/PersonalTimelineController.cs +++ b/Timeline/Controllers/PersonalTimelineController.cs @@ -1,13 +1,11 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using System; +using Microsoft.Extensions.Logging; using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; +using System.Globalization; using System.Threading.Tasks; using Timeline.Auth; -using Timeline.Entities; using Timeline.Filters; using Timeline.Models; using Timeline.Models.Http; @@ -25,6 +23,7 @@ namespace Timeline { public const int PostsGetForbid = 10040101; public const int PostsCreateForbid = 10040102; + public const int MemberAddNotExist = 10040201; } } } @@ -35,6 +34,8 @@ namespace Timeline.Controllers [ApiController] public class PersonalTimelineController : Controller { + private readonly ILogger _logger; + private readonly IPersonalTimelineService _service; private bool IsAdmin() @@ -58,18 +59,21 @@ namespace Timeline.Controllers } } - public PersonalTimelineController(IPersonalTimelineService service) + public PersonalTimelineController(ILogger logger, IPersonalTimelineService service) { + _logger = logger; _service = service; } [HttpGet("users/{username}/timeline")] + [CatchTimelineNotExistException] public async Task> TimelineGet([FromRoute][Username] string username) { return await _service.GetTimeline(username); } [HttpGet("users/{username}/timeline/posts")] + [CatchTimelineNotExistException] public async Task>> PostsGet([FromRoute][Username] string username) { if (!IsAdmin() && !await _service.HasReadPermission(username, GetAuthUsername())) @@ -81,9 +85,10 @@ namespace Timeline.Controllers return await _service.GetPosts(username); } - [HttpPost("user/{username}/timeline/posts/create")] + [HttpPost("user/{username}/timeline/postop/create")] [Authorize] - public async Task PostsCreate([FromRoute][Username] string username, [FromBody] TimelinePostCreateRequest body) + [CatchTimelineNotExistException] + public async Task> TimelinePost([FromRoute][Username] string username, [FromBody] TimelinePostCreateRequest body) { if (!IsAdmin() && !await _service.IsMemberOf(username, GetAuthUsername()!)) { @@ -91,51 +96,62 @@ namespace Timeline.Controllers new CommonResponse(ErrorCodes.Http.Timeline.PostsCreateForbid, MessagePostsCreateForbid)); } - await _service.CreatePost(username, User.Identity.Name!, body.Content, body.Time); - return Ok(); + var res = await _service.CreatePost(username, User.Identity.Name!, body.Content, body.Time); + return res; } - [HttpPut("user/{username}/timeline/description")] + [HttpPost("user/{username}/timeline/postop/delete")] [Authorize] - [SelfOrAdmin] - public async Task TimelinePutDescription([FromRoute][Username] string username, [FromBody] string body) - { - await _service.SetDescription(username, body); - return Ok(); - } - - private static TimelineVisibility StringToVisibility(string s) + [CatchTimelineNotExistException] + public async Task TimelinePostDelete([FromRoute][Username] string username, [FromBody] TimelinePostDeleteRequest body) { - if ("public".Equals(s, StringComparison.InvariantCultureIgnoreCase)) + var postId = body.Id!.Value; + if (!IsAdmin() && !await _service.HasPostModifyPermission(username, postId, GetAuthUsername()!)) { - return TimelineVisibility.Public; - } - else if ("register".Equals(s, StringComparison.InvariantCultureIgnoreCase)) - { - return TimelineVisibility.Register; - } - else if ("private".Equals(s, StringComparison.InvariantCultureIgnoreCase)) - { - return TimelineVisibility.Private; + return StatusCode(StatusCodes.Status403Forbidden, + new CommonResponse(ErrorCodes.Http.Timeline.PostsCreateForbid, MessagePostsCreateForbid)); } - throw new ArgumentException(ExceptionStringToVisibility); + await _service.DeletePost(username, postId); + return Ok(); } - [HttpPut("user/{username}/timeline/visibility")] + [HttpPost("user/{username}/timeline/op/property")] [Authorize] [SelfOrAdmin] - public async Task TimelinePutVisibility([FromRoute][Username] string username, [FromBody][RegularExpression("public|register|private")] string body) + [CatchTimelineNotExistException] + public async Task TimelineChangeProperty([FromRoute][Username] string username, [FromBody] TimelinePropertyChangeRequest body) { - await _service.SetVisibility(username, StringToVisibility(body)); + await _service.ChangeProperty(username, body); return Ok(); } - [HttpPost("user/{username}/timeline/members/change")] + [HttpPost("user/{username}/timeline/op/member")] [Authorize] [SelfOrAdmin] - public async Task TimelineMembersChange([FromRoute][Username] string username, [FromBody] TimelineMemberChangeRequest body) + [CatchTimelineNotExistException] + public async Task TimelineChangeMember([FromRoute][Username] string username, [FromBody] TimelineMemberChangeRequest body) { - //TODO! + try + { + await _service.ChangeMember(username, body.Add, body.Remove); + return Ok(); + } + catch (TimelineMemberOperationUserException e) + { + if (e.InnerException is UsernameBadFormatException) + { + return BadRequest(CommonResponse.InvalidModel( + string.Format(CultureInfo.CurrentCulture, MessageMemberUsernameBadFormat, e.Index, e.Operation))); + } + else if (e.InnerException is UserNotExistException) + { + return BadRequest(new CommonResponse(ErrorCodes.Http.Timeline.MemberAddNotExist, + string.Format(CultureInfo.CurrentCulture, MessageMemberUserNotExist, e.Index, e.Operation))); + } + + _logger.LogError(e, LogUnknownTimelineMemberOperationUserException); + throw; + } } } } -- cgit v1.2.3