From 45788f9c2dfa0c89131f1f47c87739ab515f4888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw?= <62651497+staszkiet@users.noreply.github.com> Date: Sat, 24 May 2025 12:34:31 +0200 Subject: [PATCH 1/5] Logic for setting ticket state to resell --- .../Tickets/Abstractions/ITicketRepository.cs | 1 + .../Tickets/Abstractions/ITicketService.cs | 2 ++ .../Tickets/Controllers/TicketsController.cs | 13 +++++++++ .../DTOs/Request/SetTicketForResellDataDto.cs | 6 ++++ TickAPI/TickAPI/Tickets/Models/Ticket.cs | 1 + .../Tickets/Repositories/TicketRepository.cs | 13 +++++++++ .../TickAPI/Tickets/Services/TicketService.cs | 29 +++++++++++++++++-- 7 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 TickAPI/TickAPI/Tickets/DTOs/Request/SetTicketForResellDataDto.cs diff --git a/TickAPI/TickAPI/Tickets/Abstractions/ITicketRepository.cs b/TickAPI/TickAPI/Tickets/Abstractions/ITicketRepository.cs index 6290950..6bdacf6 100644 --- a/TickAPI/TickAPI/Tickets/Abstractions/ITicketRepository.cs +++ b/TickAPI/TickAPI/Tickets/Abstractions/ITicketRepository.cs @@ -12,4 +12,5 @@ public interface ITicketRepository public IQueryable GetTicketsByEventId(Guid eventId); public IQueryable GetTicketsByCustomerEmail(string email); public Task MarkTicketAsUsed(Guid id); + public Task SetTicketForResell(Guid ticketId, decimal newPrice); } \ No newline at end of file diff --git a/TickAPI/TickAPI/Tickets/Abstractions/ITicketService.cs b/TickAPI/TickAPI/Tickets/Abstractions/ITicketService.cs index c722a8c..f06b2c5 100644 --- a/TickAPI/TickAPI/Tickets/Abstractions/ITicketService.cs +++ b/TickAPI/TickAPI/Tickets/Abstractions/ITicketService.cs @@ -17,4 +17,6 @@ public Task>> GetTicketsForCustome public Task ScanTicket(Guid ticketGuid); public Task> GetTicketDetailsAsync(Guid ticketGuid, string email, string scanUrl); + + public Task SetTicketForResellAsync(Guid ticketId, string email, decimal resellPrice); } \ No newline at end of file diff --git a/TickAPI/TickAPI/Tickets/Controllers/TicketsController.cs b/TickAPI/TickAPI/Tickets/Controllers/TicketsController.cs index 77b45e2..a39dc32 100644 --- a/TickAPI/TickAPI/Tickets/Controllers/TicketsController.cs +++ b/TickAPI/TickAPI/Tickets/Controllers/TicketsController.cs @@ -63,5 +63,18 @@ public async Task> ScanTicket(Guid id) var res = await _ticketService.ScanTicket(id); return res.ToObjectResult(); } + + [HttpPost("resell/{id:guid}")] + + public async Task> SetTicketForResell(Guid id, [FromBody] SetTicketForResellDataDto data) + { + var emailResult = _claimsService.GetEmailFromClaims(User.Claims); + if (emailResult.IsError) + { + return emailResult.ToObjectResult(); + } + var res = await _ticketService.SetTicketForResellAsync(id, emailResult.Value!, data.ResellPrice); + return res.ToObjectResult(); + } } \ No newline at end of file diff --git a/TickAPI/TickAPI/Tickets/DTOs/Request/SetTicketForResellDataDto.cs b/TickAPI/TickAPI/Tickets/DTOs/Request/SetTicketForResellDataDto.cs new file mode 100644 index 0000000..0058278 --- /dev/null +++ b/TickAPI/TickAPI/Tickets/DTOs/Request/SetTicketForResellDataDto.cs @@ -0,0 +1,6 @@ +namespace TickAPI.Tickets.DTOs.Request; + +public record SetTicketForResellDataDto +( + decimal ResellPrice +); \ No newline at end of file diff --git a/TickAPI/TickAPI/Tickets/Models/Ticket.cs b/TickAPI/TickAPI/Tickets/Models/Ticket.cs index 49a68ac..fdd8770 100644 --- a/TickAPI/TickAPI/Tickets/Models/Ticket.cs +++ b/TickAPI/TickAPI/Tickets/Models/Ticket.cs @@ -11,5 +11,6 @@ public class Ticket public string NameOnTicket { get; set; } public string? Seats { get; set; } public bool ForResell { get; set; } + public decimal? ResellPrice { get; set; } public bool Used { get; set; } } \ No newline at end of file diff --git a/TickAPI/TickAPI/Tickets/Repositories/TicketRepository.cs b/TickAPI/TickAPI/Tickets/Repositories/TicketRepository.cs index e5abb5e..e86075b 100644 --- a/TickAPI/TickAPI/Tickets/Repositories/TicketRepository.cs +++ b/TickAPI/TickAPI/Tickets/Repositories/TicketRepository.cs @@ -66,4 +66,17 @@ public async Task MarkTicketAsUsed(Guid id) await _tickApiDbContext.SaveChangesAsync(); return Result.Success(); } + + public async Task SetTicketForResell(Guid ticketId, decimal newPrice) + { + var ticket = await _tickApiDbContext.Tickets.FirstOrDefaultAsync(t => t.Id == ticketId); + if (ticket == null) + { + return Result.Failure(StatusCodes.Status404NotFound, "Ticket with this id doesn't exist"); + } + ticket.ForResell = true; + ticket.ResellPrice = newPrice; + await _tickApiDbContext.SaveChangesAsync(); + return Result.Success(); + } } \ No newline at end of file diff --git a/TickAPI/TickAPI/Tickets/Services/TicketService.cs b/TickAPI/TickAPI/Tickets/Services/TicketService.cs index 27b60fd..b16e64e 100644 --- a/TickAPI/TickAPI/Tickets/Services/TicketService.cs +++ b/TickAPI/TickAPI/Tickets/Services/TicketService.cs @@ -110,6 +110,31 @@ public async Task ScanTicket(Guid ticketGuid) var res = await _ticketRepository.MarkTicketAsUsed(ticketGuid); return res; } - - + + public async Task SetTicketForResellAsync(Guid ticketId, string email, decimal resellPrice) + { + if (resellPrice <= 0) + { + return Result.Failure(StatusCodes.Status500InternalServerError, "Price must be greater than zero"); + } + var ticketRes = await _ticketRepository.GetTicketWithDetailsByIdAndEmailAsync(ticketId, email); + if (ticketRes.IsError) + { + return Result.PropagateError(ticketRes); + } + + if (ticketRes.Value!.Type.Price < 1.5m*resellPrice) + { + return Result.Failure(StatusCodes.Status500InternalServerError, "Resell price cannot exceed " + + "value of original price times 1.5"); + } + + if (ticketRes.Value!.ForResell) + { + return Result.Failure(StatusCodes.Status500InternalServerError, "Ticket is already set for resell"); + } + + var res = await _ticketRepository.SetTicketForResell(ticketId, resellPrice); + return res; + } } \ No newline at end of file From d898aa22c2065b17ce183ea705a1f5ca08c004ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw?= <62651497+staszkiet@users.noreply.github.com> Date: Sat, 24 May 2025 13:08:08 +0200 Subject: [PATCH 2/5] Validation stuff --- .../20250524104655_resellprice.Designer.cs | 395 ++++++++++++++++++ .../Migrations/20250524104655_resellprice.cs | 28 ++ .../20250524105603_nullableowner.Designer.cs | 393 +++++++++++++++++ .../20250524105603_nullableowner.cs | 60 +++ .../TickApiDbContextModelSnapshot.cs | 9 +- TickAPI/TickAPI/Tickets/Models/Ticket.cs | 2 +- .../TickAPI/Tickets/Services/TicketService.cs | 7 +- 7 files changed, 888 insertions(+), 6 deletions(-) create mode 100644 TickAPI/TickAPI/Migrations/20250524104655_resellprice.Designer.cs create mode 100644 TickAPI/TickAPI/Migrations/20250524104655_resellprice.cs create mode 100644 TickAPI/TickAPI/Migrations/20250524105603_nullableowner.Designer.cs create mode 100644 TickAPI/TickAPI/Migrations/20250524105603_nullableowner.cs diff --git a/TickAPI/TickAPI/Migrations/20250524104655_resellprice.Designer.cs b/TickAPI/TickAPI/Migrations/20250524104655_resellprice.Designer.cs new file mode 100644 index 0000000..ad10aaa --- /dev/null +++ b/TickAPI/TickAPI/Migrations/20250524104655_resellprice.Designer.cs @@ -0,0 +1,395 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TickAPI.Common.TickApiDbContext; + +#nullable disable + +namespace TickAPI.Migrations +{ + [DbContext(typeof(TickApiDbContext))] + [Migration("20250524104655_resellprice")] + partial class resellprice + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("CategoryEvent", b => + { + b.Property("CategoriesId") + .HasColumnType("uniqueidentifier"); + + b.Property("EventsId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("CategoriesId", "EventsId"); + + b.HasIndex("EventsId"); + + b.ToTable("CategoryEvent"); + }); + + modelBuilder.Entity("TickAPI.Addresses.Models.Address", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("City") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Country") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FlatNumber") + .HasColumnType("bigint"); + + b.Property("HouseNumber") + .HasColumnType("bigint"); + + b.Property("PostalCode") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Street") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Addresses"); + }); + + modelBuilder.Entity("TickAPI.Admins.Models.Admin", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Login") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Admins"); + }); + + modelBuilder.Entity("TickAPI.Categories.Models.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Categories"); + + b.HasData( + new + { + Id = new Guid("ec3daf69-baa9-4fcd-a674-c09884a57272"), + Name = "Music" + }, + new + { + Id = new Guid("de89dd76-3b29-43e1-8f4b-5278b1b8bde2"), + Name = "Sports" + }, + new + { + Id = new Guid("ea58370b-2a17-4770-abea-66399ad69fb8"), + Name = "Conferences" + }, + new + { + Id = new Guid("4a086d9e-59de-4fd1-a1b2-bd9b5eec797c"), + Name = "Theatre" + }, + new + { + Id = new Guid("5f8dbe65-30be-453f-8f22-191a11b2977b"), + Name = "Comedy" + }, + new + { + Id = new Guid("4421327a-4bc8-4706-bec0-666f78ed0c69"), + Name = "Workshops" + }); + }); + + modelBuilder.Entity("TickAPI.Customers.Models.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Customers"); + }); + + modelBuilder.Entity("TickAPI.Events.Models.Event", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AddressId") + .HasColumnType("uniqueidentifier"); + + b.Property("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("EndDate") + .HasColumnType("datetime2"); + + b.Property("EventStatus") + .HasColumnType("int"); + + b.Property("MinimumAge") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizerId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartDate") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("AddressId"); + + b.HasIndex("OrganizerId"); + + b.ToTable("Events"); + }); + + modelBuilder.Entity("TickAPI.Organizers.Models.Organizer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsVerified") + .HasColumnType("bit"); + + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Organizers"); + }); + + modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AvailableFrom") + .HasColumnType("datetime2"); + + b.Property("Currency") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("EventId") + .HasColumnType("uniqueidentifier"); + + b.Property("MaxCount") + .HasColumnType("bigint"); + + b.Property("Price") + .HasColumnType("decimal(18,2)"); + + b.HasKey("Id"); + + b.HasIndex("EventId"); + + b.ToTable("TicketTypes"); + }); + + modelBuilder.Entity("TickAPI.Tickets.Models.Ticket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ForResell") + .HasColumnType("bit"); + + b.Property("NameOnTicket") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OwnerId") + .HasColumnType("uniqueidentifier"); + + b.Property("ResellPrice") + .HasColumnType("decimal(18,2)"); + + b.Property("Seats") + .HasColumnType("nvarchar(max)"); + + b.Property("TypeId") + .HasColumnType("uniqueidentifier"); + + b.Property("Used") + .HasColumnType("bit"); + + b.HasKey("Id"); + + b.HasIndex("OwnerId"); + + b.HasIndex("TypeId"); + + b.ToTable("Tickets"); + }); + + modelBuilder.Entity("CategoryEvent", b => + { + b.HasOne("TickAPI.Categories.Models.Category", null) + .WithMany() + .HasForeignKey("CategoriesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TickAPI.Events.Models.Event", null) + .WithMany() + .HasForeignKey("EventsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("TickAPI.Events.Models.Event", b => + { + b.HasOne("TickAPI.Addresses.Models.Address", "Address") + .WithMany() + .HasForeignKey("AddressId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TickAPI.Organizers.Models.Organizer", "Organizer") + .WithMany("Events") + .HasForeignKey("OrganizerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Address"); + + b.Navigation("Organizer"); + }); + + modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => + { + b.HasOne("TickAPI.Events.Models.Event", "Event") + .WithMany("TicketTypes") + .HasForeignKey("EventId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Event"); + }); + + modelBuilder.Entity("TickAPI.Tickets.Models.Ticket", b => + { + b.HasOne("TickAPI.Customers.Models.Customer", "Owner") + .WithMany("Tickets") + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TickAPI.TicketTypes.Models.TicketType", "Type") + .WithMany("Tickets") + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + + b.Navigation("Type"); + }); + + modelBuilder.Entity("TickAPI.Customers.Models.Customer", b => + { + b.Navigation("Tickets"); + }); + + modelBuilder.Entity("TickAPI.Events.Models.Event", b => + { + b.Navigation("TicketTypes"); + }); + + modelBuilder.Entity("TickAPI.Organizers.Models.Organizer", b => + { + b.Navigation("Events"); + }); + + modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => + { + b.Navigation("Tickets"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TickAPI/TickAPI/Migrations/20250524104655_resellprice.cs b/TickAPI/TickAPI/Migrations/20250524104655_resellprice.cs new file mode 100644 index 0000000..db156f8 --- /dev/null +++ b/TickAPI/TickAPI/Migrations/20250524104655_resellprice.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TickAPI.Migrations +{ + /// + public partial class resellprice : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ResellPrice", + table: "Tickets", + type: "decimal(18,2)", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ResellPrice", + table: "Tickets"); + } + } +} diff --git a/TickAPI/TickAPI/Migrations/20250524105603_nullableowner.Designer.cs b/TickAPI/TickAPI/Migrations/20250524105603_nullableowner.Designer.cs new file mode 100644 index 0000000..5d1fbea --- /dev/null +++ b/TickAPI/TickAPI/Migrations/20250524105603_nullableowner.Designer.cs @@ -0,0 +1,393 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TickAPI.Common.TickApiDbContext; + +#nullable disable + +namespace TickAPI.Migrations +{ + [DbContext(typeof(TickApiDbContext))] + [Migration("20250524105603_nullableowner")] + partial class nullableowner + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("CategoryEvent", b => + { + b.Property("CategoriesId") + .HasColumnType("uniqueidentifier"); + + b.Property("EventsId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("CategoriesId", "EventsId"); + + b.HasIndex("EventsId"); + + b.ToTable("CategoryEvent"); + }); + + modelBuilder.Entity("TickAPI.Addresses.Models.Address", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("City") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Country") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FlatNumber") + .HasColumnType("bigint"); + + b.Property("HouseNumber") + .HasColumnType("bigint"); + + b.Property("PostalCode") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Street") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Addresses"); + }); + + modelBuilder.Entity("TickAPI.Admins.Models.Admin", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Login") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Admins"); + }); + + modelBuilder.Entity("TickAPI.Categories.Models.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Categories"); + + b.HasData( + new + { + Id = new Guid("ec3daf69-baa9-4fcd-a674-c09884a57272"), + Name = "Music" + }, + new + { + Id = new Guid("de89dd76-3b29-43e1-8f4b-5278b1b8bde2"), + Name = "Sports" + }, + new + { + Id = new Guid("ea58370b-2a17-4770-abea-66399ad69fb8"), + Name = "Conferences" + }, + new + { + Id = new Guid("4a086d9e-59de-4fd1-a1b2-bd9b5eec797c"), + Name = "Theatre" + }, + new + { + Id = new Guid("5f8dbe65-30be-453f-8f22-191a11b2977b"), + Name = "Comedy" + }, + new + { + Id = new Guid("4421327a-4bc8-4706-bec0-666f78ed0c69"), + Name = "Workshops" + }); + }); + + modelBuilder.Entity("TickAPI.Customers.Models.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Customers"); + }); + + modelBuilder.Entity("TickAPI.Events.Models.Event", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AddressId") + .HasColumnType("uniqueidentifier"); + + b.Property("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("EndDate") + .HasColumnType("datetime2"); + + b.Property("EventStatus") + .HasColumnType("int"); + + b.Property("MinimumAge") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizerId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartDate") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("AddressId"); + + b.HasIndex("OrganizerId"); + + b.ToTable("Events"); + }); + + modelBuilder.Entity("TickAPI.Organizers.Models.Organizer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsVerified") + .HasColumnType("bit"); + + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Organizers"); + }); + + modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AvailableFrom") + .HasColumnType("datetime2"); + + b.Property("Currency") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("EventId") + .HasColumnType("uniqueidentifier"); + + b.Property("MaxCount") + .HasColumnType("bigint"); + + b.Property("Price") + .HasColumnType("decimal(18,2)"); + + b.HasKey("Id"); + + b.HasIndex("EventId"); + + b.ToTable("TicketTypes"); + }); + + modelBuilder.Entity("TickAPI.Tickets.Models.Ticket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ForResell") + .HasColumnType("bit"); + + b.Property("NameOnTicket") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OwnerId") + .HasColumnType("uniqueidentifier"); + + b.Property("ResellPrice") + .HasColumnType("decimal(18,2)"); + + b.Property("Seats") + .HasColumnType("nvarchar(max)"); + + b.Property("TypeId") + .HasColumnType("uniqueidentifier"); + + b.Property("Used") + .HasColumnType("bit"); + + b.HasKey("Id"); + + b.HasIndex("OwnerId"); + + b.HasIndex("TypeId"); + + b.ToTable("Tickets"); + }); + + modelBuilder.Entity("CategoryEvent", b => + { + b.HasOne("TickAPI.Categories.Models.Category", null) + .WithMany() + .HasForeignKey("CategoriesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TickAPI.Events.Models.Event", null) + .WithMany() + .HasForeignKey("EventsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("TickAPI.Events.Models.Event", b => + { + b.HasOne("TickAPI.Addresses.Models.Address", "Address") + .WithMany() + .HasForeignKey("AddressId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TickAPI.Organizers.Models.Organizer", "Organizer") + .WithMany("Events") + .HasForeignKey("OrganizerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Address"); + + b.Navigation("Organizer"); + }); + + modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => + { + b.HasOne("TickAPI.Events.Models.Event", "Event") + .WithMany("TicketTypes") + .HasForeignKey("EventId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Event"); + }); + + modelBuilder.Entity("TickAPI.Tickets.Models.Ticket", b => + { + b.HasOne("TickAPI.Customers.Models.Customer", "Owner") + .WithMany("Tickets") + .HasForeignKey("OwnerId"); + + b.HasOne("TickAPI.TicketTypes.Models.TicketType", "Type") + .WithMany("Tickets") + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + + b.Navigation("Type"); + }); + + modelBuilder.Entity("TickAPI.Customers.Models.Customer", b => + { + b.Navigation("Tickets"); + }); + + modelBuilder.Entity("TickAPI.Events.Models.Event", b => + { + b.Navigation("TicketTypes"); + }); + + modelBuilder.Entity("TickAPI.Organizers.Models.Organizer", b => + { + b.Navigation("Events"); + }); + + modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => + { + b.Navigation("Tickets"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TickAPI/TickAPI/Migrations/20250524105603_nullableowner.cs b/TickAPI/TickAPI/Migrations/20250524105603_nullableowner.cs new file mode 100644 index 0000000..b868a03 --- /dev/null +++ b/TickAPI/TickAPI/Migrations/20250524105603_nullableowner.cs @@ -0,0 +1,60 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TickAPI.Migrations +{ + /// + public partial class nullableowner : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Tickets_Customers_OwnerId", + table: "Tickets"); + + migrationBuilder.AlterColumn( + name: "OwnerId", + table: "Tickets", + type: "uniqueidentifier", + nullable: true, + oldClrType: typeof(Guid), + oldType: "uniqueidentifier"); + + migrationBuilder.AddForeignKey( + name: "FK_Tickets_Customers_OwnerId", + table: "Tickets", + column: "OwnerId", + principalTable: "Customers", + principalColumn: "Id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Tickets_Customers_OwnerId", + table: "Tickets"); + + migrationBuilder.AlterColumn( + name: "OwnerId", + table: "Tickets", + type: "uniqueidentifier", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + oldClrType: typeof(Guid), + oldType: "uniqueidentifier", + oldNullable: true); + + migrationBuilder.AddForeignKey( + name: "FK_Tickets_Customers_OwnerId", + table: "Tickets", + column: "OwnerId", + principalTable: "Customers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs b/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs index 50fd0cc..c6fa5bc 100644 --- a/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs +++ b/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs @@ -279,9 +279,12 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("nvarchar(max)"); - b.Property("OwnerId") + b.Property("OwnerId") .HasColumnType("uniqueidentifier"); + b.Property("ResellPrice") + .HasColumnType("decimal(18,2)"); + b.Property("Seats") .HasColumnType("nvarchar(max)"); @@ -349,9 +352,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.HasOne("TickAPI.Customers.Models.Customer", "Owner") .WithMany("Tickets") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + .HasForeignKey("OwnerId"); b.HasOne("TickAPI.TicketTypes.Models.TicketType", "Type") .WithMany("Tickets") diff --git a/TickAPI/TickAPI/Tickets/Models/Ticket.cs b/TickAPI/TickAPI/Tickets/Models/Ticket.cs index fdd8770..3805153 100644 --- a/TickAPI/TickAPI/Tickets/Models/Ticket.cs +++ b/TickAPI/TickAPI/Tickets/Models/Ticket.cs @@ -7,7 +7,7 @@ public class Ticket { public Guid Id { get; set; } public TicketType Type { get; set; } - public Customer Owner { get; set; } + public Customer? Owner { get; set; } public string NameOnTicket { get; set; } public string? Seats { get; set; } public bool ForResell { get; set; } diff --git a/TickAPI/TickAPI/Tickets/Services/TicketService.cs b/TickAPI/TickAPI/Tickets/Services/TicketService.cs index b16e64e..21098da 100644 --- a/TickAPI/TickAPI/Tickets/Services/TicketService.cs +++ b/TickAPI/TickAPI/Tickets/Services/TicketService.cs @@ -123,7 +123,7 @@ public async Task SetTicketForResellAsync(Guid ticketId, string email, d return Result.PropagateError(ticketRes); } - if (ticketRes.Value!.Type.Price < 1.5m*resellPrice) + if (ticketRes.Value!.Type.Price*1.5m < resellPrice) { return Result.Failure(StatusCodes.Status500InternalServerError, "Resell price cannot exceed " + "value of original price times 1.5"); @@ -133,6 +133,11 @@ public async Task SetTicketForResellAsync(Guid ticketId, string email, d { return Result.Failure(StatusCodes.Status500InternalServerError, "Ticket is already set for resell"); } + + if (ticketRes.Value!.Used) + { + return Result.Failure(StatusCodes.Status500InternalServerError, "Ticket is already used"); + } var res = await _ticketRepository.SetTicketForResell(ticketId, resellPrice); return res; From 8f447bd8d079eaa8acbde4cf5bdb3af86d9923c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw?= <62651497+staszkiet@users.noreply.github.com> Date: Sat, 24 May 2025 13:18:37 +0200 Subject: [PATCH 3/5] tests --- .../Tickets/Services/TicketServiceTests.cs | 101 +++++ ...0250524110838_nonnullableowenr.Designer.cs | 395 ++++++++++++++++++ .../20250524110838_nonnullableowenr.cs | 60 +++ .../TickApiDbContextModelSnapshot.cs | 6 +- TickAPI/TickAPI/Tickets/Models/Ticket.cs | 2 +- 5 files changed, 561 insertions(+), 3 deletions(-) create mode 100644 TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.Designer.cs create mode 100644 TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.cs diff --git a/TickAPI/TickAPI.Tests/Tickets/Services/TicketServiceTests.cs b/TickAPI/TickAPI.Tests/Tickets/Services/TicketServiceTests.cs index 331853f..aba720e 100644 --- a/TickAPI/TickAPI.Tests/Tickets/Services/TicketServiceTests.cs +++ b/TickAPI/TickAPI.Tests/Tickets/Services/TicketServiceTests.cs @@ -590,4 +590,105 @@ public async Task ScanTicket_WhenScanningSuccesful_ShouldReturnSuccess() // Assert Assert.True(res.IsSuccess); } + + [Fact] + public async Task SetTicketForResellAsync_ReturnsFailure_WhenPriceIsZero() + { + var ticketRepositoryMock = new Mock(); + var paginationServiceMock = new Mock(); + var qrServiceMock = new Mock(); + var sut = new TicketService(ticketRepositoryMock.Object, paginationServiceMock.Object, qrServiceMock.Object); + + var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 0); + + Assert.True(result.IsError); + Assert.Equal(500, result.StatusCode); + } + + [Fact] + public async Task SetTicketForResellAsync_ReturnsFailure_WhenPriceTooHigh() + { + var ticket = CreateTicketForResellTest(price: 100); + var ticketRepositoryMock = new Mock(); + var paginationServiceMock = new Mock(); + var qrServiceMock = new Mock(); + ticketRepositoryMock + .Setup(r => r.GetTicketWithDetailsByIdAndEmailAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success(ticket)); + + var sut = new TicketService(ticketRepositoryMock.Object, paginationServiceMock.Object, qrServiceMock.Object); + var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 160); + + Assert.True(result.IsError); + Assert.Equal(500, result.StatusCode); + } + + [Fact] + public async Task SetTicketForResellAsync_ReturnsFailure_WhenAlreadyForResell() + { + var ticket = CreateTicketForResellTest(price: 100, forResell: true); + var ticketRepositoryMock = new Mock(); + var paginationServiceMock = new Mock(); + var qrServiceMock = new Mock(); + ticketRepositoryMock + .Setup(r => r.GetTicketWithDetailsByIdAndEmailAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success(ticket)); + var sut = new TicketService(ticketRepositoryMock.Object, paginationServiceMock.Object, qrServiceMock.Object); + var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 120); + + Assert.True(result.IsError); + Assert.Equal(500, result.StatusCode); + } + + [Fact] + public async Task SetTicketForResellAsync_ReturnsFailure_WhenTicketIsUsed() + { + var ticket = CreateTicketForResellTest(price: 100, used: true); + var ticketRepositoryMock = new Mock(); + var paginationServiceMock = new Mock(); + var qrServiceMock = new Mock(); + + ticketRepositoryMock + .Setup(r => r.GetTicketWithDetailsByIdAndEmailAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success(ticket)); + var sut = new TicketService(ticketRepositoryMock.Object, paginationServiceMock.Object, qrServiceMock.Object); + + var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 120); + + Assert.True(result.IsError); + Assert.Equal(500, result.StatusCode); + } + + [Fact] + public async Task SetTicketForResellAsync_ReturnsSuccess_WhenValid() + { + var ticketRepositoryMock = new Mock(); + var paginationServiceMock = new Mock(); + var qrServiceMock = new Mock(); + var ticket = CreateTicketForResellTest(price: 100); + ticketRepositoryMock + .Setup(r => r.GetTicketWithDetailsByIdAndEmailAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success(ticket)); + + ticketRepositoryMock + .Setup(r => r.SetTicketForResell(It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success()); + + var sut = new TicketService(ticketRepositoryMock.Object, paginationServiceMock.Object, qrServiceMock.Object); + + var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 130); + + Assert.False(result.IsError); + } + + private Ticket CreateTicketForResellTest(decimal price, bool forResell = false, bool used = false) + { + return new Ticket + { + Id = Guid.NewGuid(), + Type = new TicketType { Price = price }, + ForResell = forResell, + Used = used + }; + } } \ No newline at end of file diff --git a/TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.Designer.cs b/TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.Designer.cs new file mode 100644 index 0000000..60a8d36 --- /dev/null +++ b/TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.Designer.cs @@ -0,0 +1,395 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TickAPI.Common.TickApiDbContext; + +#nullable disable + +namespace TickAPI.Migrations +{ + [DbContext(typeof(TickApiDbContext))] + [Migration("20250524110838_nonnullableowenr")] + partial class nonnullableowenr + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("CategoryEvent", b => + { + b.Property("CategoriesId") + .HasColumnType("uniqueidentifier"); + + b.Property("EventsId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("CategoriesId", "EventsId"); + + b.HasIndex("EventsId"); + + b.ToTable("CategoryEvent"); + }); + + modelBuilder.Entity("TickAPI.Addresses.Models.Address", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("City") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Country") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FlatNumber") + .HasColumnType("bigint"); + + b.Property("HouseNumber") + .HasColumnType("bigint"); + + b.Property("PostalCode") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Street") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Addresses"); + }); + + modelBuilder.Entity("TickAPI.Admins.Models.Admin", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Login") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Admins"); + }); + + modelBuilder.Entity("TickAPI.Categories.Models.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Categories"); + + b.HasData( + new + { + Id = new Guid("ec3daf69-baa9-4fcd-a674-c09884a57272"), + Name = "Music" + }, + new + { + Id = new Guid("de89dd76-3b29-43e1-8f4b-5278b1b8bde2"), + Name = "Sports" + }, + new + { + Id = new Guid("ea58370b-2a17-4770-abea-66399ad69fb8"), + Name = "Conferences" + }, + new + { + Id = new Guid("4a086d9e-59de-4fd1-a1b2-bd9b5eec797c"), + Name = "Theatre" + }, + new + { + Id = new Guid("5f8dbe65-30be-453f-8f22-191a11b2977b"), + Name = "Comedy" + }, + new + { + Id = new Guid("4421327a-4bc8-4706-bec0-666f78ed0c69"), + Name = "Workshops" + }); + }); + + modelBuilder.Entity("TickAPI.Customers.Models.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Customers"); + }); + + modelBuilder.Entity("TickAPI.Events.Models.Event", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AddressId") + .HasColumnType("uniqueidentifier"); + + b.Property("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("EndDate") + .HasColumnType("datetime2"); + + b.Property("EventStatus") + .HasColumnType("int"); + + b.Property("MinimumAge") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizerId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartDate") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("AddressId"); + + b.HasIndex("OrganizerId"); + + b.ToTable("Events"); + }); + + modelBuilder.Entity("TickAPI.Organizers.Models.Organizer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsVerified") + .HasColumnType("bit"); + + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Organizers"); + }); + + modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AvailableFrom") + .HasColumnType("datetime2"); + + b.Property("Currency") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("EventId") + .HasColumnType("uniqueidentifier"); + + b.Property("MaxCount") + .HasColumnType("bigint"); + + b.Property("Price") + .HasColumnType("decimal(18,2)"); + + b.HasKey("Id"); + + b.HasIndex("EventId"); + + b.ToTable("TicketTypes"); + }); + + modelBuilder.Entity("TickAPI.Tickets.Models.Ticket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ForResell") + .HasColumnType("bit"); + + b.Property("NameOnTicket") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OwnerId") + .HasColumnType("uniqueidentifier"); + + b.Property("ResellPrice") + .HasColumnType("decimal(18,2)"); + + b.Property("Seats") + .HasColumnType("nvarchar(max)"); + + b.Property("TypeId") + .HasColumnType("uniqueidentifier"); + + b.Property("Used") + .HasColumnType("bit"); + + b.HasKey("Id"); + + b.HasIndex("OwnerId"); + + b.HasIndex("TypeId"); + + b.ToTable("Tickets"); + }); + + modelBuilder.Entity("CategoryEvent", b => + { + b.HasOne("TickAPI.Categories.Models.Category", null) + .WithMany() + .HasForeignKey("CategoriesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TickAPI.Events.Models.Event", null) + .WithMany() + .HasForeignKey("EventsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("TickAPI.Events.Models.Event", b => + { + b.HasOne("TickAPI.Addresses.Models.Address", "Address") + .WithMany() + .HasForeignKey("AddressId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TickAPI.Organizers.Models.Organizer", "Organizer") + .WithMany("Events") + .HasForeignKey("OrganizerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Address"); + + b.Navigation("Organizer"); + }); + + modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => + { + b.HasOne("TickAPI.Events.Models.Event", "Event") + .WithMany("TicketTypes") + .HasForeignKey("EventId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Event"); + }); + + modelBuilder.Entity("TickAPI.Tickets.Models.Ticket", b => + { + b.HasOne("TickAPI.Customers.Models.Customer", "Owner") + .WithMany("Tickets") + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TickAPI.TicketTypes.Models.TicketType", "Type") + .WithMany("Tickets") + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + + b.Navigation("Type"); + }); + + modelBuilder.Entity("TickAPI.Customers.Models.Customer", b => + { + b.Navigation("Tickets"); + }); + + modelBuilder.Entity("TickAPI.Events.Models.Event", b => + { + b.Navigation("TicketTypes"); + }); + + modelBuilder.Entity("TickAPI.Organizers.Models.Organizer", b => + { + b.Navigation("Events"); + }); + + modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => + { + b.Navigation("Tickets"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.cs b/TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.cs new file mode 100644 index 0000000..b7e500b --- /dev/null +++ b/TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.cs @@ -0,0 +1,60 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TickAPI.Migrations +{ + /// + public partial class nonnullableowenr : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Tickets_Customers_OwnerId", + table: "Tickets"); + + migrationBuilder.AlterColumn( + name: "OwnerId", + table: "Tickets", + type: "uniqueidentifier", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + oldClrType: typeof(Guid), + oldType: "uniqueidentifier", + oldNullable: true); + + migrationBuilder.AddForeignKey( + name: "FK_Tickets_Customers_OwnerId", + table: "Tickets", + column: "OwnerId", + principalTable: "Customers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Tickets_Customers_OwnerId", + table: "Tickets"); + + migrationBuilder.AlterColumn( + name: "OwnerId", + table: "Tickets", + type: "uniqueidentifier", + nullable: true, + oldClrType: typeof(Guid), + oldType: "uniqueidentifier"); + + migrationBuilder.AddForeignKey( + name: "FK_Tickets_Customers_OwnerId", + table: "Tickets", + column: "OwnerId", + principalTable: "Customers", + principalColumn: "Id"); + } + } +} diff --git a/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs b/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs index c6fa5bc..d0dfd47 100644 --- a/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs +++ b/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs @@ -279,7 +279,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("nvarchar(max)"); - b.Property("OwnerId") + b.Property("OwnerId") .HasColumnType("uniqueidentifier"); b.Property("ResellPrice") @@ -352,7 +352,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.HasOne("TickAPI.Customers.Models.Customer", "Owner") .WithMany("Tickets") - .HasForeignKey("OwnerId"); + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); b.HasOne("TickAPI.TicketTypes.Models.TicketType", "Type") .WithMany("Tickets") diff --git a/TickAPI/TickAPI/Tickets/Models/Ticket.cs b/TickAPI/TickAPI/Tickets/Models/Ticket.cs index 3805153..fdd8770 100644 --- a/TickAPI/TickAPI/Tickets/Models/Ticket.cs +++ b/TickAPI/TickAPI/Tickets/Models/Ticket.cs @@ -7,7 +7,7 @@ public class Ticket { public Guid Id { get; set; } public TicketType Type { get; set; } - public Customer? Owner { get; set; } + public Customer Owner { get; set; } public string NameOnTicket { get; set; } public string? Seats { get; set; } public bool ForResell { get; set; } From aec86da3a2289c12643420a1c93f60752f4a5b78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw?= <62651497+staszkiet@users.noreply.github.com> Date: Sat, 24 May 2025 13:23:49 +0200 Subject: [PATCH 4/5] rever miratuons --- .../20250524105603_nullableowner.Designer.cs | 393 ----------------- .../20250524105603_nullableowner.cs | 60 --- ...0250524110838_nonnullableowenr.Designer.cs | 395 ------------------ .../20250524110838_nonnullableowenr.cs | 60 --- .../TickApiDbContextModelSnapshot.cs | 18 +- 5 files changed, 9 insertions(+), 917 deletions(-) delete mode 100644 TickAPI/TickAPI/Migrations/20250524105603_nullableowner.Designer.cs delete mode 100644 TickAPI/TickAPI/Migrations/20250524105603_nullableowner.cs delete mode 100644 TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.Designer.cs delete mode 100644 TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.cs diff --git a/TickAPI/TickAPI/Migrations/20250524105603_nullableowner.Designer.cs b/TickAPI/TickAPI/Migrations/20250524105603_nullableowner.Designer.cs deleted file mode 100644 index 5d1fbea..0000000 --- a/TickAPI/TickAPI/Migrations/20250524105603_nullableowner.Designer.cs +++ /dev/null @@ -1,393 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using TickAPI.Common.TickApiDbContext; - -#nullable disable - -namespace TickAPI.Migrations -{ - [DbContext(typeof(TickApiDbContext))] - [Migration("20250524105603_nullableowner")] - partial class nullableowner - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.2") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("CategoryEvent", b => - { - b.Property("CategoriesId") - .HasColumnType("uniqueidentifier"); - - b.Property("EventsId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("CategoriesId", "EventsId"); - - b.HasIndex("EventsId"); - - b.ToTable("CategoryEvent"); - }); - - modelBuilder.Entity("TickAPI.Addresses.Models.Address", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("City") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Country") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("FlatNumber") - .HasColumnType("bigint"); - - b.Property("HouseNumber") - .HasColumnType("bigint"); - - b.Property("PostalCode") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Street") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Addresses"); - }); - - modelBuilder.Entity("TickAPI.Admins.Models.Admin", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Email") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Login") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Admins"); - }); - - modelBuilder.Entity("TickAPI.Categories.Models.Category", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Categories"); - - b.HasData( - new - { - Id = new Guid("ec3daf69-baa9-4fcd-a674-c09884a57272"), - Name = "Music" - }, - new - { - Id = new Guid("de89dd76-3b29-43e1-8f4b-5278b1b8bde2"), - Name = "Sports" - }, - new - { - Id = new Guid("ea58370b-2a17-4770-abea-66399ad69fb8"), - Name = "Conferences" - }, - new - { - Id = new Guid("4a086d9e-59de-4fd1-a1b2-bd9b5eec797c"), - Name = "Theatre" - }, - new - { - Id = new Guid("5f8dbe65-30be-453f-8f22-191a11b2977b"), - Name = "Comedy" - }, - new - { - Id = new Guid("4421327a-4bc8-4706-bec0-666f78ed0c69"), - Name = "Workshops" - }); - }); - - modelBuilder.Entity("TickAPI.Customers.Models.Customer", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("CreationDate") - .HasColumnType("datetime2"); - - b.Property("Email") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("FirstName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("LastName") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Customers"); - }); - - modelBuilder.Entity("TickAPI.Events.Models.Event", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AddressId") - .HasColumnType("uniqueidentifier"); - - b.Property("Description") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("EndDate") - .HasColumnType("datetime2"); - - b.Property("EventStatus") - .HasColumnType("int"); - - b.Property("MinimumAge") - .HasColumnType("bigint"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("OrganizerId") - .HasColumnType("uniqueidentifier"); - - b.Property("StartDate") - .HasColumnType("datetime2"); - - b.HasKey("Id"); - - b.HasIndex("AddressId"); - - b.HasIndex("OrganizerId"); - - b.ToTable("Events"); - }); - - modelBuilder.Entity("TickAPI.Organizers.Models.Organizer", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("CreationDate") - .HasColumnType("datetime2"); - - b.Property("DisplayName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Email") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("FirstName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("IsVerified") - .HasColumnType("bit"); - - b.Property("LastName") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Organizers"); - }); - - modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AvailableFrom") - .HasColumnType("datetime2"); - - b.Property("Currency") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Description") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("EventId") - .HasColumnType("uniqueidentifier"); - - b.Property("MaxCount") - .HasColumnType("bigint"); - - b.Property("Price") - .HasColumnType("decimal(18,2)"); - - b.HasKey("Id"); - - b.HasIndex("EventId"); - - b.ToTable("TicketTypes"); - }); - - modelBuilder.Entity("TickAPI.Tickets.Models.Ticket", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ForResell") - .HasColumnType("bit"); - - b.Property("NameOnTicket") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("OwnerId") - .HasColumnType("uniqueidentifier"); - - b.Property("ResellPrice") - .HasColumnType("decimal(18,2)"); - - b.Property("Seats") - .HasColumnType("nvarchar(max)"); - - b.Property("TypeId") - .HasColumnType("uniqueidentifier"); - - b.Property("Used") - .HasColumnType("bit"); - - b.HasKey("Id"); - - b.HasIndex("OwnerId"); - - b.HasIndex("TypeId"); - - b.ToTable("Tickets"); - }); - - modelBuilder.Entity("CategoryEvent", b => - { - b.HasOne("TickAPI.Categories.Models.Category", null) - .WithMany() - .HasForeignKey("CategoriesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("TickAPI.Events.Models.Event", null) - .WithMany() - .HasForeignKey("EventsId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("TickAPI.Events.Models.Event", b => - { - b.HasOne("TickAPI.Addresses.Models.Address", "Address") - .WithMany() - .HasForeignKey("AddressId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("TickAPI.Organizers.Models.Organizer", "Organizer") - .WithMany("Events") - .HasForeignKey("OrganizerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Address"); - - b.Navigation("Organizer"); - }); - - modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => - { - b.HasOne("TickAPI.Events.Models.Event", "Event") - .WithMany("TicketTypes") - .HasForeignKey("EventId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Event"); - }); - - modelBuilder.Entity("TickAPI.Tickets.Models.Ticket", b => - { - b.HasOne("TickAPI.Customers.Models.Customer", "Owner") - .WithMany("Tickets") - .HasForeignKey("OwnerId"); - - b.HasOne("TickAPI.TicketTypes.Models.TicketType", "Type") - .WithMany("Tickets") - .HasForeignKey("TypeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Owner"); - - b.Navigation("Type"); - }); - - modelBuilder.Entity("TickAPI.Customers.Models.Customer", b => - { - b.Navigation("Tickets"); - }); - - modelBuilder.Entity("TickAPI.Events.Models.Event", b => - { - b.Navigation("TicketTypes"); - }); - - modelBuilder.Entity("TickAPI.Organizers.Models.Organizer", b => - { - b.Navigation("Events"); - }); - - modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => - { - b.Navigation("Tickets"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/TickAPI/TickAPI/Migrations/20250524105603_nullableowner.cs b/TickAPI/TickAPI/Migrations/20250524105603_nullableowner.cs deleted file mode 100644 index b868a03..0000000 --- a/TickAPI/TickAPI/Migrations/20250524105603_nullableowner.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace TickAPI.Migrations -{ - /// - public partial class nullableowner : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Tickets_Customers_OwnerId", - table: "Tickets"); - - migrationBuilder.AlterColumn( - name: "OwnerId", - table: "Tickets", - type: "uniqueidentifier", - nullable: true, - oldClrType: typeof(Guid), - oldType: "uniqueidentifier"); - - migrationBuilder.AddForeignKey( - name: "FK_Tickets_Customers_OwnerId", - table: "Tickets", - column: "OwnerId", - principalTable: "Customers", - principalColumn: "Id"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Tickets_Customers_OwnerId", - table: "Tickets"); - - migrationBuilder.AlterColumn( - name: "OwnerId", - table: "Tickets", - type: "uniqueidentifier", - nullable: false, - defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), - oldClrType: typeof(Guid), - oldType: "uniqueidentifier", - oldNullable: true); - - migrationBuilder.AddForeignKey( - name: "FK_Tickets_Customers_OwnerId", - table: "Tickets", - column: "OwnerId", - principalTable: "Customers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - } - } -} diff --git a/TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.Designer.cs b/TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.Designer.cs deleted file mode 100644 index 60a8d36..0000000 --- a/TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.Designer.cs +++ /dev/null @@ -1,395 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using TickAPI.Common.TickApiDbContext; - -#nullable disable - -namespace TickAPI.Migrations -{ - [DbContext(typeof(TickApiDbContext))] - [Migration("20250524110838_nonnullableowenr")] - partial class nonnullableowenr - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.2") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("CategoryEvent", b => - { - b.Property("CategoriesId") - .HasColumnType("uniqueidentifier"); - - b.Property("EventsId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("CategoriesId", "EventsId"); - - b.HasIndex("EventsId"); - - b.ToTable("CategoryEvent"); - }); - - modelBuilder.Entity("TickAPI.Addresses.Models.Address", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("City") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Country") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("FlatNumber") - .HasColumnType("bigint"); - - b.Property("HouseNumber") - .HasColumnType("bigint"); - - b.Property("PostalCode") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Street") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Addresses"); - }); - - modelBuilder.Entity("TickAPI.Admins.Models.Admin", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Email") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Login") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Admins"); - }); - - modelBuilder.Entity("TickAPI.Categories.Models.Category", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Categories"); - - b.HasData( - new - { - Id = new Guid("ec3daf69-baa9-4fcd-a674-c09884a57272"), - Name = "Music" - }, - new - { - Id = new Guid("de89dd76-3b29-43e1-8f4b-5278b1b8bde2"), - Name = "Sports" - }, - new - { - Id = new Guid("ea58370b-2a17-4770-abea-66399ad69fb8"), - Name = "Conferences" - }, - new - { - Id = new Guid("4a086d9e-59de-4fd1-a1b2-bd9b5eec797c"), - Name = "Theatre" - }, - new - { - Id = new Guid("5f8dbe65-30be-453f-8f22-191a11b2977b"), - Name = "Comedy" - }, - new - { - Id = new Guid("4421327a-4bc8-4706-bec0-666f78ed0c69"), - Name = "Workshops" - }); - }); - - modelBuilder.Entity("TickAPI.Customers.Models.Customer", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("CreationDate") - .HasColumnType("datetime2"); - - b.Property("Email") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("FirstName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("LastName") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Customers"); - }); - - modelBuilder.Entity("TickAPI.Events.Models.Event", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AddressId") - .HasColumnType("uniqueidentifier"); - - b.Property("Description") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("EndDate") - .HasColumnType("datetime2"); - - b.Property("EventStatus") - .HasColumnType("int"); - - b.Property("MinimumAge") - .HasColumnType("bigint"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("OrganizerId") - .HasColumnType("uniqueidentifier"); - - b.Property("StartDate") - .HasColumnType("datetime2"); - - b.HasKey("Id"); - - b.HasIndex("AddressId"); - - b.HasIndex("OrganizerId"); - - b.ToTable("Events"); - }); - - modelBuilder.Entity("TickAPI.Organizers.Models.Organizer", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("CreationDate") - .HasColumnType("datetime2"); - - b.Property("DisplayName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Email") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("FirstName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("IsVerified") - .HasColumnType("bit"); - - b.Property("LastName") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Organizers"); - }); - - modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("AvailableFrom") - .HasColumnType("datetime2"); - - b.Property("Currency") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Description") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("EventId") - .HasColumnType("uniqueidentifier"); - - b.Property("MaxCount") - .HasColumnType("bigint"); - - b.Property("Price") - .HasColumnType("decimal(18,2)"); - - b.HasKey("Id"); - - b.HasIndex("EventId"); - - b.ToTable("TicketTypes"); - }); - - modelBuilder.Entity("TickAPI.Tickets.Models.Ticket", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("ForResell") - .HasColumnType("bit"); - - b.Property("NameOnTicket") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("OwnerId") - .HasColumnType("uniqueidentifier"); - - b.Property("ResellPrice") - .HasColumnType("decimal(18,2)"); - - b.Property("Seats") - .HasColumnType("nvarchar(max)"); - - b.Property("TypeId") - .HasColumnType("uniqueidentifier"); - - b.Property("Used") - .HasColumnType("bit"); - - b.HasKey("Id"); - - b.HasIndex("OwnerId"); - - b.HasIndex("TypeId"); - - b.ToTable("Tickets"); - }); - - modelBuilder.Entity("CategoryEvent", b => - { - b.HasOne("TickAPI.Categories.Models.Category", null) - .WithMany() - .HasForeignKey("CategoriesId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("TickAPI.Events.Models.Event", null) - .WithMany() - .HasForeignKey("EventsId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("TickAPI.Events.Models.Event", b => - { - b.HasOne("TickAPI.Addresses.Models.Address", "Address") - .WithMany() - .HasForeignKey("AddressId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("TickAPI.Organizers.Models.Organizer", "Organizer") - .WithMany("Events") - .HasForeignKey("OrganizerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Address"); - - b.Navigation("Organizer"); - }); - - modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => - { - b.HasOne("TickAPI.Events.Models.Event", "Event") - .WithMany("TicketTypes") - .HasForeignKey("EventId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Event"); - }); - - modelBuilder.Entity("TickAPI.Tickets.Models.Ticket", b => - { - b.HasOne("TickAPI.Customers.Models.Customer", "Owner") - .WithMany("Tickets") - .HasForeignKey("OwnerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("TickAPI.TicketTypes.Models.TicketType", "Type") - .WithMany("Tickets") - .HasForeignKey("TypeId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Owner"); - - b.Navigation("Type"); - }); - - modelBuilder.Entity("TickAPI.Customers.Models.Customer", b => - { - b.Navigation("Tickets"); - }); - - modelBuilder.Entity("TickAPI.Events.Models.Event", b => - { - b.Navigation("TicketTypes"); - }); - - modelBuilder.Entity("TickAPI.Organizers.Models.Organizer", b => - { - b.Navigation("Events"); - }); - - modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => - { - b.Navigation("Tickets"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.cs b/TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.cs deleted file mode 100644 index b7e500b..0000000 --- a/TickAPI/TickAPI/Migrations/20250524110838_nonnullableowenr.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace TickAPI.Migrations -{ - /// - public partial class nonnullableowenr : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Tickets_Customers_OwnerId", - table: "Tickets"); - - migrationBuilder.AlterColumn( - name: "OwnerId", - table: "Tickets", - type: "uniqueidentifier", - nullable: false, - defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), - oldClrType: typeof(Guid), - oldType: "uniqueidentifier", - oldNullable: true); - - migrationBuilder.AddForeignKey( - name: "FK_Tickets_Customers_OwnerId", - table: "Tickets", - column: "OwnerId", - principalTable: "Customers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Tickets_Customers_OwnerId", - table: "Tickets"); - - migrationBuilder.AlterColumn( - name: "OwnerId", - table: "Tickets", - type: "uniqueidentifier", - nullable: true, - oldClrType: typeof(Guid), - oldType: "uniqueidentifier"); - - migrationBuilder.AddForeignKey( - name: "FK_Tickets_Customers_OwnerId", - table: "Tickets", - column: "OwnerId", - principalTable: "Customers", - principalColumn: "Id"); - } - } -} diff --git a/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs b/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs index d0dfd47..819b0aa 100644 --- a/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs +++ b/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs @@ -34,7 +34,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("EventsId"); - b.ToTable("CategoryEvent"); + b.ToTable("CategoryEvent", (string)null); }); modelBuilder.Entity("TickAPI.Addresses.Models.Address", b => @@ -66,7 +66,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.ToTable("Addresses"); + b.ToTable("Addresses", (string)null); }); modelBuilder.Entity("TickAPI.Admins.Models.Admin", b => @@ -85,7 +85,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.ToTable("Admins"); + b.ToTable("Admins", (string)null); }); modelBuilder.Entity("TickAPI.Categories.Models.Category", b => @@ -100,7 +100,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.ToTable("Categories"); + b.ToTable("Categories", (string)null); b.HasData( new @@ -157,7 +157,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.ToTable("Customers"); + b.ToTable("Customers", (string)null); }); modelBuilder.Entity("TickAPI.Events.Models.Event", b => @@ -198,7 +198,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("OrganizerId"); - b.ToTable("Events"); + b.ToTable("Events", (string)null); }); modelBuilder.Entity("TickAPI.Organizers.Models.Organizer", b => @@ -230,7 +230,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.ToTable("Organizers"); + b.ToTable("Organizers", (string)null); }); modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => @@ -263,7 +263,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("EventId"); - b.ToTable("TicketTypes"); + b.ToTable("TicketTypes", (string)null); }); modelBuilder.Entity("TickAPI.Tickets.Models.Ticket", b => @@ -300,7 +300,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("TypeId"); - b.ToTable("Tickets"); + b.ToTable("Tickets", (string)null); }); modelBuilder.Entity("CategoryEvent", b => From 5b2fc9ab9837bc3c70897fe2fdd41a4292afe1cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw?= <62651497+staszkiet@users.noreply.github.com> Date: Sun, 25 May 2025 19:51:05 +0200 Subject: [PATCH 5/5] apply changes --- .../Tickets/Services/TicketServiceTests.cs | 12 ++--- .../Migrations/20250524104655_resellprice.cs | 28 ----------- ...r.cs => 20250525174930_resell.Designer.cs} | 8 ++-- .../Migrations/20250525174930_resell.cs | 46 +++++++++++++++++++ .../TickApiDbContextModelSnapshot.cs | 21 +++++---- .../Tickets/Abstractions/ITicketRepository.cs | 2 +- .../Tickets/Abstractions/ITicketService.cs | 2 +- .../Tickets/Controllers/TicketsController.cs | 6 +-- .../DTOs/Request/SetTicketForResellDataDto.cs | 3 +- TickAPI/TickAPI/Tickets/Models/Ticket.cs | 1 + .../Tickets/Repositories/TicketRepository.cs | 3 +- .../TickAPI/Tickets/Services/TicketService.cs | 4 +- 12 files changed, 81 insertions(+), 55 deletions(-) delete mode 100644 TickAPI/TickAPI/Migrations/20250524104655_resellprice.cs rename TickAPI/TickAPI/Migrations/{20250524104655_resellprice.Designer.cs => 20250525174930_resell.Designer.cs} (98%) create mode 100644 TickAPI/TickAPI/Migrations/20250525174930_resell.cs diff --git a/TickAPI/TickAPI.Tests/Tickets/Services/TicketServiceTests.cs b/TickAPI/TickAPI.Tests/Tickets/Services/TicketServiceTests.cs index 548175e..de24569 100644 --- a/TickAPI/TickAPI.Tests/Tickets/Services/TicketServiceTests.cs +++ b/TickAPI/TickAPI.Tests/Tickets/Services/TicketServiceTests.cs @@ -651,7 +651,7 @@ public async Task SetTicketForResellAsync_ReturnsFailure_WhenPriceIsZero() var sut = new TicketService(ticketRepositoryMock.Object, ticketTypeRepositoryMock.Object, shoppingCartRepositoryMock.Object, paginationServiceMock.Object, qrServiceMock.Object); - var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 0); + var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 0, "zl"); Assert.True(result.IsError); Assert.Equal(500, result.StatusCode); @@ -672,7 +672,7 @@ public async Task SetTicketForResellAsync_ReturnsFailure_WhenPriceTooHigh() var shoppingCartRepositoryMock = new Mock(); var sut = new TicketService(ticketRepositoryMock.Object, ticketTypeRepositoryMock.Object, shoppingCartRepositoryMock.Object, paginationServiceMock.Object, qrServiceMock.Object); - var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 160); + var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 160, "zl"); Assert.True(result.IsError); Assert.Equal(500, result.StatusCode); @@ -692,7 +692,7 @@ public async Task SetTicketForResellAsync_ReturnsFailure_WhenAlreadyForResell() var shoppingCartRepositoryMock = new Mock(); var sut = new TicketService(ticketRepositoryMock.Object, ticketTypeRepositoryMock.Object, shoppingCartRepositoryMock.Object, paginationServiceMock.Object, qrServiceMock.Object); - var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 120); + var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 120, "zl"); Assert.True(result.IsError); Assert.Equal(500, result.StatusCode); @@ -714,7 +714,7 @@ public async Task SetTicketForResellAsync_ReturnsFailure_WhenTicketIsUsed() var sut = new TicketService(ticketRepositoryMock.Object, ticketTypeRepositoryMock.Object, shoppingCartRepositoryMock.Object, paginationServiceMock.Object, qrServiceMock.Object); - var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 120); + var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 120, "zl"); Assert.True(result.IsError); Assert.Equal(500, result.StatusCode); @@ -732,7 +732,7 @@ public async Task SetTicketForResellAsync_ReturnsSuccess_WhenValid() .ReturnsAsync(Result.Success(ticket)); ticketRepositoryMock - .Setup(r => r.SetTicketForResell(It.IsAny(), It.IsAny())) + .Setup(r => r.SetTicketForResell(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(Result.Success()); var ticketTypeRepositoryMock = new Mock(); @@ -740,7 +740,7 @@ public async Task SetTicketForResellAsync_ReturnsSuccess_WhenValid() var sut = new TicketService(ticketRepositoryMock.Object, ticketTypeRepositoryMock.Object, shoppingCartRepositoryMock.Object, paginationServiceMock.Object, qrServiceMock.Object); - var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 130); + var result = await sut.SetTicketForResellAsync(Guid.NewGuid(), "test@example.com", 130, "zl"); Assert.False(result.IsError); } diff --git a/TickAPI/TickAPI/Migrations/20250524104655_resellprice.cs b/TickAPI/TickAPI/Migrations/20250524104655_resellprice.cs deleted file mode 100644 index db156f8..0000000 --- a/TickAPI/TickAPI/Migrations/20250524104655_resellprice.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace TickAPI.Migrations -{ - /// - public partial class resellprice : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "ResellPrice", - table: "Tickets", - type: "decimal(18,2)", - nullable: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "ResellPrice", - table: "Tickets"); - } - } -} diff --git a/TickAPI/TickAPI/Migrations/20250524104655_resellprice.Designer.cs b/TickAPI/TickAPI/Migrations/20250525174930_resell.Designer.cs similarity index 98% rename from TickAPI/TickAPI/Migrations/20250524104655_resellprice.Designer.cs rename to TickAPI/TickAPI/Migrations/20250525174930_resell.Designer.cs index ad10aaa..7a09fdb 100644 --- a/TickAPI/TickAPI/Migrations/20250524104655_resellprice.Designer.cs +++ b/TickAPI/TickAPI/Migrations/20250525174930_resell.Designer.cs @@ -12,8 +12,8 @@ namespace TickAPI.Migrations { [DbContext(typeof(TickApiDbContext))] - [Migration("20250524104655_resellprice")] - partial class resellprice + [Migration("20250525174930_resell")] + partial class resell { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -279,12 +279,14 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) .HasColumnType("bit"); b.Property("NameOnTicket") - .IsRequired() .HasColumnType("nvarchar(max)"); b.Property("OwnerId") .HasColumnType("uniqueidentifier"); + b.Property("ResellCurrency") + .HasColumnType("nvarchar(max)"); + b.Property("ResellPrice") .HasColumnType("decimal(18,2)"); diff --git a/TickAPI/TickAPI/Migrations/20250525174930_resell.cs b/TickAPI/TickAPI/Migrations/20250525174930_resell.cs new file mode 100644 index 0000000..2c65ace --- /dev/null +++ b/TickAPI/TickAPI/Migrations/20250525174930_resell.cs @@ -0,0 +1,46 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TickAPI.Migrations +{ + /// + public partial class resell : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "NameOnTicket", + table: "Tickets", + type: "nvarchar(max)", + nullable: true, + oldClrType: typeof(string), + oldType: "nvarchar(max)"); + + migrationBuilder.AddColumn( + name: "ResellCurrency", + table: "Tickets", + type: "nvarchar(max)", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ResellCurrency", + table: "Tickets"); + + migrationBuilder.AlterColumn( + name: "NameOnTicket", + table: "Tickets", + type: "nvarchar(max)", + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "nvarchar(max)", + oldNullable: true); + } + } +} diff --git a/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs b/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs index 09ceb2d..71d888e 100644 --- a/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs +++ b/TickAPI/TickAPI/Migrations/TickApiDbContextModelSnapshot.cs @@ -34,7 +34,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("EventsId"); - b.ToTable("CategoryEvent", (string)null); + b.ToTable("CategoryEvent"); }); modelBuilder.Entity("TickAPI.Addresses.Models.Address", b => @@ -66,7 +66,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.ToTable("Addresses", (string)null); + b.ToTable("Addresses"); }); modelBuilder.Entity("TickAPI.Admins.Models.Admin", b => @@ -85,7 +85,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.ToTable("Admins", (string)null); + b.ToTable("Admins"); }); modelBuilder.Entity("TickAPI.Categories.Models.Category", b => @@ -100,7 +100,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.ToTable("Categories", (string)null); + b.ToTable("Categories"); b.HasData( new @@ -157,7 +157,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.ToTable("Customers", (string)null); + b.ToTable("Customers"); }); modelBuilder.Entity("TickAPI.Events.Models.Event", b => @@ -198,7 +198,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("OrganizerId"); - b.ToTable("Events", (string)null); + b.ToTable("Events"); }); modelBuilder.Entity("TickAPI.Organizers.Models.Organizer", b => @@ -230,7 +230,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id"); - b.ToTable("Organizers", (string)null); + b.ToTable("Organizers"); }); modelBuilder.Entity("TickAPI.TicketTypes.Models.TicketType", b => @@ -263,7 +263,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("EventId"); - b.ToTable("TicketTypes", (string)null); + b.ToTable("TicketTypes"); }); modelBuilder.Entity("TickAPI.Tickets.Models.Ticket", b => @@ -281,6 +281,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("OwnerId") .HasColumnType("uniqueidentifier"); + b.Property("ResellCurrency") + .HasColumnType("nvarchar(max)"); + b.Property("ResellPrice") .HasColumnType("decimal(18,2)"); @@ -299,7 +302,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("TypeId"); - b.ToTable("Tickets", (string)null); + b.ToTable("Tickets"); }); modelBuilder.Entity("CategoryEvent", b => diff --git a/TickAPI/TickAPI/Tickets/Abstractions/ITicketRepository.cs b/TickAPI/TickAPI/Tickets/Abstractions/ITicketRepository.cs index 11be49e..4add328 100644 --- a/TickAPI/TickAPI/Tickets/Abstractions/ITicketRepository.cs +++ b/TickAPI/TickAPI/Tickets/Abstractions/ITicketRepository.cs @@ -12,6 +12,6 @@ public interface ITicketRepository public IQueryable GetTicketsByEventId(Guid eventId); public IQueryable GetTicketsByCustomerEmail(string email); public Task MarkTicketAsUsed(Guid id); - public Task SetTicketForResell(Guid ticketId, decimal newPrice); + public Task SetTicketForResell(Guid ticketId, decimal newPrice, string currency); public Task AddTicketAsync(Ticket ticket); } \ No newline at end of file diff --git a/TickAPI/TickAPI/Tickets/Abstractions/ITicketService.cs b/TickAPI/TickAPI/Tickets/Abstractions/ITicketService.cs index 4ee5ef4..1fce588 100644 --- a/TickAPI/TickAPI/Tickets/Abstractions/ITicketService.cs +++ b/TickAPI/TickAPI/Tickets/Abstractions/ITicketService.cs @@ -21,7 +21,7 @@ public Task>> GetTicketsForCustome public Task> GetTicketDetailsAsync(Guid ticketGuid, string email, string scanUrl); - public Task SetTicketForResellAsync(Guid ticketId, string email, decimal resellPrice); + public Task SetTicketForResellAsync(Guid ticketId, string email, decimal resellPrice, string resellCurrency); public Task> GetTicketTypeByIdAsync(Guid ticketTypeId); public Task CreateTicketAsync(TicketType type, Customer owner, string? nameOnTicket = null, string? seats = null); diff --git a/TickAPI/TickAPI/Tickets/Controllers/TicketsController.cs b/TickAPI/TickAPI/Tickets/Controllers/TicketsController.cs index a39dc32..54209b7 100644 --- a/TickAPI/TickAPI/Tickets/Controllers/TicketsController.cs +++ b/TickAPI/TickAPI/Tickets/Controllers/TicketsController.cs @@ -64,16 +64,16 @@ public async Task> ScanTicket(Guid id) return res.ToObjectResult(); } + [AuthorizeWithPolicy(AuthPolicies.CustomerPolicy)] [HttpPost("resell/{id:guid}")] - - public async Task> SetTicketForResell(Guid id, [FromBody] SetTicketForResellDataDto data) + public async Task> SetTicketForResell([FromRoute] Guid id, [FromBody] SetTicketForResellDataDto data) { var emailResult = _claimsService.GetEmailFromClaims(User.Claims); if (emailResult.IsError) { return emailResult.ToObjectResult(); } - var res = await _ticketService.SetTicketForResellAsync(id, emailResult.Value!, data.ResellPrice); + var res = await _ticketService.SetTicketForResellAsync(id, emailResult.Value!, data.ResellPrice, data.ResellCurrency); return res.ToObjectResult(); } diff --git a/TickAPI/TickAPI/Tickets/DTOs/Request/SetTicketForResellDataDto.cs b/TickAPI/TickAPI/Tickets/DTOs/Request/SetTicketForResellDataDto.cs index 0058278..7ee6d82 100644 --- a/TickAPI/TickAPI/Tickets/DTOs/Request/SetTicketForResellDataDto.cs +++ b/TickAPI/TickAPI/Tickets/DTOs/Request/SetTicketForResellDataDto.cs @@ -2,5 +2,6 @@ public record SetTicketForResellDataDto ( - decimal ResellPrice + decimal ResellPrice, + string ResellCurrency ); \ No newline at end of file diff --git a/TickAPI/TickAPI/Tickets/Models/Ticket.cs b/TickAPI/TickAPI/Tickets/Models/Ticket.cs index 31ffd27..3622cc6 100644 --- a/TickAPI/TickAPI/Tickets/Models/Ticket.cs +++ b/TickAPI/TickAPI/Tickets/Models/Ticket.cs @@ -12,5 +12,6 @@ public class Ticket public string? Seats { get; set; } public bool ForResell { get; set; } public decimal? ResellPrice { get; set; } + public string? ResellCurrency { get; set; } public bool Used { get; set; } } \ No newline at end of file diff --git a/TickAPI/TickAPI/Tickets/Repositories/TicketRepository.cs b/TickAPI/TickAPI/Tickets/Repositories/TicketRepository.cs index a365bfc..c3d3911 100644 --- a/TickAPI/TickAPI/Tickets/Repositories/TicketRepository.cs +++ b/TickAPI/TickAPI/Tickets/Repositories/TicketRepository.cs @@ -88,7 +88,7 @@ public async Task AddTicketAsync(Ticket ticket) return Result.Success(); } - public async Task SetTicketForResell(Guid ticketId, decimal newPrice) + public async Task SetTicketForResell(Guid ticketId, decimal newPrice, string currency) { var ticket = await _tickApiDbContext.Tickets.FirstOrDefaultAsync(t => t.Id == ticketId); if (ticket == null) @@ -96,6 +96,7 @@ public async Task SetTicketForResell(Guid ticketId, decimal newPrice) return Result.Failure(StatusCodes.Status404NotFound, "Ticket with this id doesn't exist"); } ticket.ForResell = true; + ticket.ResellCurrency = currency; ticket.ResellPrice = newPrice; await _tickApiDbContext.SaveChangesAsync(); return Result.Success(); diff --git a/TickAPI/TickAPI/Tickets/Services/TicketService.cs b/TickAPI/TickAPI/Tickets/Services/TicketService.cs index f6d82ee..c643424 100644 --- a/TickAPI/TickAPI/Tickets/Services/TicketService.cs +++ b/TickAPI/TickAPI/Tickets/Services/TicketService.cs @@ -185,7 +185,7 @@ public async Task ScanTicket(Guid ticketGuid) return res; } - public async Task SetTicketForResellAsync(Guid ticketId, string email, decimal resellPrice) + public async Task SetTicketForResellAsync(Guid ticketId, string email, decimal resellPrice, string resellCurrency) { if (resellPrice <= 0) { @@ -213,7 +213,7 @@ public async Task SetTicketForResellAsync(Guid ticketId, string email, d return Result.Failure(StatusCodes.Status500InternalServerError, "Ticket is already used"); } - var res = await _ticketRepository.SetTicketForResell(ticketId, resellPrice); + var res = await _ticketRepository.SetTicketForResell(ticketId, resellPrice, resellCurrency); return res; } } \ No newline at end of file