From 4e1c08f6c4d2d764827960970abc4f047cf60174 Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Sat, 21 Sep 2024 23:42:10 +0200 Subject: [PATCH 1/4] basic tv series endpoints added --- .../WatchIt.Common.Model/Series/Series.cs | 9 ++ .../Series/SeriesQueryParameters.cs | 62 ++++++++ .../Series/SeriesRequest.cs | 59 ++++++++ .../Series/SeriesResponse.cs | 36 +++++ .../MoviesController.cs | 2 +- .../SeriesController.cs | 75 ++++++++++ .../WatchIt.WebAPI.Controllers.csproj | 1 + .../MoviesControllerService.cs | 3 +- .../ISeriesControllerService.cs | 13 ++ .../SeriesControllerService.cs | 135 ++++++++++++++++++ ....WebAPI.Services.Controllers.Series.csproj | 16 +++ WatchIt.WebAPI/WatchIt.WebAPI/Program.cs | 2 + WatchIt.sln | 7 + 13 files changed, 418 insertions(+), 2 deletions(-) create mode 100644 WatchIt.Common/WatchIt.Common.Model/Series/Series.cs create mode 100644 WatchIt.Common/WatchIt.Common.Model/Series/SeriesQueryParameters.cs create mode 100644 WatchIt.Common/WatchIt.Common.Model/Series/SeriesRequest.cs create mode 100644 WatchIt.Common/WatchIt.Common.Model/Series/SeriesResponse.cs create mode 100644 WatchIt.WebAPI/WatchIt.WebAPI.Controllers/SeriesController.cs create mode 100644 WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/ISeriesControllerService.cs create mode 100644 WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/SeriesControllerService.cs create mode 100644 WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/WatchIt.WebAPI.Services.Controllers.Series.csproj diff --git a/WatchIt.Common/WatchIt.Common.Model/Series/Series.cs b/WatchIt.Common/WatchIt.Common.Model/Series/Series.cs new file mode 100644 index 0000000..08978de --- /dev/null +++ b/WatchIt.Common/WatchIt.Common.Model/Series/Series.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace WatchIt.Common.Model.Series; + +public class Series : Media.Media +{ + [JsonPropertyName("has_ended")] + public bool HasEnded { get; set; } +} \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Series/SeriesQueryParameters.cs b/WatchIt.Common/WatchIt.Common.Model/Series/SeriesQueryParameters.cs new file mode 100644 index 0000000..d8797be --- /dev/null +++ b/WatchIt.Common/WatchIt.Common.Model/Series/SeriesQueryParameters.cs @@ -0,0 +1,62 @@ +using Microsoft.AspNetCore.Mvc; +using WatchIt.Common.Query; + +namespace WatchIt.Common.Model.Series; + +public class SeriesQueryParameters : QueryParameters +{ + #region PROPERTIES + + [FromQuery(Name = "title")] + public string? Title { get; set; } + + [FromQuery(Name = "original_title")] + public string? OriginalTitle { get; set; } + + [FromQuery(Name = "description")] + public string? Description { get; set; } + + [FromQuery(Name = "release_date")] + public DateOnly? ReleaseDate { get; set; } + + [FromQuery(Name = "release_date_from")] + public DateOnly? ReleaseDateFrom { get; set; } + + [FromQuery(Name = "release_date_to")] + public DateOnly? ReleaseDateTo { get; set; } + + [FromQuery(Name = "length")] + public short? Length { get; set; } + + [FromQuery(Name = "length_from")] + public short? LengthFrom { get; set; } + + [FromQuery(Name = "length_to")] + public short? LengthTo { get; set; } + + [FromQuery(Name = "has_ended")] + public bool? HasEnded { get; set; } + + #endregion + + + + #region PUBLIC METHODS + + public override bool IsMeetingConditions(SeriesResponse item) => + ( + TestString(item.Title, Title) + && + TestString(item.OriginalTitle, OriginalTitle) + && + TestString(item.Description, Description) + && + TestComparable(item.ReleaseDate, ReleaseDate, ReleaseDateFrom, ReleaseDateTo) + && + TestComparable(item.Length, Length, LengthFrom, LengthTo) + && + TestBoolean(item.HasEnded, HasEnded) + ); + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Series/SeriesRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Series/SeriesRequest.cs new file mode 100644 index 0000000..baab8c2 --- /dev/null +++ b/WatchIt.Common/WatchIt.Common.Model/Series/SeriesRequest.cs @@ -0,0 +1,59 @@ +using System.Diagnostics.CodeAnalysis; +using WatchIt.Database.Model.Media; + +namespace WatchIt.Common.Model.Series; + +public class SeriesRequest : Series +{ + #region CONSTRUCTORS + + [SetsRequiredMembers] + public SeriesRequest(SeriesResponse initData) + { + Title = initData.Title; + OriginalTitle = initData.OriginalTitle; + Description = initData.Description; + ReleaseDate = initData.ReleaseDate; + Length = initData.Length; + HasEnded = initData.HasEnded; + } + + public SeriesRequest() {} + + #endregion + + + + #region PUBLIC METHODS + + public Database.Model.Media.Media CreateMedia() => new Database.Model.Media.Media + { + Title = Title, + OriginalTitle = OriginalTitle, + Description = Description, + ReleaseDate = ReleaseDate, + Length = Length, + }; + + public MediaSeries CreateMediaSeries(long id) => new MediaSeries + { + Id = id, + HasEnded = HasEnded, + }; + + public void UpdateMedia(Database.Model.Media.Media media) + { + media.Title = Title; + media.OriginalTitle = OriginalTitle; + media.Description = Description; + media.ReleaseDate = ReleaseDate; + media.Length = Length; + } + + public void UpdateMediaSeries(MediaSeries mediaSeries) + { + mediaSeries.HasEnded = HasEnded; + } + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Series/SeriesResponse.cs b/WatchIt.Common/WatchIt.Common.Model/Series/SeriesResponse.cs new file mode 100644 index 0000000..2e44003 --- /dev/null +++ b/WatchIt.Common/WatchIt.Common.Model/Series/SeriesResponse.cs @@ -0,0 +1,36 @@ +using System.Diagnostics.CodeAnalysis; +using System.Text.Json.Serialization; +using WatchIt.Database.Model.Media; + +namespace WatchIt.Common.Model.Series; + +public class SeriesResponse : Series +{ + #region PROPERTIES + + [JsonPropertyName("id")] + public long Id { get; set; } + + #endregion + + + + #region CONSTRUCTORS + + [JsonConstructor] + public SeriesResponse() {} + + [SetsRequiredMembers] + public SeriesResponse(MediaSeries mediaSeries) + { + Id = mediaSeries.Media.Id; + Title = mediaSeries.Media.Title; + OriginalTitle = mediaSeries.Media.OriginalTitle; + Description = mediaSeries.Media.Description; + ReleaseDate = mediaSeries.Media.ReleaseDate; + Length = mediaSeries.Media.Length; + HasEnded = mediaSeries.HasEnded; + } + + #endregion +} \ No newline at end of file diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/MoviesController.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/MoviesController.cs index 5f87add..dbad719 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/MoviesController.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/MoviesController.cs @@ -57,7 +57,7 @@ public class MoviesController : ControllerBase [HttpPut("{id}")] [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] - [ProducesResponseType(typeof(void), StatusCodes.Status204NoContent)] + [ProducesResponseType(typeof(void), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)] diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/SeriesController.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/SeriesController.cs new file mode 100644 index 0000000..b5e82d5 --- /dev/null +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/SeriesController.cs @@ -0,0 +1,75 @@ +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using WatchIt.Common.Model.Series; +using WatchIt.Database; +using WatchIt.WebAPI.Services.Controllers.Series; + +namespace WatchIt.WebAPI.Controllers; + +[ApiController] +[Route("series")] +public class SeriesController : ControllerBase +{ + #region SERVICES + + private readonly ISeriesControllerService _seriesControllerService; + + #endregion + + + + #region CONSTRUCTORS + + public SeriesController(ISeriesControllerService seriesControllerService) + { + _seriesControllerService = seriesControllerService; + } + + #endregion + + + + #region PUBLIC METHODS + + #region Main + + [HttpGet] + [AllowAnonymous] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task GetAllSeries(SeriesQueryParameters query) => await _seriesControllerService.GetAllSeries(query); + + [HttpGet("{id}")] + [AllowAnonymous] + [ProducesResponseType(typeof(SeriesResponse), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task GetSeries([FromRoute] long id) => await _seriesControllerService.GetSeries(id); + + [HttpPost] + [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] + [ProducesResponseType(typeof(SeriesResponse), StatusCodes.Status201Created)] + [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] + [ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)] + public async Task PostSeries([FromBody] SeriesRequest body) => await _seriesControllerService.PostSeries(body); + + [HttpPut("{id}")] + [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] + [ProducesResponseType(typeof(void), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] + [ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)] + public async Task PutSeries([FromRoute] long id, [FromBody]SeriesRequest body) => await _seriesControllerService.PutSeries(id, body); + + [HttpDelete("{id}")] + [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] + [ProducesResponseType(typeof(void), StatusCodes.Status204NoContent)] + [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] + [ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)] + public async Task DeleteSeries([FromRoute] long id) => await _seriesControllerService.DeleteSeries(id); + + #endregion + + #endregion +} \ No newline at end of file diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/WatchIt.WebAPI.Controllers.csproj b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/WatchIt.WebAPI.Controllers.csproj index 12e6512e..1b46756 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/WatchIt.WebAPI.Controllers.csproj +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/WatchIt.WebAPI.Controllers.csproj @@ -17,6 +17,7 @@ + diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Movies/MoviesControllerService.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Movies/MoviesControllerService.cs index cc5d69e..50256b0 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Movies/MoviesControllerService.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Movies/MoviesControllerService.cs @@ -31,6 +31,7 @@ public class MoviesControllerService : IMoviesControllerService #endregion + #region PUBLIC METHODS #region Main @@ -90,7 +91,7 @@ public class MoviesControllerService : IMoviesControllerService data.UpdateMedia(item.Media); await _database.SaveChangesAsync(); - return RequestResult.NoContent(); + return RequestResult.Ok(); } public async Task DeleteMovie(long id) diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/ISeriesControllerService.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/ISeriesControllerService.cs new file mode 100644 index 0000000..3c78ae5 --- /dev/null +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/ISeriesControllerService.cs @@ -0,0 +1,13 @@ +using WatchIt.Common.Model.Series; +using WatchIt.WebAPI.Services.Controllers.Common; + +namespace WatchIt.WebAPI.Services.Controllers.Series; + +public interface ISeriesControllerService +{ + Task GetAllSeries(SeriesQueryParameters query); + Task GetSeries(long id); + Task PostSeries(SeriesRequest data); + Task PutSeries(long id, SeriesRequest data); + Task DeleteSeries(long id); +} \ No newline at end of file diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/SeriesControllerService.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/SeriesControllerService.cs new file mode 100644 index 0000000..5117aec --- /dev/null +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/SeriesControllerService.cs @@ -0,0 +1,135 @@ +using Microsoft.EntityFrameworkCore; +using WatchIt.Common.Model.Series; +using WatchIt.Database; +using WatchIt.Database.Model.Media; +using WatchIt.WebAPI.Services.Controllers.Common; +using WatchIt.WebAPI.Services.Utility.User; + +namespace WatchIt.WebAPI.Services.Controllers.Series; + +public class SeriesControllerService : ISeriesControllerService +{ + #region SERVICES + + private readonly DatabaseContext _database; + + private readonly IUserService _userService; + + #endregion + + + + #region CONSTRUCTORS + + public SeriesControllerService(DatabaseContext database, IUserService userService) + { + _database = database; + + _userService = userService; + } + + #endregion + + + + #region PUBLIC METHODS + + public async Task GetAllSeries(SeriesQueryParameters query) + { + IEnumerable data = await _database.MediaSeries.Select(x => new SeriesResponse(x)).ToListAsync(); + data = query.PrepareData(data); + return RequestResult.Ok(data); + } + + public async Task GetSeries(long id) + { + MediaSeries? item = await _database.MediaSeries.FirstOrDefaultAsync(x => x.Id == id); + if (item is null) + { + return RequestResult.NotFound(); + } + + SeriesResponse data = new SeriesResponse(item); + return RequestResult.Ok(data); + } + + public async Task PostSeries(SeriesRequest data) + { + UserValidator validator = _userService.GetValidator().MustBeAdmin(); + if (!validator.IsValid) + { + return RequestResult.Forbidden(); + } + + Media mediaItem = data.CreateMedia(); + await _database.Media.AddAsync(mediaItem); + await _database.SaveChangesAsync(); + MediaSeries mediaSeriesItem = data.CreateMediaSeries(mediaItem.Id); + await _database.MediaSeries.AddAsync(mediaSeriesItem); + await _database.SaveChangesAsync(); + + return RequestResult.Created($"series/{mediaItem.Id}", new SeriesResponse(mediaSeriesItem)); + } + + public async Task PutSeries(long id, SeriesRequest data) + { + UserValidator validator = _userService.GetValidator().MustBeAdmin(); + if (!validator.IsValid) + { + return RequestResult.Forbidden(); + } + + MediaSeries? item = await _database.MediaSeries.FirstOrDefaultAsync(x => x.Id == id); + if (item is null) + { + return RequestResult.NotFound(); + } + + data.UpdateMediaSeries(item); + data.UpdateMedia(item.Media); + await _database.SaveChangesAsync(); + + return RequestResult.Ok(); + } + + public async Task DeleteSeries(long id) + { + UserValidator validator = _userService.GetValidator().MustBeAdmin(); + if (!validator.IsValid) + { + return RequestResult.Forbidden(); + } + + MediaSeries? item = await _database.MediaSeries.FirstOrDefaultAsync(x => x.Id == id); + if (item is null) + { + return RequestResult.NotFound(); + } + + _database.MediaSeries.Attach(item); + _database.MediaSeries.Remove(item); + _database.MediaPosterImages.Attach(item.Media.MediaPosterImage!); + _database.MediaPosterImages.Remove(item.Media.MediaPosterImage!); + _database.MediaPhotoImages.AttachRange(item.Media.MediaPhotoImages); + _database.MediaPhotoImages.RemoveRange(item.Media.MediaPhotoImages); + _database.MediaGenres.AttachRange(item.Media.MediaGenres); + _database.MediaGenres.RemoveRange(item.Media.MediaGenres); + _database.MediaProductionCountries.AttachRange(item.Media.MediaProductionCountries); + _database.MediaProductionCountries.RemoveRange(item.Media.MediaProductionCountries); + _database.PersonActorRoles.AttachRange(item.Media.PersonActorRoles); + _database.PersonActorRoles.RemoveRange(item.Media.PersonActorRoles); + _database.PersonCreatorRoles.AttachRange(item.Media.PersonCreatorRoles); + _database.PersonCreatorRoles.RemoveRange(item.Media.PersonCreatorRoles); + _database.RatingsMedia.AttachRange(item.Media.RatingMedia); + _database.RatingsMedia.RemoveRange(item.Media.RatingMedia); + _database.ViewCountsMedia.AttachRange(item.Media.ViewCountsMedia); + _database.ViewCountsMedia.RemoveRange(item.Media.ViewCountsMedia); + _database.Media.Attach(item.Media); + _database.Media.Remove(item.Media); + await _database.SaveChangesAsync(); + + return RequestResult.NoContent(); + } + + #endregion +} \ No newline at end of file diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/WatchIt.WebAPI.Services.Controllers.Series.csproj b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/WatchIt.WebAPI.Services.Controllers.Series.csproj new file mode 100644 index 0000000..9e4603e --- /dev/null +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/WatchIt.WebAPI.Services.Controllers.Series.csproj @@ -0,0 +1,16 @@ + + + + net8.0 + enable + enable + + + + + + + + + + diff --git a/WatchIt.WebAPI/WatchIt.WebAPI/Program.cs b/WatchIt.WebAPI/WatchIt.WebAPI/Program.cs index 215523c..751b900 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI/Program.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI/Program.cs @@ -13,6 +13,7 @@ using WatchIt.WebAPI.Services.Controllers.Accounts; using WatchIt.WebAPI.Services.Controllers.Genres; using WatchIt.WebAPI.Services.Controllers.Media; using WatchIt.WebAPI.Services.Controllers.Movies; +using WatchIt.WebAPI.Services.Controllers.Series; using WatchIt.WebAPI.Services.Utility.Configuration; using WatchIt.WebAPI.Services.Utility.Tokens; using WatchIt.WebAPI.Services.Utility.User; @@ -149,6 +150,7 @@ public static class Program builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); + builder.Services.AddTransient(); return builder; } diff --git a/WatchIt.sln b/WatchIt.sln index ecc00b2..75ac7f3 100644 --- a/WatchIt.sln +++ b/WatchIt.sln @@ -80,6 +80,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WatchIt.Website.Services.Ut EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WatchIt.Website.Services.Utility.Authentication", "WatchIt.Website\WatchIt.Website.Services\WatchIt.Website.Services.Utility\WatchIt.Website.Services.Utility.Authentication\WatchIt.Website.Services.Utility.Authentication.csproj", "{8720AECA-7084-429A-BA15-49B6622C1A32}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WatchIt.WebAPI.Services.Controllers.Series", "WatchIt.WebAPI\WatchIt.WebAPI.Services\WatchIt.WebAPI.Services.Controllers\WatchIt.WebAPI.Services.Controllers.Series\WatchIt.WebAPI.Services.Controllers.Series.csproj", "{F8FCEF7B-72EA-48BC-AC68-E11244B067DD}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -122,6 +124,7 @@ Global {2D62ED42-489E-4888-9479-E5A50A0E7D70} = {46E3711F-18BD-4004-AF53-EA4D8643D92F} {77FDAFDD-E97E-4059-A935-B563B6B0D555} = {130BC8F5-82CE-4EDF-AECB-21594DD41849} {8720AECA-7084-429A-BA15-49B6622C1A32} = {130BC8F5-82CE-4EDF-AECB-21594DD41849} + {F8FCEF7B-72EA-48BC-AC68-E11244B067DD} = {CEC468DB-CC49-47D3-9E3E-1CC9530C3CE7} EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {23383776-1F27-4B5D-8C7C-57BFF75FA473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -236,5 +239,9 @@ Global {8720AECA-7084-429A-BA15-49B6622C1A32}.Debug|Any CPU.Build.0 = Debug|Any CPU {8720AECA-7084-429A-BA15-49B6622C1A32}.Release|Any CPU.ActiveCfg = Release|Any CPU {8720AECA-7084-429A-BA15-49B6622C1A32}.Release|Any CPU.Build.0 = Release|Any CPU + {F8FCEF7B-72EA-48BC-AC68-E11244B067DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8FCEF7B-72EA-48BC-AC68-E11244B067DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8FCEF7B-72EA-48BC-AC68-E11244B067DD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8FCEF7B-72EA-48BC-AC68-E11244B067DD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal From 0b93765d121fd88c817b08e1d6bd7da3691b6b28 Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Sat, 21 Sep 2024 23:46:46 +0200 Subject: [PATCH 2/4] view rank get endpoint for tv series added --- .../SeriesController.cs | 10 +++++++ .../ISeriesControllerService.cs | 2 ++ .../SeriesControllerService.cs | 27 +++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/SeriesController.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/SeriesController.cs index b5e82d5..5afe5ca 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/SeriesController.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/SeriesController.cs @@ -71,5 +71,15 @@ public class SeriesController : ControllerBase #endregion + #region View count + + [HttpGet("view")] + [AllowAnonymous] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + public async Task GetSeriesViewRank([FromQuery] int first = 5, [FromQuery] int days = 7) => await _seriesControllerService.GetSeriesViewRank(first, days); + + #endregion + #endregion } \ No newline at end of file diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/ISeriesControllerService.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/ISeriesControllerService.cs index 3c78ae5..aac8fdd 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/ISeriesControllerService.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/ISeriesControllerService.cs @@ -10,4 +10,6 @@ public interface ISeriesControllerService Task PostSeries(SeriesRequest data); Task PutSeries(long id, SeriesRequest data); Task DeleteSeries(long id); + + Task GetSeriesViewRank(int first, int days); } \ No newline at end of file diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/SeriesControllerService.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/SeriesControllerService.cs index 5117aec..79527ad 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/SeriesControllerService.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Series/SeriesControllerService.cs @@ -34,6 +34,8 @@ public class SeriesControllerService : ISeriesControllerService #region PUBLIC METHODS + #region Main + public async Task GetAllSeries(SeriesQueryParameters query) { IEnumerable data = await _database.MediaSeries.Select(x => new SeriesResponse(x)).ToListAsync(); @@ -132,4 +134,29 @@ public class SeriesControllerService : ISeriesControllerService } #endregion + + #region View count + + public async Task GetSeriesViewRank(int first, int days) + { + if (first < 1 || days < 1) + { + return RequestResult.BadRequest(); + } + + DateOnly startDate = DateOnly.FromDateTime(DateTime.Now).AddDays(-days); + IEnumerable rawData = await _database.MediaSeries.OrderByDescending(x => x.Media.ViewCountsMedia.Where(y => y.Date >= startDate) + .Sum(y => y.ViewCount)) + .ThenBy(x => x.Id) + .Take(first) + .ToListAsync(); + + IEnumerable data = rawData.Select(x => new SeriesResponse(x)); + + return RequestResult.Ok(data); + } + + #endregion + + #endregion } \ No newline at end of file From 3c990b591d0160f7280dcb3eb3af0d9075d9ce69 Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Sun, 22 Sep 2024 00:05:40 +0200 Subject: [PATCH 3/4] view rank get endpoint client service method for movies added --- .../Model/Endpoints.cs | 3 +- .../Model/Movies.cs | 11 +-- .../Model/Series.cs | 12 +++ .../IMoviesWebAPIService.cs | 10 +-- .../MoviesWebAPIService.cs | 85 ++++++++++++++----- .../WatchIt.Website/Pages/MediaPage.razor.cs | 2 +- .../Pages/MovieEditPage.razor.cs | 6 +- .../WatchIt.Website/appsettings.json | 26 ++++-- 8 files changed, 111 insertions(+), 44 deletions(-) create mode 100644 WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Series.cs diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Endpoints.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Endpoints.cs index 94ed6ee..a71bdbf 100644 --- a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Endpoints.cs +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Endpoints.cs @@ -5,6 +5,7 @@ public class Endpoints public string Base { get; set; } public Accounts Accounts { get; set; } public Genres Genres { get; set; } - public Movies Movies { get; set; } public Media Media { get; set; } + public Movies Movies { get; set; } + public Series Series { get; set; } } \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Movies.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Movies.cs index c59dc81..36ee8e2 100644 --- a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Movies.cs +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Movies.cs @@ -3,9 +3,10 @@ public class Movies { public string Base { get; set; } - public string GetAll { get; set; } - public string Get { get; set; } - public string Post { get; set; } - public string Put { get; set; } - public string Delete { get; set; } + public string GetAllMovies { get; set; } + public string GetMovie { get; set; } + public string PostMovie { get; set; } + public string PutMovie { get; set; } + public string DeleteMovie { get; set; } + public string GetMoviesViewRank { get; set; } } \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Series.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Series.cs new file mode 100644 index 0000000..ec8dc63 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.Utility/WatchIt.Website.Services.Utility.Configuration/Model/Series.cs @@ -0,0 +1,12 @@ +namespace WatchIt.Website.Services.Utility.Configuration.Model; + +public class Series +{ + public string Base { get; set; } + public string GetAllSeries { get; set; } + public string GetSeries { get; set; } + public string PostSeries { get; set; } + public string PutSeries { get; set; } + public string DeleteSeries { get; set; } + public string GetSeriesViewRank { get; set; } +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Movies/IMoviesWebAPIService.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Movies/IMoviesWebAPIService.cs index ada9dbf..1a856c7 100644 --- a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Movies/IMoviesWebAPIService.cs +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Movies/IMoviesWebAPIService.cs @@ -4,9 +4,9 @@ namespace WatchIt.Website.Services.WebAPI.Movies; public interface IMoviesWebAPIService { - Task GetAll(MovieQueryParameters? query = null, Action>? successAction = null); - Task Post(MovieRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); - Task Get(long id, Action? successAction = null, Action? notFoundAction = null); - Task Put(long id, MovieRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); - Task Delete(long id, Action? successAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); + Task GetAllMovies(MovieQueryParameters? query = null, Action>? successAction = null); + Task PostMovie(MovieRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); + Task GetMovie(long id, Action? successAction = null, Action? notFoundAction = null); + Task PutMovie(long id, MovieRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); + Task DeleteMovie(long id, Action? successAction = 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.Movies/MoviesWebAPIService.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Movies/MoviesWebAPIService.cs index 56ed638..c8980bf 100644 --- a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Movies/MoviesWebAPIService.cs +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Movies/MoviesWebAPIService.cs @@ -1,4 +1,6 @@ -using Microsoft.AspNetCore.Components; +using System.Text; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Primitives; using WatchIt.Common.Model.Movies; using WatchIt.Common.Services.HttpClient; using WatchIt.Website.Services.Utility.Configuration; @@ -28,11 +30,14 @@ public class MoviesWebAPIService : BaseWebAPIService, IMoviesWebAPIService #endregion + #region PUBLIC METHODS + + #region Main - public async Task GetAll(MovieQueryParameters? query = null, Action>? successAction = null) + public async Task GetAllMovies(MovieQueryParameters? query = null, Action>? successAction = null) { - string url = GetUrl(EndpointsConfiguration.Movies.GetAll); + string url = GetUrl(EndpointsConfiguration.Movies.GetAllMovies); HttpRequest request = new HttpRequest(HttpMethodType.Get, url); request.Query = query; @@ -42,9 +47,21 @@ public class MoviesWebAPIService : BaseWebAPIService, IMoviesWebAPIService .ExecuteAction(); } - public async Task Post(MovieRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) + public async Task GetMovie(long id, Action? successAction = null, Action? notFoundAction = null) { - string url = GetUrl(EndpointsConfiguration.Movies.Post); + string url = GetUrl(EndpointsConfiguration.Movies.GetMovie, id); + + HttpRequest request = new HttpRequest(HttpMethodType.Get, url); + + HttpResponse response = await _httpClientService.SendRequestAsync(request); + response.RegisterActionFor2XXSuccess(successAction) + .RegisterActionFor404NotFound(notFoundAction) + .ExecuteAction(); + } + + public async Task PostMovie(MovieRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) + { + string url = GetUrl(EndpointsConfiguration.Movies.PostMovie); HttpRequest request = new HttpRequest(HttpMethodType.Post, url); request.Body = data; @@ -57,21 +74,9 @@ public class MoviesWebAPIService : BaseWebAPIService, IMoviesWebAPIService .ExecuteAction(); } - public async Task Get(long id, Action? successAction = null, Action? notFoundAction = null) + public async Task PutMovie(long id, MovieRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) { - string url = GetUrl(EndpointsConfiguration.Movies.Get, id); - - HttpRequest request = new HttpRequest(HttpMethodType.Get, url); - - HttpResponse response = await _httpClientService.SendRequestAsync(request); - response.RegisterActionFor2XXSuccess(successAction) - .RegisterActionFor404NotFound(notFoundAction) - .ExecuteAction(); - } - - public async Task Put(long id, MovieRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) - { - string url = GetUrl(EndpointsConfiguration.Movies.Put, id); + string url = GetUrl(EndpointsConfiguration.Movies.PutMovie, id); HttpRequest request = new HttpRequest(HttpMethodType.Put, url); request.Body = data; @@ -84,9 +89,9 @@ public class MoviesWebAPIService : BaseWebAPIService, IMoviesWebAPIService .ExecuteAction(); } - public async Task Delete(long id, Action? successAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) + public async Task DeleteMovie(long id, Action? successAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) { - string url = GetUrl(EndpointsConfiguration.Movies.Delete, id); + string url = GetUrl(EndpointsConfiguration.Movies.DeleteMovie, id); HttpRequest request = new HttpRequest(HttpMethodType.Delete, url); @@ -96,6 +101,44 @@ public class MoviesWebAPIService : BaseWebAPIService, IMoviesWebAPIService .RegisterActionFor403Forbidden(forbiddenAction) .ExecuteAction(); } + + #endregion + + #region View count + + public async Task GetMoviesViewRank(int? first = null, int? days = null, Action>? successAction = null, Action>? badRequestAction = null) + { + string url = GetUrl(EndpointsConfiguration.Movies.GetMoviesViewRank); + if (first.HasValue || days.HasValue) + { + StringBuilder urlBuilder = new StringBuilder(url); + urlBuilder.Append('?'); + bool firstParameter = true; + if (first.HasValue) + { + urlBuilder.Append($"first={first.Value}"); + firstParameter = false; + } + if (days.HasValue) + { + if (!firstParameter) + { + urlBuilder.Append('&'); + } + urlBuilder.Append($"days={days.Value}"); + } + url = urlBuilder.ToString(); + } + + HttpRequest request = new HttpRequest(HttpMethodType.Get, url); + + HttpResponse response = await _httpClientService.SendRequestAsync(request); + response.RegisterActionFor2XXSuccess(successAction) + .RegisterActionFor400BadRequest(badRequestAction) + .ExecuteAction(); + } + + #endregion #endregion diff --git a/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor.cs b/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor.cs index 31430d2..d34b7ac 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor.cs +++ b/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor.cs @@ -84,7 +84,7 @@ public partial class MediaPage : ComponentBase MediaWebAPIService.GetPoster(Id, data => _poster = data), MediaWebAPIService.GetMediaGenres(Id, data => _genres = data), MediaWebAPIService.GetMediaRating(Id, data => _globalRating = data), - _media.Type == MediaType.Movie ? MoviesWebAPIService.Get(Id, data => _movie = data) : Task.CompletedTask, + _media.Type == MediaType.Movie ? MoviesWebAPIService.GetMovie(Id, data => _movie = data) : Task.CompletedTask, ]); } diff --git a/WatchIt.Website/WatchIt.Website/Pages/MovieEditPage.razor.cs b/WatchIt.Website/WatchIt.Website/Pages/MovieEditPage.razor.cs index 285ef1f..f1d17c1 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/MovieEditPage.razor.cs +++ b/WatchIt.Website/WatchIt.Website/Pages/MovieEditPage.razor.cs @@ -64,7 +64,7 @@ public partial class MovieEditPage : ComponentBase { if (Id is not null) { - await MoviesWebAPIService.Get(Id.Value, GetSuccessAction, NoIdAction); + await MoviesWebAPIService.GetMovie(Id.Value, GetSuccessAction, NoIdAction); } return; @@ -83,11 +83,11 @@ public partial class MovieEditPage : ComponentBase _movieDataInfo = null; if (Id is null) { - await MoviesWebAPIService.Post(_movieData, PostSuccessAction, BadRequestAction, NoPermissionsAction, NoPermissionsAction); + await MoviesWebAPIService.PostMovie(_movieData, PostSuccessAction, BadRequestAction, NoPermissionsAction, NoPermissionsAction); } else { - await MoviesWebAPIService.Put(Id.Value, _movieData, PutSuccessAction, BadRequestAction, NoPermissionsAction, NoPermissionsAction); + await MoviesWebAPIService.PutMovie(Id.Value, _movieData, PutSuccessAction, BadRequestAction, NoPermissionsAction, NoPermissionsAction); } return; diff --git a/WatchIt.Website/WatchIt.Website/appsettings.json b/WatchIt.Website/WatchIt.Website/appsettings.json index 8da2d13..d2096a0 100644 --- a/WatchIt.Website/WatchIt.Website/appsettings.json +++ b/WatchIt.Website/WatchIt.Website/appsettings.json @@ -28,14 +28,6 @@ "Put": "/{0}", "Delete": "/{0}" }, - "Movies": { - "Base": "/movies", - "GetAll": "", - "Get": "/{0}", - "Post": "", - "Put": "/{0}", - "Delete": "/{0}" - }, "Media": { "Base": "/media", "Get": "/{0}", @@ -58,6 +50,24 @@ "PostPhoto": "/photos", "PutPhoto": "/photos/{0}", "DeletePhoto": "/photos/{0}" + }, + "Movies": { + "Base": "/movies", + "GetAll": "", + "Get": "/{0}", + "Post": "", + "Put": "/{0}", + "Delete": "/{0}", + "GetMoviesViewRank": "/view" + }, + "Series": { + "Base": "/series", + "GetAllSeries": "", + "GetSeries": "/{0}", + "PostSeries": "", + "PutSeries": "/{0}", + "DeleteSeries": "/{0}", + "GetSeriesViewRank": "/view" } } } From e2f9b524f6e8f12248d552d2c1339c746c433ba3 Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Sun, 22 Sep 2024 00:13:29 +0200 Subject: [PATCH 4/4] endpoint client service for tv series added --- .../ISeriesWebAPIService.cs | 14 ++ .../SeriesWebAPIService.cs | 150 ++++++++++++++++++ ...chIt.Website.Services.WebAPI.Series.csproj | 14 ++ WatchIt.sln | 7 + 4 files changed, 185 insertions(+) create mode 100644 WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Series/ISeriesWebAPIService.cs create mode 100644 WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Series/SeriesWebAPIService.cs create mode 100644 WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Series/WatchIt.Website.Services.WebAPI.Series.csproj diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Series/ISeriesWebAPIService.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Series/ISeriesWebAPIService.cs new file mode 100644 index 0000000..dfb2b4d --- /dev/null +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Series/ISeriesWebAPIService.cs @@ -0,0 +1,14 @@ +using WatchIt.Common.Model.Series; + +namespace WatchIt.Website.Services.WebAPI.Series; + +public interface ISeriesWebAPIService +{ + Task GetAllSeries(SeriesQueryParameters? query = null, Action>? successAction = null); + Task GetSeries(long id, Action? successAction = null, Action? notFoundAction = null); + Task PostSeries(SeriesRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); + Task PutSeries(long id, SeriesRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); + Task DeleteSeries(long id, Action? successAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); + + Task GetSeriesViewRank(int? first = null, int? days = null, Action>? successAction = null, Action>? badRequestAction = null); +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Series/SeriesWebAPIService.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Series/SeriesWebAPIService.cs new file mode 100644 index 0000000..52f144b --- /dev/null +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Series/SeriesWebAPIService.cs @@ -0,0 +1,150 @@ +using System.Text; +using WatchIt.Common.Model.Series; +using WatchIt.Common.Services.HttpClient; +using WatchIt.Website.Services.Utility.Configuration; +using WatchIt.Website.Services.WebAPI.Common; + +namespace WatchIt.Website.Services.WebAPI.Series; + +public class SeriesWebAPIService : BaseWebAPIService, ISeriesWebAPIService +{ + #region SERVICES + + private IHttpClientService _httpClientService; + private IConfigurationService _configurationService; + + #endregion + + + + #region CONSTRUCTORS + + public SeriesWebAPIService(IHttpClientService httpClientService, IConfigurationService configurationService) : base(configurationService) + { + _httpClientService = httpClientService; + _configurationService = configurationService; + } + + #endregion + + + + #region PUBLIC METHODS + + #region Main + + public async Task GetAllSeries(SeriesQueryParameters? query = null, Action>? successAction = null) + { + string url = GetUrl(EndpointsConfiguration.Series.GetAllSeries); + + HttpRequest request = new HttpRequest(HttpMethodType.Get, url); + request.Query = query; + + HttpResponse response = await _httpClientService.SendRequestAsync(request); + response.RegisterActionFor2XXSuccess(successAction) + .ExecuteAction(); + } + + public async Task GetSeries(long id, Action? successAction = null, Action? notFoundAction = null) + { + string url = GetUrl(EndpointsConfiguration.Series.GetSeries, id); + + HttpRequest request = new HttpRequest(HttpMethodType.Get, url); + + HttpResponse response = await _httpClientService.SendRequestAsync(request); + response.RegisterActionFor2XXSuccess(successAction) + .RegisterActionFor404NotFound(notFoundAction) + .ExecuteAction(); + } + + public async Task PostSeries(SeriesRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) + { + string url = GetUrl(EndpointsConfiguration.Series.PostSeries); + + HttpRequest request = new HttpRequest(HttpMethodType.Post, url); + request.Body = data; + + HttpResponse response = await _httpClientService.SendRequestAsync(request); + response.RegisterActionFor2XXSuccess(successAction) + .RegisterActionFor400BadRequest(badRequestAction) + .RegisterActionFor401Unauthorized(unauthorizedAction) + .RegisterActionFor403Forbidden(forbiddenAction) + .ExecuteAction(); + } + + public async Task PutSeries(long id, SeriesRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) + { + string url = GetUrl(EndpointsConfiguration.Series.PutSeries, id); + + HttpRequest request = new HttpRequest(HttpMethodType.Put, url); + request.Body = data; + + HttpResponse response = await _httpClientService.SendRequestAsync(request); + response.RegisterActionFor2XXSuccess(successAction) + .RegisterActionFor400BadRequest(badRequestAction) + .RegisterActionFor401Unauthorized(unauthorizedAction) + .RegisterActionFor403Forbidden(forbiddenAction) + .ExecuteAction(); + } + + public async Task DeleteSeries(long id, Action? successAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) + { + string url = GetUrl(EndpointsConfiguration.Series.DeleteSeries, id); + + HttpRequest request = new HttpRequest(HttpMethodType.Delete, url); + + HttpResponse response = await _httpClientService.SendRequestAsync(request); + response.RegisterActionFor2XXSuccess(successAction) + .RegisterActionFor401Unauthorized(unauthorizedAction) + .RegisterActionFor403Forbidden(forbiddenAction) + .ExecuteAction(); + } + + #endregion + + #region View count + + public async Task GetSeriesViewRank(int? first = null, int? days = null, Action>? successAction = null, Action>? badRequestAction = null) + { + string url = GetUrl(EndpointsConfiguration.Series.GetSeriesViewRank); + if (first.HasValue || days.HasValue) + { + StringBuilder urlBuilder = new StringBuilder(url); + urlBuilder.Append('?'); + bool firstParameter = true; + if (first.HasValue) + { + urlBuilder.Append($"first={first.Value}"); + firstParameter = false; + } + if (days.HasValue) + { + if (!firstParameter) + { + urlBuilder.Append('&'); + } + urlBuilder.Append($"days={days.Value}"); + } + url = urlBuilder.ToString(); + } + + HttpRequest request = new HttpRequest(HttpMethodType.Get, url); + + HttpResponse response = await _httpClientService.SendRequestAsync(request); + response.RegisterActionFor2XXSuccess(successAction) + .RegisterActionFor400BadRequest(badRequestAction) + .ExecuteAction(); + } + + #endregion + + #endregion + + + + #region PRIVATE METHODS + + protected override string GetServiceBase() => EndpointsConfiguration.Series.Base; + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Series/WatchIt.Website.Services.WebAPI.Series.csproj b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Series/WatchIt.Website.Services.WebAPI.Series.csproj new file mode 100644 index 0000000..abf3359 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Series/WatchIt.Website.Services.WebAPI.Series.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/WatchIt.sln b/WatchIt.sln index 75ac7f3..d94dd47 100644 --- a/WatchIt.sln +++ b/WatchIt.sln @@ -82,6 +82,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WatchIt.Website.Services.Ut EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WatchIt.WebAPI.Services.Controllers.Series", "WatchIt.WebAPI\WatchIt.WebAPI.Services\WatchIt.WebAPI.Services.Controllers\WatchIt.WebAPI.Services.Controllers.Series\WatchIt.WebAPI.Services.Controllers.Series.csproj", "{F8FCEF7B-72EA-48BC-AC68-E11244B067DD}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WatchIt.Website.Services.WebAPI.Series", "WatchIt.Website\WatchIt.Website.Services\WatchIt.Website.Services.WebAPI\WatchIt.Website.Services.WebAPI.Series\WatchIt.Website.Services.WebAPI.Series.csproj", "{783C743A-85BF-4382-BFE5-7A90E3F3B8B6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -125,6 +127,7 @@ Global {77FDAFDD-E97E-4059-A935-B563B6B0D555} = {130BC8F5-82CE-4EDF-AECB-21594DD41849} {8720AECA-7084-429A-BA15-49B6622C1A32} = {130BC8F5-82CE-4EDF-AECB-21594DD41849} {F8FCEF7B-72EA-48BC-AC68-E11244B067DD} = {CEC468DB-CC49-47D3-9E3E-1CC9530C3CE7} + {783C743A-85BF-4382-BFE5-7A90E3F3B8B6} = {46E3711F-18BD-4004-AF53-EA4D8643D92F} EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {23383776-1F27-4B5D-8C7C-57BFF75FA473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -243,5 +246,9 @@ Global {F8FCEF7B-72EA-48BC-AC68-E11244B067DD}.Debug|Any CPU.Build.0 = Debug|Any CPU {F8FCEF7B-72EA-48BC-AC68-E11244B067DD}.Release|Any CPU.ActiveCfg = Release|Any CPU {F8FCEF7B-72EA-48BC-AC68-E11244B067DD}.Release|Any CPU.Build.0 = Release|Any CPU + {783C743A-85BF-4382-BFE5-7A90E3F3B8B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {783C743A-85BF-4382-BFE5-7A90E3F3B8B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {783C743A-85BF-4382-BFE5-7A90E3F3B8B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {783C743A-85BF-4382-BFE5-7A90E3F3B8B6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal