Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -368,3 +368,4 @@ FodyWeavers.xsd
*/**/bin/Release
*/**/obj/Debug
*/**/obj/Release
*/Migrations
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
using api_cinema_challenge.Data;
using api_cinema_challenge.DataTransfer.Requests;
using api_cinema_challenge.DataTransfer.Response;
using api_cinema_challenge.Enums;
using api_cinema_challenge.RegistrationRequeest;
using api_cinema_challenge.Services;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;



namespace api_cinema_challenge.Controllers

{

[ApiController]
[Route("/api/[controller]")]
public class UsersController : ControllerBase
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly CinemaContext _context;
private readonly TokenService _tokenService;

public UsersController(UserManager<ApplicationUser> userManager, CinemaContext context,
TokenService tokenService, ILogger<UsersController> logger)
{
_userManager = userManager;
_context = context;
_tokenService = tokenService;
}


[HttpPost]
[Route("register")]
public async Task<IActionResult> Register(RegistrationRequest request)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}

var result = await _userManager.CreateAsync(
new ApplicationUser { UserName = request.Username, Email = request.Email, Role = request.Role },
request.Password!
);

if (result.Succeeded)
{
request.Password = "";
return CreatedAtAction(nameof(Register), new { email = request.Email, role = Role.User }, request);
}

foreach (var error in result.Errors)
{
ModelState.AddModelError(error.Code, error.Description);
}

return BadRequest(ModelState);
}


[HttpPost]
[Route("login")]
public async Task<ActionResult<AuthResponse>> Authenticate([FromBody] AuthRequest request)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}

var managedUser = await _userManager.FindByEmailAsync(request.Email!);

if (managedUser == null)
{
return BadRequest("Bad credentials");
}

var isPasswordValid = await _userManager.CheckPasswordAsync(managedUser, request.Password!);

if (!isPasswordValid)
{
return BadRequest("Bad credentials");
}

var userInDb = _context.ApplicationUsers.FirstOrDefault(u => u.Email == request.Email);

if (userInDb is null)
{
return Unauthorized();
}

var accessToken = _tokenService.CreateToken(userInDb);
await _context.SaveChangesAsync();

return Ok(new AuthResponse
{
Username = userInDb.UserName,
Email = userInDb.Email,
Token = accessToken,
});
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using api_cinema_challenge.Models;

namespace api_cinema_challenge.DOTs.CustomerDTOs
{
public class CustomerGet
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
public IEnumerable<TicketNoCustomer> Tickets { get; set; } = new List<TicketNoCustomer>();

public CustomerGet(Customer customer)
{
Id = customer.Id;
Name = customer.Name;
Email = customer.Email;
Phone = customer.Phone;
Tickets = customer.Tickets.Select(x => new TicketNoCustomer(x));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using api_cinema_challenge.Models;

namespace api_cinema_challenge.DOTs.CustomerDTOs
{
public class CustomerGetNoExtra
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }

public CustomerGetNoExtra(Customer customer)
{
Id = customer.Id;
Name = customer.Name;
Email = customer.Email;
Phone = customer.Phone;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using api_cinema_challenge.Models;

namespace api_cinema_challenge.DOTs.CustomerDTOs
{
public class CustomerPost
{
public string Name { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace api_cinema_challenge.DOTs.CustomerDTOs
{
public class CustomerPut
{
public string? Name { get; set; }
public string? Email { get; set; }
public string? Phone { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using api_cinema_challenge.Models;

namespace api_cinema_challenge.DOTs.CustomerDTOs
{
public class MovieNoScreenings
{
public string Title { get; set; }
public string Description { get; set; }
public string Rating { get; set; }
public int RunTimeMins { get; set; }

public MovieNoScreenings(Movie movie)
{
Title = movie.Title;
Description = movie.Description;
Rating = movie.Rating;
RunTimeMins = movie.RunTimeMins;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using api_cinema_challenge.Models;

namespace api_cinema_challenge.DOTs.CustomerDTOs
{
public class ScreeningNoTicket
{
public int ScreenNumber { get; set; }
public int Capacity { get; set; }
public DateTime StartsAt { get; set; }
public MovieNoScreenings Movie { get; set; }

public ScreeningNoTicket(Screening screening)
{
ScreenNumber = screening.ScreenNumber;
Capacity = screening.Capacity;
StartsAt = screening.StartsAt;
Movie = new MovieNoScreenings(screening.Movie);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using api_cinema_challenge.Models;

namespace api_cinema_challenge.DOTs.CustomerDTOs
{
public class TicketNoCustomer
{
public ScreeningNoTicket Screening { get; set; }
public TicketNoCustomer(Ticket ticket)
{
Screening = new ScreeningNoTicket(ticket.Screening);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace api_cinema_challenge.DOTs.CustomerDTOs
{
public class TicketNoExtra
{
public int Id { get; set; }
public int numSeats { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using api_cinema_challenge.Models;

namespace api_cinema_challenge.DOTs.MovieDTOs
{
public class CustomerNoTicket
{
public string Name { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public CustomerNoTicket(Customer customer)
{
Name = customer.Name;
Email = customer.Email;
Phone = customer.Phone;

}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using api_cinema_challenge.DOTs.CustomerDTOs;
using api_cinema_challenge.Models;

namespace api_cinema_challenge.DOTs.MovieDTOs
{
public class MovieGet
{
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Rating { get; set; }
public int RunTimeMins { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }

public IEnumerable<ScreeningsNoMovie> Screenings { get; set; } = new List<ScreeningsNoMovie>();

public MovieGet(Movie movie)
{
Id = movie.Id;
Title = movie.Title;
Description = movie.Description;
Rating = movie.Rating;
RunTimeMins = movie.RunTimeMins;
Screenings = movie.Screenings.Select(x => new ScreeningsNoMovie(x));
CreatedAt = movie.CreatedAt;
UpdatedAt = movie.UpdatedAt;
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace api_cinema_challenge.DOTs.MovieDTOs
{
public class MoviePost
{
public string Title { get; set; }
public string Rating { get; set; }
public string Description { get; set; }
public int RunTimeMins { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace api_cinema_challenge.DOTs.MovieDTOs
{
public class MoviePut
{
public string Title { get; set; }
public string Rating { get; set; }
public string Description { get; set; }
public int? RunTimeMins { get; set; }

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using api_cinema_challenge.Models;

namespace api_cinema_challenge.DOTs.MovieDTOs
{
public class ScreeningsNoMovie
{
public int ScreenNumber { get; set; }
public int Capacity { get; set; }
public DateTime StartsAt { get; set; }
public IEnumerable<TicketNoScreening> Tickets { get; set; } = new List<TicketNoScreening>();

public ScreeningsNoMovie(Screening screening)
{
ScreenNumber = screening.ScreenNumber;
Capacity = screening.Capacity;
StartsAt = screening.StartsAt;
Tickets = screening.Tickets.Select(t => new TicketNoScreening(t));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using api_cinema_challenge.Models;

namespace api_cinema_challenge.DOTs.MovieDTOs
{
public class TicketNoScreening
{
public CustomerNoTicket Customer { get; set; }
public TicketNoScreening(Ticket ticket)
{
Customer = new CustomerNoTicket(ticket.Customer);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using api_cinema_challenge.Models;

namespace api_cinema_challenge.DOTs.ScreeningDTOs
{
public class ScreeningGet
{
public int Id { get; set; }
public int ScreenNumber { get; set; }
public int Capacity { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }

public ScreeningGet(Screening screening)
{
Id = screening.Id;
ScreenNumber = screening.ScreenNumber;
Capacity = screening.Capacity;
CreatedAt = screening.CreatedAt;
UpdatedAt = screening.UpdatedAt;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace api_cinema_challenge.DOTs.ScreeningDTOs
{
public class ScreeningPost
{
public int ScreenNumber { get; set; }
public int Capacity { get; set; }
public DateTime StartAt { get; set; }
}
}
Loading