media view count incrementation endpoint added, media page loading optimized, media view count incrementation on media page added

This commit is contained in:
2024-09-21 21:11:21 +02:00
Unverified
parent 6e2a38fb7c
commit 40fdc3f345
10 changed files with 112 additions and 44 deletions

View File

@@ -84,6 +84,18 @@ public class MediaController(IMediaControllerService mediaControllerService)
#region VIEW COUNT
[HttpPost("{id}/view")]
[AllowAnonymous]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult> PostMediaView([FromRoute] long id) => await mediaControllerService.PostMediaView(id);
#endregion
#region POSTER
[HttpGet("{id}/poster")]

View File

@@ -16,9 +16,11 @@ public interface IMediaControllerService
Task<RequestResult> PutMediaRating(long mediaId, MediaRatingRequest data);
Task<RequestResult> DeleteMediaRating(long mediaId);
Task<RequestResult> GetMediaPoster(long id);
Task<RequestResult> PutMediaPoster(long id, MediaPosterRequest data);
Task<RequestResult> DeleteMediaPoster(long id);
Task<RequestResult> PostMediaView(long mediaId);
Task<RequestResult> GetMediaPoster(long mediaId);
Task<RequestResult> PutMediaPoster(long mediaId, MediaPosterRequest data);
Task<RequestResult> DeleteMediaPoster(long mediaId);
Task<RequestResult> GetPhoto(Guid id);
Task<RequestResult> GetPhotos(MediaPhotoQueryParameters query);

View File

@@ -5,6 +5,7 @@ using WatchIt.Common.Model.Media;
using WatchIt.Database;
using WatchIt.Database.Model.Media;
using WatchIt.Database.Model.Rating;
using WatchIt.Database.Model.ViewCount;
using WatchIt.WebAPI.Services.Controllers.Common;
using WatchIt.WebAPI.Services.Utility.User;
@@ -184,11 +185,44 @@ public class MediaControllerService(DatabaseContext database, IUserService userS
#endregion
#region View count
public async Task<RequestResult> PostMediaView(long mediaId)
{
Database.Model.Media.Media? item = await database.Media.FirstOrDefaultAsync(x => x.Id == mediaId);
if (item is null)
{
return RequestResult.NotFound();
}
DateOnly dateNow = DateOnly.FromDateTime(DateTime.Now);
ViewCountMedia? viewCount = await database.ViewCountsMedia.FirstOrDefaultAsync(x => x.MediaId == mediaId && x.Date == dateNow);
if (viewCount is null)
{
viewCount = new ViewCountMedia
{
MediaId = mediaId,
Date = dateNow,
ViewCount = 1
};
await database.ViewCountsMedia.AddAsync(viewCount);
}
else
{
viewCount.ViewCount++;
}
await database.SaveChangesAsync();
return RequestResult.Ok();
}
#endregion
#region Poster
public async Task<RequestResult> GetMediaPoster(long id)
public async Task<RequestResult> GetMediaPoster(long mediaId)
{
Database.Model.Media.Media? media = await database.Media.FirstOrDefaultAsync(x => x.Id == id);
Database.Model.Media.Media? media = await database.Media.FirstOrDefaultAsync(x => x.Id == mediaId);
if (media is null)
{
return RequestResult.BadRequest();
@@ -204,7 +238,7 @@ public class MediaControllerService(DatabaseContext database, IUserService userS
return RequestResult.Ok(data);
}
public async Task<RequestResult> PutMediaPoster(long id, MediaPosterRequest data)
public async Task<RequestResult> PutMediaPoster(long mediaId, MediaPosterRequest data)
{
UserValidator validator = userService.GetValidator().MustBeAdmin();
if (!validator.IsValid)
@@ -212,7 +246,7 @@ public class MediaControllerService(DatabaseContext database, IUserService userS
return RequestResult.Forbidden();
}
Database.Model.Media.Media? media = await database.Media.FirstOrDefaultAsync(x => x.Id == id);
Database.Model.Media.Media? media = await database.Media.FirstOrDefaultAsync(x => x.Id == mediaId);
if (media is null)
{
return RequestResult.BadRequest();
@@ -236,7 +270,7 @@ public class MediaControllerService(DatabaseContext database, IUserService userS
return RequestResult.Ok();
}
public async Task<RequestResult> DeleteMediaPoster(long id)
public async Task<RequestResult> DeleteMediaPoster(long mediaId)
{
UserValidator validator = userService.GetValidator().MustBeAdmin();
if (!validator.IsValid)
@@ -244,7 +278,7 @@ public class MediaControllerService(DatabaseContext database, IUserService userS
return RequestResult.Forbidden();
}
Database.Model.Media.Media? media = await database.Media.FirstOrDefaultAsync(x => x.Id == id);
Database.Model.Media.Media? media = await database.Media.FirstOrDefaultAsync(x => x.Id == mediaId);
if (media?.MediaPosterImage != null)
{

View File

@@ -11,6 +11,7 @@ public class Media
public string GetMediaRatingByUser { get; set; }
public string PutMediaRating { get; set; }
public string DeleteMediaRating { get; set; }
public string PostMediaView { get; set; }
public string GetPhotoMediaRandomBackground { get; set; }
public string GetPoster { get; set; }
public string PutPoster { get; set; }

View File

@@ -15,6 +15,8 @@ public interface IMediaWebAPIService
Task PutMediaRating(long mediaId, MediaRatingRequest body, Action? successAction = null, Action<IDictionary<string, string[]>>? badRequestAction = null, Action? unauthorizedAction = null, Action? notFoundAction = null);
Task DeleteMediaRating(long mediaId, Action? successAction = null, Action? unauthorizedAction = null);
Task PostMediaView(long mediaId, Action? successAction = null, Action? notFoundAction = null);
Task GetPhotoMediaRandomBackground(long mediaId, Action<MediaPhotoResponse>? successAction = null, Action? notFoundAction = null);
Task GetPhotoRandomBackground(Action<MediaPhotoResponse>? successAction = null, Action? notFoundAction = null);
Task GetPoster(long mediaId, Action<MediaPosterResponse>? successAction = null, Action<IDictionary<string, string[]>>? badRequestAction = null, Action? notFoundAction = null);

View File

@@ -114,6 +114,22 @@ public class MediaWebAPIService(IHttpClientService httpClientService, IConfigura
#endregion
#region View count
public async Task PostMediaView(long mediaId, Action? successAction = null, Action? notFoundAction = null)
{
string url = GetUrl(EndpointsConfiguration.Media.PostMediaView, mediaId);
HttpRequest request = new HttpRequest(HttpMethodType.Post, url);
HttpResponse response = await httpClientService.SendRequestAsync(request);
response.RegisterActionFor2XXSuccess(successAction)
.RegisterActionFor404NotFound(notFoundAction)
.ExecuteAction();
}
#endregion
public async Task GetPhotoMediaRandomBackground(long mediaId, Action<MediaPhotoResponse>? successAction = null, Action? notFoundAction = null)

View File

@@ -9,7 +9,7 @@ using WatchIt.Website.Services.WebAPI.Movies;
namespace WatchIt.Website.Pages;
public partial class MediaDataPage : ComponentBase
public partial class MediaPage : ComponentBase
{
#region SERVICES
@@ -56,49 +56,49 @@ public partial class MediaDataPage : ComponentBase
{
if (firstRender)
{
await MediaWebAPIService.GetMedia(Id, data => _media = data, () => _error = $"Media with id {Id} was not found");
List<Task> step1Tasks = new List<Task>();
List<Task> step2Tasks = new List<Task>();
List<Task> endTasks = new List<Task>();
// STEP 0
step1Tasks.AddRange(
[
MediaWebAPIService.GetMedia(Id, data => _media = data, () => _error = $"Media with id {Id} was not found")
]);
// STEP 1
await Task.WhenAll(step1Tasks);
if (_error is null)
{
Task backgroundTask = MediaWebAPIService.GetPhotoMediaRandomBackground(Id, data => _background = data);
Task posterTask = MediaWebAPIService.GetPoster(Id, data => _poster = data);
Task<User?> userTask = AuthenticationService.GetUserAsync();
Task genresTask = MediaWebAPIService.GetMediaGenres(Id, data => _genres = data);
Task globalRatingTask = MediaWebAPIService.GetMediaRating(Id, data => _globalRating = data);
Task specificMediaTask;
if (_media.Type == MediaType.Movie)
{
specificMediaTask = MoviesWebAPIService.Get(Id, data => _movie = data);
}
else
{
// TODO: download tv series info
specificMediaTask = null;
}
await Task.WhenAll(
step2Tasks.AddRange(
[
userTask,
specificMediaTask,
genresTask,
globalRatingTask,
backgroundTask,
posterTask,
Task.Run(async () => _user = await AuthenticationService.GetUserAsync())
]);
_user = await userTask;
endTasks.AddRange(
[
MediaWebAPIService.PostMediaView(Id),
MediaWebAPIService.GetPhotoMediaRandomBackground(Id, data => _background = data),
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,
]);
}
if (_user is not null)
// STEP 2
await Task.WhenAll(step2Tasks);
if (_error is null && _user is not null)
{
Task userRatingTask = MediaWebAPIService.GetMediaRatingByUser(Id, _user.Id, data => _userRating = data);
await Task.WhenAll(
endTasks.AddRange(
[
userRatingTask,
MediaWebAPIService.GetMediaRatingByUser(Id, _user.Id, data => _userRating = data)
]);
}
// END
await Task.WhenAll(endTasks);
_loaded = true;
StateHasChanged();
}

View File

@@ -46,6 +46,7 @@
"GetMediaRatingByUser": "/{0}/rating/{1}",
"PutMediaRating": "/{0}/rating",
"DeleteMediaRating": "/{0}/rating",
"PostMediaView": "/{0}/view",
"GetPhotoMediaRandomBackground": "/{0}/photos/random_background",
"GetPoster": "/{0}/poster",