From 3267e698c644ec638af42b782b6848dc27467f8b Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 10 Mar 2020 16:01:09 +0800 Subject: ... --- Timeline/Controllers/PersonalTimelineController.cs | 131 --------------------- Timeline/Controllers/TimelineController.cs | 14 +-- Timeline/Models/Timeline.cs | 2 + .../Validation/GeneralTimelineNameValidator.cs | 33 ++++++ 4 files changed, 42 insertions(+), 138 deletions(-) delete mode 100644 Timeline/Controllers/PersonalTimelineController.cs create mode 100644 Timeline/Models/Validation/GeneralTimelineNameValidator.cs (limited to 'Timeline') diff --git a/Timeline/Controllers/PersonalTimelineController.cs b/Timeline/Controllers/PersonalTimelineController.cs deleted file mode 100644 index cef04a97..00000000 --- a/Timeline/Controllers/PersonalTimelineController.cs +++ /dev/null @@ -1,131 +0,0 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Logging; -using System.Collections.Generic; -using System.Threading.Tasks; -using Timeline.Filters; -using Timeline.Models.Http; -using Timeline.Models.Validation; -using Timeline.Services; - -namespace Timeline.Controllers -{ - [ApiController] - [CatchTimelineNotExistException] - public class PersonalTimelineController : Controller - { - private readonly ILogger _logger; - - private readonly IPersonalTimelineService _service; - - public PersonalTimelineController(ILogger logger, IPersonalTimelineService service) - { - _logger = logger; - _service = service; - } - - [HttpGet("users/{username}/timeline")] - public async Task> TimelineGet([FromRoute][Username] string username) - { - return (await _service.GetTimeline(username)).FillLinks(Url); - } - - [HttpGet("users/{username}/timeline/posts")] - public async Task>> PostListGet([FromRoute][Username] string username) - { - if (!this.IsAdministrator() && !await _service.HasReadPermission(username, this.GetOptionalUserId())) - { - return StatusCode(StatusCodes.Status403Forbidden, ErrorResponse.Common.Forbid()); - } - - return await _service.GetPosts(username); - } - - [HttpPost("users/{username}/timeline/posts")] - [Authorize] - public async Task> PostPost([FromRoute][Username] string username, [FromBody] TimelinePostCreateRequest body) - { - var id = this.GetUserId(); - if (!this.IsAdministrator() && !await _service.IsMemberOf(username, id)) - { - return StatusCode(StatusCodes.Status403Forbidden, ErrorResponse.Common.Forbid()); - } - - var res = await _service.CreatePost(username, id, body.Content, body.Time); - return res; - } - - [HttpDelete("users/{username}/timeline/posts/{id}")] - [Authorize] - public async Task PostDelete([FromRoute][Username] string username, [FromRoute] long id) - { - try - { - if (!this.IsAdministrator() && !await _service.HasPostModifyPermission(username, id, this.GetUserId())) - { - return StatusCode(StatusCodes.Status403Forbidden, ErrorResponse.Common.Forbid()); - } - await _service.DeletePost(username, id); - return Ok(CommonDeleteResponse.Delete()); - } - catch (TimelinePostNotExistException) - { - return Ok(CommonDeleteResponse.NotExist()); - } - } - - [HttpPatch("users/{username}/timeline")] - [Authorize] - public async Task> TimelinePatch([FromRoute][Username] string username, [FromBody] TimelinePatchRequest body) - { - if (!this.IsAdministrator() && !(await _service.HasManagePermission(username, this.GetUserId()))) - { - return StatusCode(StatusCodes.Status403Forbidden, ErrorResponse.Common.Forbid()); - } - await _service.ChangeProperty(username, body); - var timeline = (await _service.GetTimeline(username)).FillLinks(Url); - return Ok(timeline); - } - - [HttpPut("users/{username}/timeline/members/{member}")] - [Authorize] - public async Task TimelineMemberPut([FromRoute][Username] string username, [FromRoute][Username] string member) - { - if (!this.IsAdministrator() && !(await _service.HasManagePermission(username, this.GetUserId()))) - { - return StatusCode(StatusCodes.Status403Forbidden, ErrorResponse.Common.Forbid()); - } - - try - { - await _service.ChangeMember(username, new List { member }, null); - return Ok(); - } - catch (UserNotExistException) - { - return BadRequest(ErrorResponse.TimelineCommon.MemberPut_NotExist()); - } - } - - [HttpDelete("users/{username}/timeline/members/{member}")] - [Authorize] - public async Task TimelineMemberDelete([FromRoute][Username] string username, [FromRoute][Username] string member) - { - if (!this.IsAdministrator() && !(await _service.HasManagePermission(username, this.GetUserId()))) - { - return StatusCode(StatusCodes.Status403Forbidden, ErrorResponse.Common.Forbid()); - } - - try - { - await _service.ChangeMember(username, null, new List { member }); - return Ok(CommonDeleteResponse.Delete()); - } - catch (UserNotExistException) - { - return Ok(CommonDeleteResponse.NotExist()); - } - } - } -} diff --git a/Timeline/Controllers/TimelineController.cs b/Timeline/Controllers/TimelineController.cs index 25290ca5..0e5483fa 100644 --- a/Timeline/Controllers/TimelineController.cs +++ b/Timeline/Controllers/TimelineController.cs @@ -92,7 +92,7 @@ namespace Timeline.Controllers } [HttpGet("timelines/{name}")] - public async Task> TimelineGet([FromRoute][TimelineName] string name) + public async Task> TimelineGet([FromRoute][GeneralTimelineName] string name) { var timeline = await _service.GetTimeline(name); var result = _mapper.Map(timeline); @@ -100,7 +100,7 @@ namespace Timeline.Controllers } [HttpGet("timelines/{name}/posts")] - public async Task>> PostListGet([FromRoute][TimelineName] string name) + public async Task>> PostListGet([FromRoute][GeneralTimelineName] string name) { if (!this.IsAdministrator() && !await _service.HasReadPermission(name, this.GetOptionalUserId())) { @@ -115,7 +115,7 @@ namespace Timeline.Controllers [HttpPost("timelines/{name}/posts")] [Authorize] - public async Task> PostPost([FromRoute][TimelineName] string name, [FromBody] TimelinePostCreateRequest body) + public async Task> PostPost([FromRoute][GeneralTimelineName] string name, [FromBody] TimelinePostCreateRequest body) { var id = this.GetUserId(); if (!this.IsAdministrator() && !await _service.IsMemberOf(name, id)) @@ -129,7 +129,7 @@ namespace Timeline.Controllers [HttpDelete("timelines/{name}/posts/{id}")] [Authorize] - public async Task> PostDelete([FromRoute][TimelineName] string name, [FromRoute] long id) + public async Task> PostDelete([FromRoute][GeneralTimelineName] string name, [FromRoute] long id) { try { @@ -148,7 +148,7 @@ namespace Timeline.Controllers [HttpPatch("timelines/{name}")] [Authorize] - public async Task> TimelinePatch([FromRoute][TimelineName] string name, [FromBody] TimelinePatchRequest body) + public async Task> TimelinePatch([FromRoute][GeneralTimelineName] string name, [FromBody] TimelinePatchRequest body) { if (!this.IsAdministrator() && !(await _service.HasManagePermission(name, this.GetUserId()))) { @@ -162,7 +162,7 @@ namespace Timeline.Controllers [HttpPut("timelines/{name}/members/{member}")] [Authorize] - public async Task TimelineMemberPut([FromRoute][TimelineName] string name, [FromRoute][Username] string member) + public async Task TimelineMemberPut([FromRoute][GeneralTimelineName] string name, [FromRoute][Username] string member) { if (!this.IsAdministrator() && !(await _service.HasManagePermission(name, this.GetUserId()))) { @@ -182,7 +182,7 @@ namespace Timeline.Controllers [HttpDelete("timelines/{name}/members/{member}")] [Authorize] - public async Task TimelineMemberDelete([FromRoute][TimelineName] string name, [FromRoute][Username] string member) + public async Task TimelineMemberDelete([FromRoute][GeneralTimelineName] string name, [FromRoute][Username] string member) { if (!this.IsAdministrator() && !(await _service.HasManagePermission(name, this.GetUserId()))) { diff --git a/Timeline/Models/Timeline.cs b/Timeline/Models/Timeline.cs index e2ff525e..6d4c924d 100644 --- a/Timeline/Models/Timeline.cs +++ b/Timeline/Models/Timeline.cs @@ -55,7 +55,9 @@ namespace Timeline.Models public DateTime LastUpdated { get; set; } = default!; } +#pragma warning disable CA1724 // Type names should not match namespaces public class Timeline +#pragma warning restore CA1724 // Type names should not match namespaces { public string Name { get; set; } = default!; public string Description { get; set; } = default!; diff --git a/Timeline/Models/Validation/GeneralTimelineNameValidator.cs b/Timeline/Models/Validation/GeneralTimelineNameValidator.cs new file mode 100644 index 00000000..e1c96fbd --- /dev/null +++ b/Timeline/Models/Validation/GeneralTimelineNameValidator.cs @@ -0,0 +1,33 @@ +using System; + +namespace Timeline.Models.Validation +{ + public class GeneralTimelineNameValidator : Validator + { + private readonly UsernameValidator _usernameValidator = new UsernameValidator(); + private readonly TimelineNameValidator _timelineNameValidator = new TimelineNameValidator(); + + protected override (bool, string) DoValidate(string value) + { + if (value.StartsWith('@')) + { + return _usernameValidator.Validate(value.Substring(1)); + } + else + { + return _timelineNameValidator.Validate(value); + } + } + } + + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, + AllowMultiple = false)] + public class GeneralTimelineNameAttribute : ValidateWithAttribute + { + public GeneralTimelineNameAttribute() + : base(typeof(GeneralTimelineNameValidator)) + { + + } + } +} -- cgit v1.2.3