diff --git a/FichaBackend/Controllers/AdminController.cs b/FichaBackend/Controllers/AdminController.cs new file mode 100644 index 0000000..c383522 --- /dev/null +++ b/FichaBackend/Controllers/AdminController.cs @@ -0,0 +1,15 @@ +using Microsoft.AspNetCore.Mvc; + +namespace FichaBackend.Controllers; + +[ApiController] +[Route("v1/admin")] +public class AdminController : ControllerBase +{ + private readonly ILogger _logger; + + public AdminController(ILogger logger) + { + _logger = logger; + } +} \ No newline at end of file diff --git a/FichaBackend/Controllers/MainController.cs b/FichaBackend/Controllers/MainController.cs index f0ae3f5..2293199 100644 --- a/FichaBackend/Controllers/MainController.cs +++ b/FichaBackend/Controllers/MainController.cs @@ -1,17 +1,31 @@ -using Microsoft.AspNetCore.Mvc; +using FichaBackend.Models; +using FichaBackend.Services; +using Microsoft.AspNetCore.Mvc; namespace FichaBackend.Controllers; [ApiController] -[Route("[controller]")] +[Route("v1/")] public class MainController : ControllerBase { private readonly ILogger _logger; + private readonly IPublicDataService _publicDataService; - public MainController(ILogger logger) + public MainController(ILogger logger, IPublicDataService publicDataService) { _logger = logger; + _publicDataService = publicDataService; + } + + public async Task> GetAllCity() + { + return await _publicDataService.GetAllCity(); + } + + public async Task> GetAllMoviesInCityWithPuskinCard(string cityName) + { + return await _publicDataService.GetAllFilmsInCity(cityName); } } \ No newline at end of file diff --git a/FichaBackend/Controllers/ParserController.cs b/FichaBackend/Controllers/ParserController.cs new file mode 100644 index 0000000..ec5b9d9 --- /dev/null +++ b/FichaBackend/Controllers/ParserController.cs @@ -0,0 +1,30 @@ +using FichaBackend.Models; +using FichaBackend.Services; +using Microsoft.AspNetCore.Mvc; + +namespace FichaBackend.Controllers; + +[ApiController] +[Route("v1/parser")] +public class ParserController : ControllerBase +{ + private readonly ILogger _logger; + private readonly IPublicDataService _publicDataService; + + public ParserController(ILogger logger, IPublicDataService publicDataService) + { + _logger = logger; + _publicDataService = publicDataService; + } + + [HttpPost("UpdateFilms")] + public async Task UpdateFilmsInCity(List films) + { + var val = films.First().City; + if (films.Any(x => x.City != val)) + return BadRequest("All films must be in the same city"); + + await _publicDataService.UpdateFilmsInCity(films); + return Ok("Films updated"); + } +} \ No newline at end of file diff --git a/FichaBackend/DatabaseContext.cs b/FichaBackend/DatabaseContext.cs index 7633b49..89a9ded 100644 --- a/FichaBackend/DatabaseContext.cs +++ b/FichaBackend/DatabaseContext.cs @@ -1,9 +1,12 @@ -using Microsoft.EntityFrameworkCore; +using FichaBackend.Models; +using Microsoft.EntityFrameworkCore; namespace FichaBackend { public class DatabaseContext : DbContext { + public DbSet Cities { get; set; } = null!; + public DbSet Films { get; set; } = null!; protected override void OnModelCreating(ModelBuilder modelBuilder) { diff --git a/FichaBackend/FichaBackend.csproj b/FichaBackend/FichaBackend.csproj index b746a16..2857e3d 100644 --- a/FichaBackend/FichaBackend.csproj +++ b/FichaBackend/FichaBackend.csproj @@ -35,4 +35,6 @@ + + diff --git a/FichaBackend/Models/City.cs b/FichaBackend/Models/City.cs new file mode 100644 index 0000000..5dc5cf6 --- /dev/null +++ b/FichaBackend/Models/City.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace FichaBackend.Models; + +public class City +{ + [Key] + public long Id { get; set; } + public string Name { get; set; } + public string ImageURL { get; set; } +} \ No newline at end of file diff --git a/FichaBackend/Models/Film.cs b/FichaBackend/Models/Film.cs new file mode 100644 index 0000000..256ee6a --- /dev/null +++ b/FichaBackend/Models/Film.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; + +namespace FichaBackend.Models; + +public class Film +{ + [Key] + public long Id { get; set; } + public string FilmName { get; set; } + public string Cinema { get; set; } + public string Genre { get; set; } + public string Time { get; set; } + public float Price { get; set; } + public City City { get; set; } +} \ No newline at end of file diff --git a/FichaBackend/Models/FilmDto.cs b/FichaBackend/Models/FilmDto.cs new file mode 100644 index 0000000..2f1c59a --- /dev/null +++ b/FichaBackend/Models/FilmDto.cs @@ -0,0 +1,11 @@ +namespace FichaBackend.Models; + +public class FilmDto +{ + public string City { get; set; } + public string Cinema { get; set; } + public string FilmName { get; set; } + public string? Genre { get; set; } + public string? Time { get; set; } + public float? Price { get; set; } +} \ No newline at end of file diff --git a/FichaBackend/Program.cs b/FichaBackend/Program.cs index 2df9870..2608e58 100644 --- a/FichaBackend/Program.cs +++ b/FichaBackend/Program.cs @@ -1,4 +1,5 @@ using FichaBackend; +using FichaBackend.Services; using Microsoft.EntityFrameworkCore; using Microsoft.OpenApi.Models; @@ -39,6 +40,8 @@ builder.Services.AddHealthChecks() .AddNpgSql(dbConString); // Services +builder.Services.AddScoped(); + // cors builder.Services.AddCors(options => { diff --git a/FichaBackend/Services/IPublicDataService.cs b/FichaBackend/Services/IPublicDataService.cs new file mode 100644 index 0000000..3bb445a --- /dev/null +++ b/FichaBackend/Services/IPublicDataService.cs @@ -0,0 +1,48 @@ +using FichaBackend.Models; +using Microsoft.EntityFrameworkCore; + +namespace FichaBackend.Services; + +public interface IPublicDataService +{ + public Task> GetAllCity(); + public Task> GetAllFilmsInCity(string cityName); + public Task UpdateFilmsInCity(IEnumerable films); +} + +public class PublicDataService : IPublicDataService +{ + private readonly DatabaseContext _databaseContext; + + public PublicDataService(DatabaseContext databaseContext) + { + _databaseContext = databaseContext; + } + + public async Task> GetAllCity() + { + return await _databaseContext.Cities.ToListAsync(); + } + + public async Task> GetAllFilmsInCity(string cityName) + { + return await _databaseContext.Films.ToListAsync(); + } + + public async Task UpdateFilmsInCity(IEnumerable films) + { + await _databaseContext.Films.Where(x => x.City.Name == films.First().City).ForEachAsync(x => _databaseContext.Films.Remove(x)); + + foreach (var filmDto in films) + { + var film = new Film(); + film.FilmName = filmDto.FilmName; + film.Cinema = filmDto.Cinema; + film.Price = filmDto.Price ?? 0; + film.City = await _databaseContext.Cities.FirstOrDefaultAsync(x => x.Name == filmDto.City); + await _databaseContext.Films.AddAsync(film); + } + + await _databaseContext.SaveChangesAsync(); + } +} \ No newline at end of file