From cb433ba39056041d048e9a24b55769b6a167538a Mon Sep 17 00:00:00 2001 From: Tara Wilson Date: Fri, 6 Dec 2024 17:23:23 -0500 Subject: [PATCH] Refactoring Building out UI Building out API Fixing Bugs --- .../api/Controllers/TicketController.cs | 3 +- source/ticketAPI/api/RestFiles/event.http | 14 ++-- source/ticketAPI/api/RestFiles/scan.http | 2 +- source/ticketAPI/api/RestFiles/season.http | 8 +-- source/ticketAPI/api/RestFiles/ticket.http | 21 +++++- source/ticketAPI/api/Services/EventManager.cs | 6 +- .../ticketAPI/api/Services/SeasonManager.cs | 4 +- source/ticketAPI/data/Events/Update.cs | 4 +- source/ticketAPI/models/Core/Event.cs | 5 +- source/ticketAPI/models/Core/Ticket.cs | 1 + source/ticketAPI/models/Request/AddEvent.cs | 5 +- source/ticketAPI/models/Request/AddSeason.cs | 4 +- source/ticketAPI/models/Request/AddTicket.cs | 1 + .../ticketAPI/models/Request/EventSearch.cs | 7 -- source/ticketAPI/models/Request/PatchEvent.cs | 4 +- source/ticketUI/public/fail.svg | 1 + source/ticketUI/public/group.svg | 1 + source/ticketUI/public/pass.svg | 1 + source/ticketUI/public/season.svg | 1 + source/ticketUI/public/senior.svg | 1 + source/ticketUI/public/single.svg | 1 + source/ticketUI/src/app/app.component.html | 2 +- source/ticketUI/src/app/app.component.ts | 4 +- .../event-browser.component.html | 8 +++ .../event-browser.component.scss | 0 .../event-browser/event-browser.component.ts | 17 +++++ .../src/app/page/debug/debug.component.ts | 7 +- .../src/app/page/event/event.component.html | 45 ++++++++++++- .../src/app/page/event/event.component.scss | 3 + .../src/app/page/event/event.component.ts | 26 +++++++- .../src/app/page/ticket/ticket.component.html | 5 +- .../src/app/page/ticket/ticket.component.ts | 5 +- .../scan-result/scan-result.component.html | 58 +++++++++++++++- .../app/scan-result/scan-result.component.ts | 5 +- .../season-browser.component.html | 8 +++ .../season-browser.component.scss | 0 .../season-browser.component.ts | 17 +++++ .../src/app/services/event.service.ts | 34 ++++++++-- .../ticketUI/src/app/services/scan.service.ts | 4 +- .../src/app/services/season.service.ts | 66 +++++++++++++++++++ .../src/app/services/snackbar.service.ts | 19 ++++++ .../src/app/services/ticket.service.ts | 8 ++- .../src/app/sidebar/sidebar.component.html | 2 +- .../src/app/snackbar/snackbar.component.html | 3 + .../src/app/snackbar/snackbar.component.scss | 16 +++++ .../src/app/snackbar/snackbar.component.ts | 14 ++++ source/ticketUI/src/models/core/event.ts | 13 ++++ source/ticketUI/src/models/core/season.ts | 7 ++ source/ticketUI/src/models/core/talent.ts | 2 +- source/ticketUI/src/models/core/venue.ts | 2 +- source/ticketUI/src/models/endpoints.ts | 10 ++- .../src/models/request/add-event-request.ts | 4 +- .../ticketUI/src/models/request/add-season.ts | 6 ++ .../ticketUI/src/models/request/add-ticket.ts | 6 ++ .../src/models/request/mint-request.ts | 5 -- .../src/models/request/patch-event.ts | 4 +- source/ticketUI/src/styles.scss | 4 ++ 57 files changed, 461 insertions(+), 73 deletions(-) delete mode 100644 source/ticketAPI/models/Request/EventSearch.cs create mode 100644 source/ticketUI/public/fail.svg create mode 100644 source/ticketUI/public/group.svg create mode 100644 source/ticketUI/public/pass.svg create mode 100644 source/ticketUI/public/season.svg create mode 100644 source/ticketUI/public/senior.svg create mode 100644 source/ticketUI/public/single.svg create mode 100644 source/ticketUI/src/app/event-browser/event-browser.component.html create mode 100644 source/ticketUI/src/app/event-browser/event-browser.component.scss create mode 100644 source/ticketUI/src/app/event-browser/event-browser.component.ts create mode 100644 source/ticketUI/src/app/season-browser/season-browser.component.html create mode 100644 source/ticketUI/src/app/season-browser/season-browser.component.scss create mode 100644 source/ticketUI/src/app/season-browser/season-browser.component.ts create mode 100644 source/ticketUI/src/app/services/season.service.ts create mode 100644 source/ticketUI/src/app/services/snackbar.service.ts create mode 100644 source/ticketUI/src/app/snackbar/snackbar.component.html create mode 100644 source/ticketUI/src/app/snackbar/snackbar.component.scss create mode 100644 source/ticketUI/src/app/snackbar/snackbar.component.ts create mode 100644 source/ticketUI/src/models/core/event.ts create mode 100644 source/ticketUI/src/models/core/season.ts create mode 100644 source/ticketUI/src/models/request/add-season.ts create mode 100644 source/ticketUI/src/models/request/add-ticket.ts delete mode 100644 source/ticketUI/src/models/request/mint-request.ts diff --git a/source/ticketAPI/api/Controllers/TicketController.cs b/source/ticketAPI/api/Controllers/TicketController.cs index 8270cab..f43b9b3 100644 --- a/source/ticketAPI/api/Controllers/TicketController.cs +++ b/source/ticketAPI/api/Controllers/TicketController.cs @@ -40,7 +40,8 @@ public class TicketController( Id = ticketId, QrCode = qrCode, Type = mintRequest.Type, - EventId = mintRequest.EventId + EventId = mintRequest.EventId, + SeasonId = mintRequest.SeasonId != Guid.Empty ? mintRequest.SeasonId : Guid.Empty, }; //save the minted ticket diff --git a/source/ticketAPI/api/RestFiles/event.http b/source/ticketAPI/api/RestFiles/event.http index b2f4eb2..ec530f1 100644 --- a/source/ticketAPI/api/RestFiles/event.http +++ b/source/ticketAPI/api/RestFiles/event.http @@ -1,14 +1,16 @@ @api_HostAddress = http://localhost:5168 -@eventId = b9f4478b-701b-4223-9aaa-042b6f53b83a +@eventId = cdae537c-e5ad-4945-9557-b14ba473c80f +@seasonId = c69552ba-8fcf-43b4-9d4f-23b5203ea40e POST {{api_HostAddress}}/event Accept: application/json Content-Type: application/json { - "Date": "2024-12-02T15:00:00.991Z", - "EventName": "Winter Concert", - "EventDescription": "A wintery journey of classical music", + "Date": "2024-12-07T15:00:00.991Z", + "Name": "Winter Concert", + "Description": "A wintery journey of classical music", + "SeasonId": "{{seasonId}}", "Venue": { "Name": "Valley Forge High School", "Description": "Auditorium", @@ -33,8 +35,8 @@ Content-Type: application/json { "Id": "{{eventId}}", "Date": "2024-12-05T15:00:00.991Z", - "EventName": "Winter Concert", - "EventDescription": "A wintery journey of classical music", + "Name": "Winter Concert", + "Description": "A wintery journey of classical music", "Venue": { "Name": "Valley Forge High School", "Description": "Auditorium", diff --git a/source/ticketAPI/api/RestFiles/scan.http b/source/ticketAPI/api/RestFiles/scan.http index 53961dd..db2eb70 100644 --- a/source/ticketAPI/api/RestFiles/scan.http +++ b/source/ticketAPI/api/RestFiles/scan.http @@ -1,5 +1,5 @@ @api_HostAddress = http://localhost:5168 -@ticketId = fe21c683-b607-4da7-8e9b-76b199a4b76c +@ticketId = ### diff --git a/source/ticketAPI/api/RestFiles/season.http b/source/ticketAPI/api/RestFiles/season.http index f68639c..b2566f1 100644 --- a/source/ticketAPI/api/RestFiles/season.http +++ b/source/ticketAPI/api/RestFiles/season.http @@ -1,6 +1,6 @@ @api_HostAddress = http://localhost:5168 -@seasonId = 76178cf4-3805-4a66-a3d9-a0223d99c2fa -@eventId = b9f4478b-701b-4223-9aaa-042b6f53b83a +@seasonId = c69552ba-8fcf-43b4-9d4f-23b5203ea40e +@eventId = cdae537c-e5ad-4945-9557-b14ba473c80f GET {{api_HostAddress}}/season Accept: application/json @@ -13,8 +13,8 @@ Accept: application/json Content-Type: application/json { - "SeasonName": "PSO 25 - 26", - "SeasonDescription": "Parma Symphony Orchestra's 53rd Season", + "Name": "PSO 25 - 26", + "Description": "Parma Symphony Orchestra's 53rd Season", "StartDate": "2025-08-01T00:00:00.991Z", "EndDate": "2026-05-31T00:00:00.991Z" } diff --git a/source/ticketAPI/api/RestFiles/ticket.http b/source/ticketAPI/api/RestFiles/ticket.http index 90d2117..7b8553e 100644 --- a/source/ticketAPI/api/RestFiles/ticket.http +++ b/source/ticketAPI/api/RestFiles/ticket.http @@ -1,16 +1,31 @@ @api_HostAddress = http://localhost:5168 -@ticketId = fe21c683-b607-4da7-8e9b-76b199a4b76c -@eventId = b9f4478b-701b-4223-9aaa-042b6f53b83a +@ticketId = +@eventId = cdae537c-e5ad-4945-9557-b14ba473c80f +@seasonId = c69552ba-8fcf-43b4-9d4f-23b5203ea40e + +### Mint Single Non Season Ticket POST {{api_HostAddress}}/ticket Accept: application/json Content-Type: application/json { - "ticketType": "Single", + "type": 0, "eventId": "{{eventId}}" } +### Mint Single Season Ticket + +POST {{api_HostAddress}}/ticket +Accept: application/json +Content-Type: application/json + +{ + "type": 1, + "eventId": "{{eventId}}", + "seasonId": "{{seasonId}}" +} + ### GET {{api_HostAddress}}/ticket?ticketId={{ticketId}} diff --git a/source/ticketAPI/api/Services/EventManager.cs b/source/ticketAPI/api/Services/EventManager.cs index 04a8b2b..4ac3fdd 100644 --- a/source/ticketAPI/api/Services/EventManager.cs +++ b/source/ticketAPI/api/Services/EventManager.cs @@ -12,14 +12,16 @@ public class EventManager : IEventManager var @event = new Event { Id = Guid.NewGuid(), - EventDescription = request.EventDescription, - EventName = request.EventName, + SeasonId = request.SeasonId, + Description = request.Description, + Name = request.Name, Date = request.Date, Talent = request.Talent, Venue = request.Venue }; new Save().Execute(@event); + new data.Seasons.AddEvent().Execute(@event.Id, request.SeasonId); } public void PatchEvent(PatchEvent request) diff --git a/source/ticketAPI/api/Services/SeasonManager.cs b/source/ticketAPI/api/Services/SeasonManager.cs index 590b663..006444c 100644 --- a/source/ticketAPI/api/Services/SeasonManager.cs +++ b/source/ticketAPI/api/Services/SeasonManager.cs @@ -13,8 +13,8 @@ public class SeasonManager : ISeasonManager var season = new Season { Id = Guid.NewGuid(), - Name = request.SeasonName, - Description = request.SeasonDescription, + Name = request.Name, + Description = request.Description, StartDate = request.StartDate, EndDate = request.EndDate, }; diff --git a/source/ticketAPI/data/Events/Update.cs b/source/ticketAPI/data/Events/Update.cs index 365aaa3..09b2d36 100644 --- a/source/ticketAPI/data/Events/Update.cs +++ b/source/ticketAPI/data/Events/Update.cs @@ -17,8 +17,8 @@ public class Update { Id = request.Id, Date = request.Date, - EventName = request.EventName, - EventDescription = request.EventDescription, + Name = request.Name, + Description = request.Description, Venue = request.Venue, Talent = request.Talent, }; diff --git a/source/ticketAPI/models/Core/Event.cs b/source/ticketAPI/models/Core/Event.cs index c860925..76d60dc 100644 --- a/source/ticketAPI/models/Core/Event.cs +++ b/source/ticketAPI/models/Core/Event.cs @@ -3,9 +3,10 @@ namespace models.Core; public class Event { public Guid Id { get; set; } + public Guid SeasonId { get; set; } public DateTime Date { get; set; } - public required string EventName { get; set; } - public string? EventDescription { get; set; } + public required string Name { get; set; } + public string? Description { get; set; } public required Venue Venue { get; set; } public required Talent Talent { get; set; } public List TicketIds { get; set; } = []; diff --git a/source/ticketAPI/models/Core/Ticket.cs b/source/ticketAPI/models/Core/Ticket.cs index 169d716..3a763ca 100644 --- a/source/ticketAPI/models/Core/Ticket.cs +++ b/source/ticketAPI/models/Core/Ticket.cs @@ -5,6 +5,7 @@ namespace models.Core; public class Ticket { public Guid Id { get; set; } + public Guid SeasonId { get; set; } public Guid EventId { get; set; } public TicketType Type { get; set; } public required string QrCode { get; set; } diff --git a/source/ticketAPI/models/Request/AddEvent.cs b/source/ticketAPI/models/Request/AddEvent.cs index 7910e06..a0762a6 100644 --- a/source/ticketAPI/models/Request/AddEvent.cs +++ b/source/ticketAPI/models/Request/AddEvent.cs @@ -5,8 +5,9 @@ namespace models.Request; public class AddEvent { public DateTime Date { get; set; } - public required string EventName { get; set; } - public string? EventDescription { get; set; } + public Guid SeasonId { get; set; } + public required string Name { get; set; } + public string? Description { get; set; } public required Venue Venue { get; set; } public required Talent Talent { get; set; } } \ No newline at end of file diff --git a/source/ticketAPI/models/Request/AddSeason.cs b/source/ticketAPI/models/Request/AddSeason.cs index 0b57034..d46463f 100644 --- a/source/ticketAPI/models/Request/AddSeason.cs +++ b/source/ticketAPI/models/Request/AddSeason.cs @@ -2,8 +2,8 @@ namespace models.Request; public class AddSeason { - public required string SeasonName { get; set; } - public string? SeasonDescription { get; set; } + public required string Name { get; set; } + public string? Description { get; set; } public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } } \ No newline at end of file diff --git a/source/ticketAPI/models/Request/AddTicket.cs b/source/ticketAPI/models/Request/AddTicket.cs index 0ccccb2..dbc9721 100644 --- a/source/ticketAPI/models/Request/AddTicket.cs +++ b/source/ticketAPI/models/Request/AddTicket.cs @@ -6,4 +6,5 @@ public class AddTicket { public TicketType Type { get; set; } public Guid EventId { get; set; } + public Guid SeasonId { get; set; } = Guid.Empty; } \ No newline at end of file diff --git a/source/ticketAPI/models/Request/EventSearch.cs b/source/ticketAPI/models/Request/EventSearch.cs deleted file mode 100644 index 2fbb12d..0000000 --- a/source/ticketAPI/models/Request/EventSearch.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace models.Request; - -public class EventSearch -{ - public DateTime StartDate { get; set; } - public DateTime EndDate { get; set; } -} \ No newline at end of file diff --git a/source/ticketAPI/models/Request/PatchEvent.cs b/source/ticketAPI/models/Request/PatchEvent.cs index aa446f3..3c51f49 100644 --- a/source/ticketAPI/models/Request/PatchEvent.cs +++ b/source/ticketAPI/models/Request/PatchEvent.cs @@ -6,8 +6,8 @@ public class PatchEvent { public Guid Id { get; set; } public DateTime Date { get; set; } - public required string EventName { get; set; } - public string? EventDescription { get; set; } + public required string Name { get; set; } + public string? Description { get; set; } public required Venue Venue { get; set; } public required Talent Talent { get; set; } } \ No newline at end of file diff --git a/source/ticketUI/public/fail.svg b/source/ticketUI/public/fail.svg new file mode 100644 index 0000000..2c866e3 --- /dev/null +++ b/source/ticketUI/public/fail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/ticketUI/public/group.svg b/source/ticketUI/public/group.svg new file mode 100644 index 0000000..7cbbbd5 --- /dev/null +++ b/source/ticketUI/public/group.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/ticketUI/public/pass.svg b/source/ticketUI/public/pass.svg new file mode 100644 index 0000000..66518c1 --- /dev/null +++ b/source/ticketUI/public/pass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/ticketUI/public/season.svg b/source/ticketUI/public/season.svg new file mode 100644 index 0000000..8fa96d4 --- /dev/null +++ b/source/ticketUI/public/season.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/ticketUI/public/senior.svg b/source/ticketUI/public/senior.svg new file mode 100644 index 0000000..5c117fa --- /dev/null +++ b/source/ticketUI/public/senior.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/ticketUI/public/single.svg b/source/ticketUI/public/single.svg new file mode 100644 index 0000000..571e8ab --- /dev/null +++ b/source/ticketUI/public/single.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/ticketUI/src/app/app.component.html b/source/ticketUI/src/app/app.component.html index 4ead765..dc9a3a8 100644 --- a/source/ticketUI/src/app/app.component.html +++ b/source/ticketUI/src/app/app.component.html @@ -4,4 +4,4 @@
- + diff --git a/source/ticketUI/src/app/app.component.ts b/source/ticketUI/src/app/app.component.ts index 77c8f56..9b5beb9 100644 --- a/source/ticketUI/src/app/app.component.ts +++ b/source/ticketUI/src/app/app.component.ts @@ -1,12 +1,14 @@ import {Component} from '@angular/core'; import {SidebarComponent} from './sidebar/sidebar.component'; import {RouterOutlet} from '@angular/router'; +import {SnackbarComponent} from './snackbar/snackbar.component'; @Component({ selector: 'app-root', imports: [ SidebarComponent, - RouterOutlet + RouterOutlet, + SnackbarComponent, ], templateUrl: './app.component.html', styleUrl: './app.component.scss' diff --git a/source/ticketUI/src/app/event-browser/event-browser.component.html b/source/ticketUI/src/app/event-browser/event-browser.component.html new file mode 100644 index 0000000..b7b2d62 --- /dev/null +++ b/source/ticketUI/src/app/event-browser/event-browser.component.html @@ -0,0 +1,8 @@ +
+ + +
diff --git a/source/ticketUI/src/app/event-browser/event-browser.component.scss b/source/ticketUI/src/app/event-browser/event-browser.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/source/ticketUI/src/app/event-browser/event-browser.component.ts b/source/ticketUI/src/app/event-browser/event-browser.component.ts new file mode 100644 index 0000000..8128717 --- /dev/null +++ b/source/ticketUI/src/app/event-browser/event-browser.component.ts @@ -0,0 +1,17 @@ +import {Component, inject, OnInit} from '@angular/core'; +import {EventService} from '../services/event.service'; + +@Component({ + selector: 'app-event-browser', + imports: [], + templateUrl: './event-browser.component.html', + styleUrl: './event-browser.component.scss' +}) +export class EventBrowserComponent implements OnInit { + private eventService = inject(EventService); + public events$ = this.eventService.events$; + + public ngOnInit() { + this.eventService.searchAllEvents(); + } +} diff --git a/source/ticketUI/src/app/page/debug/debug.component.ts b/source/ticketUI/src/app/page/debug/debug.component.ts index d0b5515..f4433b7 100644 --- a/source/ticketUI/src/app/page/debug/debug.component.ts +++ b/source/ticketUI/src/app/page/debug/debug.component.ts @@ -1,7 +1,7 @@ import {Component, inject} from '@angular/core'; import {TicketComponent} from "../../ticket/ticket.component"; import {TicketService} from '../../services/ticket.service'; -import {MintRequest} from '../../../models/request/mint-request'; +import {AddTicket} from '../../../models/request/add-ticket'; import {TicketTypeEnum} from '../../../models/enums/ticket-type.enum'; @Component({ @@ -16,8 +16,9 @@ export class DebugComponent { private ticketMinter = inject(TicketService); public getQrCode(): void { - const mintRequest: MintRequest = { - ticketType: TicketTypeEnum.Single + const mintRequest: AddTicket = { + ticketType: TicketTypeEnum.Single, + eventId: '' }; this.ticketMinter.addTicket(mintRequest); diff --git a/source/ticketUI/src/app/page/event/event.component.html b/source/ticketUI/src/app/page/event/event.component.html index 8a7c90c..1d35736 100644 --- a/source/ticketUI/src/app/page/event/event.component.html +++ b/source/ticketUI/src/app/page/event/event.component.html @@ -1 +1,44 @@ -

event works!

+
+ +

Add Event

+
+ + + + + + + + + + + + +
+ + +
+ +
+ +

Add Season

+
+ + + + + + + + + + + + + + + + +
+ +
diff --git a/source/ticketUI/src/app/page/event/event.component.scss b/source/ticketUI/src/app/page/event/event.component.scss index e69de29..0a5d778 100644 --- a/source/ticketUI/src/app/page/event/event.component.scss +++ b/source/ticketUI/src/app/page/event/event.component.scss @@ -0,0 +1,3 @@ +label { + padding-right: 15px; +} diff --git a/source/ticketUI/src/app/page/event/event.component.ts b/source/ticketUI/src/app/page/event/event.component.ts index ee6181f..9675abb 100644 --- a/source/ticketUI/src/app/page/event/event.component.ts +++ b/source/ticketUI/src/app/page/event/event.component.ts @@ -1,11 +1,33 @@ -import { Component } from '@angular/core'; +import {Component, inject} from '@angular/core'; +import {FormControl, ReactiveFormsModule} from '@angular/forms'; +import {EventService} from '../../services/event.service'; +import {SeasonService} from '../../services/season.service'; +import {SeasonBrowserComponent} from '../../season-browser/season-browser.component'; @Component({ selector: 'app-event', - imports: [], + imports: [ReactiveFormsModule, SeasonBrowserComponent], templateUrl: './event.component.html', styleUrl: './event.component.scss' }) export class EventComponent { + public eventName = new FormControl(''); + public eventDescription = new FormControl(''); + public eventDate = new FormControl(new Date); + public seasonName = new FormControl(''); + public seasonDescription = new FormControl(''); + public seasonStartDate = new FormControl(new Date); + public seasonEndDate = new FormControl(new Date); + + private eventService = inject(EventService); + private seasonService = inject(SeasonService); + + public saveEvent(): void { + + } + + public saveSeason(): void { + + } } diff --git a/source/ticketUI/src/app/page/ticket/ticket.component.html b/source/ticketUI/src/app/page/ticket/ticket.component.html index 9d31e5c..423b64d 100644 --- a/source/ticketUI/src/app/page/ticket/ticket.component.html +++ b/source/ticketUI/src/app/page/ticket/ticket.component.html @@ -1 +1,4 @@ -

ticket works!

+
+

Generate Tickets

+ +
diff --git a/source/ticketUI/src/app/page/ticket/ticket.component.ts b/source/ticketUI/src/app/page/ticket/ticket.component.ts index 9a2e826..2e1589a 100644 --- a/source/ticketUI/src/app/page/ticket/ticket.component.ts +++ b/source/ticketUI/src/app/page/ticket/ticket.component.ts @@ -1,8 +1,11 @@ import { Component } from '@angular/core'; +import {EventBrowserComponent} from '../../event-browser/event-browser.component'; @Component({ selector: 'app-ticket', - imports: [], + imports: [ + EventBrowserComponent + ], templateUrl: './ticket.component.html', styleUrl: './ticket.component.scss' }) diff --git a/source/ticketUI/src/app/scan-result/scan-result.component.html b/source/ticketUI/src/app/scan-result/scan-result.component.html index 3059525..95b29fd 100644 --- a/source/ticketUI/src/app/scan-result/scan-result.component.html +++ b/source/ticketUI/src/app/scan-result/scan-result.component.html @@ -1,5 +1,57 @@ -@if(ticketValidity() !== TicketValidity.Invalid && ticketType() !== TicketTypeEnum.Null) { -
- +@if (ticketValidity() !== TicketValidity.Invalid && ticketType() !== TicketTypeEnum.Null) { +
+
+ @if (ticketValidity() == TicketValidity.Valid) { + Ticket Valid + Valid + } @else { + Ticket Invalid + Invalid + } +
+ @if (ticketValidity() == TicketValidity.Valid) { +
+ @switch (ticketType()){ + @case (TicketTypeEnum.Family) { + Family + Family + } + @case (TicketTypeEnum.FamilySeason) { + Family + Family + } + @case (TicketTypeEnum.Single) { + Single + Single + } + @case (TicketTypeEnum.SingleSeason) { + Single + Single + } + @case (TicketTypeEnum.Senior) { + Senior + Senior + } + @case (TicketTypeEnum.SeniorSeason) { + Senior + Senior + } + } +
+
+ @if (ticketType() !== TicketTypeEnum.FamilySeason) { + Family + Season + } + @if (ticketType() !== TicketTypeEnum.SingleSeason) { + Single + Season + } + @if (ticketType() !== TicketTypeEnum.SeniorSeason) { + Single + Season + } +
+ }
} diff --git a/source/ticketUI/src/app/scan-result/scan-result.component.ts b/source/ticketUI/src/app/scan-result/scan-result.component.ts index 103acb3..90b4127 100644 --- a/source/ticketUI/src/app/scan-result/scan-result.component.ts +++ b/source/ticketUI/src/app/scan-result/scan-result.component.ts @@ -2,10 +2,13 @@ import {Component, inject} from '@angular/core'; import {TicketValidity} from '../../models/enums/ticket-validity.enum'; import {TicketTypeEnum} from '../../models/enums/ticket-type.enum'; import {ScanService} from '../services/scan.service'; +import {NgOptimizedImage} from '@angular/common'; @Component({ selector: 'app-scan-result', - imports: [], + imports: [ + NgOptimizedImage + ], templateUrl: './scan-result.component.html', styleUrl: './scan-result.component.scss' }) diff --git a/source/ticketUI/src/app/season-browser/season-browser.component.html b/source/ticketUI/src/app/season-browser/season-browser.component.html new file mode 100644 index 0000000..880cb2f --- /dev/null +++ b/source/ticketUI/src/app/season-browser/season-browser.component.html @@ -0,0 +1,8 @@ +
+ + +
diff --git a/source/ticketUI/src/app/season-browser/season-browser.component.scss b/source/ticketUI/src/app/season-browser/season-browser.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/source/ticketUI/src/app/season-browser/season-browser.component.ts b/source/ticketUI/src/app/season-browser/season-browser.component.ts new file mode 100644 index 0000000..b7b256e --- /dev/null +++ b/source/ticketUI/src/app/season-browser/season-browser.component.ts @@ -0,0 +1,17 @@ +import {Component, inject, OnInit} from '@angular/core'; +import {SeasonService} from '../services/season.service'; + +@Component({ + selector: 'app-season-browser', + imports: [], + templateUrl: './season-browser.component.html', + styleUrl: './season-browser.component.scss' +}) +export class SeasonBrowserComponent implements OnInit { + private seasonService = inject(SeasonService); + public seasons$ = this.seasonService.seasons$; + + public ngOnInit() { + this.seasonService.getSeasons(); + } +} diff --git a/source/ticketUI/src/app/services/event.service.ts b/source/ticketUI/src/app/services/event.service.ts index 940984f..76ef9d0 100644 --- a/source/ticketUI/src/app/services/event.service.ts +++ b/source/ticketUI/src/app/services/event.service.ts @@ -4,14 +4,17 @@ import {AddEventRequest} from '../../models/request/add-event-request'; import {ApiUtils} from './api-utils'; import {environment} from '../../environments/environment'; import {Endpoints} from '../../models/endpoints'; -import {catchError, of} from 'rxjs'; +import {catchError, map, of} from 'rxjs'; +import {SnackbarService} from './snackbar.service'; +import {Event} from '../../models/core/event'; @Injectable({ providedIn: 'root' }) export class EventService extends ApiUtils { - public eventSignal: WritableSignal = signal(null); private httpClient = inject(HttpClient); + private snackbar = inject(SnackbarService); + public events$: WritableSignal> = signal([]); constructor() { super(); @@ -41,22 +44,41 @@ export class EventService extends ApiUtils { this.httpClient.post(url, JSON.stringify(request), options) .pipe( catchError(error => { - console.log(error); + this.snackbar.showError(error.error); return of(undefined); }) ).subscribe(); } - public searchEvents(startDate: Date, endDate: Date): void { + public searchAllEvents(): void { const options = this.setHttpRequestOptions(); const url = environment.apiBase + Endpoints.EVENT; this.httpClient.get(url, options) .pipe( + map((response: any) => response.body), catchError(error => { - console.log(error); + this.snackbar.showError(error.error); return of(undefined); }) - ).subscribe(); + ).subscribe(res => { + this.events$.set(res); + }); + } + + public searchEvents(startDate: Date, endDate: Date): void { + const options = this.setHttpRequestOptions(); + const url = environment.apiBase + Endpoints.EVENT_DATE_SEARCH(startDate, endDate); + + this.httpClient.get(url, options) + .pipe( + map((response: any) => response.body), + catchError(error => { + this.snackbar.showError(error.error); + return of(undefined); + }) + ).subscribe(res => { + this.events$.set(res); + }); } } diff --git a/source/ticketUI/src/app/services/scan.service.ts b/source/ticketUI/src/app/services/scan.service.ts index e7a15af..da3cc6a 100644 --- a/source/ticketUI/src/app/services/scan.service.ts +++ b/source/ticketUI/src/app/services/scan.service.ts @@ -7,6 +7,7 @@ import {Endpoints} from '../../models/endpoints'; import {TicketSearch} from '../../models/response/ticket-search'; import {catchError, map, of} from 'rxjs'; import {ApiUtils} from './api-utils'; +import {SnackbarService} from './snackbar.service'; @Injectable({ providedIn: 'root' @@ -15,6 +16,7 @@ export class ScanService extends ApiUtils { public ticketValid$: WritableSignal = signal(TicketValidity.Null); public ticketType$: WritableSignal = signal(TicketTypeEnum.Null); private httpClient = inject(HttpClient); + private snackbar = inject(SnackbarService); constructor() { super(); @@ -28,7 +30,7 @@ export class ScanService extends ApiUtils { .pipe( map((response: any) => response.body), catchError(error => { - console.log(error); + this.snackbar.showError(error.error); return of(undefined); }) ).subscribe((res: TicketSearch) => { diff --git a/source/ticketUI/src/app/services/season.service.ts b/source/ticketUI/src/app/services/season.service.ts new file mode 100644 index 0000000..19124a7 --- /dev/null +++ b/source/ticketUI/src/app/services/season.service.ts @@ -0,0 +1,66 @@ +import {inject, Injectable, signal, WritableSignal} from '@angular/core'; +import {HttpClient} from '@angular/common/http'; +import {SnackbarService} from './snackbar.service'; +import {ApiUtils} from './api-utils'; +import {Season} from '../../models/core/season'; +import {environment} from '../../environments/environment'; +import {Endpoints} from '../../models/endpoints'; +import {catchError, map, of} from 'rxjs'; +import {AddSeason} from '../../models/request/add-season'; + +@Injectable({ + providedIn: 'root' +}) +export class SeasonService extends ApiUtils { + private httpClient = inject(HttpClient); + private snackbar = inject(SnackbarService); + public seasons$: WritableSignal> = signal([]); + + constructor() { + super(); + } + + public getSeasons(): void { + const options = this.setHttpRequestOptions(); + const url = environment.apiBase + Endpoints.SEASON; + + this.httpClient.get(url, options) + .pipe( + map((response: any) => response.body), + catchError(error => { + this.snackbar.showError(error.error); + return of(undefined); + }) + ).subscribe(res => { + if (res !== null) { + this.seasons$.set(res); + } + }) + } + + public saveSeason(request: AddSeason): void { + const options = this.setHttpRequestOptions(request); + const url = environment.apiBase + Endpoints.SEASON; + + this.httpClient.post(url, JSON.stringify(request), options) + .pipe( + catchError(error => { + this.snackbar.showError(error.error); + return of(undefined); + }) + ).subscribe(); + } + + public addEventToSeason(eventId: string, seasonId: string): void { + const options = this.setHttpRequestOptions(); + const url = environment.apiBase + Endpoints.SEASON_ADD_EVENT(eventId, seasonId); + + this.httpClient.put(url, options) + .pipe( + catchError(error => { + this.snackbar.showError(error.error); + return of(undefined); + }) + ).subscribe(); + } +} diff --git a/source/ticketUI/src/app/services/snackbar.service.ts b/source/ticketUI/src/app/services/snackbar.service.ts new file mode 100644 index 0000000..382df8c --- /dev/null +++ b/source/ticketUI/src/app/services/snackbar.service.ts @@ -0,0 +1,19 @@ +import {Injectable, signal, WritableSignal} from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class SnackbarService { + public showSnackbar$: WritableSignal = signal(false); + public snackbarMessage$: WritableSignal = signal(''); + + public showError(message: string): void { + this.showSnackbar$.set(true); + this.snackbarMessage$.set(message); + + setTimeout(() => { + this.showSnackbar$.set(false); + this.snackbarMessage$.set(''); + }, 5000); + } +} diff --git a/source/ticketUI/src/app/services/ticket.service.ts b/source/ticketUI/src/app/services/ticket.service.ts index 2d42f0d..336087d 100644 --- a/source/ticketUI/src/app/services/ticket.service.ts +++ b/source/ticketUI/src/app/services/ticket.service.ts @@ -4,9 +4,10 @@ import {catchError, map, of} from 'rxjs'; import {environment} from '../../environments/environment'; import {MintResponse} from '../../models/response/mint-response'; import {Endpoints} from '../../models/endpoints'; -import {MintRequest} from '../../models/request/mint-request'; +import {AddTicket} from '../../models/request/add-ticket'; import {ApiUtils} from './api-utils'; import {TicketSearch} from '../../models/response/ticket-search'; +import {SnackbarService} from './snackbar.service'; @Injectable({ providedIn: 'root' @@ -14,12 +15,13 @@ import {TicketSearch} from '../../models/response/ticket-search'; export class TicketService extends ApiUtils { public dataSignal$: WritableSignal = signal(''); private httpClient = inject(HttpClient); + private snackbar = inject(SnackbarService); constructor() { super(); } - public addTicket(request: MintRequest): void { + public addTicket(request: AddTicket): void { const options = this.setHttpRequestOptions(); const url = environment.apiBase + Endpoints.TICKET; @@ -27,7 +29,7 @@ export class TicketService extends ApiUtils { .pipe( map((response: any) => response.body), catchError(error => { - console.log(error); + this.snackbar.showError(error.error); return of(undefined); }) ).subscribe((res: MintResponse) => { diff --git a/source/ticketUI/src/app/sidebar/sidebar.component.html b/source/ticketUI/src/app/sidebar/sidebar.component.html index 73f7142..fc8ebd7 100644 --- a/source/ticketUI/src/app/sidebar/sidebar.component.html +++ b/source/ticketUI/src/app/sidebar/sidebar.component.html @@ -1,7 +1,7 @@
- + @if(!environment.production) { } diff --git a/source/ticketUI/src/app/snackbar/snackbar.component.html b/source/ticketUI/src/app/snackbar/snackbar.component.html new file mode 100644 index 0000000..f27682b --- /dev/null +++ b/source/ticketUI/src/app/snackbar/snackbar.component.html @@ -0,0 +1,3 @@ +@if(showSnackbar$()) { +
{{snackbarMessage$()}}
+} diff --git a/source/ticketUI/src/app/snackbar/snackbar.component.scss b/source/ticketUI/src/app/snackbar/snackbar.component.scss new file mode 100644 index 0000000..feced18 --- /dev/null +++ b/source/ticketUI/src/app/snackbar/snackbar.component.scss @@ -0,0 +1,16 @@ +.snackbar { + min-width: 250px; /* Set a default minimum width */ + margin-left: -125px; /* Divide value of min-width by 2 */ + backdrop-filter: blur(25px) saturate(112%); + -webkit-backdrop-filter: blur(25px) saturate(112%); + background-color: rgba(255, 255, 255, 0.11); + border-radius: 8px; + border: 1px solid rgba(255, 255, 255, 0.125); + font-size: 28px; + text-align: center; /* Centered text */ + padding: 16px; /* Padding */ + position: fixed; /* Sit on top of the screen */ + z-index: 1; /* Add a z-index if needed */ + left: 50%; /* Center the snackbar */ + bottom: 30px; /* 30px from the bottom */ +} diff --git a/source/ticketUI/src/app/snackbar/snackbar.component.ts b/source/ticketUI/src/app/snackbar/snackbar.component.ts new file mode 100644 index 0000000..cba5919 --- /dev/null +++ b/source/ticketUI/src/app/snackbar/snackbar.component.ts @@ -0,0 +1,14 @@ +import {Component, inject} from '@angular/core'; +import {SnackbarService} from '../services/snackbar.service'; + +@Component({ + selector: 'app-snackbar', + imports: [], + templateUrl: './snackbar.component.html', + styleUrl: './snackbar.component.scss' +}) +export class SnackbarComponent { + public snackbar = inject(SnackbarService); + public showSnackbar$ = this.snackbar.showSnackbar$; + public snackbarMessage$ = this.snackbar.snackbarMessage$; +} diff --git a/source/ticketUI/src/models/core/event.ts b/source/ticketUI/src/models/core/event.ts new file mode 100644 index 0000000..a5769dc --- /dev/null +++ b/source/ticketUI/src/models/core/event.ts @@ -0,0 +1,13 @@ +import {Talent} from './talent'; +import {Venue} from './venue'; + +export interface Event { + id: string, + seasonId: string, + date: Date, + name: string, + description: string | null, + venue: Venue, + talent: Talent, + ticketIds: Array +} diff --git a/source/ticketUI/src/models/core/season.ts b/source/ticketUI/src/models/core/season.ts new file mode 100644 index 0000000..66894ec --- /dev/null +++ b/source/ticketUI/src/models/core/season.ts @@ -0,0 +1,7 @@ +export interface Season { + id: string; + name: string, + description: string | null, + startDate: Date, + endDate: Date +} diff --git a/source/ticketUI/src/models/core/talent.ts b/source/ticketUI/src/models/core/talent.ts index b843a8e..8badd9b 100644 --- a/source/ticketUI/src/models/core/talent.ts +++ b/source/ticketUI/src/models/core/talent.ts @@ -1,4 +1,4 @@ export interface Talent { name: string; - description: string; + description: string | null; } diff --git a/source/ticketUI/src/models/core/venue.ts b/source/ticketUI/src/models/core/venue.ts index bf9cfff..0fcb6a0 100644 --- a/source/ticketUI/src/models/core/venue.ts +++ b/source/ticketUI/src/models/core/venue.ts @@ -1,6 +1,6 @@ export interface Venue { name: string, - description: string, + description: string | null, addressOne: string, addressTwo: string | null, city: string, diff --git a/source/ticketUI/src/models/endpoints.ts b/source/ticketUI/src/models/endpoints.ts index a1098a9..5d46340 100644 --- a/source/ticketUI/src/models/endpoints.ts +++ b/source/ticketUI/src/models/endpoints.ts @@ -15,10 +15,18 @@ export class Endpoints { } /* Event Routes */ - public static readonly EVENT: string = 'events'; + public static readonly EVENT: string = 'event'; /* Calculated Routes */ public static EVENT_DATE_SEARCH(startDate: Date, endDate: Date): string { return `${Endpoints.EVENT}?startDate=${startDate}&endDate=${endDate}`; } + + /* Season Routes */ + public static readonly SEASON: string = 'season'; + + /* Calculated Routes */ + public static SEASON_ADD_EVENT(eventId: string, seasonId: string): string { + return `${Endpoints.SEASON}?eventId=${eventId}&seasonId=${seasonId}`; + } } diff --git a/source/ticketUI/src/models/request/add-event-request.ts b/source/ticketUI/src/models/request/add-event-request.ts index 65a5410..34c18f4 100644 --- a/source/ticketUI/src/models/request/add-event-request.ts +++ b/source/ticketUI/src/models/request/add-event-request.ts @@ -3,8 +3,8 @@ import {Talent} from '../core/talent'; export interface AddEventRequest { date: Date, - eventName: string, - eventDescription: string, + name: string, + description: string, venue: Venue, talent: Talent, } diff --git a/source/ticketUI/src/models/request/add-season.ts b/source/ticketUI/src/models/request/add-season.ts new file mode 100644 index 0000000..9eee2bc --- /dev/null +++ b/source/ticketUI/src/models/request/add-season.ts @@ -0,0 +1,6 @@ +export interface AddSeason { + name: string, + description: string | null, + startDate: Date, + endDate: Date +} diff --git a/source/ticketUI/src/models/request/add-ticket.ts b/source/ticketUI/src/models/request/add-ticket.ts new file mode 100644 index 0000000..d27991a --- /dev/null +++ b/source/ticketUI/src/models/request/add-ticket.ts @@ -0,0 +1,6 @@ +import {TicketTypeEnum} from '../enums/ticket-type.enum'; + +export interface AddTicket { + ticketType: TicketTypeEnum, + eventId: string +} diff --git a/source/ticketUI/src/models/request/mint-request.ts b/source/ticketUI/src/models/request/mint-request.ts deleted file mode 100644 index 2a7ea8f..0000000 --- a/source/ticketUI/src/models/request/mint-request.ts +++ /dev/null @@ -1,5 +0,0 @@ -import {TicketTypeEnum} from '../enums/ticket-type.enum'; - -export interface MintRequest { - ticketType: TicketTypeEnum -} diff --git a/source/ticketUI/src/models/request/patch-event.ts b/source/ticketUI/src/models/request/patch-event.ts index 1bd35eb..21e0080 100644 --- a/source/ticketUI/src/models/request/patch-event.ts +++ b/source/ticketUI/src/models/request/patch-event.ts @@ -4,8 +4,8 @@ import {Talent} from '../core/talent'; export interface PatchEvent { id: string, date: Date, - eventName: string, - eventDescription: string, + name: string, + description: string, venue: Venue, talent: Talent } diff --git a/source/ticketUI/src/styles.scss b/source/ticketUI/src/styles.scss index 07b5789..46eecad 100644 --- a/source/ticketUI/src/styles.scss +++ b/source/ticketUI/src/styles.scss @@ -43,6 +43,10 @@ body { display: flex; flex-direction: row; justify-content: center; + + &-space-between { + justify-content: space-between; + } } .column {