diff --git a/WatchIt.Common/WatchIt.Common.Model/Media/MediaPoster.cs b/WatchIt.Common/WatchIt.Common.Model/Media/MediaPoster.cs index dfa79e8..d4f4aab 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Media/MediaPoster.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Media/MediaPoster.cs @@ -4,9 +4,21 @@ namespace WatchIt.Common.Model.Media; public abstract class MediaPoster { + #region PROPERTIES + [JsonPropertyName("image")] public required byte[] Image { get; set; } [JsonPropertyName("mime_type")] public required string MimeType { get; set; } + + #endregion + + + + #region PUBLIC METHODS + + public override string ToString() => $"data:{MimeType};base64,{Convert.ToBase64String(Image)}"; + + #endregion } \ No newline at end of file diff --git a/WatchIt.Common/WatchIt.Common.Model/Media/MediaPosterRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Media/MediaPosterRequest.cs index 7e8224e..5a9fa95 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Media/MediaPosterRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Media/MediaPosterRequest.cs @@ -1,9 +1,24 @@ -using WatchIt.Database.Model.Media; +using System.Diagnostics.CodeAnalysis; +using WatchIt.Database.Model.Media; namespace WatchIt.Common.Model.Media; public class MediaPosterRequest : MediaPoster { + #region CONSTRUCTORS + + public MediaPosterRequest() {} + + [SetsRequiredMembers] + public MediaPosterRequest(MediaPosterResponse response) + { + Image = response.Image; + MimeType = response.MimeType; + } + + #endregion + + public MediaPosterImage CreateMediaPosterImage() => new MediaPosterImage { Image = Image, @@ -14,6 +29,6 @@ public class MediaPosterRequest : MediaPoster { item.Image = Image; item.MimeType = MimeType; - item.UploadDate = DateTime.Now; + item.UploadDate = DateTime.UtcNow; } } \ 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 57388b9..045308c 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/MediaController.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Controllers/MediaController.cs @@ -107,7 +107,7 @@ public class MediaController(IMediaControllerService mediaControllerService) [HttpPut("{id}/poster")] [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] - [ProducesResponseType(typeof(void), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(MediaPosterResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)] 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 7f4281d..d33cea2 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 @@ -267,7 +267,8 @@ public class MediaControllerService(DatabaseContext database, IUserService userS await database.SaveChangesAsync(); - return RequestResult.Ok(); + MediaPosterResponse returnData = new MediaPosterResponse(media.MediaPosterImage); + return RequestResult.Ok(returnData); } public async Task DeleteMediaPoster(long mediaId) diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Series/SeriesRequestValidator.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Series/SeriesRequestValidator.cs new file mode 100644 index 0000000..ba38f66 --- /dev/null +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Validators/Series/SeriesRequestValidator.cs @@ -0,0 +1,14 @@ +using FluentValidation; +using WatchIt.Common.Model.Series; + +namespace WatchIt.WebAPI.Validators.Movies; + +public class SeriesRequestValidator : AbstractValidator +{ + public SeriesRequestValidator() + { + RuleFor(x => x.Title).NotEmpty().MaximumLength(250); + RuleFor(x => x.OriginalTitle).MaximumLength(250); + RuleFor(x => x.Description).MaximumLength(1000); + } +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/IMediaWebAPIService.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/IMediaWebAPIService.cs index 6e9a0df..923607d 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 @@ -20,6 +20,6 @@ public interface IMediaWebAPIService Task GetPhotoMediaRandomBackground(long mediaId, Action? successAction = null, Action? notFoundAction = null); Task GetPhotoRandomBackground(Action? successAction = null, Action? notFoundAction = null); Task GetPoster(long mediaId, Action? successAction = null, Action>? badRequestAction = null, Action? notFoundAction = null); - Task PutPoster(long mediaId, MediaPosterRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); + Task PutPoster(long mediaId, MediaPosterRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null); Task DeletePoster(long mediaId, 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.Media/MediaWebAPIService.cs b/WatchIt.Website/WatchIt.Website.Services/WatchIt.Website.Services.WebAPI/WatchIt.Website.Services.WebAPI.Media/MediaWebAPIService.cs index e8541bd..b8780fd 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 @@ -169,7 +169,7 @@ public class MediaWebAPIService(IHttpClientService httpClientService, IConfigura .ExecuteAction(); } - public async Task PutPoster(long mediaId, MediaPosterRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) + public async Task PutPoster(long mediaId, MediaPosterRequest data, Action? successAction = null, Action>? badRequestAction = null, Action? unauthorizedAction = null, Action? forbiddenAction = null) { string url = GetUrl(EndpointsConfiguration.Media.PutPoster, mediaId); diff --git a/WatchIt.Website/WatchIt.Website/App.razor b/WatchIt.Website/WatchIt.Website/App.razor index 22f3f63..51bd262 100644 --- a/WatchIt.Website/WatchIt.Website/App.razor +++ b/WatchIt.Website/WatchIt.Website/App.razor @@ -10,7 +10,7 @@ - + diff --git a/WatchIt.Website/WatchIt.Website/Components/ErrorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/ErrorComponent.razor new file mode 100644 index 0000000..6f1c699 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/ErrorComponent.razor @@ -0,0 +1,32 @@ +
+
+
+
+
+
+
+
⚠︎
+
+
+
+
+
+
+

An error occured while loading a page

+
+
+
+ @if (!string.IsNullOrWhiteSpace(ErrorMessage)) + { +
+
+
+

@ErrorMessage

+
+
+
+ } +
+
+
+
\ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/ErrorComponent.razor.cs b/WatchIt.Website/WatchIt.Website/Components/ErrorComponent.razor.cs new file mode 100644 index 0000000..20cde5f --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/ErrorComponent.razor.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Components; + +namespace WatchIt.Website.Components; + +public partial class ErrorComponent : ComponentBase +{ + #region PARAMETERS + + [Parameter] public string? ErrorMessage { get; set; } + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/ErrorComponent.razor.css b/WatchIt.Website/WatchIt.Website/Components/ErrorComponent.razor.css new file mode 100644 index 0000000..0c799f5 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/ErrorComponent.razor.css @@ -0,0 +1,5 @@ +/* CLASSES */ + +.icon-size { + font-size: 80px; +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/LoadingPageComponent.razor b/WatchIt.Website/WatchIt.Website/Components/LoadingComponent.razor similarity index 100% rename from WatchIt.Website/WatchIt.Website/Components/LoadingPageComponent.razor rename to WatchIt.Website/WatchIt.Website/Components/LoadingComponent.razor diff --git a/WatchIt.Website/WatchIt.Website/Components/LoadingPageComponent.razor.css b/WatchIt.Website/WatchIt.Website/Components/LoadingComponent.razor.css similarity index 100% rename from WatchIt.Website/WatchIt.Website/Components/LoadingPageComponent.razor.css rename to WatchIt.Website/WatchIt.Website/Components/LoadingComponent.razor.css diff --git a/WatchIt.Website/WatchIt.Website/Components/MediaFormComponent.razor.cs b/WatchIt.Website/WatchIt.Website/Components/MediaFormComponent.razor.cs index e99b263..ff5340f 100644 --- a/WatchIt.Website/WatchIt.Website/Components/MediaFormComponent.razor.cs +++ b/WatchIt.Website/WatchIt.Website/Components/MediaFormComponent.razor.cs @@ -80,7 +80,7 @@ public partial class MediaFormComponent : ComponentBase private async Task SavePoster() { - void SuccessAction() + void SuccessAction(MediaPosterResponse data) { _actualPosterBase64 = _posterBase64; _actualPosterMediaType = _posterMediaType; diff --git a/WatchIt.Website/WatchIt.Website/Components/NoPermissionComponent.razor b/WatchIt.Website/WatchIt.Website/Components/NoPermissionComponent.razor deleted file mode 100644 index 66495cf..0000000 --- a/WatchIt.Website/WatchIt.Website/Components/NoPermissionComponent.razor +++ /dev/null @@ -1,7 +0,0 @@ -
-
-
-

Sorry. You have no permission to view this site.

-
-
-
\ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Layout/MainLayout.razor b/WatchIt.Website/WatchIt.Website/Layout/MainLayout.razor index 8daab63..0b21658 100644 --- a/WatchIt.Website/WatchIt.Website/Layout/MainLayout.razor +++ b/WatchIt.Website/WatchIt.Website/Layout/MainLayout.razor @@ -3,7 +3,7 @@ @if (_loaded) {
-
+
+

New movie

-

New TV series

@@ -27,7 +26,11 @@ } else { - + } -
-} \ No newline at end of file + } + else + { + + } +
\ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Pages/AuthPage.razor.cs b/WatchIt.Website/WatchIt.Website/Pages/AuthPage.razor.cs index b58b7e0..f45313f 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/AuthPage.razor.cs +++ b/WatchIt.Website/WatchIt.Website/Pages/AuthPage.razor.cs @@ -66,28 +66,32 @@ public partial class AuthPage #region METHODS - protected override async Task OnInitializedAsync() + protected override async Task OnAfterRenderAsync(bool firstRender) { - if (await AuthenticationService.GetAuthenticationStatusAsync()) + if (firstRender) { - NavigationManager.NavigateTo("/"); - } + if (await AuthenticationService.GetAuthenticationStatusAsync()) + { + NavigationManager.NavigateTo("/"); + } - Action backgroundSuccess = (data) => - { - string imageBase64 = Convert.ToBase64String(data.Image); - string firstColor = BitConverter.ToString(data.Background.FirstGradientColor) - .Replace("-", string.Empty); - string secondColor = BitConverter.ToString(data.Background.SecondGradientColor) - .Replace("-", string.Empty); + Action backgroundSuccess = (data) => + { + string imageBase64 = Convert.ToBase64String(data.Image); + string firstColor = BitConverter.ToString(data.Background.FirstGradientColor) + .Replace("-", string.Empty); + string secondColor = BitConverter.ToString(data.Background.SecondGradientColor) + .Replace("-", string.Empty); - _background = $"data:{data.MimeType};base64,{imageBase64}"; - _firstGradientColor = $"#{firstColor}"; - _secondGradientColor = $"#{secondColor}"; - }; - await MediaWebAPIService.GetPhotoRandomBackground(backgroundSuccess); + _background = $"data:{data.MimeType};base64,{imageBase64}"; + _firstGradientColor = $"#{firstColor}"; + _secondGradientColor = $"#{secondColor}"; + }; + await MediaWebAPIService.GetPhotoRandomBackground(backgroundSuccess); - _loaded = true; + _loaded = true; + StateHasChanged(); + } } private async Task Login() diff --git a/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor b/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor new file mode 100644 index 0000000..5f4e437 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor @@ -0,0 +1,230 @@ +@using WatchIt.Common.Model.Movies +@using WatchIt.Common.Model.Series + +@page "/media/{id:long}/edit" +@page "/media/new/{type}" + + + + WatchIt - + @if (_loaded) + { + if (string.IsNullOrWhiteSpace(_error) && _user?.IsAdmin == true) + { + if (_media is not null) + { + @($"Edit \"")@(_media.Title)@("\"") + } + else + { + if (_movieRequest is null) + { + @("New TV series") + } + else + { + @("New movie") + } + } + } + else + { + @("Error") + } + } + else + { + @("Loading") + } + + +
+ @if (_loaded) + { + if (string.IsNullOrWhiteSpace(_error)) + { + if (_user?.IsAdmin == true) + { +
+
+
+

@(_media is not null ? "Edit" : "Create new") @(_movieRequest is not null ? "movie" : "series")@(_media is not null ? $" \"{_media.Title}\"" : string.Empty)

+
+
+
+
+
+
+
+
+
+ poster +
+
+
+
+ +
+
+ @if (_mediaPosterChanged || _mediaPosterSaved is not null) + { +
+ @if (_mediaPosterChanged) + { +
+ +
+
+ +
+ } + else if (_mediaPosterSaved is not null) + { +
+ +
+ } +
+ } +
+
+
+
+
+ + +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+ @if (_mediaRequest is MovieRequest) + { +
+ +
+ +
+
+ } + else + { +
+ +
+
+ +
+ + Yes +
+
+ + No +
+
+
+
+
+ } +
+
+
+ @if (!string.IsNullOrWhiteSpace(_basicDataError)) + { +
@_basicDataError
+ } + +
+
+
+
+
+
+
+
+ } + else + { + + } + } + else + { + + } + } + else + { + + } +
+ + + +@if (_background is not null) +{ + +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor.cs b/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor.cs new file mode 100644 index 0000000..6d98912 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor.cs @@ -0,0 +1,254 @@ +using System.Diagnostics; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; +using WatchIt.Common.Model.Media; +using WatchIt.Common.Model.Movies; +using WatchIt.Common.Model.Series; +using WatchIt.Website.Services.Utility.Authentication; +using WatchIt.Website.Services.WebAPI.Media; +using WatchIt.Website.Services.WebAPI.Movies; +using WatchIt.Website.Services.WebAPI.Series; + +namespace WatchIt.Website.Pages; + +public partial class MediaEditPage : ComponentBase +{ + #region SERVICES + + [Inject] public NavigationManager NavigationManager { get; set; } = default!; + [Inject] public IAuthenticationService AuthenticationService { get; set; } = default!; + [Inject] public IMediaWebAPIService MediaWebAPIService { get; set; } = default!; + [Inject] public IMoviesWebAPIService MoviesWebAPIService { get; set; } = default!; + [Inject] public ISeriesWebAPIService SeriesWebAPIService { get; set; } = default!; + + #endregion + + + + #region PARAMETERS + + [Parameter] public long? Id { get; set; } + [Parameter] public string? Type { get; set; } + + #endregion + + + + #region FIELDS + + private bool _loaded = false; + private string? _error; + + private User? _user; + + private MediaPhotoResponse? _background; + + private MediaResponse? _media; + private MovieRequest? _movieRequest; + private SeriesRequest? _seriesRequest; + private Media? _mediaRequest => _movieRequest is not null ? _movieRequest : _seriesRequest; + private bool _basicDataSaving; + private string? _basicDataError; + + private MediaPosterResponse? _mediaPosterSaved; + private MediaPosterRequest? _mediaPosterRequest; + private bool _mediaPosterChanged; + private bool _mediaPosterSaving; + private bool _mediaPosterDeleting; + + #endregion + + + + #region PRIVATE METHODS + + #region Main + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + List step1Tasks = new List(); + List step2Tasks = new List(); + List endTasks = new List(); + + // STEP 0 + step1Tasks.AddRange( + [ + Task.Run(async () => _user = await AuthenticationService.GetUserAsync()) + ]); + + // STEP 1 + await Task.WhenAll(step1Tasks); + if (_user is not null && _user.IsAdmin) + { + step2Tasks.AddRange( + [ + InitializeMedia() + ]); + } + + // STEP 2 + await Task.WhenAll(step2Tasks); + if (_user is not null && _user.IsAdmin && _media is not null) + { + endTasks.AddRange( + [ + MediaWebAPIService.GetPhotoMediaRandomBackground(Id.Value, data => _background = data), + MediaWebAPIService.GetPoster(Id.Value, data => + { + _mediaPosterSaved = data; + _mediaPosterRequest = new MediaPosterRequest(data); + }) + ]); + } + + await Task.WhenAll(endTasks); + + _loaded = true; + StateHasChanged(); + } + } + + private async Task InitializeMedia() + { + if (Id.HasValue) + { + await MediaWebAPIService.GetMedia(Id.Value, data => _media = data, () => NavigationManager.NavigateTo("/media/new/movie")); + if (_media.Type == MediaType.Movie) + { + await MoviesWebAPIService.GetMovie(Id.Value, data => _movieRequest = new MovieRequest(data)); + } + else + { + await SeriesWebAPIService.GetSeries(Id.Value, data => _seriesRequest = new SeriesRequest(data)); + } + } + else + { + if (!string.IsNullOrWhiteSpace(Type) && Type == "series") + { + _seriesRequest = new SeriesRequest + { + Title = string.Empty + }; + } + else + { + _movieRequest = new MovieRequest + { + Title = string.Empty + }; + } + } + } + + #endregion + + #region Poster + + private async Task LoadPoster(InputFileChangeEventArgs args) + { + if (args.File.ContentType.StartsWith("image")) + { + Stream stream = args.File.OpenReadStream(5242880); + byte[] array; + using (MemoryStream ms = new MemoryStream()) + { + await stream.CopyToAsync(ms); + array = ms.ToArray(); + } + + _mediaPosterRequest = new MediaPosterRequest() + { + Image = array, + MimeType = args.File.ContentType + }; + _mediaPosterChanged = true; + } + } + + private async Task SavePoster() + { + void Success(MediaPosterResponse data) + { + _mediaPosterSaved = data; + _mediaPosterRequest = new MediaPosterRequest(data); + _mediaPosterChanged = false; + _mediaPosterSaving = false; + } + + _mediaPosterSaving = true; + await MediaWebAPIService.PutPoster(Id.Value, _mediaPosterRequest, Success); + } + + private void CancelPoster() + { + _mediaPosterRequest = _mediaPosterSaved is not null ? new MediaPosterRequest(_mediaPosterSaved) : null; + _mediaPosterChanged = false; + } + + private async Task DeletePoster() + { + void Success() + { + _mediaPosterSaved = null; + _mediaPosterRequest = null; + _mediaPosterChanged = false; + _mediaPosterDeleting = false; + } + + _mediaPosterDeleting = true; + await MediaWebAPIService.DeletePoster(Id.Value, Success); + } + + #endregion + + #region Basic data + + private async Task SaveBasicData() + { + void SuccessPost(long id) + { + _basicDataSaving = false; + NavigationManager.NavigateTo($"/media/{id}/edit", true); + } + + void BadRequest(IDictionary errors) + { + _basicDataError = errors.SelectMany(x => x.Value).FirstOrDefault(); + if (!string.IsNullOrWhiteSpace(_basicDataError)) + { + _basicDataSaving = false; + } + } + + _basicDataSaving = true; + if (_media is null) + { + if (_movieRequest is not null) + { + await MoviesWebAPIService.PostMovie(_movieRequest, data => SuccessPost(data.Id), BadRequest); + } + else + { + await SeriesWebAPIService.PostSeries(_seriesRequest, data => SuccessPost(data.Id), BadRequest); + } + } + else + { + if (_movieRequest is not null) + { + await MoviesWebAPIService.PutMovie(Id.Value, _movieRequest, () => _basicDataSaving = false, BadRequest); + } + else + { + await SeriesWebAPIService.PutSeries(Id.Value, _seriesRequest, () => _basicDataSaving = false, BadRequest); + } + } + } + + #endregion + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Pages/MovieEditPage.razor.css b/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor.css similarity index 100% rename from WatchIt.Website/WatchIt.Website/Pages/MovieEditPage.razor.css rename to WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor.css diff --git a/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor b/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor index 405a02a..38578d1 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor +++ b/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor @@ -24,14 +24,14 @@ else -
+
@if (_loaded) { if (string.IsNullOrWhiteSpace(_error)) {
- poster + poster
@@ -187,18 +187,12 @@ else } else { -
-
-
-

@_error

-
-
-
+ } } else { - + }
diff --git a/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor.cs b/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor.cs index d34b7ac..cae3342 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor.cs +++ b/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor.cs @@ -24,8 +24,7 @@ public partial class MediaPage : ComponentBase #region PARAMETERS - [Parameter] - public long Id { get; set; } + [Parameter] public long Id { get; set; } #endregion diff --git a/WatchIt.Website/WatchIt.Website/Pages/MovieEditPage.razor b/WatchIt.Website/WatchIt.Website/Pages/MovieEditPage.razor deleted file mode 100644 index 991f676..0000000 --- a/WatchIt.Website/WatchIt.Website/Pages/MovieEditPage.razor +++ /dev/null @@ -1,23 +0,0 @@ -@page "/movies/new" -@page "/movies/{id:long}/edit" - -WatchIt - New movie - -@if (_loaded) -{ -
- @if (_authenticated) - { -
-
-

@(Id is null ? "Create new movie" : $"Edit movie \"{_movieInfo.Title}\"")

-
-
- - } - else - { - - } -
-} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Pages/MovieEditPage.razor.cs b/WatchIt.Website/WatchIt.Website/Pages/MovieEditPage.razor.cs deleted file mode 100644 index f1d17c1..0000000 --- a/WatchIt.Website/WatchIt.Website/Pages/MovieEditPage.razor.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System.Diagnostics; -using Microsoft.AspNetCore.Components; -using WatchIt.Common.Model.Movies; -using WatchIt.Website.Services.Utility.Authentication; -using WatchIt.Website.Services.WebAPI.Movies; - -namespace WatchIt.Website.Pages; - -public partial class MovieEditPage : ComponentBase -{ - #region SERVICES - - [Inject] public NavigationManager NavigationManager { get; set; } = default!; - [Inject] public IAuthenticationService AuthenticationService { get; set; } = default!; - [Inject] public IMoviesWebAPIService MoviesWebAPIService { get; set; } = default!; - - #endregion - - - - #region PARAMETERS - - [Parameter] - public long? Id { get; set; } - - #endregion - - - - #region FIELDS - - private bool _loaded = false; - private bool _authenticated = false; - - private MovieResponse? _movieInfo = null; - - private MovieRequest _movieData = new MovieRequest { Title = string.Empty }; - private IEnumerable? _movieDataErrors = null; - private string? _movieDataInfo = null; - - #endregion - - - - #region PRIVATE METHODS - - protected override async Task OnAfterRenderAsync(bool firstRender) - { - if (firstRender) - { - User? user = await AuthenticationService.GetUserAsync(); - if (user is not null && user.IsAdmin) - { - _authenticated = true; - - await LoadData(); - } - _loaded = true; - StateHasChanged(); - } - } - - private async Task LoadData() - { - if (Id is not null) - { - await MoviesWebAPIService.GetMovie(Id.Value, GetSuccessAction, NoIdAction); - } - - return; - - void GetSuccessAction(MovieResponse data) - { - _movieInfo = data; - _movieData = new MovieRequest(_movieInfo); - } - void NoIdAction() => NavigationManager.NavigateTo("/movies/new", true); // await for all - } - - private async Task SaveData() - { - _movieDataErrors = null; - _movieDataInfo = null; - if (Id is null) - { - await MoviesWebAPIService.PostMovie(_movieData, PostSuccessAction, BadRequestAction, NoPermissionsAction, NoPermissionsAction); - } - else - { - await MoviesWebAPIService.PutMovie(Id.Value, _movieData, PutSuccessAction, BadRequestAction, NoPermissionsAction, NoPermissionsAction); - } - - return; - - void PutSuccessAction() => _movieDataInfo = "Data saved"; - void PostSuccessAction(MovieResponse data) => NavigationManager.NavigateTo($"/movies/{data.Id}/edit", true); - void BadRequestAction(IDictionary errors) => _movieDataErrors = errors.SelectMany(x => x.Value); - void NoPermissionsAction() => NavigationManager.Refresh(true); - } - - #endregion -} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Program.cs b/WatchIt.Website/WatchIt.Website/Program.cs index 6df2926..133fc07 100644 --- a/WatchIt.Website/WatchIt.Website/Program.cs +++ b/WatchIt.Website/WatchIt.Website/Program.cs @@ -8,6 +8,7 @@ using WatchIt.Website.Services.Utility.Tokens; using WatchIt.Website.Services.WebAPI.Accounts; using WatchIt.Website.Services.WebAPI.Media; using WatchIt.Website.Services.WebAPI.Movies; +using WatchIt.Website.Services.WebAPI.Series; namespace WatchIt.Website; @@ -62,6 +63,7 @@ public static class Program builder.Services.AddScoped(); 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 5f45cd9..7dbaed0 100644 --- a/WatchIt.Website/WatchIt.Website/WatchIt.Website.csproj +++ b/WatchIt.Website/WatchIt.Website/WatchIt.Website.csproj @@ -22,6 +22,7 @@ +