From 35e657d8d119bc750a54eb9d5b28f3185c4d45ba Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Tue, 8 Oct 2024 02:14:16 +0200 Subject: [PATCH 1/7] PersonRolesEditActorComponent added --- .../WatchIt.Common.Model/Roles/ActorRole.cs | 8 +- .../Roles/ActorRoleRequest.cs | 18 +++ .../Roles/RoleTypeResponse.cs | 2 +- .../MediaController.cs | 5 + .../IMediaControllerService.cs | 1 + .../MediaControllerService.cs | 8 ++ .../Model/Media.cs | 1 + .../IMediaWebAPIService.cs | 1 + .../MediaWebAPIService.cs | 12 ++ WatchIt.Website/WatchIt.Website/App.razor | 4 +- .../PersonEditFormComponent.razor | 2 +- .../PersonRolesEditActorComponent.razor | 117 ++++++++++++++++++ .../PersonRolesEditActorComponent.razor.cs | 100 +++++++++++++++ .../PersonRolesEditActorComponent.razor.css | 0 .../Pages/PersonEditPage.razor | 6 + .../Pages/PersonEditPage.razor.cs | 9 +- WatchIt.Website/WatchIt.Website/Program.cs | 2 + .../WatchIt.Website/WatchIt.Website.csproj | 2 + .../WatchIt.Website/appsettings.json | 1 + .../WatchIt.Website/wwwroot/css/general.css | 7 ++ 20 files changed, 296 insertions(+), 10 deletions(-) create mode 100644 WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor create mode 100644 WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.cs create mode 100644 WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.css diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRole.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRole.cs index 446ad2f..22812dd 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRole.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRole.cs @@ -7,16 +7,16 @@ public class ActorRole #region PROPERTIES [JsonPropertyName("type_id")] - public required short TypeId { get; set; } + public short TypeId { get; set; } [JsonPropertyName("name")] - public required string Name { get; set; } + public string Name { get; set; } [JsonPropertyName("media_id")] - public required long MediaId { get; set; } + public long MediaId { get; set; } [JsonPropertyName("person_id")] - public required long PersonId { get; set; } + public long PersonId { get; set; } #endregion } \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs index c51f77c..747ec73 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs @@ -1,9 +1,27 @@ +using System.Diagnostics.CodeAnalysis; using WatchIt.Database.Model.Person; namespace WatchIt.Common.Model.Roles; public class ActorRoleRequest : ActorRole, IActorRoleMediaRequest, IActorRolePersonRequest { + #region CONSTRUCTORS + + [SetsRequiredMembers] + public ActorRoleRequest(ActorRoleResponse data) + { + Name = data.Name; + PersonId = data.PersonId; + MediaId = data.MediaId; + TypeId = data.TypeId; + } + + public ActorRoleRequest() {} + + #endregion + + + #region PUBLIC METHODS PersonActorRole IActorRoleMediaRequest.CreateActorRole(long mediaId) diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/RoleTypeResponse.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/RoleTypeResponse.cs index 56629e6..2b3dbe6 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/RoleTypeResponse.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/RoleTypeResponse.cs @@ -16,7 +16,7 @@ public class RoleTypeResponse : RoleType, IQueryOrderable [JsonPropertyName("id")] - public required short? Id { get; set; } + public required short Id { get; set; } #endregion diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/MediaController.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/MediaController.cs index ee25ae1..650141b 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/MediaController.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/MediaController.cs @@ -38,6 +38,11 @@ public class MediaController : ControllerBase #region Main + [HttpGet] + [AllowAnonymous] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task GetAllMedia(MediaQueryParameters query) => await _mediaControllerService.GetAllMedia(query); + [HttpGet("{id}")] [AllowAnonymous] [ProducesResponseType(typeof(MediaResponse), StatusCodes.Status200OK)] diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/IMediaControllerService.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/IMediaControllerService.cs index 390a831..4dff60c 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/IMediaControllerService.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/IMediaControllerService.cs @@ -8,6 +8,7 @@ namespace WatchIt.WebAPI.Services.Controllers.Media; public interface IMediaControllerService { + Task GetAllMedia(MediaQueryParameters query); Task GetMedia(long mediaId); Task GetMediaGenres(long mediaId); diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/MediaControllerService.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/MediaControllerService.cs index 9d34b84..cc25650 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/MediaControllerService.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/MediaControllerService.cs @@ -21,6 +21,14 @@ public class MediaControllerService(DatabaseContext database, IUserService userS #region Main + public async Task GetAllMedia(MediaQueryParameters query) + { + IEnumerable rawData = await database.Media.ToListAsync(); + IEnumerable data = rawData.Select(x => new MediaResponse(x, database.MediaMovies.Any(y => y.Id == x.Id) ? MediaType.Movie : MediaType.Series)); + data = query.PrepareData(data); + return RequestResult.Ok(data); + } + public async Task GetMedia(long mediaId) { Database.Model.Media.Media? item = await database.Media.FirstOrDefaultAsync(x => x.Id == mediaId); diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Media.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Media.cs index fa20a8d..a7ae025 100644 --- a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Media.cs +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Media.cs @@ -3,6 +3,7 @@ public class Media { public string Base { get; set; } + public string GetAllMedia { get; set; } public string GetMedia { get; set; } public string GetMediaGenres { get; set; } public string PostMediaGenre { get; set; } diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/IMediaWebAPIService.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/IMediaWebAPIService.cs index 86a9dee..ec33625 100644 --- a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/IMediaWebAPIService.cs +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/IMediaWebAPIService.cs @@ -8,6 +8,7 @@ namespace WatchIt.Website.Services.WebAPI.Media; public interface IMediaWebAPIService { + Task GetAllMedia(MediaQueryParameters? query = null, Action>? successAction = null); Task GetMedia(long mediaId, Action? successAction = null, Action? notFoundAction = null); Task GetMediaGenres(long mediaId, Action>? successAction = null, Action? notFoundAction = null); diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/MediaWebAPIService.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/MediaWebAPIService.cs index 4ec059a..0098bd6 100644 --- a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/MediaWebAPIService.cs +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/MediaWebAPIService.cs @@ -35,6 +35,18 @@ public class MediaWebAPIService : BaseWebAPIService, IMediaWebAPIService #region Main + public async Task GetAllMedia(MediaQueryParameters? query = null, Action>? successAction = null) + { + string url = GetUrl(EndpointsConfiguration.Media.GetAllMedia); + + HttpRequest request = new HttpRequest(HttpMethodType.Get, url); + request.Query = query; + + HttpResponse response = await _httpClientService.SendRequestAsync(request); + response.RegisterActionFor2XXSuccess(successAction) + .ExecuteAction(); + } + public async Task GetMedia(long mediaId, Action? successAction = null, Action? notFoundAction = null) { string url = GetUrl(EndpointsConfiguration.Media.GetMedia, mediaId); diff --git a/WatchIt.Website/WatchIt.Website/App.razor b/WatchIt.Website/WatchIt.Website/App.razor index fb9b08f..059458f 100644 --- a/WatchIt.Website/WatchIt.Website/App.razor +++ b/WatchIt.Website/WatchIt.Website/App.razor @@ -9,8 +9,8 @@ - - + + diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonEditFormComponent.razor b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonEditFormComponent.razor index c365b9d..24d0157 100644 --- a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonEditFormComponent.razor +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonEditFormComponent.razor @@ -45,7 +45,7 @@ -
+
@if (!string.IsNullOrWhiteSpace(_error)) { diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor new file mode 100644 index 0000000..95c812a --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor @@ -0,0 +1,117 @@ +@using Blazorise.Extensions +@using WatchIt.Common.Model.Roles + + + +
+ @if (_loaded) + { +
+
+
+
+

Actor roles

+
+ @if (!_editingMode) + { +
+ +
+ } + else + { +
+ +
+
+ +
+ } +
+
+ @if (!_editingMode) + { + if (_roles.IsNullOrEmpty()) + { + No items + } + else + { + + + + + + + + + + + + @foreach (Guid roleId in _roles.Keys) + { + + + + + + + + } + +
+ Media name + + Media type + + Role type + + Role name + + Actions +
+ @(Media[_roles[roleId].Data.MediaId].Title)@(Media[_roles[roleId].Data.MediaId].ReleaseDate.HasValue ? $" ({Media[_roles[roleId].Data.MediaId].ReleaseDate!.Value.Year})" : string.Empty) + + @(Media[_roles[roleId].Data.MediaId].Type == MediaType.Movie ? $"Movie" : "TV Series") + + @(_roleTypes[_roles[roleId].Data.TypeId]) + + @(_roles[roleId].Data.Name) + +
+ + +
+
+ } + } + else + { + + } +
+ } + else + { + + } +
\ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.cs b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.cs new file mode 100644 index 0000000..06af0dd --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.cs @@ -0,0 +1,100 @@ +using Microsoft.AspNetCore.Components; +using WatchIt.Common.Model.Media; +using WatchIt.Common.Model.Roles; +using WatchIt.Website.Services.WebAPI.Media; +using WatchIt.Website.Services.WebAPI.Persons; +using WatchIt.Website.Services.WebAPI.Roles; + +namespace WatchIt.Website.Components.PersonEditPage; + +public partial class PersonRolesEditActorComponent : ComponentBase +{ + #region SERVICES + + [Inject] private IPersonsWebAPIService PersonsWebAPIService { get; set; } = default!; + [Inject] private IMediaWebAPIService MediaWebAPIService { get; set; } = default!; + [Inject] private IRolesWebAPIService RolesWebAPIService { get; set; } = default!; + + #endregion + + + + #region PARAMETERS + + [Parameter] public required long? Id { get; set; } + [Parameter] public required Dictionary Media { get; set; } + [Parameter] public string Class { get; set; } = string.Empty; + + #endregion + + + + #region FIELDS + + private bool _loaded; + + private Dictionary _roles = []; + private Dictionary _roleTypes = []; + + + private Guid? _editedId; + private IActorRolePersonRequest _editedModel = new ActorRoleRequest(); + + private bool _editingMode; + private bool _saving; + + #endregion + + + + #region PUBLIC METHODS + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + List endTasks = new List(); + + // STEP 0 + if (Id.HasValue) + { + endTasks.AddRange( + [ + PersonsWebAPIService.GetPersonAllActorRoles(Id.Value, successAction: data => _roles = data.ToDictionary(x => x.Id, x => (x, false))), + RolesWebAPIService.GetAllActorRoleTypes(successAction: data => _roleTypes = data.ToDictionary(x => x.Id, x => x.Name)), + ]); + } + + // END + await Task.WhenAll(endTasks); + + _loaded = true; + StateHasChanged(); + } + } + + private void CancelEdit() + { + _editingMode = false; + } + + private void SaveEdit() + { + + } + + private void ActivateEdit(Guid? id = null) + { + _editedId = id; + _editedModel = id.HasValue ? new ActorRoleRequest(_roles[id.Value].Data) : new ActorRoleRequest(); + _editingMode = true; + } + + private async Task Delete(Guid id) + { + _roles[id] = (_roles[id].Data, true); + await RolesWebAPIService.DeleteActorRole(id, () => _roles.Remove(id)); + } + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.css b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.css new file mode 100644 index 0000000..e69de29 diff --git a/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor b/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor index 27ab84f..01dcb6c 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor +++ b/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor @@ -59,6 +59,12 @@ Class="h-100"/>
+
+
+ +
+
} else diff --git a/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor.cs b/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor.cs index 3efed3b..242d128 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor.cs +++ b/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor.cs @@ -1,7 +1,9 @@ using Microsoft.AspNetCore.Components; +using WatchIt.Common.Model.Media; using WatchIt.Common.Model.Persons; using WatchIt.Website.Layout; using WatchIt.Website.Services.Utility.Authentication; +using WatchIt.Website.Services.WebAPI.Media; using WatchIt.Website.Services.WebAPI.Persons; namespace WatchIt.Website.Pages; @@ -13,6 +15,7 @@ public partial class PersonEditPage : ComponentBase [Inject] private NavigationManager NavigationManager { get; set; } = default!; [Inject] private IAuthenticationService AuthenticationService { get; set; } = default!; [Inject] private IPersonsWebAPIService PersonsWebAPIService { get; set; } = default!; + [Inject] private IMediaWebAPIService MediaWebAPIService { get; set; } = default!; #endregion @@ -36,6 +39,7 @@ public partial class PersonEditPage : ComponentBase private User? _user; private PersonResponse? _person; + private Dictionary _media = []; #endregion @@ -53,7 +57,7 @@ public partial class PersonEditPage : ComponentBase // STEP 0 step1Tasks.AddRange( [ - Task.Run(async () => _user = await AuthenticationService.GetUserAsync()) + Task.Run(async () => _user = await AuthenticationService.GetUserAsync()), ]); // STEP 1 @@ -62,7 +66,8 @@ public partial class PersonEditPage : ComponentBase { endTasks.AddRange( [ - PersonsWebAPIService.GetPerson(Id.Value, data => _person = data, () => NavigationManager.NavigateTo("/person/new", true)) + PersonsWebAPIService.GetPerson(Id.Value, data => _person = data, () => NavigationManager.NavigateTo("/person/new", true)), + MediaWebAPIService.GetAllMedia(successAction: data => _media = data.ToDictionary(x => x.Id, x => x)), ]); } diff --git a/WatchIt.Website/WatchIt.Website/Program.cs b/WatchIt.Website/WatchIt.Website/Program.cs index 6975f44..9f05d6f 100644 --- a/WatchIt.Website/WatchIt.Website/Program.cs +++ b/WatchIt.Website/WatchIt.Website/Program.cs @@ -14,6 +14,7 @@ using WatchIt.Website.Services.WebAPI.Media; using WatchIt.Website.Services.WebAPI.Movies; using WatchIt.Website.Services.WebAPI.Persons; using WatchIt.Website.Services.WebAPI.Photos; +using WatchIt.Website.Services.WebAPI.Roles; using WatchIt.Website.Services.WebAPI.Series; namespace WatchIt.Website; @@ -79,6 +80,7 @@ public static class Program builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); return builder; } diff --git a/WatchIt.Website/WatchIt.Website/WatchIt.Website.csproj b/WatchIt.Website/WatchIt.Website/WatchIt.Website.csproj index 7a61124..eb28837 100644 --- a/WatchIt.Website/WatchIt.Website/WatchIt.Website.csproj +++ b/WatchIt.Website/WatchIt.Website/WatchIt.Website.csproj @@ -25,6 +25,7 @@ + @@ -46,6 +47,7 @@ + diff --git a/WatchIt.Website/WatchIt.Website/appsettings.json b/WatchIt.Website/WatchIt.Website/appsettings.json index 4300ef7..aa46c17 100644 --- a/WatchIt.Website/WatchIt.Website/appsettings.json +++ b/WatchIt.Website/WatchIt.Website/appsettings.json @@ -37,6 +37,7 @@ }, "Media": { "Base": "/media", + "GetAllMedia": "", "GetMedia": "/{0}", "GetMediaGenres": "/{0}/genres", "PostMediaGenre": "/{0}/genres/{1}", diff --git a/WatchIt.Website/WatchIt.Website/wwwroot/css/general.css b/WatchIt.Website/WatchIt.Website/wwwroot/css/general.css index 443ec27..263c518 100644 --- a/WatchIt.Website/WatchIt.Website/wwwroot/css/general.css +++ b/WatchIt.Website/WatchIt.Website/wwwroot/css/general.css @@ -42,7 +42,14 @@ body, html { -webkit-text-fill-color: transparent; } +.table-transparent { + --bs-table-bg: transparent !important; +} +.table td.table-cell-fit, .table th.table-cell-fit { + white-space: nowrap; + width: 1%; +} From 4064f4924038a9433d41f6ae4c850a8a7f05bed6 Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Tue, 8 Oct 2024 19:56:14 +0200 Subject: [PATCH 2/7] changes in model, actor roles adding in person edit page finished --- .../WatchIt.Common.Model/Roles/ActorRole.cs | 8 +--- .../Roles/ActorRoleMediaRequest.cs | 22 ++++++++++ .../Roles/ActorRolePersonRequest.cs | 22 ++++++++++ .../Roles/ActorRoleRequest.cs | 43 +++---------------- .../Roles/ActorRoleResponse.cs | 6 +++ .../Roles/ActorRoleUniversalRequest.cs | 43 +++++++++++++++++++ .../WatchIt.Common.Model/Roles/CreatorRole.cs | 8 +--- ...aRequest.cs => CreatorRoleMediaRequest.cs} | 13 +++--- ...Request.cs => CreatorRolePersonRequest.cs} | 13 +++--- .../Roles/CreatorRoleRequest.cs | 26 +++-------- .../Roles/CreatorRoleResponse.cs | 6 +++ .../Roles/CreatorRoleUniversalRequest.cs | 27 ++++++++++++ .../Roles/IActorRoleMediaRequest.cs | 22 +--------- .../Roles/IActorRolePersonRequest.cs | 22 +--------- .../Roles/IActorRoleRequest.cs | 12 ++++++ .../Person/PersonActorRoleConfiguration.cs | 4 ++ .../MediaController.cs | 4 +- .../PersonsController.cs | 4 +- .../RolesController.cs | 4 +- .../IMediaControllerService.cs | 4 +- .../MediaControllerService.cs | 4 +- .../IPersonsControllerService.cs | 4 +- .../PersonsControllerService.cs | 10 ++--- .../IRolesControllerService.cs | 4 +- .../RolesControllerService.cs | 4 +- .../Roles/ActorRoleMediaRequestValidator.cs | 16 +++++++ .../Roles/ActorRolePersonRequestValidator.cs | 16 +++++++ .../ActorRoleUniversalRequestValidator.cs | 19 ++++++++ .../Roles/BaseActorRoleRequestValidator.cs | 17 ++++++++ .../IMediaWebAPIService.cs | 4 +- .../MediaWebAPIService.cs | 4 +- .../IPersonsWebAPIService.cs | 4 +- .../PersonsWebAPIService.cs | 4 +- .../IRolesWebAPIService.cs | 5 ++- .../RolesWebAPIService.cs | 4 +- .../PersonRolesEditActorComponent.razor | 40 ++++++++++++++++- .../PersonRolesEditActorComponent.razor.cs | 41 ++++++++++++++++-- .../Components/PictureEditorComponent.razor | 2 +- 38 files changed, 352 insertions(+), 163 deletions(-) create mode 100644 WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleMediaRequest.cs create mode 100644 WatchIt.Common/WatchIt.Common.Model/Roles/ActorRolePersonRequest.cs create mode 100644 WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleUniversalRequest.cs rename WatchIt.Common/WatchIt.Common.Model/Roles/{ICreatorRoleMediaRequest.cs => CreatorRoleMediaRequest.cs} (54%) rename WatchIt.Common/WatchIt.Common.Model/Roles/{ICreatorRolePersonRequest.cs => CreatorRolePersonRequest.cs} (54%) create mode 100644 WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleUniversalRequest.cs create mode 100644 WatchIt.Common/WatchIt.Common.Model/Roles/IActorRoleRequest.cs create mode 100644 WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/ActorRoleMediaRequestValidator.cs create mode 100644 WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/ActorRolePersonRequestValidator.cs create mode 100644 WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/ActorRoleUniversalRequestValidator.cs create mode 100644 WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/BaseActorRoleRequestValidator.cs diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRole.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRole.cs index 22812dd..572748f 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRole.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRole.cs @@ -2,7 +2,7 @@ using System.Text.Json.Serialization; namespace WatchIt.Common.Model.Roles; -public class ActorRole +public abstract class ActorRole { #region PROPERTIES @@ -12,11 +12,5 @@ public class ActorRole [JsonPropertyName("name")] public string Name { get; set; } - [JsonPropertyName("media_id")] - public long MediaId { get; set; } - - [JsonPropertyName("person_id")] - public long PersonId { get; set; } - #endregion } \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleMediaRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleMediaRequest.cs new file mode 100644 index 0000000..66787b5 --- /dev/null +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleMediaRequest.cs @@ -0,0 +1,22 @@ +using System.Text.Json.Serialization; +using WatchIt.Database.Model.Person; + +namespace WatchIt.Common.Model.Roles; + +public class ActorRoleMediaRequest : ActorRoleRequest, IActorRoleMediaRequest +{ + #region PROPERTIES + + [JsonPropertyName("person_id")] + public long PersonId { get; set; } + + #endregion + + + + #region PUBLIC METHODS + + public PersonActorRole CreateActorRole(long mediaId) => base.CreateActorRole(mediaId, PersonId); + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRolePersonRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRolePersonRequest.cs new file mode 100644 index 0000000..aba7c47 --- /dev/null +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRolePersonRequest.cs @@ -0,0 +1,22 @@ +using System.Text.Json.Serialization; +using WatchIt.Database.Model.Person; + +namespace WatchIt.Common.Model.Roles; + +public class ActorRolePersonRequest : ActorRoleRequest, IActorRolePersonRequest +{ + #region PROPERTIES + + [JsonPropertyName("media_id")] + public long MediaId { get; set; } + + #endregion + + + + #region PUBLIC METHODS + + public PersonActorRole CreateActorRole(long personId) => base.CreateActorRole(MediaId, personId); + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs index 747ec73..ab30f23 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs @@ -3,51 +3,22 @@ using WatchIt.Database.Model.Person; namespace WatchIt.Common.Model.Roles; -public class ActorRoleRequest : ActorRole, IActorRoleMediaRequest, IActorRolePersonRequest +public abstract class ActorRoleRequest : ActorRole { - #region CONSTRUCTORS - - [SetsRequiredMembers] - public ActorRoleRequest(ActorRoleResponse data) - { - Name = data.Name; - PersonId = data.PersonId; - MediaId = data.MediaId; - TypeId = data.TypeId; - } - - public ActorRoleRequest() {} - - #endregion - - - #region PUBLIC METHODS - - PersonActorRole IActorRoleMediaRequest.CreateActorRole(long mediaId) - { - MediaId = mediaId; - return CreateActorRole(); - } - PersonActorRole IActorRolePersonRequest.CreateActorRole(long personId) + public PersonActorRole CreateActorRole(long mediaId, long personId) => new PersonActorRole { - PersonId = personId; - return CreateActorRole(); - } - - public PersonActorRole CreateActorRole() => new PersonActorRole - { - MediaId = MediaId, - PersonId = PersonId, + MediaId = mediaId, + PersonId = personId, PersonActorRoleTypeId = TypeId, RoleName = Name, }; - public void UpdateActorRole(PersonActorRole item) + public void UpdateActorRole(PersonActorRole item, long mediaId, long personId) { - item.MediaId = MediaId; - item.PersonId = PersonId; + item.MediaId = mediaId; + item.PersonId = personId; item.PersonActorRoleTypeId = TypeId; item.RoleName = Name; } diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleResponse.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleResponse.cs index 8f6e024..692e5a9 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleResponse.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleResponse.cs @@ -18,6 +18,12 @@ public class ActorRoleResponse : ActorRole, IQueryOrderable [JsonPropertyName("id")] public required Guid Id { get; set; } + + [JsonPropertyName("media_id")] + public long MediaId { get; set; } + + [JsonPropertyName("person_id")] + public long PersonId { get; set; } #endregion diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleUniversalRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleUniversalRequest.cs new file mode 100644 index 0000000..76ff560 --- /dev/null +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleUniversalRequest.cs @@ -0,0 +1,43 @@ +using System.Text.Json.Serialization; +using WatchIt.Database.Model.Person; + +namespace WatchIt.Common.Model.Roles; + +public class ActorRoleUniversalRequest : ActorRoleRequest, IActorRolePersonRequest, IActorRoleMediaRequest +{ + #region PROPERTIES + + [JsonPropertyName("person_id")] + public long PersonId { get; set; } + + [JsonPropertyName("media_id")] + public long MediaId { get; set; } + + #endregion + + + + #region CONSTRUCTORS + + public ActorRoleUniversalRequest() { } + + public ActorRoleUniversalRequest(ActorRoleResponse data) + { + MediaId = data.MediaId; + PersonId = data.PersonId; + TypeId = data.TypeId; + Name = data.Name; + } + + #endregion + + + + #region PUBLIC METHODS + + public PersonActorRole CreateActorRole() => base.CreateActorRole(MediaId, PersonId); + + public void UpdateActorRole(PersonActorRole item) => base.UpdateActorRole(item, MediaId, PersonId); + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRole.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRole.cs index 0eab7d9..b62c387 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRole.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRole.cs @@ -2,18 +2,12 @@ using System.Text.Json.Serialization; namespace WatchIt.Common.Model.Roles; -public class CreatorRole +public abstract class CreatorRole { #region PROPERTIES [JsonPropertyName("type_id")] public required short TypeId { get; set; } - [JsonPropertyName("media_id")] - public required long MediaId { get; set; } - - [JsonPropertyName("person_id")] - public required long PersonId { get; set; } - #endregion } \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRoleMediaRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs similarity index 54% rename from WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRoleMediaRequest.cs rename to WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs index cc7cc47..63b3455 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRoleMediaRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs @@ -3,23 +3,20 @@ using WatchIt.Database.Model.Person; namespace WatchIt.Common.Model.Roles; -public interface ICreatorRoleMediaRequest +public class CreatorRoleMediaRequest : CreatorRoleRequest { #region PROPERTIES [JsonPropertyName("person_id")] - long PersonId { get; set; } - - [JsonPropertyName("type_id")] - short TypeId { get; set; } + public required long PersonId { get; set; } #endregion #region PUBLIC METHODS - - PersonCreatorRole CreateCreatorRole(long mediaId); - + + public PersonCreatorRole CreateCreatorRole(long mediaId) => base.CreateCreatorRole(mediaId, 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/CreatorRolePersonRequest.cs similarity index 54% rename from WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRolePersonRequest.cs rename to WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRolePersonRequest.cs index 2702520..f922efa 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRolePersonRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRolePersonRequest.cs @@ -3,23 +3,20 @@ using WatchIt.Database.Model.Person; namespace WatchIt.Common.Model.Roles; -public interface ICreatorRolePersonRequest +public class CreatorRolePersonRequest : CreatorRoleRequest { #region PROPERTIES [JsonPropertyName("media_id")] - long MediaId { get; set; } - - [JsonPropertyName("type_id")] - short TypeId { get; set; } + public required long MediaId { get; set; } #endregion #region PUBLIC METHODS - - PersonCreatorRole CreateCreatorRole(long personId); - + + public PersonCreatorRole CreateCreatorRole(long personId) => base.CreateCreatorRole(MediaId, personId); + #endregion } \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleRequest.cs index ad9fa5c..ab93a3a 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleRequest.cs @@ -2,33 +2,21 @@ using WatchIt.Database.Model.Person; namespace WatchIt.Common.Model.Roles; -public class CreatorRoleRequest : CreatorRole, ICreatorRoleMediaRequest, ICreatorRolePersonRequest +public abstract class CreatorRoleRequest : CreatorRole { #region PUBLIC METHODS - - PersonCreatorRole ICreatorRoleMediaRequest.CreateCreatorRole(long mediaId) - { - MediaId = mediaId; - return CreateCreatorRole(); - } - PersonCreatorRole ICreatorRolePersonRequest.CreateCreatorRole(long personId) + public PersonCreatorRole CreateCreatorRole(long mediaId, long personId) => new PersonCreatorRole { - PersonId = personId; - return CreateCreatorRole(); - } - - public PersonCreatorRole CreateCreatorRole() => new PersonCreatorRole - { - MediaId = MediaId, - PersonId = PersonId, + MediaId = mediaId, + PersonId = personId, PersonCreatorRoleTypeId = TypeId, }; - public void UpdateCreatorRole(PersonCreatorRole item) + public void UpdateCreatorRole(PersonCreatorRole item, long mediaId, long personId) { - item.MediaId = MediaId; - item.PersonId = PersonId; + item.MediaId = mediaId; + item.PersonId = personId; item.PersonCreatorRoleTypeId = TypeId; } diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleResponse.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleResponse.cs index c1b4433..986989d 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleResponse.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleResponse.cs @@ -17,6 +17,12 @@ public class CreatorRoleResponse : CreatorRole, IQueryOrderable base.CreateCreatorRole(MediaId, PersonId); + + public void UpdateCreatorRole(PersonCreatorRole item) => base.UpdateCreatorRole(item, MediaId, PersonId); + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/IActorRoleMediaRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/IActorRoleMediaRequest.cs index 2bf7bf9..c99d824 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/IActorRoleMediaRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/IActorRoleMediaRequest.cs @@ -1,28 +1,10 @@ -using System.Text.Json.Serialization; -using WatchIt.Database.Model.Person; - namespace WatchIt.Common.Model.Roles; -public interface IActorRoleMediaRequest +public interface IActorRoleMediaRequest : IActorRoleRequest { #region PROPERTIES - [JsonPropertyName("person_id")] - long PersonId { get; set; } + public long PersonId { get; set; } - [JsonPropertyName("type_id")] - short TypeId { get; set; } - - [JsonPropertyName("name")] - string Name { get; set; } - - #endregion - - - - #region PUBLIC METHODS - - PersonActorRole CreateActorRole(long mediaId); - #endregion } \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/IActorRolePersonRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/IActorRolePersonRequest.cs index 05d475b..37d2dfc 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/IActorRolePersonRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/IActorRolePersonRequest.cs @@ -1,28 +1,10 @@ -using System.Text.Json.Serialization; -using WatchIt.Database.Model.Person; - namespace WatchIt.Common.Model.Roles; -public interface IActorRolePersonRequest +public interface IActorRolePersonRequest : IActorRoleRequest { #region PROPERTIES - [JsonPropertyName("media_id")] - long MediaId { get; set; } + public long MediaId { get; set; } - [JsonPropertyName("type_id")] - short TypeId { get; set; } - - [JsonPropertyName("name")] - 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/IActorRoleRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/IActorRoleRequest.cs new file mode 100644 index 0000000..d61550f --- /dev/null +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/IActorRoleRequest.cs @@ -0,0 +1,12 @@ +namespace WatchIt.Common.Model.Roles; + +public interface IActorRoleRequest +{ + #region PROPERTIES + + public short TypeId { get; set; } + + public string Name { get; set; } + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Database/WatchIt.Database.Model/WatchIt.Database.Model.Configuration/Person/PersonActorRoleConfiguration.cs b/WatchIt.Database/WatchIt.Database.Model/WatchIt.Database.Model.Configuration/Person/PersonActorRoleConfiguration.cs index b94193e..b6edd76 100644 --- a/WatchIt.Database/WatchIt.Database.Model/WatchIt.Database.Model.Configuration/Person/PersonActorRoleConfiguration.cs +++ b/WatchIt.Database/WatchIt.Database.Model/WatchIt.Database.Model.Configuration/Person/PersonActorRoleConfiguration.cs @@ -34,5 +34,9 @@ public class PersonActorRoleConfiguration : IEntityTypeConfiguration x.PersonActorRoleTypeId) .IsRequired(); + + builder.Property(x => x.RoleName) + .HasMaxLength(100) + .IsRequired(); } } \ No newline at end of file diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/MediaController.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/MediaController.cs index 650141b..6764675 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/MediaController.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/MediaController.cs @@ -183,7 +183,7 @@ public class MediaController : ControllerBase [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task PostMediaActorRole([FromRoute]long id, [FromBody]IActorRoleMediaRequest body) => await _mediaControllerService.PostMediaActorRole(id, body); + public async Task PostMediaActorRole([FromRoute]long id, [FromBody]ActorRoleMediaRequest body) => await _mediaControllerService.PostMediaActorRole(id, body); [HttpGet("{id}/roles/creator")] [AllowAnonymous] @@ -198,7 +198,7 @@ public class MediaController : ControllerBase [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task PostMediaCreatorRole([FromRoute]long id, [FromBody]ICreatorRoleMediaRequest body) => await _mediaControllerService.PostMediaCreatorRole(id, body); + public async Task PostMediaCreatorRole([FromRoute]long id, [FromBody]CreatorRoleMediaRequest body) => await _mediaControllerService.PostMediaCreatorRole(id, body); #endregion diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/PersonsController.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/PersonsController.cs index 4b84e5e..0192a0d 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/PersonsController.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/PersonsController.cs @@ -122,7 +122,7 @@ public class PersonsController : ControllerBase [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); + public async Task PostPersonActorRole([FromRoute]long id, [FromBody]ActorRolePersonRequest body) => await _personsControllerService.PostPersonActorRole(id, body); [HttpGet("{id}/roles/creator")] [AllowAnonymous] @@ -137,7 +137,7 @@ public class PersonsController : ControllerBase [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); + public async Task PostPersonCreatorRole([FromRoute]long id, [FromBody]CreatorRolePersonRequest body) => await _personsControllerService.PostPersonCreatorRole(id, body); #endregion diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/RolesController.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/RolesController.cs index 100b4e0..cb43f62 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/RolesController.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/RolesController.cs @@ -47,7 +47,7 @@ public class RolesController : ControllerBase [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task PutActorRole([FromRoute]Guid id, [FromBody]ActorRoleRequest body) => await _rolesControllerService.PutActorRole(id, body); + public async Task PutActorRole([FromRoute]Guid id, [FromBody]ActorRoleUniversalRequest body) => await _rolesControllerService.PutActorRole(id, body); [HttpDelete("actor/{id}")] [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] @@ -98,7 +98,7 @@ public class RolesController : ControllerBase [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task PutCreatorRole([FromRoute]Guid id, [FromBody]CreatorRoleRequest body) => await _rolesControllerService.PutCreatorRole(id, body); + public async Task PutCreatorRole([FromRoute]Guid id, [FromBody]CreatorRoleUniversalRequest body) => await _rolesControllerService.PutCreatorRole(id, body); [HttpDelete("creator/{id}")] [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/IMediaControllerService.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/IMediaControllerService.cs index 4dff60c..8b073a0 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/IMediaControllerService.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/IMediaControllerService.cs @@ -31,7 +31,7 @@ public interface IMediaControllerService Task PostMediaPhoto(long mediaId, MediaPhotoRequest data); Task GetMediaAllActorRoles(long mediaId, ActorRoleMediaQueryParameters queryParameters); - Task PostMediaActorRole(long mediaId, IActorRoleMediaRequest data); + Task PostMediaActorRole(long mediaId, ActorRoleMediaRequest data); Task GetMediaAllCreatorRoles(long mediaId, CreatorRoleMediaQueryParameters queryParameters); - Task PostMediaCreatorRole(long mediaId, ICreatorRoleMediaRequest data); + Task PostMediaCreatorRole(long mediaId, CreatorRoleMediaRequest data); } \ No newline at end of file diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/MediaControllerService.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/MediaControllerService.cs index cc25650..18f8364 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/MediaControllerService.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Media/MediaControllerService.cs @@ -377,7 +377,7 @@ public class MediaControllerService(DatabaseContext database, IUserService userS return RequestResult.Ok(data); } - public async Task PostMediaActorRole(long mediaId, IActorRoleMediaRequest data) + public async Task PostMediaActorRole(long mediaId, ActorRoleMediaRequest data) { UserValidator validator = userService.GetValidator().MustBeAdmin(); if (!validator.IsValid) @@ -412,7 +412,7 @@ public class MediaControllerService(DatabaseContext database, IUserService userS return RequestResult.Ok(data); } - public async Task PostMediaCreatorRole(long mediaId, ICreatorRoleMediaRequest data) + public async Task PostMediaCreatorRole(long mediaId, CreatorRoleMediaRequest data) { UserValidator validator = userService.GetValidator().MustBeAdmin(); if (!validator.IsValid) 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 760d9f3..8b72b75 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 @@ -19,7 +19,7 @@ public interface IPersonsControllerService Task DeletePersonPhoto(long id); Task GetPersonAllActorRoles(long personId, ActorRolePersonQueryParameters queryParameters); - Task PostPersonActorRole(long personId, IActorRolePersonRequest data); + Task PostPersonActorRole(long personId, ActorRolePersonRequest data); Task GetPersonAllCreatorRoles(long personId, CreatorRolePersonQueryParameters queryParameters); - Task PostPersonCreatorRole(long personId, ICreatorRolePersonRequest data); + Task PostPersonCreatorRole(long personId, CreatorRolePersonRequest 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 d7031f5..2118ce2 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 @@ -235,7 +235,7 @@ public class PersonsControllerService : IPersonsControllerService return RequestResult.Ok(data); } - public async Task PostPersonActorRole(long personId, IActorRolePersonRequest data) + public async Task PostPersonActorRole(long personId, ActorRolePersonRequest data) { UserValidator validator = _userService.GetValidator().MustBeAdmin(); if (!validator.IsValid) @@ -243,7 +243,7 @@ public class PersonsControllerService : IPersonsControllerService return RequestResult.Forbidden(); } - Database.Model.Person.Person? person = await _database.Persons.FirstOrDefaultAsync(x => x.Id == personId); + Person? person = await _database.Persons.FirstOrDefaultAsync(x => x.Id == personId); if (person is null) { return RequestResult.NotFound(); @@ -258,7 +258,7 @@ public class PersonsControllerService : IPersonsControllerService public async Task GetPersonAllCreatorRoles(long personId, CreatorRolePersonQueryParameters queryParameters) { - Database.Model.Person.Person? media = await _database.Persons.FirstOrDefaultAsync(x => x.Id == personId); + Person? media = await _database.Persons.FirstOrDefaultAsync(x => x.Id == personId); if (media is null) { return RequestResult.NotFound(); @@ -270,7 +270,7 @@ public class PersonsControllerService : IPersonsControllerService return RequestResult.Ok(data); } - public async Task PostPersonCreatorRole(long personId, ICreatorRolePersonRequest data) + public async Task PostPersonCreatorRole(long personId, CreatorRolePersonRequest data) { UserValidator validator = _userService.GetValidator().MustBeAdmin(); if (!validator.IsValid) @@ -278,7 +278,7 @@ public class PersonsControllerService : IPersonsControllerService return RequestResult.Forbidden(); } - Database.Model.Person.Person? media = await _database.Persons.FirstOrDefaultAsync(x => x.Id == personId); + Person? media = await _database.Persons.FirstOrDefaultAsync(x => x.Id == personId); if (media is null) { return RequestResult.NotFound(); diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Roles/IRolesControllerService.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Roles/IRolesControllerService.cs index 6841b05..13b364c 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Roles/IRolesControllerService.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Roles/IRolesControllerService.cs @@ -6,7 +6,7 @@ namespace WatchIt.WebAPI.Services.Controllers.Roles; public interface IRolesControllerService { Task GetActorRole(Guid id); - Task PutActorRole(Guid id, ActorRoleRequest data); + Task PutActorRole(Guid id, ActorRoleUniversalRequest data); Task DeleteActorRole(Guid id); Task GetAllActorRoleTypes(RoleTypeQueryParameters query); Task GetActorRoleType(short typeId); @@ -14,7 +14,7 @@ public interface IRolesControllerService Task DeleteActorRoleType(short typeId); Task GetCreatorRole(Guid id); - Task PutCreatorRole(Guid id, CreatorRoleRequest data); + Task PutCreatorRole(Guid id, CreatorRoleUniversalRequest data); Task DeleteCreatorRole(Guid id); Task GetAllCreatorRoleTypes(RoleTypeQueryParameters query); Task GetCreatorRoleType(short typeId); diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Roles/RolesControllerService.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Roles/RolesControllerService.cs index f004d9b..3f6735e 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Roles/RolesControllerService.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Roles/RolesControllerService.cs @@ -46,7 +46,7 @@ public class RolesControllerService : IRolesControllerService return RequestResult.Ok(data); } - public async Task PutActorRole(Guid id, ActorRoleRequest data) + public async Task PutActorRole(Guid id, ActorRoleUniversalRequest data) { UserValidator validator = _userService.GetValidator().MustBeAdmin(); if (!validator.IsValid) @@ -159,7 +159,7 @@ public class RolesControllerService : IRolesControllerService return RequestResult.Ok(data); } - public async Task PutCreatorRole(Guid id, CreatorRoleRequest data) + public async Task PutCreatorRole(Guid id, CreatorRoleUniversalRequest data) { UserValidator validator = _userService.GetValidator().MustBeAdmin(); if (!validator.IsValid) diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/ActorRoleMediaRequestValidator.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/ActorRoleMediaRequestValidator.cs new file mode 100644 index 0000000..12c2b5c --- /dev/null +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/ActorRoleMediaRequestValidator.cs @@ -0,0 +1,16 @@ +using FluentValidation; +using WatchIt.Common.Model.Roles; +using WatchIt.Database; + +namespace WatchIt.WebAPI.Validators.Roles; + +public class ActorRoleMediaRequestValidator : AbstractValidator +{ + public ActorRoleMediaRequestValidator(DatabaseContext database) + { + Include(new BaseActorRoleRequestValidator(database)); + RuleFor(x => x.PersonId).NotEmpty() + .NotNull() + .MustBeIn(database.Persons.Select(x => x.Id).ToList()); + } +} \ No newline at end of file diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/ActorRolePersonRequestValidator.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/ActorRolePersonRequestValidator.cs new file mode 100644 index 0000000..c89142c --- /dev/null +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/ActorRolePersonRequestValidator.cs @@ -0,0 +1,16 @@ +using FluentValidation; +using WatchIt.Common.Model.Roles; +using WatchIt.Database; + +namespace WatchIt.WebAPI.Validators.Roles; + +public class ActorRolePersonRequestValidator : AbstractValidator +{ + public ActorRolePersonRequestValidator(DatabaseContext database) + { + Include(new BaseActorRoleRequestValidator(database)); + RuleFor(x => x.MediaId).NotEmpty() + .NotNull() + .MustBeIn(database.Media.Select(x => x.Id).ToList()); + } +} \ No newline at end of file diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/ActorRoleUniversalRequestValidator.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/ActorRoleUniversalRequestValidator.cs new file mode 100644 index 0000000..d23f72d --- /dev/null +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/ActorRoleUniversalRequestValidator.cs @@ -0,0 +1,19 @@ +using FluentValidation; +using WatchIt.Common.Model.Roles; +using WatchIt.Database; + +namespace WatchIt.WebAPI.Validators.Roles; + +public class ActorRoleUniversalRequestValidator : AbstractValidator +{ + public ActorRoleUniversalRequestValidator(DatabaseContext database) + { + Include(new BaseActorRoleRequestValidator(database)); + RuleFor(x => x.PersonId).NotEmpty() + .NotNull() + .MustBeIn(database.Persons.Select(x => x.Id).ToList()); + RuleFor(x => x.MediaId).NotEmpty() + .NotNull() + .MustBeIn(database.Media.Select(x => x.Id).ToList()); + } +} \ No newline at end of file diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/BaseActorRoleRequestValidator.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/BaseActorRoleRequestValidator.cs new file mode 100644 index 0000000..5ead1e0 --- /dev/null +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Roles/BaseActorRoleRequestValidator.cs @@ -0,0 +1,17 @@ +using FluentValidation; +using WatchIt.Common.Model.Roles; +using WatchIt.Database; + +namespace WatchIt.WebAPI.Validators.Roles; + +public class BaseActorRoleRequestValidator : AbstractValidator +{ + public BaseActorRoleRequestValidator(DatabaseContext database) + { + RuleFor(x => x.Name).NotEmpty() + .MaximumLength(100); + RuleFor(x => x.TypeId).NotEmpty() + .NotNull() + .MustBeIn(database.PersonActorRoleTypes.Select(x => x.Id).ToList()); + } +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/IMediaWebAPIService.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/IMediaWebAPIService.cs index ec33625..7f80fa0 100644 --- a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/IMediaWebAPIService.cs +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/IMediaWebAPIService.cs @@ -31,7 +31,7 @@ public interface IMediaWebAPIService Task PostMediaPhoto(long mediaId, MediaPhotoRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null, Action? notFoundAction = null); Task GetMediaAllActorRoles(long id, ActorRoleMediaQueryParameters? query = null, Action>? successAction = null); - Task PostMediaActorRole(long id, IActorRoleMediaRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); + Task PostMediaActorRole(long id, ActorRoleMediaRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); Task GetMediaAllCreatorRoles(long id, CreatorRoleMediaQueryParameters? query = null, Action>? successAction = null); - Task PostMediaCreatorRole(long id, ICreatorRoleMediaRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); + Task PostMediaCreatorRole(long id, CreatorRoleMediaRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); } \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/MediaWebAPIService.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/MediaWebAPIService.cs index 0098bd6..4fecf3b 100644 --- a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/MediaWebAPIService.cs +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/MediaWebAPIService.cs @@ -285,7 +285,7 @@ public class MediaWebAPIService : BaseWebAPIService, IMediaWebAPIService .ExecuteAction(); } - public async Task PostMediaActorRole(long id, IActorRoleMediaRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) + public async Task PostMediaActorRole(long id, ActorRoleMediaRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) { string url = GetUrl(EndpointsConfiguration.Media.PostMediaActorRole, id); @@ -312,7 +312,7 @@ public class MediaWebAPIService : BaseWebAPIService, IMediaWebAPIService .ExecuteAction(); } - public async Task PostMediaCreatorRole(long id, ICreatorRoleMediaRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) + public async Task PostMediaCreatorRole(long id, CreatorRoleMediaRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) { string url = GetUrl(EndpointsConfiguration.Media.PostMediaCreatorRole, id); diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Persons/IPersonsWebAPIService.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Persons/IPersonsWebAPIService.cs index 0570417..c1f7cd9 100644 --- a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Persons/IPersonsWebAPIService.cs +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Persons/IPersonsWebAPIService.cs @@ -18,7 +18,7 @@ public interface IPersonsWebAPIService Task DeletePersonPhoto(long id, Action? successAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); Task GetPersonAllActorRoles(long id, ActorRolePersonQueryParameters? query = null, Action>? successAction = null); - Task PostPersonActorRole(long id, IActorRolePersonRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); + Task PostPersonActorRole(long id, ActorRolePersonRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); Task GetPersonAllCreatorRoles(long id, CreatorRolePersonQueryParameters? query = null, Action>? successAction = null); - Task PostPersonCreatorRole(long id, ICreatorRolePersonRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); + Task PostPersonCreatorRole(long id, CreatorRolePersonRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); } \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Persons/PersonsWebAPIService.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Persons/PersonsWebAPIService.cs index 375b597..b7d6ed4 100644 --- a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Persons/PersonsWebAPIService.cs +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Persons/PersonsWebAPIService.cs @@ -202,7 +202,7 @@ public class PersonsWebAPIService : BaseWebAPIService, IPersonsWebAPIService .ExecuteAction(); } - public async Task PostPersonActorRole(long id, IActorRolePersonRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) + public async Task PostPersonActorRole(long id, ActorRolePersonRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) { string url = GetUrl(EndpointsConfiguration.Persons.PostPersonActorRole, id); @@ -229,7 +229,7 @@ public class PersonsWebAPIService : BaseWebAPIService, IPersonsWebAPIService .ExecuteAction(); } - public async Task PostPersonCreatorRole(long id, ICreatorRolePersonRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) + public async Task PostPersonCreatorRole(long id, CreatorRolePersonRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) { string url = GetUrl(EndpointsConfiguration.Persons.PostPersonCreatorRole, id); diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Roles/IRolesWebAPIService.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Roles/IRolesWebAPIService.cs index d88111e..106027b 100644 --- a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Roles/IRolesWebAPIService.cs +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Roles/IRolesWebAPIService.cs @@ -5,14 +5,15 @@ namespace WatchIt.Website.Services.WebAPI.Roles; public interface IRolesWebAPIService { Task GetActorRole(Guid id, Action? successAction = null, Action? notFoundAction = null); - Task PutActorRole(Guid id, ActorRoleRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null, Action? notFoundAction = null); + Task PutActorRole(Guid id, ActorRoleUniversalRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null, Action? notFoundAction = null); Task DeleteActorRole(Guid id, Action? successAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); Task GetAllActorRoleTypes(RoleTypeQueryParameters? query = null, Action>? successAction = null); Task GetActorRoleType(long typeId, Action? successAction = null, Action? notFoundAction = null); Task PostActorRoleType(RoleTypeRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); Task DeleteActorRoleType(long typeId, Action? successAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); + Task GetCreatorRole(Guid id, Action? successAction = null, Action? notFoundAction = null); - Task PutCreatorRole(Guid id, CreatorRoleRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null, Action? notFoundAction = null); + Task PutCreatorRole(Guid id, CreatorRoleUniversalRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null, Action? notFoundAction = null); Task DeleteCreatorRole(Guid id, Action? successAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); Task GetAllCreatorRoleTypes(RoleTypeQueryParameters? query = null, Action>? successAction = null); Task GetCreatorRoleType(long typeId, Action? successAction = null, Action? notFoundAction = null); diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Roles/RolesWebAPIService.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Roles/RolesWebAPIService.cs index 839aca8..4e6a1b9 100644 --- a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Roles/RolesWebAPIService.cs +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Roles/RolesWebAPIService.cs @@ -42,7 +42,7 @@ public class RolesWebAPIService : BaseWebAPIService, IRolesWebAPIService .ExecuteAction(); } - public async Task PutActorRole(Guid id, ActorRoleRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null, Action? notFoundAction = null) + public async Task PutActorRole(Guid id, ActorRoleUniversalRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null, Action? notFoundAction = null) { string url = GetUrl(EndpointsConfiguration.Roles.PutActorRole, id); @@ -139,7 +139,7 @@ public class RolesWebAPIService : BaseWebAPIService, IRolesWebAPIService .ExecuteAction(); } - public async Task PutCreatorRole(Guid id, CreatorRoleRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null, Action? notFoundAction = null) + public async Task PutCreatorRole(Guid id, CreatorRoleUniversalRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null, Action? notFoundAction = null) { string url = GetUrl(EndpointsConfiguration.Roles.PutCreatorRole, id); diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor index 95c812a..c35de7e 100644 --- a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor @@ -1,5 +1,6 @@ @using Blazorise.Extensions @using WatchIt.Common.Model.Roles +@using Blazorise.Components @@ -106,7 +107,44 @@ } else { - + + +
+
+ +
+ + Sorry... @not_found_context was not found + +
+
+
+ +
+ + @foreach (KeyValuePair type in _roleTypes) + { + + } + +
+
+
+ +
+ +
+
+
+
} } diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.cs b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.cs index 06af0dd..ccfd445 100644 --- a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.cs +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.cs @@ -38,7 +38,7 @@ public partial class PersonRolesEditActorComponent : ComponentBase private Guid? _editedId; - private IActorRolePersonRequest _editedModel = new ActorRoleRequest(); + private IActorRolePersonRequest? _editedModel; private bool _editingMode; private bool _saving; @@ -67,6 +67,7 @@ public partial class PersonRolesEditActorComponent : ComponentBase // END await Task.WhenAll(endTasks); + _roles = _roles.OrderBy(x => Media.First(y => y.Key == x.Value.Data.MediaId).Value.ReleaseDate).ToDictionary(x => x.Key, x => x.Value); _loaded = true; StateHasChanged(); @@ -78,15 +79,49 @@ public partial class PersonRolesEditActorComponent : ComponentBase _editingMode = false; } - private void SaveEdit() + private async Task SaveEdit() { + void SuccessPost(ActorRoleResponse data) + { + _roles[data.Id] = (data, false); + _roles = _roles.OrderBy(x => Media.First(y => y.Key == x.Value.Data.MediaId).Value.ReleaseDate).ToDictionary(x => x.Key, x => x.Value); + + _saving = false; + _editingMode = false; + } + + void SuccessPut() + { + ActorRoleResponse temp = _roles[_editedId!.Value].Data; + temp.MediaId = _editedModel.MediaId; + temp.TypeId = _editedModel.TypeId; + temp.Name = _editedModel.Name; + + _roles[_editedId!.Value] = (temp, false); + _roles = _roles.OrderBy(x => Media.First(y => y.Key == x.Value.Data.MediaId).Value.ReleaseDate).ToDictionary(x => x.Key, x => x.Value); + + _saving = false; + _editingMode = false; + } + _saving = true; + if (_editedId.HasValue) + { + await RolesWebAPIService.PutActorRole(_editedId.Value, _editedModel as ActorRoleUniversalRequest, SuccessPut); + } + else + { + await PersonsWebAPIService.PostPersonActorRole(Id!.Value, _editedModel as ActorRolePersonRequest, SuccessPost); + } } private void ActivateEdit(Guid? id = null) { _editedId = id; - _editedModel = id.HasValue ? new ActorRoleRequest(_roles[id.Value].Data) : new ActorRoleRequest(); + _editedModel = id.HasValue ? new ActorRoleUniversalRequest(_roles[id.Value].Data) : new ActorRolePersonRequest() + { + TypeId = _roleTypes.Keys.First() + }; _editingMode = true; } diff --git a/WatchIt.Website/WatchIt.Website/Components/PictureEditorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/PictureEditorComponent.razor index 8a3a505..bcd5be9 100644 --- a/WatchIt.Website/WatchIt.Website/Components/PictureEditorComponent.razor +++ b/WatchIt.Website/WatchIt.Website/Components/PictureEditorComponent.razor @@ -51,7 +51,7 @@ else {
- +
} From 18b14e8b4011bd7354f056384aa03290aa4454e7 Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Tue, 8 Oct 2024 23:15:41 +0200 Subject: [PATCH 3/7] PersonRolesEditActorComponent fix --- .../PersonRolesEditActorComponent.razor | 6 ++++++ .../PersonRolesEditActorComponent.razor.cs | 21 ++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor index c35de7e..a31d7f7 100644 --- a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor @@ -21,6 +21,12 @@ } else { + if (!string.IsNullOrWhiteSpace(_error)) + { +
+ @(_error) +
+ }
diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.cs b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.cs index ccfd445..c04d8e1 100644 --- a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.cs +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.cs @@ -32,6 +32,7 @@ public partial class PersonRolesEditActorComponent : ComponentBase #region FIELDS private bool _loaded; + private string? _error; private Dictionary _roles = []; private Dictionary _roleTypes = []; @@ -76,6 +77,7 @@ public partial class PersonRolesEditActorComponent : ComponentBase private void CancelEdit() { + _error = null; _editingMode = false; } @@ -99,19 +101,32 @@ public partial class PersonRolesEditActorComponent : ComponentBase _roles[_editedId!.Value] = (temp, false); _roles = _roles.OrderBy(x => Media.First(y => y.Key == x.Value.Data.MediaId).Value.ReleaseDate).ToDictionary(x => x.Key, x => x.Value); - + _saving = false; _editingMode = false; } + + void BadRequest(IDictionary errors) + { + _error = errors.SelectMany(x => x.Value).FirstOrDefault() ?? "Unknown error"; + _saving = false; + } + + void Unauthorized() + { + _error = "You do not have permission to do this"; + _saving = false; + } + _error = null; _saving = true; if (_editedId.HasValue) { - await RolesWebAPIService.PutActorRole(_editedId.Value, _editedModel as ActorRoleUniversalRequest, SuccessPut); + await RolesWebAPIService.PutActorRole(_editedId.Value, _editedModel as ActorRoleUniversalRequest, SuccessPut, BadRequest, Unauthorized); } else { - await PersonsWebAPIService.PostPersonActorRole(Id!.Value, _editedModel as ActorRolePersonRequest, SuccessPost); + await PersonsWebAPIService.PostPersonActorRole(Id!.Value, _editedModel as ActorRolePersonRequest, SuccessPost, BadRequest, Unauthorized); } } From 3bc17393b8d28c1270432fc3b853c015bade13cd Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Wed, 9 Oct 2024 00:57:56 +0200 Subject: [PATCH 4/7] PersonRolesEditCreatorComponent added --- .../PersonRolesEditCreatorComponent.razor | 151 ++++++++++++++++++ .../PersonRolesEditCreatorComponent.razor.cs | 149 +++++++++++++++++ .../PersonRolesEditCreatorComponent.razor.css | 0 3 files changed, 300 insertions(+) create mode 100644 WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor create mode 100644 WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor.cs create mode 100644 WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor.css diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor new file mode 100644 index 0000000..514ec3d --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor @@ -0,0 +1,151 @@ +@using Blazorise.Extensions +@using Blazorise.Components + + + +
+ @if (_loaded) + { +
+
+
+
+

Actor roles

+
+ @if (!_editingMode) + { +
+ +
+ } + else + { + if (!string.IsNullOrWhiteSpace(_error)) + { +
+ @(_error) +
+ } +
+ +
+
+ +
+ } +
+
+ @if (!_editingMode) + { + if (_roles.IsNullOrEmpty()) + { + No items + } + else + { + + + + + + + + + + + + @foreach (Guid roleId in _roles.Keys) + { + + + + + + + } + +
+ Media name + + Media type + + Role type + + Role name + + Actions +
+ @(Media[_roles[roleId].Data.MediaId].Title)@(Media[_roles[roleId].Data.MediaId].ReleaseDate.HasValue ? $" ({Media[_roles[roleId].Data.MediaId].ReleaseDate!.Value.Year})" : string.Empty) + + @(Media[_roles[roleId].Data.MediaId].Type == MediaType.Movie ? $"Movie" : "TV Series") + + @(_roleTypes[_roles[roleId].Data.TypeId]) + +
+ + +
+
+ } + } + else + { + + +
+
+ +
+ + Sorry... @not_found_context was not found + +
+
+
+ +
+ + @foreach (KeyValuePair type in _roleTypes) + { + + } + +
+
+
+
+ } +
+ } + else + { + + } +
\ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor.cs b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor.cs new file mode 100644 index 0000000..3e7701e --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor.cs @@ -0,0 +1,149 @@ +using Microsoft.AspNetCore.Components; +using WatchIt.Common.Model.Media; +using WatchIt.Common.Model.Roles; +using WatchIt.Website.Services.WebAPI.Media; +using WatchIt.Website.Services.WebAPI.Persons; +using WatchIt.Website.Services.WebAPI.Roles; + +namespace WatchIt.Website.Components.PersonEditPage; + +public partial class PersonRolesEditCreatorComponent : ComponentBase +{ + #region SERVICES + + [Inject] private IPersonsWebAPIService PersonsWebAPIService { get; set; } = default!; + [Inject] private IMediaWebAPIService MediaWebAPIService { get; set; } = default!; + [Inject] private IRolesWebAPIService RolesWebAPIService { get; set; } = default!; + + #endregion + + + + #region PARAMETERS + + [Parameter] public required long? Id { get; set; } + [Parameter] public required Dictionary Media { get; set; } + [Parameter] public string Class { get; set; } = string.Empty; + + #endregion + + + + #region FIELDS + + private bool _loaded; + private string? _error; + + private Dictionary _roles = []; + private Dictionary _roleTypes = []; + + + private Guid? _editedId; + private ICreatorRolePersonRequest? _editedModel; + + private bool _editingMode; + private bool _saving; + + #endregion + + + + #region PUBLIC METHODS + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + List endTasks = new List(); + + // STEP 0 + if (Id.HasValue) + { + endTasks.AddRange( + [ + PersonsWebAPIService.GetPersonAllCreatorRoles(Id.Value, successAction: data => _roles = data.ToDictionary(x => x.Id, x => (x, false))), + RolesWebAPIService.GetAllCreatorRoleTypes(successAction: data => _roleTypes = data.ToDictionary(x => x.Id, x => x.Name)), + ]); + } + + // END + await Task.WhenAll(endTasks); + _roles = _roles.OrderBy(x => Media.First(y => y.Key == x.Value.Data.MediaId).Value.ReleaseDate).ToDictionary(x => x.Key, x => x.Value); + + _loaded = true; + StateHasChanged(); + } + } + + private void CancelEdit() + { + _error = null; + _editingMode = false; + } + + private async Task SaveEdit() + { + void SuccessPost(CreatorRoleResponse data) + { + _roles[data.Id] = (data, false); + _roles = _roles.OrderBy(x => Media.First(y => y.Key == x.Value.Data.MediaId).Value.ReleaseDate).ToDictionary(x => x.Key, x => x.Value); + + _saving = false; + _editingMode = false; + } + + void SuccessPut() + { + CreatorRoleResponse temp = _roles[_editedId!.Value].Data; + temp.MediaId = _editedModel.MediaId; + temp.TypeId = _editedModel.TypeId; + + _roles[_editedId!.Value] = (temp, false); + _roles = _roles.OrderBy(x => Media.First(y => y.Key == x.Value.Data.MediaId).Value.ReleaseDate).ToDictionary(x => x.Key, x => x.Value); + + _saving = false; + _editingMode = false; + } + + void BadRequest(IDictionary errors) + { + _error = errors.SelectMany(x => x.Value).FirstOrDefault() ?? "Unknown error"; + _saving = false; + } + + void Unauthorized() + { + _error = "You do not have permission to do this"; + _saving = false; + } + + _error = null; + _saving = true; + if (_editedId.HasValue) + { + await RolesWebAPIService.PutCreatorRole(_editedId.Value, _editedModel as CreatorRoleUniversalRequest, SuccessPut, BadRequest, Unauthorized); + } + else + { + await PersonsWebAPIService.PostPersonCreatorRole(Id!.Value, _editedModel as CreatorRolePersonRequest, SuccessPost, BadRequest, Unauthorized); + } + } + + private void ActivateEdit(Guid? id = null) + { + _editedId = id; + _editedModel = id.HasValue ? new CreatorRoleUniversalRequest(_roles[id.Value].Data) : new CreatorRolePersonRequest() + { + TypeId = _roleTypes.Keys.First() + }; + _editingMode = true; + } + + private async Task Delete(Guid id) + { + _roles[id] = (_roles[id].Data, true); + await RolesWebAPIService.DeleteCreatorRole(id, () => _roles.Remove(id)); + } + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor.css b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor.css new file mode 100644 index 0000000..e69de29 From 28061cdcf4f7fadae20256c1d5948cee13d1a7d8 Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Wed, 9 Oct 2024 01:00:25 +0200 Subject: [PATCH 5/7] PersonEditPage roles adding finished --- .../PersonEditPage/PersonRolesEditCreatorComponent.razor | 2 +- WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor index 514ec3d..0815a92 100644 --- a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor @@ -10,7 +10,7 @@
-

Actor roles

+

Creator roles

@if (!_editingMode) { diff --git a/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor b/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor index 01dcb6c..61ad6a8 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor +++ b/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor @@ -65,6 +65,12 @@ Media="@(_media)"/>
+
+
+ +
+
} else From f416c62ea6bf4a0238602cf1fb2f68859bda95bc Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Wed, 9 Oct 2024 01:16:05 +0200 Subject: [PATCH 6/7] PersonRolesEditCreatorComponent fixed --- .../Roles/ActorRoleRequest.cs | 2 +- .../WatchIt.Common.Model/Roles/CreatorRole.cs | 2 +- .../Roles/CreatorRoleMediaRequest.cs | 2 +- .../Roles/CreatorRolePersonRequest.cs | 4 ++-- .../Roles/CreatorRoleRequest.cs | 2 +- .../Roles/CreatorRoleUniversalRequest.cs | 17 ++++++++++++++++- .../Roles/ICreatorRoleMediaRequest.cs | 10 ++++++++++ .../Roles/ICreatorRolePersonRequest.cs | 10 ++++++++++ .../Roles/ICreatorRoleRequest.cs | 10 ++++++++++ .../PersonRolesEditCreatorComponent.razor | 3 --- 10 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRoleMediaRequest.cs create mode 100644 WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRolePersonRequest.cs create mode 100644 WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRoleRequest.cs diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs index ab30f23..8b096ad 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs @@ -3,7 +3,7 @@ using WatchIt.Database.Model.Person; namespace WatchIt.Common.Model.Roles; -public abstract class ActorRoleRequest : ActorRole +public abstract class ActorRoleRequest : ActorRole, IActorRoleRequest { #region PUBLIC METHODS diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRole.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRole.cs index b62c387..5262eed 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRole.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRole.cs @@ -7,7 +7,7 @@ public abstract class CreatorRole #region PROPERTIES [JsonPropertyName("type_id")] - public required short TypeId { get; set; } + public short TypeId { get; set; } #endregion } \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs index 63b3455..d2373f9 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs @@ -3,7 +3,7 @@ using WatchIt.Database.Model.Person; namespace WatchIt.Common.Model.Roles; -public class CreatorRoleMediaRequest : CreatorRoleRequest +public class CreatorRoleMediaRequest : CreatorRoleRequest, ICreatorRoleMediaRequest { #region PROPERTIES diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRolePersonRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRolePersonRequest.cs index f922efa..7bf53dd 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRolePersonRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRolePersonRequest.cs @@ -3,12 +3,12 @@ using WatchIt.Database.Model.Person; namespace WatchIt.Common.Model.Roles; -public class CreatorRolePersonRequest : CreatorRoleRequest +public class CreatorRolePersonRequest : CreatorRoleRequest, ICreatorRolePersonRequest { #region PROPERTIES [JsonPropertyName("media_id")] - public required long MediaId { get; set; } + public long MediaId { get; set; } #endregion diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleRequest.cs index ab93a3a..1aa45f7 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleRequest.cs @@ -2,7 +2,7 @@ using WatchIt.Database.Model.Person; namespace WatchIt.Common.Model.Roles; -public abstract class CreatorRoleRequest : CreatorRole +public abstract class CreatorRoleRequest : CreatorRole, ICreatorRoleRequest { #region PUBLIC METHODS diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleUniversalRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleUniversalRequest.cs index 00eae9e..931c794 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleUniversalRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleUniversalRequest.cs @@ -3,7 +3,7 @@ using WatchIt.Database.Model.Person; namespace WatchIt.Common.Model.Roles; -public class CreatorRoleUniversalRequest : CreatorRoleRequest +public class CreatorRoleUniversalRequest : CreatorRoleRequest, ICreatorRolePersonRequest, ICreatorRoleMediaRequest { #region PROPERTIES @@ -14,6 +14,21 @@ public class CreatorRoleUniversalRequest : CreatorRoleRequest public long MediaId { get; set; } #endregion + + + + #region CONSTRUCTORS + + public CreatorRoleUniversalRequest() { } + + public CreatorRoleUniversalRequest(CreatorRoleResponse data) + { + MediaId = data.MediaId; + PersonId = data.PersonId; + TypeId = data.TypeId; + } + + #endregion diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRoleMediaRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRoleMediaRequest.cs new file mode 100644 index 0000000..40fb45d --- /dev/null +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRoleMediaRequest.cs @@ -0,0 +1,10 @@ +namespace WatchIt.Common.Model.Roles; + +public interface ICreatorRoleMediaRequest : ICreatorRoleRequest +{ + #region PROPERTIES + + public long PersonId { get; set; } + + #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 new file mode 100644 index 0000000..2e569e5 --- /dev/null +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRolePersonRequest.cs @@ -0,0 +1,10 @@ +namespace WatchIt.Common.Model.Roles; + +public interface ICreatorRolePersonRequest : ICreatorRoleRequest +{ + #region PROPERTIES + + public long MediaId { get; set; } + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRoleRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRoleRequest.cs new file mode 100644 index 0000000..150eba0 --- /dev/null +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRoleRequest.cs @@ -0,0 +1,10 @@ +namespace WatchIt.Common.Model.Roles; + +public interface ICreatorRoleRequest +{ + #region PROPERTIES + + public short TypeId { get; set; } + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor index 0815a92..0165b83 100644 --- a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor @@ -65,9 +65,6 @@ Role type - - Role name - Actions From 4124669187a3d38f5bfaf401be79e7ff37f832cf Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Thu, 10 Oct 2024 02:34:26 +0200 Subject: [PATCH 7/7] MediaRolesEditComponents added --- .../Roles/CreatorRoleMediaRequest.cs | 2 +- .../MediaRolesEditActorComponent.razor | 156 ++++++++++++++++++ .../MediaRolesEditActorComponent.razor.cs | 148 +++++++++++++++++ .../MediaRolesEditActorComponent.razor.css | 0 .../MediaRolesEditCreatorComponent.razor | 142 ++++++++++++++++ .../MediaRolesEditCreatorComponent.razor.cs | 147 +++++++++++++++++ .../MediaRolesEditCreatorComponent.razor.css | 0 .../PersonRolesEditActorComponent.razor | 2 +- .../PersonRolesEditCreatorComponent.razor | 2 +- .../WatchIt.Website/Pages/MediaEditPage.razor | 12 ++ .../Pages/MediaEditPage.razor.cs | 9 + .../WatchIt.Website/_Imports.razor | 1 + 12 files changed, 618 insertions(+), 3 deletions(-) create mode 100644 WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor create mode 100644 WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor.cs create mode 100644 WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor.css create mode 100644 WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor create mode 100644 WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor.cs create mode 100644 WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor.css diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs index d2373f9..b256322 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs @@ -8,7 +8,7 @@ public class CreatorRoleMediaRequest : CreatorRoleRequest, ICreatorRoleMediaRequ #region PROPERTIES [JsonPropertyName("person_id")] - public required long PersonId { get; set; } + public long PersonId { get; set; } #endregion diff --git a/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor new file mode 100644 index 0000000..ff50f15 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor @@ -0,0 +1,156 @@ +@using Blazorise.Extensions +@using WatchIt.Common.Model.Roles +@using Blazorise.Components +@using WatchIt.Common.Model.Persons + + + +
+ @if (_loaded) + { +
+
+
+
+

Actor roles

+
+ @if (!_editingMode) + { +
+ +
+ } + else + { + if (!string.IsNullOrWhiteSpace(_error)) + { +
+ @(_error) +
+ } +
+ +
+
+ +
+ } +
+
+ @if (!_editingMode) + { + if (_roles.IsNullOrEmpty()) + { + No items + } + else + { + + + + + + + + + + + @foreach (Guid roleId in _roles.Keys) + { + + + + + + + } + +
+ Person + + Role type + + Role name + + Actions +
+ @(Persons[_roles[roleId].Data.PersonId].Name) + + @(_roleTypes[_roles[roleId].Data.TypeId]) + + @(_roles[roleId].Data.Name) + +
+ + +
+
+ } + } + else + { + + +
+
+ +
+ + Sorry... @not_found_context was not found + +
+
+
+ +
+ + @foreach (KeyValuePair type in _roleTypes) + { + + } + +
+
+
+ +
+ +
+
+
+
+ } +
+ } + else + { + + } +
\ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor.cs b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor.cs new file mode 100644 index 0000000..8475468 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor.cs @@ -0,0 +1,148 @@ +using Microsoft.AspNetCore.Components; +using WatchIt.Common.Model.Media; +using WatchIt.Common.Model.Persons; +using WatchIt.Common.Model.Roles; +using WatchIt.Website.Services.WebAPI.Media; +using WatchIt.Website.Services.WebAPI.Persons; +using WatchIt.Website.Services.WebAPI.Roles; + +namespace WatchIt.Website.Components.MediaEditPage; + +public partial class MediaRolesEditActorComponent : ComponentBase +{ + #region SERVICES + + [Inject] private IPersonsWebAPIService PersonsWebAPIService { get; set; } = default!; + [Inject] private IMediaWebAPIService MediaWebAPIService { get; set; } = default!; + [Inject] private IRolesWebAPIService RolesWebAPIService { get; set; } = default!; + + #endregion + + + + #region PARAMETERS + + [Parameter] public required long? Id { get; set; } + [Parameter] public required Dictionary Persons { get; set; } + [Parameter] public string Class { get; set; } = string.Empty; + + #endregion + + + + #region FIELDS + + private bool _loaded; + private string? _error; + + private Dictionary _roles = []; + private Dictionary _roleTypes = []; + + + private Guid? _editedId; + private IActorRoleMediaRequest? _editedModel; + + private bool _editingMode; + private bool _saving; + + #endregion + + + + #region PUBLIC METHODS + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + List endTasks = new List(); + + // STEP 0 + if (Id.HasValue) + { + endTasks.AddRange( + [ + MediaWebAPIService.GetMediaAllActorRoles(Id.Value, successAction: data => _roles = data.ToDictionary(x => x.Id, x => (x, false))), + RolesWebAPIService.GetAllActorRoleTypes(successAction: data => _roleTypes = data.ToDictionary(x => x.Id, x => x.Name)), + ]); + } + + // END + await Task.WhenAll(endTasks); + + _loaded = true; + StateHasChanged(); + } + } + + private void CancelEdit() + { + _error = null; + _editingMode = false; + } + + private async Task SaveEdit() + { + void SuccessPost(ActorRoleResponse data) + { + _roles[data.Id] = (data, false); + + _saving = false; + _editingMode = false; + } + + void SuccessPut() + { + ActorRoleResponse temp = _roles[_editedId!.Value].Data; + temp.PersonId = _editedModel.PersonId; + temp.TypeId = _editedModel.TypeId; + temp.Name = _editedModel.Name; + + _roles[_editedId!.Value] = (temp, false); + + _saving = false; + _editingMode = false; + } + + void BadRequest(IDictionary errors) + { + _error = errors.SelectMany(x => x.Value).FirstOrDefault() ?? "Unknown error"; + _saving = false; + } + + void Unauthorized() + { + _error = "You do not have permission to do this"; + _saving = false; + } + + _error = null; + _saving = true; + if (_editedId.HasValue) + { + await RolesWebAPIService.PutActorRole(_editedId.Value, _editedModel as ActorRoleUniversalRequest, SuccessPut, BadRequest, Unauthorized); + } + else + { + await MediaWebAPIService.PostMediaActorRole(Id!.Value, _editedModel as ActorRoleMediaRequest, SuccessPost, BadRequest, Unauthorized); + } + } + + private void ActivateEdit(Guid? id = null) + { + _editedId = id; + _editedModel = id.HasValue ? new ActorRoleUniversalRequest(_roles[id.Value].Data) : new ActorRoleMediaRequest() + { + TypeId = _roleTypes.Keys.First() + }; + _editingMode = true; + } + + private async Task Delete(Guid id) + { + _roles[id] = (_roles[id].Data, true); + await RolesWebAPIService.DeleteActorRole(id, () => _roles.Remove(id)); + } + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor.css b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor.css new file mode 100644 index 0000000..e69de29 diff --git a/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor new file mode 100644 index 0000000..0e240b0 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor @@ -0,0 +1,142 @@ +@using Blazorise.Extensions +@using Blazorise.Components +@using WatchIt.Common.Model.Persons + + +
+ @if (_loaded) + { +
+
+
+
+

Creator roles

+
+ @if (!_editingMode) + { +
+ +
+ } + else + { + if (!string.IsNullOrWhiteSpace(_error)) + { +
+ @(_error) +
+ } +
+ +
+
+ +
+ } +
+
+ @if (!_editingMode) + { + if (_roles.IsNullOrEmpty()) + { + No items + } + else + { + + + + + + + + + + @foreach (Guid roleId in _roles.Keys) + { + + + + + + } + +
+ Person + + Role type + + Actions +
+ @(Persons[_roles[roleId].Data.PersonId].Name) + + @(_roleTypes[_roles[roleId].Data.TypeId]) + +
+ + +
+
+ } + } + else + { + + +
+
+ +
+ + Sorry... @not_found_context was not found + +
+
+
+ +
+ + @foreach (KeyValuePair type in _roleTypes) + { + + } + +
+
+
+
+ } +
+ } + else + { + + } +
\ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor.cs b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor.cs new file mode 100644 index 0000000..1d43395 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor.cs @@ -0,0 +1,147 @@ +using Microsoft.AspNetCore.Components; +using WatchIt.Common.Model.Media; +using WatchIt.Common.Model.Persons; +using WatchIt.Common.Model.Roles; +using WatchIt.Website.Services.WebAPI.Media; +using WatchIt.Website.Services.WebAPI.Persons; +using WatchIt.Website.Services.WebAPI.Roles; + +namespace WatchIt.Website.Components.MediaEditPage; + +public partial class MediaRolesEditCreatorComponent : ComponentBase +{ + #region SERVICES + + [Inject] private IPersonsWebAPIService PersonsWebAPIService { get; set; } = default!; + [Inject] private IMediaWebAPIService MediaWebAPIService { get; set; } = default!; + [Inject] private IRolesWebAPIService RolesWebAPIService { get; set; } = default!; + + #endregion + + + + #region PARAMETERS + + [Parameter] public required long? Id { get; set; } + [Parameter] public required Dictionary Persons { get; set; } + [Parameter] public string Class { get; set; } = string.Empty; + + #endregion + + + + #region FIELDS + + private bool _loaded; + private string? _error; + + private Dictionary _roles = []; + private Dictionary _roleTypes = []; + + + private Guid? _editedId; + private ICreatorRoleMediaRequest? _editedModel; + + private bool _editingMode; + private bool _saving; + + #endregion + + + + #region PUBLIC METHODS + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + List endTasks = new List(); + + // STEP 0 + if (Id.HasValue) + { + endTasks.AddRange( + [ + MediaWebAPIService.GetMediaAllCreatorRoles(Id.Value, successAction: data => _roles = data.ToDictionary(x => x.Id, x => (x, false))), + RolesWebAPIService.GetAllCreatorRoleTypes(successAction: data => _roleTypes = data.ToDictionary(x => x.Id, x => x.Name)), + ]); + } + + // END + await Task.WhenAll(endTasks); + + _loaded = true; + StateHasChanged(); + } + } + + private void CancelEdit() + { + _error = null; + _editingMode = false; + } + + private async Task SaveEdit() + { + void SuccessPost(CreatorRoleResponse data) + { + _roles[data.Id] = (data, false); + + _saving = false; + _editingMode = false; + } + + void SuccessPut() + { + CreatorRoleResponse temp = _roles[_editedId!.Value].Data; + temp.PersonId = _editedModel.PersonId; + temp.TypeId = _editedModel.TypeId; + + _roles[_editedId!.Value] = (temp, false); + + _saving = false; + _editingMode = false; + } + + void BadRequest(IDictionary errors) + { + _error = errors.SelectMany(x => x.Value).FirstOrDefault() ?? "Unknown error"; + _saving = false; + } + + void Unauthorized() + { + _error = "You do not have permission to do this"; + _saving = false; + } + + _error = null; + _saving = true; + if (_editedId.HasValue) + { + await RolesWebAPIService.PutCreatorRole(_editedId.Value, _editedModel as CreatorRoleUniversalRequest, SuccessPut, BadRequest, Unauthorized); + } + else + { + await MediaWebAPIService.PostMediaCreatorRole(Id!.Value, _editedModel as CreatorRoleMediaRequest, SuccessPost, BadRequest, Unauthorized); + } + } + + private void ActivateEdit(Guid? id = null) + { + _editedId = id; + _editedModel = id.HasValue ? new CreatorRoleUniversalRequest(_roles[id.Value].Data) : new CreatorRoleMediaRequest() + { + TypeId = _roleTypes.Keys.First() + }; + _editingMode = true; + } + + private async Task Delete(Guid id) + { + _roles[id] = (_roles[id].Data, true); + await RolesWebAPIService.DeleteCreatorRole(id, () => _roles.Remove(id)); + } + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor.css b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor.css new file mode 100644 index 0000000..e69de29 diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor index a31d7f7..6b95d1b 100644 --- a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor @@ -11,7 +11,7 @@
-

Actor roles

+

Actor roles

@if (!_editingMode) { diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor index 0165b83..e9a3e42 100644 --- a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor @@ -10,7 +10,7 @@
-

Creator roles

+

Creator roles

@if (!_editingMode) { diff --git a/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor b/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor index 68b0d51..9dd815c 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor +++ b/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor @@ -199,6 +199,18 @@
+
+
+ +
+
+
+
+ +
+
diff --git a/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor.cs b/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor.cs index e034282..d0dc6f5 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor.cs +++ b/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor.cs @@ -3,12 +3,14 @@ using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Forms; using WatchIt.Common.Model.Media; using WatchIt.Common.Model.Movies; +using WatchIt.Common.Model.Persons; using WatchIt.Common.Model.Photos; using WatchIt.Common.Model.Series; using WatchIt.Website.Layout; using WatchIt.Website.Services.Utility.Authentication; using WatchIt.Website.Services.WebAPI.Media; using WatchIt.Website.Services.WebAPI.Movies; +using WatchIt.Website.Services.WebAPI.Persons; using WatchIt.Website.Services.WebAPI.Photos; using WatchIt.Website.Services.WebAPI.Series; @@ -24,6 +26,7 @@ public partial class MediaEditPage : ComponentBase [Inject] public IMoviesWebAPIService MoviesWebAPIService { get; set; } = default!; [Inject] public ISeriesWebAPIService SeriesWebAPIService { get; set; } = default!; [Inject] public IPhotosWebAPIService PhotosWebAPIService { get; set; } = default!; + [Inject] public IPersonsWebAPIService PersonsWebAPIService { get; set; } = default!; #endregion @@ -48,6 +51,8 @@ public partial class MediaEditPage : ComponentBase private User? _user; private MediaResponse? _media; + private Dictionary _persons; + private MovieRequest? _movieRequest; private SeriesRequest? _seriesRequest; private Media? _mediaRequest => _movieRequest is not null ? _movieRequest : _seriesRequest; @@ -107,6 +112,10 @@ public partial class MediaEditPage : ComponentBase [ InitializeMedia() ]); + endTasks.AddRange( + [ + PersonsWebAPIService.GetAllPersons(successAction: data => _persons = data.ToDictionary(x => x.Id, x => x)) + ]); } // STEP 2 diff --git a/WatchIt.Website/WatchIt.Website/_Imports.razor b/WatchIt.Website/WatchIt.Website/_Imports.razor index e8981f0..41dfd4d 100644 --- a/WatchIt.Website/WatchIt.Website/_Imports.razor +++ b/WatchIt.Website/WatchIt.Website/_Imports.razor @@ -10,6 +10,7 @@ @using WatchIt.Website.Layout @using WatchIt.Website.Components @using WatchIt.Website.Components.PersonEditPage +@using WatchIt.Website.Components.MediaEditPage @using WatchIt.Common.Model.Accounts @using WatchIt.Common.Model.Media @using WatchIt.Website.Services.Utility.Tokens