diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRole.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRole.cs index 446ad2f..572748f 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRole.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRole.cs @@ -2,21 +2,15 @@ using System.Text.Json.Serialization; namespace WatchIt.Common.Model.Roles; -public class ActorRole +public abstract 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; } - - [JsonPropertyName("media_id")] - public required long MediaId { get; set; } - - [JsonPropertyName("person_id")] - public required long PersonId { get; set; } + public string Name { 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 c51f77c..8b096ad 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ActorRoleRequest.cs @@ -1,35 +1,24 @@ +using System.Diagnostics.CodeAnalysis; using WatchIt.Database.Model.Person; namespace WatchIt.Common.Model.Roles; -public class ActorRoleRequest : ActorRole, IActorRoleMediaRequest, IActorRolePersonRequest +public abstract class ActorRoleRequest : ActorRole, IActorRoleRequest { #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..5262eed 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; } + 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 new file mode 100644 index 0000000..b256322 --- /dev/null +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs @@ -0,0 +1,22 @@ +using System.Text.Json.Serialization; +using WatchIt.Database.Model.Person; + +namespace WatchIt.Common.Model.Roles; + +public class CreatorRoleMediaRequest : CreatorRoleRequest, ICreatorRoleMediaRequest +{ + #region PROPERTIES + + [JsonPropertyName("person_id")] + public long PersonId { get; set; } + + #endregion + + + + #region PUBLIC METHODS + + 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/CreatorRolePersonRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRolePersonRequest.cs new file mode 100644 index 0000000..7bf53dd --- /dev/null +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRolePersonRequest.cs @@ -0,0 +1,22 @@ +using System.Text.Json.Serialization; +using WatchIt.Database.Model.Person; + +namespace WatchIt.Common.Model.Roles; + +public class CreatorRolePersonRequest : CreatorRoleRequest, ICreatorRolePersonRequest +{ + #region PROPERTIES + + [JsonPropertyName("media_id")] + public long MediaId { get; set; } + + #endregion + + + + #region PUBLIC METHODS + + 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..1aa45f7 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, ICreatorRoleRequest { #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.Common/WatchIt.Common.Model/Roles/ICreatorRoleMediaRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRoleMediaRequest.cs index cc7cc47..40fb45d 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRoleMediaRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRoleMediaRequest.cs @@ -1,25 +1,10 @@ -using System.Text.Json.Serialization; -using WatchIt.Database.Model.Person; - namespace WatchIt.Common.Model.Roles; -public interface ICreatorRoleMediaRequest +public interface ICreatorRoleMediaRequest : ICreatorRoleRequest { #region PROPERTIES - [JsonPropertyName("person_id")] - long PersonId { get; set; } + public long PersonId { get; set; } - [JsonPropertyName("type_id")] - short TypeId { get; set; } - - #endregion - - - - #region PUBLIC METHODS - - PersonCreatorRole CreateCreatorRole(long mediaId); - #endregion } \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRolePersonRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRolePersonRequest.cs index 2702520..2e569e5 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRolePersonRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/ICreatorRolePersonRequest.cs @@ -1,25 +1,10 @@ -using System.Text.Json.Serialization; -using WatchIt.Database.Model.Person; - namespace WatchIt.Common.Model.Roles; -public interface ICreatorRolePersonRequest +public interface ICreatorRolePersonRequest : ICreatorRoleRequest { #region PROPERTIES - [JsonPropertyName("media_id")] - long MediaId { get; set; } + public long MediaId { get; set; } - [JsonPropertyName("type_id")] - short TypeId { get; set; } - - #endregion - - - - #region PUBLIC METHODS - - PersonCreatorRole CreateCreatorRole(long personId); - #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.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.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 ee25ae1..6764675 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)] @@ -178,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] @@ -193,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 390a831..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 @@ -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); @@ -30,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 9d34b84..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 @@ -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); @@ -369,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) @@ -404,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.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..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 @@ -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); @@ -30,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 4ec059a..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 @@ -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); @@ -273,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); @@ -300,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/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/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/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..6b95d1b --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor @@ -0,0 +1,161 @@ +@using Blazorise.Extensions +@using WatchIt.Common.Model.Roles +@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]) + + @(_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/PersonEditPage/PersonRolesEditActorComponent.razor.cs b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.cs new file mode 100644 index 0000000..c04d8e1 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor.cs @@ -0,0 +1,150 @@ +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 string? _error; + + private Dictionary _roles = []; + private Dictionary _roleTypes = []; + + + private Guid? _editedId; + private IActorRolePersonRequest? _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.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); + _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(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; + } + + 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 PersonsWebAPIService.PostPersonActorRole(Id!.Value, _editedModel as ActorRolePersonRequest, SuccessPost, BadRequest, Unauthorized); + } + } + + private void ActivateEdit(Guid? id = null) + { + _editedId = id; + _editedModel = id.HasValue ? new ActorRoleUniversalRequest(_roles[id.Value].Data) : new ActorRolePersonRequest() + { + 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/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/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor new file mode 100644 index 0000000..e9a3e42 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor @@ -0,0 +1,148 @@ +@using Blazorise.Extensions +@using Blazorise.Components + + + +
+ @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) + { + + + + + + + } + +
+ Media name + + Media type + + Role type + + 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 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 {
- +
}
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/Pages/PersonEditPage.razor b/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor index 27ab84f..61ad6a8 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor +++ b/WatchIt.Website/WatchIt.Website/Pages/PersonEditPage.razor @@ -59,6 +59,18 @@ 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/_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 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%; +}