Skip to content

Commit 19130a4

Browse files
committed
service/ movie , genre
1 parent ca31ae8 commit 19130a4

25 files changed

+872
-33
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
using Microsoft.AspNetCore.Http;
2+
using Microsoft.AspNetCore.Mvc;
3+
using MoviesApi.Services;
4+
5+
namespace MoviesApi.Controllers
6+
{
7+
[Route("api/[controller]")]
8+
[ApiController]
9+
public class GenresController : ControllerBase
10+
{
11+
private readonly IGenresService _genresService;
12+
13+
public GenresController(IGenresService genresService)
14+
{
15+
_genresService = genresService;
16+
}
17+
18+
[HttpGet]
19+
public async Task<IActionResult> GetAllAsync()
20+
{
21+
var genres = await _genresService.GetAll();
22+
23+
return Ok(genres);
24+
}
25+
[HttpPost]
26+
public async Task<IActionResult> CreateAsync(GenreDto dto)
27+
{
28+
var genre = new Genre { Name = dto.Name };
29+
30+
await _genresService.Add(genre);
31+
32+
return Ok(genre);
33+
}
34+
[HttpPut("{id}")]
35+
public async Task<IActionResult> UpdateAsync(byte id, [FromBody] GenreDto dto)
36+
{
37+
var genre = await _genresService.GetById(id);
38+
39+
if (genre == null)
40+
return NotFound($"No genre was found with ID: {id}");
41+
42+
genre.Name = dto.Name;
43+
44+
_genresService.Update(genre);
45+
46+
return Ok(genre);
47+
}
48+
49+
[HttpDelete("{id}")]
50+
public async Task<IActionResult> DeleteAsync(byte id)
51+
{
52+
var genre = await _genresService.GetById(id);
53+
54+
if (genre == null)
55+
return NotFound($"No genre was found with ID: {id}");
56+
57+
_genresService.Delete(genre);
58+
59+
return Ok(genre);
60+
61+
}
62+
}
63+
}
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
using AutoMapper;
2+
using Microsoft.AspNetCore.Mvc;
3+
using MoviesApi.Services;
4+
5+
namespace MoviesApi.Controllers
6+
{
7+
[Route("api/[controller]")]
8+
[ApiController]
9+
public class MoviesController : ControllerBase
10+
{
11+
private readonly IMapper _mapper;
12+
private readonly IMoviesService _moviesService;
13+
private readonly IGenresService _genresService;
14+
15+
private new List<string> _allowedExtenstions = new List<string> { ".jpg", ".png" };
16+
private long _maxAllowedPosterSize = 1048576;
17+
18+
public MoviesController(IMoviesService moviesService, IGenresService genresService, IMapper mapper)
19+
{
20+
_moviesService = moviesService;
21+
_genresService = genresService;
22+
_mapper = mapper;
23+
}
24+
25+
[HttpGet]
26+
public async Task<IActionResult> GetAllAsync()
27+
{
28+
var movies = await _moviesService.GetAll();
29+
30+
var data = _mapper.Map<IEnumerable<MovieDetailsDto>>(movies);
31+
32+
return Ok(data);
33+
}
34+
35+
[HttpGet("{id}")]
36+
public async Task<IActionResult> GetByIdAsync(int id)
37+
{
38+
var movie = await _moviesService.GetById(id);
39+
40+
if (movie == null)
41+
return NotFound();
42+
43+
var dto = _mapper.Map<MovieDetailsDto>(movie);
44+
45+
return Ok(dto);
46+
}
47+
48+
[HttpGet("GetByGenreId")]
49+
public async Task<IActionResult> GetByGenreIdAsync(byte genreId)
50+
{
51+
var movies = await _moviesService.GetAll(genreId);
52+
var data = _mapper.Map<IEnumerable<MovieDetailsDto>>(movies);
53+
54+
return Ok(data);
55+
}
56+
57+
[HttpPost]
58+
public async Task<IActionResult> CreateAsync([FromForm] MovieDto dto)
59+
{
60+
if (dto.Poster == null)
61+
return BadRequest("Poster is required!");
62+
63+
if (!_allowedExtenstions.Contains(Path.GetExtension(dto.Poster.FileName).ToLower()))
64+
return BadRequest("Only .png and .jpg images are allowed!");
65+
66+
if (dto.Poster.Length > _maxAllowedPosterSize)
67+
return BadRequest("Max allowed size for poster is 1MB!");
68+
69+
var isValidGenre = await _genresService.IsvalidGenre(dto.GenreId);
70+
71+
if (!isValidGenre)
72+
return BadRequest("Invalid genere ID!");
73+
74+
using var dataStream = new MemoryStream();
75+
76+
await dto.Poster.CopyToAsync(dataStream);
77+
78+
var movie = _mapper.Map<Movie>(dto);
79+
movie.Poster = dataStream.ToArray();
80+
81+
_moviesService.Add(movie);
82+
83+
return Ok(movie);
84+
}
85+
86+
[HttpPut("{id}")]
87+
public async Task<IActionResult> UpdateAsync(int id, [FromForm] MovieDto dto)
88+
{
89+
var movie = await _moviesService.GetById(id);
90+
91+
if (movie == null)
92+
return NotFound($"No movie was found with ID {id}");
93+
94+
var isValidGenre = await _genresService.IsvalidGenre(dto.GenreId);
95+
96+
if (!isValidGenre)
97+
return BadRequest("Invalid genere ID!");
98+
99+
if (dto.Poster != null)
100+
{
101+
if (!_allowedExtenstions.Contains(Path.GetExtension(dto.Poster.FileName).ToLower()))
102+
return BadRequest("Only .png and .jpg images are allowed!");
103+
104+
if (dto.Poster.Length > _maxAllowedPosterSize)
105+
return BadRequest("Max allowed size for poster is 1MB!");
106+
107+
using var dataStream = new MemoryStream();
108+
109+
await dto.Poster.CopyToAsync(dataStream);
110+
111+
movie.Poster = dataStream.ToArray();
112+
}
113+
114+
movie.Title = dto.Title;
115+
movie.GenreId = dto.GenreId;
116+
movie.Year = dto.Year;
117+
movie.Storeline = dto.Storeline;
118+
movie.Rate = dto.Rate;
119+
120+
_moviesService.Update(movie);
121+
122+
return Ok(movie);
123+
}
124+
125+
[HttpDelete("{id}")]
126+
public async Task<IActionResult> DeleteAsync(int id)
127+
{
128+
var movie = await _moviesService.GetById(id);
129+
130+
if (movie == null)
131+
return NotFound($"No movie was found with ID {id}");
132+
133+
_moviesService.Delete(movie);
134+
135+
return Ok(movie);
136+
}
137+
}
138+
}

MoviesApi/Controllers/WeatherForecastController.cs

Lines changed: 0 additions & 33 deletions
This file was deleted.

MoviesApi/Dtos/GenreDto.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace MoviesApi.Dtos
2+
{
3+
public class GenreDto
4+
{
5+
[MaxLength(100)]
6+
public string Name { get; set; } =string.Empty;
7+
}
8+
}

MoviesApi/Dtos/MovieDetailsDto.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
namespace MoviesApi.Dtos
2+
{
3+
public class MovieDetailsDto
4+
{
5+
public int Id { get; set; }
6+
7+
public string Title { get; set; }
8+
9+
public int Year { get; set; }
10+
11+
public double Rate { get; set; }
12+
13+
public string Storeline { get; set; }
14+
15+
public byte[] Poster { get; set; }
16+
17+
public byte GenreId { get; set; }
18+
19+
public string GenreName { get; set; }
20+
}
21+
}

MoviesApi/Dtos/MovieDto.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace MoviesApi.Dtos
2+
{
3+
public class MovieDto
4+
{
5+
[MaxLength(250)]
6+
7+
public string Title { get; set; }
8+
9+
public int Year { get; set; }
10+
11+
public double Rate { get; set; }
12+
13+
[MaxLength(2500)]
14+
public string Storeline { get; set; }
15+
16+
public IFormFile? Poster { get; set; }
17+
18+
public byte GenreId { get; set; }
19+
}
20+
}

MoviesApi/GlobalUsings.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
global using System.ComponentModel.DataAnnotations;
2+
global using MoviesApi.Models;
3+
global using MoviesApi.Dtos;

MoviesApi/Helpers/MappingProfile.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using AutoMapper;
2+
3+
namespace MoviesApi.Helpers
4+
{
5+
public class MappingProfile : Profile
6+
{
7+
public MappingProfile()
8+
{
9+
CreateMap<Movie, MovieDetailsDto>();
10+
CreateMap<MovieDto, Movie>()
11+
.ForMember(src => src.Poster, opt => opt.Ignore());
12+
}
13+
}
14+
}

MoviesApi/Migrations/20240609130820_model01.Designer.cs

Lines changed: 47 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using Microsoft.EntityFrameworkCore.Migrations;
2+
3+
#nullable disable
4+
5+
namespace MoviesApi.Migrations
6+
{
7+
/// <inheritdoc />
8+
public partial class model01 : Migration
9+
{
10+
/// <inheritdoc />
11+
protected override void Up(MigrationBuilder migrationBuilder)
12+
{
13+
migrationBuilder.CreateTable(
14+
name: "Genres",
15+
columns: table => new
16+
{
17+
Id = table.Column<byte>(type: "tinyint", nullable: false)
18+
.Annotation("SqlServer:Identity", "1, 1"),
19+
Name = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false)
20+
},
21+
constraints: table =>
22+
{
23+
table.PrimaryKey("PK_Genres", x => x.Id);
24+
});
25+
}
26+
27+
/// <inheritdoc />
28+
protected override void Down(MigrationBuilder migrationBuilder)
29+
{
30+
migrationBuilder.DropTable(
31+
name: "Genres");
32+
}
33+
}
34+
}

0 commit comments

Comments
 (0)