Files
WatchIt/WatchIt.DTO/Models/Controllers/Media/MediaMappers.cs

208 lines
6.9 KiB
C#

using WatchIt.Database.Model.Media;
using WatchIt.DTO.Models.Controllers.Genres;
using WatchIt.DTO.Models.Controllers.Media.Medium.Request;
using WatchIt.DTO.Models.Controllers.Media.Medium.Response;
using WatchIt.DTO.Models.Generics.Image;
using WatchIt.DTO.Models.Generics.Rating;
using WatchIt.DTO.Models.Generics.ViewCount;
using MediumType = WatchIt.Database.Model.Media.MediumType;
namespace WatchIt.DTO.Models.Controllers.Media;
public static class MediaMappers
{
#region PUBLIC METHODS
#region Medium
public static MediumMovie ToEntity(this MediumMovieRequest request)
{
MediumMovie medium = new MediumMovie();
medium.UpdateWithRequest(request);
return medium;
}
public static void UpdateWithRequest(this MediumMovie entity, MediumMovieRequest request)
{
entity.SetMediumEntityProperties(request);
entity.Budget = request.Budget;
}
public static MediumSeries ToEntity(this MediumSeriesRequest request)
{
MediumSeries medium = new MediumSeries();
medium.UpdateWithRequest(request);
return medium;
}
public static void UpdateWithRequest(this MediumSeries entity, MediumSeriesRequest request)
{
entity.SetMediumEntityProperties(request);
entity.HasEnded = request.HasEnded;
}
public static MediumResponse ToResponse(this Database.Model.Media.Medium entity)
{
MediumResponse response = new MediumResponse();
response.SetMediumResponseProperties(entity);
response.Type = entity.Type == MediumType.Movie ? Medium.Response.MediumResponseType.Movie : Medium.Response.MediumResponseType.Series;
return response;
}
public static MediumMovieResponse ToResponse(this MediumMovie entity)
{
MediumMovieResponse response = new MediumMovieResponse();
response.SetMediumResponseProperties(entity);
response.SetMediumMovieResponseProperties(entity);
return response;
}
public static MediumSeriesResponse ToResponse(this MediumSeries entity)
{
MediumSeriesResponse response = new MediumSeriesResponse();
response.SetMediumResponseProperties(entity);
response.SetMediumSeriesResponseProperties(entity);
return response;
}
public static MediumUserRatedResponse ToResponse(this Database.Model.Media.Medium entity, long accountId)
{
MediumUserRatedResponse response = new MediumUserRatedResponse();
response.SetMediumResponseProperties(entity);
response.SetMediumUserRatedResponseProperties(entity, accountId);
return response;
}
public static MediumMovieUserRatedResponse ToResponse(this MediumMovie entity, long accountId)
{
MediumMovieUserRatedResponse response = new MediumMovieUserRatedResponse();
response.SetMediumResponseProperties(entity);
response.SetMediumMovieResponseProperties(entity);
response.SetMediumUserRatedResponseProperties(entity, accountId);
return response;
}
public static MediumSeriesUserRatedResponse ToResponse(this MediumSeries entity, long accountId)
{
MediumSeriesUserRatedResponse response = new MediumSeriesUserRatedResponse();
response.SetMediumResponseProperties(entity);
response.SetMediumSeriesResponseProperties(entity);
response.SetMediumUserRatedResponseProperties(entity, accountId);
return response;
}
public static MediumRequest ToRequest(this BaseMediumResponse response)
{
MediumRequest request = response switch
{
MediumMovieResponse mediumMovieResponse => new MediumMovieRequest
{
Budget = mediumMovieResponse.Budget,
},
MediumSeriesResponse mediumSeriesResponse => new MediumSeriesRequest
{
HasEnded = mediumSeriesResponse.HasEnded,
}
};
request.Title = response.Title;
request.Description = response.Description;
request.OriginalTitle = response.OriginalTitle;
request.ReleaseDate = response.ReleaseDate;
request.Duration = response.Duration;
return request;
}
#endregion
#region MediumPicture
public static MediumPicture ToEntity(this ImageRequest request, long mediumId) => new Database.Model.Media.MediumPicture
{
MediumId = mediumId,
Image = request.Image,
MimeType = request.MimeType,
};
#endregion
#region MediumGenre
public static MediumGenre CreateMediumGenre(long mediumId, short genreId) => new MediumGenre
{
MediumId = mediumId,
GenreId = genreId,
};
#endregion
#region MediumRating
public static MediumRating ToEntity(this RatingRequest request, long mediumId, long userId)
{
MediumRating entity = new MediumRating
{
MediumId = mediumId,
AccountId = userId
};
entity.UpdateWithRequest(request);
return entity;
}
#endregion
#region MediumViewCount
public static MediumViewCount CreateMediumViewCountEntity(long mediumId) => new MediumViewCount
{
MediumId = mediumId,
ViewCount = 1,
};
#endregion
#endregion
#region PRIVATE METHODS
private static void SetMediumEntityProperties(this Database.Model.Media.Medium entity, MediumRequest request)
{
entity.Title = request.Title;
entity.OriginalTitle = request.OriginalTitle;
entity.Description = request.Description;
entity.Duration = request.Duration;
entity.ReleaseDate = request.ReleaseDate;
}
private static void SetMediumResponseProperties(this BaseMediumResponse response, Database.Model.Media.Medium entity)
{
response.Id = entity.Id;
response.Title = entity.Title;
response.OriginalTitle = entity.OriginalTitle;
response.Description = entity.Description;
response.ReleaseDate = entity.ReleaseDate;
response.Duration = entity.Duration;
response.Genres = entity.Genres.Select(x => x.ToResponse());
response.Rating = entity.Ratings.ToOverallResponse();
response.ViewCount = entity.ViewCounts.ToResponse();
response.Picture = entity.Picture?.ToResponse();
}
private static void SetMediumMovieResponseProperties(this MediumMovieResponse response, MediumMovie entity)
{
response.Budget = entity.Budget;
}
private static void SetMediumSeriesResponseProperties(this MediumSeriesResponse response, MediumSeries entity)
{
response.HasEnded = entity.HasEnded;
}
private static void SetMediumUserRatedResponseProperties(this IMediumUserRatedResponse response, Database.Model.Media.Medium entity, long accountId)
{
response.RatingUser = entity.Ratings.SingleOrDefault(x => x.AccountId == accountId)?.ToUserResponse();
}
#endregion
}