From 4a5a688aa48958f63c89e6a388dac0622f70db5a Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Sun, 6 Oct 2024 21:22:08 +0200 Subject: [PATCH] roles endpoints in media controller added --- .../Roles/ActorRoleRequest.cs | 8 +- .../Roles/CreatorRoleRequest.cs | 8 +- .../Roles/IActorRolePersonRequest.cs | 9 +++ .../Roles/ICreatorRolePersonRequest.cs | 9 +++ .../PersonsController.cs | 35 +++++++++ .../IPersonsControllerService.cs | 6 ++ .../PersonsControllerService.cs | 75 +++++++++++++++++++ 7 files changed, 148 insertions(+), 2 deletions(-) diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs index 517491c..cfb7c1d 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs @@ -8,7 +8,13 @@ public class ActorRoleRequest : ActorRole, IActorRoleMediaRequest, IActorRolePer PersonActorRole IActorRoleMediaRequest.CreateActorRole(long mediaId) { - this.MediaId = mediaId; + MediaId = mediaId; + return CreateActorRole(); + } + + PersonActorRole IActorRolePersonRequest.CreateActorRole(long personId) + { + PersonId = personId; return CreateActorRole(); } diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleRequest.cs index 8edba7f..6021528 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleRequest.cs @@ -8,7 +8,13 @@ public class CreatorRoleRequest : CreatorRole, ICreatorRoleMediaRequest, ICreato PersonCreatorRole ICreatorRoleMediaRequest.CreateCreatorRole(long mediaId) { - this.MediaId = mediaId; + MediaId = mediaId; + return CreateCreatorRole(); + } + + PersonCreatorRole ICreatorRolePersonRequest.CreateCreatorRole(long personId) + { + PersonId = personId; return CreateCreatorRole(); } diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/IActorRolePersonRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/IActorRolePersonRequest.cs index cd2be35..05d475b 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/IActorRolePersonRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/IActorRolePersonRequest.cs @@ -1,4 +1,5 @@ using System.Text.Json.Serialization; +using WatchIt.Database.Model.Person; namespace WatchIt.Common.Model.Roles; @@ -16,4 +17,12 @@ public interface IActorRolePersonRequest string Name { get; set; } #endregion + + + + #region PUBLIC METHODS + + PersonActorRole CreateActorRole(long personId); + + #endregion } \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRolePersonRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRolePersonRequest.cs index 8181c9c..2702520 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRolePersonRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRolePersonRequest.cs @@ -1,4 +1,5 @@ using System.Text.Json.Serialization; +using WatchIt.Database.Model.Person; namespace WatchIt.Common.Model.Roles; @@ -13,4 +14,12 @@ public interface ICreatorRolePersonRequest short TypeId { get; set; } #endregion + + + + #region PUBLIC METHODS + + PersonCreatorRole CreateCreatorRole(long personId); + + #endregion } \ No newline at end of file diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/PersonsController.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/PersonsController.cs index 258763a..4b84e5e 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/PersonsController.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/PersonsController.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using WatchIt.Common.Model.Persons; +using WatchIt.Common.Model.Roles; using WatchIt.WebAPI.Services.Controllers.Persons; namespace WatchIt.WebAPI.Controllers; @@ -104,6 +105,40 @@ public class PersonsController : ControllerBase [ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)] public async Task DeletePersonPhoto([FromRoute]long id) => await _personsControllerService.DeletePersonPhoto(id); + #endregion + + #region Roles + + [HttpGet("{id}/roles/actor")] + [AllowAnonymous] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task GetPersonAllActorRoles([FromRoute]long id, ActorRolePersonQueryParameters query) => await _personsControllerService.GetPersonAllActorRoles(id, query); + + [HttpPost("{id}/roles/actor")] + [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] + [ProducesResponseType(typeof(ActorRoleResponse), StatusCodes.Status201Created)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] + [ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task PostPersonActorRole([FromRoute]long id, [FromBody]IActorRolePersonRequest body) => await _personsControllerService.PostPersonActorRole(id, body); + + [HttpGet("{id}/roles/creator")] + [AllowAnonymous] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task GetPersonAllCreatorRoles([FromRoute]long id, CreatorRolePersonQueryParameters query) => await _personsControllerService.GetPersonAllCreatorRoles(id, query); + + [HttpPost("{id}/roles/creator")] + [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] + [ProducesResponseType(typeof(CreatorRoleResponse), StatusCodes.Status201Created)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] + [ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task PostPersonCreatorRole([FromRoute]long id, [FromBody]ICreatorRolePersonRequest body) => await _personsControllerService.PostPersonCreatorRole(id, body); + #endregion #endregion diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Persons/IPersonsControllerService.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Persons/IPersonsControllerService.cs index d3bd360..760d9f3 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Persons/IPersonsControllerService.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Persons/IPersonsControllerService.cs @@ -1,4 +1,5 @@ using WatchIt.Common.Model.Persons; +using WatchIt.Common.Model.Roles; using WatchIt.WebAPI.Services.Controllers.Common; namespace WatchIt.WebAPI.Services.Controllers.Persons; @@ -16,4 +17,9 @@ public interface IPersonsControllerService Task GetPersonPhoto(long id); Task PutPersonPhoto(long id, PersonPhotoRequest data); Task DeletePersonPhoto(long id); + + Task GetPersonAllActorRoles(long personId, ActorRolePersonQueryParameters queryParameters); + Task PostPersonActorRole(long personId, IActorRolePersonRequest data); + Task GetPersonAllCreatorRoles(long personId, CreatorRolePersonQueryParameters queryParameters); + Task PostPersonCreatorRole(long personId, ICreatorRolePersonRequest data); } \ No newline at end of file diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Persons/PersonsControllerService.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Persons/PersonsControllerService.cs index 549a5c1..d7031f5 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Persons/PersonsControllerService.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Persons/PersonsControllerService.cs @@ -1,5 +1,6 @@ using Microsoft.EntityFrameworkCore; using WatchIt.Common.Model.Persons; +using WatchIt.Common.Model.Roles; using WatchIt.Database; using WatchIt.Database.Model.Person; using WatchIt.WebAPI.Services.Controllers.Common; @@ -218,5 +219,79 @@ public class PersonsControllerService : IPersonsControllerService #endregion + #region Roles + + public async Task GetPersonAllActorRoles(long personId, ActorRolePersonQueryParameters queryParameters) + { + Database.Model.Person.Person? person = await _database.Persons.FirstOrDefaultAsync(x => x.Id == personId); + if (person is null) + { + return RequestResult.NotFound(); + } + + IEnumerable dataRaw = await _database.PersonActorRoles.Where(x => x.PersonId == personId).ToListAsync(); + IEnumerable data = dataRaw.Select(x => new ActorRoleResponse(x)); + data = queryParameters.PrepareData(data); + return RequestResult.Ok(data); + } + + public async Task PostPersonActorRole(long personId, IActorRolePersonRequest data) + { + UserValidator validator = _userService.GetValidator().MustBeAdmin(); + if (!validator.IsValid) + { + return RequestResult.Forbidden(); + } + + Database.Model.Person.Person? person = await _database.Persons.FirstOrDefaultAsync(x => x.Id == personId); + if (person is null) + { + return RequestResult.NotFound(); + } + + PersonActorRole item = data.CreateActorRole(personId); + await _database.PersonActorRoles.AddAsync(item); + await _database.SaveChangesAsync(); + + return RequestResult.Created($"roles/actor/{item.Id}", new ActorRoleResponse(item)); + } + + public async Task GetPersonAllCreatorRoles(long personId, CreatorRolePersonQueryParameters queryParameters) + { + Database.Model.Person.Person? media = await _database.Persons.FirstOrDefaultAsync(x => x.Id == personId); + if (media is null) + { + return RequestResult.NotFound(); + } + + IEnumerable dataRaw = await _database.PersonCreatorRoles.Where(x => x.PersonId == personId).ToListAsync(); + IEnumerable data = dataRaw.Select(x => new CreatorRoleResponse(x)); + data = queryParameters.PrepareData(data); + return RequestResult.Ok(data); + } + + public async Task PostPersonCreatorRole(long personId, ICreatorRolePersonRequest data) + { + UserValidator validator = _userService.GetValidator().MustBeAdmin(); + if (!validator.IsValid) + { + return RequestResult.Forbidden(); + } + + Database.Model.Person.Person? media = await _database.Persons.FirstOrDefaultAsync(x => x.Id == personId); + if (media is null) + { + return RequestResult.NotFound(); + } + + PersonCreatorRole item = data.CreateCreatorRole(personId); + await _database.PersonCreatorRoles.AddAsync(item); + await _database.SaveChangesAsync(); + + return RequestResult.Created($"roles/creator/{item.Id}", new CreatorRoleResponse(item)); + } + + #endregion + #endregion } \ No newline at end of file