Merge pull request #59 from mateuszskoczek/features/media_view_counter
Features/media view counter
This commit is contained in:
@@ -81,6 +81,18 @@ public class MediaController(IMediaControllerService mediaControllerService)
|
|||||||
public async Task<ActionResult> DeleteMediaRating([FromRoute] long id) => await mediaControllerService.DeleteMediaRating(id);
|
public async Task<ActionResult> DeleteMediaRating([FromRoute] long id) => await mediaControllerService.DeleteMediaRating(id);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,18 +11,41 @@ namespace WatchIt.WebAPI.Controllers;
|
|||||||
|
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("movies")]
|
[Route("movies")]
|
||||||
public class MoviesController(IMoviesControllerService moviesControllerService) : ControllerBase
|
public class MoviesController : ControllerBase
|
||||||
{
|
{
|
||||||
|
#region SERVICES
|
||||||
|
|
||||||
|
private readonly IMoviesControllerService _moviesControllerService;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public MoviesController(IMoviesControllerService moviesControllerService)
|
||||||
|
{
|
||||||
|
_moviesControllerService = moviesControllerService;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region METHODS
|
||||||
|
|
||||||
|
#region Main
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
[ProducesResponseType(typeof(IEnumerable<MovieResponse>), StatusCodes.Status200OK)]
|
[ProducesResponseType(typeof(IEnumerable<MovieResponse>), StatusCodes.Status200OK)]
|
||||||
public async Task<ActionResult> GetAll(MovieQueryParameters query) => await moviesControllerService.GetAll(query);
|
public async Task<ActionResult> GetAllMovies(MovieQueryParameters query) => await _moviesControllerService.GetAllMovies(query);
|
||||||
|
|
||||||
[HttpGet("{id}")]
|
[HttpGet("{id}")]
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
[ProducesResponseType(typeof(MovieResponse), StatusCodes.Status200OK)]
|
[ProducesResponseType(typeof(MovieResponse), StatusCodes.Status200OK)]
|
||||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||||
public async Task<ActionResult> Get([FromRoute]long id) => await moviesControllerService.Get(id);
|
public async Task<ActionResult> GetMovie([FromRoute] long id) => await _moviesControllerService.GetMovie(id);
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
|
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
|
||||||
@@ -30,7 +53,7 @@ public class MoviesController(IMoviesControllerService moviesControllerService)
|
|||||||
[ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)]
|
[ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)]
|
||||||
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
|
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
|
||||||
[ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)]
|
[ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)]
|
||||||
public async Task<ActionResult> Post([FromBody]MovieRequest body) => await moviesControllerService.Post(body);
|
public async Task<ActionResult> PostMovie([FromBody] MovieRequest body) => await _moviesControllerService.PostMovie(body);
|
||||||
|
|
||||||
[HttpPut("{id}")]
|
[HttpPut("{id}")]
|
||||||
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
|
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
|
||||||
@@ -38,12 +61,26 @@ public class MoviesController(IMoviesControllerService moviesControllerService)
|
|||||||
[ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)]
|
[ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)]
|
||||||
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
|
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
|
||||||
[ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)]
|
[ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)]
|
||||||
public async Task<ActionResult> Put([FromRoute]long id, [FromBody]MovieRequest body) => await moviesControllerService.Put(id, body);
|
public async Task<ActionResult> PutMovie([FromRoute] long id, [FromBody]MovieRequest body) => await _moviesControllerService.PutMovie(id, body);
|
||||||
|
|
||||||
[HttpDelete("{id}")]
|
[HttpDelete("{id}")]
|
||||||
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
|
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
|
||||||
[ProducesResponseType(typeof(void), StatusCodes.Status204NoContent)]
|
[ProducesResponseType(typeof(void), StatusCodes.Status204NoContent)]
|
||||||
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
|
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
|
||||||
[ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)]
|
[ProducesResponseType(typeof(void), StatusCodes.Status403Forbidden)]
|
||||||
public async Task<ActionResult> Delete([FromRoute] long id) => await moviesControllerService.Delete(id);
|
public async Task<ActionResult> DeleteMovie([FromRoute] long id) => await _moviesControllerService.DeleteMovie(id);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region View count
|
||||||
|
|
||||||
|
[HttpGet("view")]
|
||||||
|
[AllowAnonymous]
|
||||||
|
[ProducesResponseType(typeof(IEnumerable<MovieResponse>), StatusCodes.Status200OK)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||||
|
public async Task<ActionResult> GetMoviesViewRank([FromQuery] int first = 5, [FromQuery] int days = 7) => await _moviesControllerService.GetMoviesViewRank(first, days);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
@@ -15,10 +15,12 @@ public interface IMediaControllerService
|
|||||||
Task<RequestResult> GetMediaRatingByUser(long mediaId, long userId);
|
Task<RequestResult> GetMediaRatingByUser(long mediaId, long userId);
|
||||||
Task<RequestResult> PutMediaRating(long mediaId, MediaRatingRequest data);
|
Task<RequestResult> PutMediaRating(long mediaId, MediaRatingRequest data);
|
||||||
Task<RequestResult> DeleteMediaRating(long mediaId);
|
Task<RequestResult> DeleteMediaRating(long mediaId);
|
||||||
|
|
||||||
|
Task<RequestResult> PostMediaView(long mediaId);
|
||||||
|
|
||||||
Task<RequestResult> GetMediaPoster(long id);
|
Task<RequestResult> GetMediaPoster(long mediaId);
|
||||||
Task<RequestResult> PutMediaPoster(long id, MediaPosterRequest data);
|
Task<RequestResult> PutMediaPoster(long mediaId, MediaPosterRequest data);
|
||||||
Task<RequestResult> DeleteMediaPoster(long id);
|
Task<RequestResult> DeleteMediaPoster(long mediaId);
|
||||||
|
|
||||||
Task<RequestResult> GetPhoto(Guid id);
|
Task<RequestResult> GetPhoto(Guid id);
|
||||||
Task<RequestResult> GetPhotos(MediaPhotoQueryParameters query);
|
Task<RequestResult> GetPhotos(MediaPhotoQueryParameters query);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ using WatchIt.Common.Model.Media;
|
|||||||
using WatchIt.Database;
|
using WatchIt.Database;
|
||||||
using WatchIt.Database.Model.Media;
|
using WatchIt.Database.Model.Media;
|
||||||
using WatchIt.Database.Model.Rating;
|
using WatchIt.Database.Model.Rating;
|
||||||
|
using WatchIt.Database.Model.ViewCount;
|
||||||
using WatchIt.WebAPI.Services.Controllers.Common;
|
using WatchIt.WebAPI.Services.Controllers.Common;
|
||||||
using WatchIt.WebAPI.Services.Utility.User;
|
using WatchIt.WebAPI.Services.Utility.User;
|
||||||
|
|
||||||
@@ -182,13 +183,46 @@ public class MediaControllerService(DatabaseContext database, IUserService userS
|
|||||||
return RequestResult.Ok();
|
return RequestResult.Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#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
|
#endregion
|
||||||
|
|
||||||
#region Poster
|
#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)
|
if (media is null)
|
||||||
{
|
{
|
||||||
return RequestResult.BadRequest();
|
return RequestResult.BadRequest();
|
||||||
@@ -204,7 +238,7 @@ public class MediaControllerService(DatabaseContext database, IUserService userS
|
|||||||
return RequestResult.Ok(data);
|
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();
|
UserValidator validator = userService.GetValidator().MustBeAdmin();
|
||||||
if (!validator.IsValid)
|
if (!validator.IsValid)
|
||||||
@@ -212,7 +246,7 @@ public class MediaControllerService(DatabaseContext database, IUserService userS
|
|||||||
return RequestResult.Forbidden();
|
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)
|
if (media is null)
|
||||||
{
|
{
|
||||||
return RequestResult.BadRequest();
|
return RequestResult.BadRequest();
|
||||||
@@ -236,7 +270,7 @@ public class MediaControllerService(DatabaseContext database, IUserService userS
|
|||||||
return RequestResult.Ok();
|
return RequestResult.Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<RequestResult> DeleteMediaPoster(long id)
|
public async Task<RequestResult> DeleteMediaPoster(long mediaId)
|
||||||
{
|
{
|
||||||
UserValidator validator = userService.GetValidator().MustBeAdmin();
|
UserValidator validator = userService.GetValidator().MustBeAdmin();
|
||||||
if (!validator.IsValid)
|
if (!validator.IsValid)
|
||||||
@@ -244,7 +278,7 @@ public class MediaControllerService(DatabaseContext database, IUserService userS
|
|||||||
return RequestResult.Forbidden();
|
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)
|
if (media?.MediaPosterImage != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,9 +5,11 @@ namespace WatchIt.WebAPI.Services.Controllers.Movies;
|
|||||||
|
|
||||||
public interface IMoviesControllerService
|
public interface IMoviesControllerService
|
||||||
{
|
{
|
||||||
Task<RequestResult> GetAll(MovieQueryParameters query);
|
Task<RequestResult> GetAllMovies(MovieQueryParameters query);
|
||||||
Task<RequestResult> Get(long id);
|
Task<RequestResult> GetMovie(long id);
|
||||||
Task<RequestResult> Post(MovieRequest data);
|
Task<RequestResult> PostMovie(MovieRequest data);
|
||||||
Task<RequestResult> Put(long id, MovieRequest data);
|
Task<RequestResult> PutMovie(long id, MovieRequest data);
|
||||||
Task<RequestResult> Delete(long id);
|
Task<RequestResult> DeleteMovie(long id);
|
||||||
|
|
||||||
|
Task<RequestResult> GetMoviesViewRank(int first, int days);
|
||||||
}
|
}
|
||||||
@@ -7,20 +7,44 @@ using WatchIt.WebAPI.Services.Utility.User;
|
|||||||
|
|
||||||
namespace WatchIt.WebAPI.Services.Controllers.Movies;
|
namespace WatchIt.WebAPI.Services.Controllers.Movies;
|
||||||
|
|
||||||
public class MoviesControllerService(DatabaseContext database, IUserService userService) : IMoviesControllerService
|
public class MoviesControllerService : IMoviesControllerService
|
||||||
{
|
{
|
||||||
#region PUBLIC METHODS
|
#region SERVICES
|
||||||
|
|
||||||
public async Task<RequestResult> GetAll(MovieQueryParameters query)
|
private readonly DatabaseContext _database;
|
||||||
|
|
||||||
|
private readonly IUserService _userService;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#region CONSTRUCTORS
|
||||||
|
|
||||||
|
public MoviesControllerService(DatabaseContext database, IUserService userService)
|
||||||
{
|
{
|
||||||
IEnumerable<MovieResponse> data = await database.MediaMovies.Select(x => new MovieResponse(x)).ToListAsync();
|
_database = database;
|
||||||
|
|
||||||
|
_userService = userService;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
#region PUBLIC METHODS
|
||||||
|
|
||||||
|
#region Main
|
||||||
|
|
||||||
|
public async Task<RequestResult> GetAllMovies(MovieQueryParameters query)
|
||||||
|
{
|
||||||
|
IEnumerable<MovieResponse> data = await _database.MediaMovies.Select(x => new MovieResponse(x)).ToListAsync();
|
||||||
data = query.PrepareData(data);
|
data = query.PrepareData(data);
|
||||||
return RequestResult.Ok(data);
|
return RequestResult.Ok(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<RequestResult> Get(long id)
|
public async Task<RequestResult> GetMovie(long id)
|
||||||
{
|
{
|
||||||
MediaMovie? item = await database.MediaMovies.FirstOrDefaultAsync(x => x.Id == id);
|
MediaMovie? item = await _database.MediaMovies.FirstOrDefaultAsync(x => x.Id == id);
|
||||||
if (item is null)
|
if (item is null)
|
||||||
{
|
{
|
||||||
return RequestResult.NotFound();
|
return RequestResult.NotFound();
|
||||||
@@ -30,33 +54,33 @@ public class MoviesControllerService(DatabaseContext database, IUserService user
|
|||||||
return RequestResult.Ok(data);
|
return RequestResult.Ok(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<RequestResult> Post(MovieRequest data)
|
public async Task<RequestResult> PostMovie(MovieRequest data)
|
||||||
{
|
{
|
||||||
UserValidator validator = userService.GetValidator().MustBeAdmin();
|
UserValidator validator = _userService.GetValidator().MustBeAdmin();
|
||||||
if (!validator.IsValid)
|
if (!validator.IsValid)
|
||||||
{
|
{
|
||||||
return RequestResult.Forbidden();
|
return RequestResult.Forbidden();
|
||||||
}
|
}
|
||||||
|
|
||||||
Media mediaItem = data.CreateMedia();
|
Media mediaItem = data.CreateMedia();
|
||||||
await database.Media.AddAsync(mediaItem);
|
await _database.Media.AddAsync(mediaItem);
|
||||||
await database.SaveChangesAsync();
|
await _database.SaveChangesAsync();
|
||||||
MediaMovie mediaMovieItem = data.CreateMediaMovie(mediaItem.Id);
|
MediaMovie mediaMovieItem = data.CreateMediaMovie(mediaItem.Id);
|
||||||
await database.MediaMovies.AddAsync(mediaMovieItem);
|
await _database.MediaMovies.AddAsync(mediaMovieItem);
|
||||||
await database.SaveChangesAsync();
|
await _database.SaveChangesAsync();
|
||||||
|
|
||||||
return RequestResult.Created($"movies/{mediaItem.Id}", new MovieResponse(mediaMovieItem));
|
return RequestResult.Created($"movies/{mediaItem.Id}", new MovieResponse(mediaMovieItem));
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<RequestResult> Put(long id, MovieRequest data)
|
public async Task<RequestResult> PutMovie(long id, MovieRequest data)
|
||||||
{
|
{
|
||||||
UserValidator validator = userService.GetValidator().MustBeAdmin();
|
UserValidator validator = _userService.GetValidator().MustBeAdmin();
|
||||||
if (!validator.IsValid)
|
if (!validator.IsValid)
|
||||||
{
|
{
|
||||||
return RequestResult.Forbidden();
|
return RequestResult.Forbidden();
|
||||||
}
|
}
|
||||||
|
|
||||||
MediaMovie? item = await database.MediaMovies.FirstOrDefaultAsync(x => x.Id == id);
|
MediaMovie? item = await _database.MediaMovies.FirstOrDefaultAsync(x => x.Id == id);
|
||||||
if (item is null)
|
if (item is null)
|
||||||
{
|
{
|
||||||
return RequestResult.NotFound();
|
return RequestResult.NotFound();
|
||||||
@@ -64,49 +88,74 @@ public class MoviesControllerService(DatabaseContext database, IUserService user
|
|||||||
|
|
||||||
data.UpdateMediaMovie(item);
|
data.UpdateMediaMovie(item);
|
||||||
data.UpdateMedia(item.Media);
|
data.UpdateMedia(item.Media);
|
||||||
await database.SaveChangesAsync();
|
await _database.SaveChangesAsync();
|
||||||
|
|
||||||
return RequestResult.NoContent();
|
return RequestResult.NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<RequestResult> Delete(long id)
|
public async Task<RequestResult> DeleteMovie(long id)
|
||||||
{
|
{
|
||||||
UserValidator validator = userService.GetValidator().MustBeAdmin();
|
UserValidator validator = _userService.GetValidator().MustBeAdmin();
|
||||||
if (!validator.IsValid)
|
if (!validator.IsValid)
|
||||||
{
|
{
|
||||||
return RequestResult.Forbidden();
|
return RequestResult.Forbidden();
|
||||||
}
|
}
|
||||||
|
|
||||||
MediaMovie? item = await database.MediaMovies.FirstOrDefaultAsync(x => x.Id == id);
|
MediaMovie? item = await _database.MediaMovies.FirstOrDefaultAsync(x => x.Id == id);
|
||||||
if (item is null)
|
if (item is null)
|
||||||
{
|
{
|
||||||
return RequestResult.NotFound();
|
return RequestResult.NotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
database.MediaMovies.Attach(item);
|
_database.MediaMovies.Attach(item);
|
||||||
database.MediaMovies.Remove(item);
|
_database.MediaMovies.Remove(item);
|
||||||
database.MediaPosterImages.Attach(item.Media.MediaPosterImage!);
|
_database.MediaPosterImages.Attach(item.Media.MediaPosterImage!);
|
||||||
database.MediaPosterImages.Remove(item.Media.MediaPosterImage!);
|
_database.MediaPosterImages.Remove(item.Media.MediaPosterImage!);
|
||||||
database.MediaPhotoImages.AttachRange(item.Media.MediaPhotoImages);
|
_database.MediaPhotoImages.AttachRange(item.Media.MediaPhotoImages);
|
||||||
database.MediaPhotoImages.RemoveRange(item.Media.MediaPhotoImages);
|
_database.MediaPhotoImages.RemoveRange(item.Media.MediaPhotoImages);
|
||||||
database.MediaGenres.AttachRange(item.Media.MediaGenres);
|
_database.MediaGenres.AttachRange(item.Media.MediaGenres);
|
||||||
database.MediaGenres.RemoveRange(item.Media.MediaGenres);
|
_database.MediaGenres.RemoveRange(item.Media.MediaGenres);
|
||||||
database.MediaProductionCountries.AttachRange(item.Media.MediaProductionCountries);
|
_database.MediaProductionCountries.AttachRange(item.Media.MediaProductionCountries);
|
||||||
database.MediaProductionCountries.RemoveRange(item.Media.MediaProductionCountries);
|
_database.MediaProductionCountries.RemoveRange(item.Media.MediaProductionCountries);
|
||||||
database.PersonActorRoles.AttachRange(item.Media.PersonActorRoles);
|
_database.PersonActorRoles.AttachRange(item.Media.PersonActorRoles);
|
||||||
database.PersonActorRoles.RemoveRange(item.Media.PersonActorRoles);
|
_database.PersonActorRoles.RemoveRange(item.Media.PersonActorRoles);
|
||||||
database.PersonCreatorRoles.AttachRange(item.Media.PersonCreatorRoles);
|
_database.PersonCreatorRoles.AttachRange(item.Media.PersonCreatorRoles);
|
||||||
database.PersonCreatorRoles.RemoveRange(item.Media.PersonCreatorRoles);
|
_database.PersonCreatorRoles.RemoveRange(item.Media.PersonCreatorRoles);
|
||||||
database.RatingsMedia.AttachRange(item.Media.RatingMedia);
|
_database.RatingsMedia.AttachRange(item.Media.RatingMedia);
|
||||||
database.RatingsMedia.RemoveRange(item.Media.RatingMedia);
|
_database.RatingsMedia.RemoveRange(item.Media.RatingMedia);
|
||||||
database.ViewCountsMedia.AttachRange(item.Media.ViewCountsMedia);
|
_database.ViewCountsMedia.AttachRange(item.Media.ViewCountsMedia);
|
||||||
database.ViewCountsMedia.RemoveRange(item.Media.ViewCountsMedia);
|
_database.ViewCountsMedia.RemoveRange(item.Media.ViewCountsMedia);
|
||||||
database.Media.Attach(item.Media);
|
_database.Media.Attach(item.Media);
|
||||||
database.Media.Remove(item.Media);
|
_database.Media.Remove(item.Media);
|
||||||
await database.SaveChangesAsync();
|
await _database.SaveChangesAsync();
|
||||||
|
|
||||||
return RequestResult.NoContent();
|
return RequestResult.NoContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region View count
|
||||||
|
|
||||||
|
public async Task<RequestResult> GetMoviesViewRank(int first, int days)
|
||||||
|
{
|
||||||
|
if (first < 1 || days < 1)
|
||||||
|
{
|
||||||
|
return RequestResult.BadRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
DateOnly startDate = DateOnly.FromDateTime(DateTime.Now).AddDays(-days);
|
||||||
|
IEnumerable<MediaMovie> rawData = await _database.MediaMovies.OrderByDescending(x => x.Media.ViewCountsMedia.Where(y => y.Date >= startDate)
|
||||||
|
.Sum(y => y.ViewCount))
|
||||||
|
.ThenBy(x => x.Id)
|
||||||
|
.Take(first)
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
IEnumerable<MovieResponse> data = rawData.Select(x => new MovieResponse(x));
|
||||||
|
|
||||||
|
return RequestResult.Ok(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@ public class Media
|
|||||||
public string GetMediaRatingByUser { get; set; }
|
public string GetMediaRatingByUser { get; set; }
|
||||||
public string PutMediaRating { get; set; }
|
public string PutMediaRating { get; set; }
|
||||||
public string DeleteMediaRating { get; set; }
|
public string DeleteMediaRating { get; set; }
|
||||||
|
public string PostMediaView { get; set; }
|
||||||
public string GetPhotoMediaRandomBackground { get; set; }
|
public string GetPhotoMediaRandomBackground { get; set; }
|
||||||
public string GetPoster { get; set; }
|
public string GetPoster { get; set; }
|
||||||
public string PutPoster { get; set; }
|
public string PutPoster { get; set; }
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ public interface IMediaWebAPIService
|
|||||||
Task GetMediaRatingByUser(long mediaId, long userId, Action<short>? successAction = null, Action? notFoundAction = null);
|
Task GetMediaRatingByUser(long mediaId, long userId, Action<short>? successAction = null, Action? notFoundAction = null);
|
||||||
Task PutMediaRating(long mediaId, MediaRatingRequest body, Action? successAction = null, Action<IDictionary<string, string[]>>? badRequestAction = null, Action? unauthorizedAction = null, Action? notFoundAction = null);
|
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 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 GetPhotoMediaRandomBackground(long mediaId, Action<MediaPhotoResponse>? successAction = null, Action? notFoundAction = null);
|
||||||
Task GetPhotoRandomBackground(Action<MediaPhotoResponse>? successAction = null, Action? notFoundAction = null);
|
Task GetPhotoRandomBackground(Action<MediaPhotoResponse>? successAction = null, Action? notFoundAction = null);
|
||||||
|
|||||||
@@ -113,6 +113,22 @@ public class MediaWebAPIService(IHttpClientService httpClientService, IConfigura
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ using WatchIt.Website.Services.WebAPI.Movies;
|
|||||||
|
|
||||||
namespace WatchIt.Website.Pages;
|
namespace WatchIt.Website.Pages;
|
||||||
|
|
||||||
public partial class MediaDataPage : ComponentBase
|
public partial class MediaPage : ComponentBase
|
||||||
{
|
{
|
||||||
#region SERVICES
|
#region SERVICES
|
||||||
|
|
||||||
@@ -33,16 +33,18 @@ public partial class MediaDataPage : ComponentBase
|
|||||||
|
|
||||||
#region FIELDS
|
#region FIELDS
|
||||||
|
|
||||||
private bool _loaded = false;
|
private bool _loaded;
|
||||||
private string? _error;
|
private string? _error;
|
||||||
|
|
||||||
private MediaResponse? _media;
|
private MediaResponse? _media;
|
||||||
private MovieResponse? _movie;
|
|
||||||
private IEnumerable<GenreResponse> _genres;
|
private User? _user;
|
||||||
private MediaRatingResponse _globalRating;
|
|
||||||
private MediaPhotoResponse? _background;
|
private MediaPhotoResponse? _background;
|
||||||
private MediaPosterResponse? _poster;
|
private MediaPosterResponse? _poster;
|
||||||
private User? _user;
|
private IEnumerable<GenreResponse> _genres;
|
||||||
|
private MediaRatingResponse _globalRating;
|
||||||
|
private MovieResponse? _movie;
|
||||||
|
|
||||||
private short? _userRating;
|
private short? _userRating;
|
||||||
|
|
||||||
@@ -56,49 +58,49 @@ public partial class MediaDataPage : ComponentBase
|
|||||||
{
|
{
|
||||||
if (firstRender)
|
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)
|
if (_error is null)
|
||||||
{
|
{
|
||||||
Task backgroundTask = MediaWebAPIService.GetPhotoMediaRandomBackground(Id, data => _background = data);
|
step2Tasks.AddRange(
|
||||||
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(
|
|
||||||
[
|
[
|
||||||
userTask,
|
Task.Run(async () => _user = await AuthenticationService.GetUserAsync())
|
||||||
specificMediaTask,
|
|
||||||
genresTask,
|
|
||||||
globalRatingTask,
|
|
||||||
backgroundTask,
|
|
||||||
posterTask,
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
_user = await userTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_user is not null)
|
|
||||||
{
|
|
||||||
Task userRatingTask = MediaWebAPIService.GetMediaRatingByUser(Id, _user.Id, data => _userRating = data);
|
|
||||||
|
|
||||||
await Task.WhenAll(
|
endTasks.AddRange(
|
||||||
[
|
[
|
||||||
userRatingTask,
|
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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// STEP 2
|
||||||
|
await Task.WhenAll(step2Tasks);
|
||||||
|
if (_error is null && _user is not null)
|
||||||
|
{
|
||||||
|
endTasks.AddRange(
|
||||||
|
[
|
||||||
|
MediaWebAPIService.GetMediaRatingByUser(Id, _user.Id, data => _userRating = data)
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// END
|
||||||
|
await Task.WhenAll(endTasks);
|
||||||
|
|
||||||
_loaded = true;
|
_loaded = true;
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
@@ -46,6 +46,7 @@
|
|||||||
"GetMediaRatingByUser": "/{0}/rating/{1}",
|
"GetMediaRatingByUser": "/{0}/rating/{1}",
|
||||||
"PutMediaRating": "/{0}/rating",
|
"PutMediaRating": "/{0}/rating",
|
||||||
"DeleteMediaRating": "/{0}/rating",
|
"DeleteMediaRating": "/{0}/rating",
|
||||||
|
"PostMediaView": "/{0}/view",
|
||||||
|
|
||||||
"GetPhotoMediaRandomBackground": "/{0}/photos/random_background",
|
"GetPhotoMediaRandomBackground": "/{0}/photos/random_background",
|
||||||
"GetPoster": "/{0}/poster",
|
"GetPoster": "/{0}/poster",
|
||||||
|
|||||||
Reference in New Issue
Block a user