2023-10-02 10:21:02 +02:00
using System.Collections ;
2023-09-15 10:42:46 +02:00
using Microsoft.AspNetCore.Mvc ;
2023-09-19 09:48:59 +02:00
using Microsoft.OpenApi.Writers ;
2023-09-15 10:42:46 +02:00
2023-09-19 13:45:34 +02:00
namespace backend ;
using static backend . QueryParameterValidators ;
2023-09-15 10:42:46 +02:00
[ApiController]
[Route("[controller] ")]
public class MovieController : ControllerBase
{
2023-09-19 09:48:59 +02:00
private readonly MovieDbContext _context ;
2023-09-15 10:42:46 +02:00
private readonly ILogger < MovieController > _logger ;
2023-09-19 13:45:34 +02:00
private static readonly string [ ] sortTypes = new [ ]
{
"titleasc" , "titledesc" , "yearasc" , "yeardesc"
} ;
2023-09-15 10:42:46 +02:00
2023-09-19 09:48:59 +02:00
public MovieController ( ILogger < MovieController > logger , MovieDbContext context )
2023-09-15 10:42:46 +02:00
{
_logger = logger ;
2023-09-19 09:48:59 +02:00
_context = context ;
2023-09-15 10:42:46 +02:00
}
2023-09-19 10:14:35 +02:00
[HttpGet(Name = "GetMovies")]
2023-09-19 11:58:43 +02:00
public ActionResult < IEnumerable < MovieDB > > Get (
2023-10-02 10:21:02 +02:00
[FromQuery] string? s ,
2023-09-19 11:58:43 +02:00
[FromQuery] string? type ,
[FromQuery] string? y ,
2023-09-19 13:45:34 +02:00
[FromQuery] string? sort ,
2023-09-19 11:58:43 +02:00
[FromQuery] int pageNumber = 1 ,
[FromQuery] int pageSize = 5
) {
2023-09-19 10:14:35 +02:00
try
{
2023-10-02 10:21:02 +02:00
var movies = _context . Movies . AsQueryable ( ) ;
if ( s ! = null ) {
if ( ! IsValidS ( s ) ) return StatusCode ( 400 , "Bad Request: Invalid title" ) ;
movies = _context . Movies . Where ( m = > m . Title . ToLower ( ) . Contains ( s . ToLower ( ) ) ) ;
}
2023-09-19 11:58:43 +02:00
if ( type ! = null ) {
2023-09-19 13:45:34 +02:00
if ( ! IsValidType ( type ) ) return StatusCode ( 400 , "Bad Request: Invalid type" ) ;
2023-09-19 11:58:43 +02:00
movies = movies . Where ( m = > m . Type = = type ) ;
}
if ( y ! = null ) {
2023-09-19 13:45:34 +02:00
if ( ! IsValidYear ( y ) ) return StatusCode ( 400 , "Bad Request: Invalid year" ) ;
2023-09-19 11:58:43 +02:00
movies = movies . Where ( m = > m . Year = = y ) ;
}
2023-09-19 13:45:34 +02:00
if ( sort ! = null ) {
if ( ! IsValidSort ( sort ) ) return StatusCode ( 400 , "Bad Request: Invalid sort-type" ) ;
2023-09-19 13:53:05 +02:00
if ( sort = = "titleasc" ) movies = movies . OrderBy ( m = > m . Title ) ;
if ( sort = = "titledesc" ) movies = movies . OrderByDescending ( m = > m . Title ) ;
if ( sort = = "yearasc" ) movies = movies . OrderBy ( m = > m . Year ) ;
if ( sort = = "yeardesc" ) movies = movies . OrderByDescending ( m = > m . Year ) ;
}
2023-09-19 13:45:34 +02:00
if ( ! IsValidPageNumber ( pageNumber ) | | ! IsValidPageSize ( pageSize ) )
return StatusCode ( 400 , "Bad Request: Invalid page-size or page-number" ) ;
2023-09-19 11:58:43 +02:00
var totalMovies = movies . Count ( ) ;
2023-09-19 11:14:59 +02:00
var totalPages = Math . Ceiling ( ( double ) totalMovies / pageSize ) ;
2023-09-19 13:45:34 +02:00
2023-09-19 11:14:59 +02:00
IEnumerable < MovieDB > resultSkip = movies . Skip ( pageSize * ( pageNumber - 1 ) ) ;
IEnumerable < MovieDB > resultTake = resultSkip . Take ( pageSize ) ;
2023-09-19 11:21:13 +02:00
if ( resultTake . ToList ( ) . Count = = 0 ) {
return StatusCode ( 204 , "No Content" ) ;
}
2023-10-03 10:29:41 +02:00
MovieResponse Response = new MovieResponse ( "OK" , totalMovies , pageNumber , resultTake ) ;
2023-10-03 09:18:04 +02:00
return Ok ( Response ) ;
2023-09-19 10:14:35 +02:00
}
catch ( Exception ex )
{
_logger . LogError ( ex , "Error fetching movies" ) ;
return StatusCode ( 500 , "Internal server error" ) ;
}
2023-09-15 10:42:46 +02:00
}
2023-09-19 10:14:35 +02:00
2023-09-26 09:47:41 +02:00
[HttpPost(Name = "PostMovie")]
public ActionResult Post (
[FromQuery] string s ,
[FromQuery] string y ,
[FromQuery] string imdbID ,
[FromQuery] string type ,
[FromQuery] string poster
) {
try
{
MovieDB newMovie = new ( s , y , imdbID , type , poster ) ;
var movies = _context . Movies . Where ( m = > m . imdbID . ToLower ( ) . Contains ( imdbID . ToLower ( ) ) ) ;
if ( movies . Count ( ) = = 0 ) {
_context . Add ( newMovie ) ;
_context . SaveChanges ( ) ;
return Ok ( "Successfully added new movie" ) ;
2023-10-19 08:51:47 +02:00
}
return StatusCode ( 409 , "Conflict, imdbID already exists" ) ;
2023-09-26 09:47:41 +02:00
}
catch ( Exception ex )
{
_logger . LogError ( ex , "Error posting movie" ) ;
return StatusCode ( 500 , "Internal server error" ) ;
}
}
2023-09-26 10:13:32 +02:00
[HttpDelete(Name = "DeleteMovie")]
public ActionResult Delete ( [ FromQuery ] string imdbID ) {
try
{
var movie = _context . Movies . AsEnumerable ( )
. Where ( m = > m . imdbID . ToLower ( ) . Contains ( imdbID . ToLower ( ) ) )
2023-10-19 08:51:47 +02:00
. SingleOrDefault ( ) ;
2023-09-26 10:13:32 +02:00
if ( movie ! = null ) {
_context . Remove ( movie ) ;
_context . SaveChanges ( ) ;
return Ok ( "Successfully deleted movie" ) ;
2023-10-19 08:51:47 +02:00
}
return StatusCode ( 409 , "Conflict, imdbID doesn't exists" ) ;
2023-09-26 10:13:32 +02:00
}
catch ( Exception ex )
{
_logger . LogError ( ex , "Error deleting movie" ) ;
return StatusCode ( 500 , "Internal server error" ) ;
}
}
2023-09-26 10:25:40 +02:00
[HttpPut(Name = "PutMovie")]
public ActionResult Put (
[FromQuery] string? s ,
[FromQuery] string? y ,
[FromQuery] string imdbID ,
[FromQuery] string? type ,
[FromQuery] string? poster
) {
try
{
var movie = _context . Movies . AsEnumerable ( )
. Where ( m = > m . imdbID . ToLower ( ) . Contains ( imdbID . ToLower ( ) ) )
2023-10-19 08:51:47 +02:00
. SingleOrDefault ( ) ;
2023-09-26 10:25:40 +02:00
if ( movie ! = null ) {
if ( s ! = null ) movie . Title = s ;
if ( y ! = null ) movie . Year = y ;
if ( type ! = null ) movie . Type = type ;
if ( poster ! = null ) movie . Poster = poster ;
_context . SaveChanges ( ) ;
return Ok ( "Successfully edited movie" ) ;
}
2023-10-19 08:51:47 +02:00
return StatusCode ( 404 , "Conflict, imdbID doesn't exists" ) ;
2023-09-26 10:25:40 +02:00
}
catch ( Exception ex )
{
_logger . LogError ( ex , "Error deleting movie" ) ;
return StatusCode ( 500 , "Internal server error" ) ;
}
}
2023-09-15 10:42:46 +02:00
}