Skip to content

Commit

Permalink
Merge pull request #123 from EduardoKroetz/feature/payment
Browse files Browse the repository at this point in the history
FEATURE: integração do sistema com os serviços do Stripe
  • Loading branch information
EduardoKroetz authored Jun 26, 2024
2 parents 8d40162 + 7fb37f4 commit 3406fbf
Show file tree
Hide file tree
Showing 109 changed files with 4,074 additions and 1,875 deletions.
3 changes: 2 additions & 1 deletion .github/workflows/dotnet-desktop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ jobs:
PasswordToSendEmail: ${{ secrets.PASSWORD_TO_SEND_EMAIL }}
EmailToSendEmail: ${{ secrets.EMAIL_TO_SEND_EMAIL }}
JwtKey: ${{ secrets.JWT_KEY }}

STRIPE__SECRETKEY: ${{ secrets.STRIPE__SECRETKEY }}
STRIPE__PUBLISHABLEKEY: ${{ secrets.STRIPE__PUBLISHABLEKEY }}

steps:
- name: Checkout
Expand Down
18 changes: 13 additions & 5 deletions Hotel.Domain/Configuration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,16 @@ namespace Hotel.Domain;

public static class Configuration
{
public static string ConnectionString = "";
public static string JwtKey = "";
public static string EmailToSendEmail = "";
public static string PasswordToSendEmail = "";
}
public static string ConnectionString = null!;
public static string JwtKey = null!;
public static string EmailToSendEmail = null!;
public static string PasswordToSendEmail = null!;
public static StripeModel Stripe = new();
public static string BaseUrl = "https://localhost:7100";
}

public class StripeModel
{
public string SecretKey { get; set; } = null!;
public string PublishableKey { get; set; } = null!;
};
4 changes: 2 additions & 2 deletions Hotel.Domain/Controllers/CustomerController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,10 @@ public async Task<IActionResult> UpdateNameAsync([FromBody] Name name)

// Endpoint para editar o e-mail do cliente (usando ID do token)
[HttpPatch("email")]
public async Task<IActionResult> UpdateEmailAsync([FromBody] Email email)
public async Task<IActionResult> UpdateEmailAsync([FromBody] Email email, [FromQuery] string code)
{
var customerId = _userService.GetUserIdentifier(User);
return Ok(await _handler.HandleUpdateEmailAsync(customerId, email));
return Ok(await _handler.HandleUpdateEmailAsync(customerId, email, code));
}

// Endpoint para editar o telefone do cliente (usando ID do token)
Expand Down
53 changes: 53 additions & 0 deletions Hotel.Domain/Controllers/PaymentController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using Hotel.Domain.DTOs;
using Microsoft.AspNetCore.Mvc;
using Stripe;
using Stripe.Checkout;

namespace Hotel.Domain.Controllers;

[ApiController]
[Route("v1/payments")]
public class PaymentController : ControllerBase
{
[HttpPost("checkout/card/{priceId}")]
public async Task<IActionResult> CreateCheckout([FromRoute] string priceId)
{
if (string.IsNullOrEmpty(priceId))
{
return BadRequest(new Response("ID de preço inválido"));
}

var options = new SessionCreateOptions
{
PaymentMethodTypes = new List<string>
{
"card"
},

LineItems = new List<SessionLineItemOptions>
{
new SessionLineItemOptions
{
Price = priceId,
Quantity = 1,
}
},
Mode = "payment",
SuccessUrl = "https://localhost:7100/success.html",
CancelUrl = "https://localhost:7100/cancel.html"
};

var service = new SessionService();

try
{
var session = await service.CreateAsync(options);

return Ok(new Response("Sessão criada com sucesso!", new { sessionId = session.Id }));
}
catch (StripeException)
{
throw new StripeException("Algum erro ocorreu ao criar a sessão de pagamento");
}
}
}
8 changes: 8 additions & 0 deletions Hotel.Domain/Controllers/ReservationControllers.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Hotel.Domain.Attributes;
using Hotel.Domain.DTOs.PaymentDTOs;
using Hotel.Domain.DTOs.ReservationDTOs;
using Hotel.Domain.Enums;
using Hotel.Domain.Handlers.ReservationHandlers;
Expand Down Expand Up @@ -127,6 +128,13 @@ public async Task<IActionResult> AddServiceAsync([FromRoute] Guid id, [FromRoute
public async Task<IActionResult> RemoveServiceAsync([FromRoute] Guid id, [FromRoute] Guid serviceId)
=> Ok(await _handler.HandleRemoveServiceAsync(id, serviceId));

[HttpPost("check-in/{Id:guid}")]
[AuthorizePermissions([EPermissions.ReservationCheckIn,EPermissions.DefaultAdminPermission, EPermissions.DefaultEmployeePermission])]
public async Task<IActionResult> ReservationCheckInAsync([FromRoute] Guid Id, [FromBody] CardOptions cardOptions)
{
return Ok(await _handler.HandleReservationCheckInAsync(Id, cardOptions.TokenId));
}

[HttpPatch("finish/{Id:guid}")]
public async Task<IActionResult> FinishReservationAsync([FromRoute] Guid Id)
{
Expand Down
35 changes: 21 additions & 14 deletions Hotel.Domain/Controllers/RoomController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,24 @@ public RoomController(RoomHandler handler)
// Endpoint para buscar todos os quartos
[HttpGet]
public async Task<IActionResult> GetAsync(
[FromQuery] int? skip,
[FromQuery] int? take,
[FromQuery] int? number,
[FromQuery] string? numberOperator,
[FromQuery] decimal? price,
[FromQuery] string? priceOperator,
[FromQuery] ERoomStatus? status,
[FromQuery] int? capacity,
[FromQuery] string? capacityOperator,
[FromQuery] Guid? serviceId,
[FromQuery] Guid? categoryId,
[FromQuery] DateTime? createdAt,
[FromQuery] string? createdAtOperator
[FromQuery] int? skip,
[FromQuery] int? take,
[FromQuery] string? name,
[FromQuery] int? number,
[FromQuery] string? numberOperator,
[FromQuery] decimal? price,
[FromQuery] string? priceOperator,
[FromQuery] ERoomStatus? status,
[FromQuery] int? capacity,
[FromQuery] string? capacityOperator,
[FromQuery] Guid? serviceId,
[FromQuery] Guid? categoryId,
[FromQuery] DateTime? createdAt,
[FromQuery] string? createdAtOperator
)
{
var queryParameters = new RoomQueryParameters(
skip, take, number, numberOperator, price, priceOperator, status,
skip, take, name, number, numberOperator, price, priceOperator, status,
capacity, capacityOperator, serviceId, categoryId, createdAt, createdAtOperator
);

Expand Down Expand Up @@ -85,6 +86,12 @@ public async Task<IActionResult> RemoveServiceAsync([FromRoute] Guid id, [FromRo
public async Task<IActionResult> UpdateNumberAsync([FromRoute] Guid id, [FromRoute] int number)
=> Ok(await _handler.HandleUpdateNumberAsync(id, number));

// Endpoint para atualizar o nome de um quarto (com permissão)
[HttpPatch("{id:guid}")]
[AuthorizePermissions([EPermissions.UpdateRoomName, EPermissions.DefaultAdminPermission, EPermissions.DefaultEmployeePermission])]
public async Task<IActionResult> UpdateNameAsync([FromRoute] Guid id, [FromQuery] string name)
=> Ok(await _handler.HandleUpdateNameAsync(id, name));

// Endpoint para atualizar a capacidade de um quarto (com permissão)
[HttpPatch("{id:guid}/capacity/{capacity:int}")]
[AuthorizePermissions([EPermissions.UpdateRoomCapacity, EPermissions.DefaultAdminPermission, EPermissions.DefaultEmployeePermission])]
Expand Down
3 changes: 3 additions & 0 deletions Hotel.Domain/DTOs/PaymentDTOs/CardOptions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace Hotel.Domain.DTOs.PaymentDTOs;

public record CardOptions(string TokenId);
4 changes: 3 additions & 1 deletion Hotel.Domain/DTOs/RoomDTOs/EditorRoom.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@ namespace Hotel.Domain.DTOs.RoomDTOs;

public class EditorRoom : IDataTransferObject
{
public EditorRoom(int number, decimal price, int capacity, string description, Guid categoryId)
public EditorRoom(string name ,int number, decimal price, int capacity, string description, Guid categoryId)
{
Name = name;
Number = number;
Price = price;
Capacity = capacity;
Description = description;
CategoryId = categoryId;
}

public string Name { get; private set; }
public int Number { get; private set; }
public decimal Price { get; private set; }
public int Capacity { get; private set; }
Expand Down
6 changes: 3 additions & 3 deletions Hotel.Domain/DTOs/RoomDTOs/GetRoom.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,27 @@ namespace Hotel.Domain.DTOs.RoomDTOs;

public class GetRoom : IDataTransferObject
{
public GetRoom(Guid id, int number, decimal price, ERoomStatus status, int capacity, string description, ICollection<Service> services, Guid categoryId, ICollection<Image> images, DateTime createdAt)
public GetRoom(Guid id,string name , int number, decimal price, ERoomStatus status, int capacity, string description, Guid categoryId, ICollection<Image> images, DateTime createdAt)
{
Id = id;
Name = name;
Number = number;
Price = price;
Status = status;
Capacity = capacity;
Description = description;
Services = services;
CategoryId = categoryId;
Images = images;
CreatedAt = createdAt;
}

public Guid Id { get; set; }
public string Name { get; private set; }
public int Number { get; private set; }
public decimal Price { get; private set; }
public ERoomStatus Status { get; private set; }
public int Capacity { get; private set; }
public string Description { get; private set; }
public ICollection<Service> Services { get; private set; }
public Guid CategoryId { get; private set; }
public ICollection<Image> Images { get; private set; }
public DateTime CreatedAt { get; private set; }
Expand Down
28 changes: 0 additions & 28 deletions Hotel.Domain/DTOs/RoomDTOs/GetRoomCollection.cs

This file was deleted.

4 changes: 3 additions & 1 deletion Hotel.Domain/DTOs/RoomDTOs/RoomQueryParameters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ namespace Hotel.Domain.DTOs.RoomDTOs;

public class RoomQueryParameters : QueryParameters
{
public RoomQueryParameters(int? skip, int? take, int? number, string? numberOperator, decimal? price, string? priceOperator, ERoomStatus? status, int? capacity, string? capacityOperator, Guid? serviceId, Guid? categoryId, DateTime? createdAt, string? createdAtOperator) : base(skip, take, createdAt, createdAtOperator)
public RoomQueryParameters(int? skip, int? take, string? name, int? number, string? numberOperator, decimal? price, string? priceOperator, ERoomStatus? status, int? capacity, string? capacityOperator, Guid? serviceId, Guid? categoryId, DateTime? createdAt, string? createdAtOperator) : base(skip, take, createdAt, createdAtOperator)
{
Name = name;
Number = number;
NumberOperator = numberOperator;
Price = price;
Expand All @@ -18,6 +19,7 @@ public RoomQueryParameters(int? skip, int? take, int? number, string? numberOper
CategoryId = categoryId;
}

public string? Name { get; private set; }
public int? Number { get; private set; }
public string? NumberOperator { get; private set; }
public decimal? Price { get; private set; }
Expand Down
4 changes: 3 additions & 1 deletion Hotel.Domain/DTOs/ServiceDTOs/EditorService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,17 @@ namespace Hotel.Domain.DTOs.ServiceDTOs;

public class EditorService : IDataTransferObject
{
public EditorService(string name, decimal price, EPriority priority, int timeInMinutes)
public EditorService(string name, string description, decimal price, EPriority priority, int timeInMinutes)
{
Name = name;
Description = description;
Price = price;
Priority = priority;
TimeInMinutes = timeInMinutes;
}

public string Name { get; private set; }
public string Description { get; private set; }
public decimal Price { get; private set; }
public EPriority Priority { get; private set; }
public int TimeInMinutes { get; private set; }
Expand Down
5 changes: 5 additions & 0 deletions Hotel.Domain/Data/HotelDbContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ public HotelDbContext(DbContextOptions<HotelDbContext> options) : base(options)
public DbSet<Like> Likes { get; set; }
public DbSet<Dislike> Dislikes { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.EnableSensitiveDataLogging();
}

protected override void OnModelCreating(ModelBuilder model)
{

Expand Down
4 changes: 4 additions & 0 deletions Hotel.Domain/Data/Mappings/CustomerMapping.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@ public void Configure(EntityTypeBuilder<Customer> builder)
{
BaseMapping(builder);


builder.ToTable("Customers");

builder.Property(x => x.StripeCustomerId)
.HasColumnType("NVARCHAR(120)");

builder.HasMany(c => c.Feedbacks)
.WithOne(f => f.Customer)
.HasForeignKey(f => f.CustomerId)
Expand Down
3 changes: 3 additions & 0 deletions Hotel.Domain/Data/Mappings/ReservationMapping.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ public void Configure(EntityTypeBuilder<Reservation> builder)
builder.Property(x => x.Capacity)
.IsRequired();

builder.Property(x => x.StripePaymentIntentId)
.IsRequired();

builder.Property(x => x.RoomId)
.IsRequired();

Expand Down
9 changes: 9 additions & 0 deletions Hotel.Domain/Data/Mappings/RoomMapping.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ public void Configure(EntityTypeBuilder<Room> builder)

builder.ToTable("Rooms");

builder.Property(x => x.Name)
.IsRequired();

builder.HasIndex(x => x.Name)
.IsUnique();

builder.Property(x => x.Number)
.IsRequired();

Expand All @@ -36,6 +42,9 @@ public void Configure(EntityTypeBuilder<Room> builder)
builder.Property(x => x.Description)
.IsRequired();

builder.Property(x => x.StripeProductId)
.IsRequired();

builder.Property(x => x.CategoryId);
builder.HasOne(x => x.Category)
.WithMany(x => x.Rooms)
Expand Down
1 change: 1 addition & 0 deletions Hotel.Domain/Entities/CustomerEntity/Customer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public Customer(Name name, Email email, Phone phone, string password, EGender? g
{
}

public string StripeCustomerId { get; set; } = "";
public ICollection<Feedback> Feedbacks { get; private set; } = [];
public ICollection<Reservation> Reservations { get; private set; } = [];
public ICollection<Invoice> Invoices { get; private set; } = [];
Expand Down
Loading

0 comments on commit 3406fbf

Please sign in to comment.