diff --git a/source/ticketAPI/api/Controllers/TicketController.cs b/source/ticketAPI/api/Controllers/TicketController.cs index f43b9b3..a614a55 100644 --- a/source/ticketAPI/api/Controllers/TicketController.cs +++ b/source/ticketAPI/api/Controllers/TicketController.cs @@ -22,7 +22,7 @@ public class TicketController( /// /// Base64 String Qr Code [HttpPost] - public ActionResult Post([FromBody] AddTicket mintRequest) + public ActionResult Post([FromBody] AddTicket request) { //TODO: Protect Endpoint @@ -39,9 +39,10 @@ public class TicketController( { Id = ticketId, QrCode = qrCode, - Type = mintRequest.Type, - EventId = mintRequest.EventId, - SeasonId = mintRequest.SeasonId != Guid.Empty ? mintRequest.SeasonId : Guid.Empty, + Type = request.Type, + EventId = request.EventId, + SeasonId = request.SeasonId != Guid.Empty ? request.SeasonId : Guid.Empty, + Patron = request.Patron, }; //save the minted ticket diff --git a/source/ticketAPI/api/RestFiles/ticket.http b/source/ticketAPI/api/RestFiles/ticket.http index 7b8553e..6da414e 100644 --- a/source/ticketAPI/api/RestFiles/ticket.http +++ b/source/ticketAPI/api/RestFiles/ticket.http @@ -11,7 +11,19 @@ Content-Type: application/json { "type": 0, - "eventId": "{{eventId}}" + "eventId": "{{eventId}}", + "patron": { + "firstName": "Tara", + "middleName": "", + "lastName": "Wilson", + "email": "terralilly85@icloud.com", + "phoneNumber": "", + "addressOne": "1330 Douglas Ave", + "addressTwo": "", + "city": "Youngstown", + "state": "Ohio", + "zip": "44502" + } } ### Mint Single Season Ticket @@ -23,7 +35,19 @@ Content-Type: application/json { "type": 1, "eventId": "{{eventId}}", - "seasonId": "{{seasonId}}" + "seasonId": "{{seasonId}}", + "patron": { + "firstName": "Tara", + "middleName": "", + "lastName": "Wilson", + "email": "terralilly85@icloud.com", + "phoneNumber": "", + "addressOne": "1330 Douglas Ave", + "addressTwo": "", + "city": "Youngstown", + "state": "Ohio", + "zip": "44502" + } } ### diff --git a/source/ticketAPI/api/Services/TicketManager.cs b/source/ticketAPI/api/Services/TicketManager.cs index 4832aca..a50fffa 100644 --- a/source/ticketAPI/api/Services/TicketManager.cs +++ b/source/ticketAPI/api/Services/TicketManager.cs @@ -23,7 +23,7 @@ public class TicketManager : ITicketManager } var @event = new data.Events.Find().Execute(ticket.EventId); - + if (@event == null) { throw new Exception("Event not found"); diff --git a/source/ticketAPI/data/Seasons/Get.cs b/source/ticketAPI/data/Seasons/Get.cs new file mode 100644 index 0000000..44cc645 --- /dev/null +++ b/source/ticketAPI/data/Seasons/Get.cs @@ -0,0 +1,15 @@ +using models.Core; +using MongoDB.Driver; + +namespace data.Seasons; + +public class Get +{ + public Season Execute(Guid seasonId) + { + var database = MongoFactory.GetDatabase(); + var collection = database.GetCollection("seasons"); + + return collection.Find(s => s.Id == seasonId).FirstOrDefault(); + } +} \ No newline at end of file diff --git a/source/ticketAPI/models/Core/Patron.cs b/source/ticketAPI/models/Core/Patron.cs new file mode 100644 index 0000000..112e0a4 --- /dev/null +++ b/source/ticketAPI/models/Core/Patron.cs @@ -0,0 +1,15 @@ +namespace models.Core; + +public class Patron +{ + public required string FirstName { get; set; } + public string? MiddleName { get; set; } + public required string LastName { get; set; } + public required string Email { get; set; } + public string? PhoneNumber { get; set; } + public required string AddressOne { get; set; } + public string? AddressTwo { get; set; } + public required string City { get; set; } + public required string State { get; set; } + public required string Zip { get; set; } +} \ No newline at end of file diff --git a/source/ticketAPI/models/Core/Ticket.cs b/source/ticketAPI/models/Core/Ticket.cs index 3a763ca..9524d3f 100644 --- a/source/ticketAPI/models/Core/Ticket.cs +++ b/source/ticketAPI/models/Core/Ticket.cs @@ -9,4 +9,5 @@ public class Ticket public Guid EventId { get; set; } public TicketType Type { get; set; } public required string QrCode { get; set; } + public required Patron Patron { 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 dbc9721..8dcea6e 100644 --- a/source/ticketAPI/models/Request/AddTicket.cs +++ b/source/ticketAPI/models/Request/AddTicket.cs @@ -1,3 +1,4 @@ +using models.Core; using models.Enumerations; namespace models.Request; @@ -7,4 +8,5 @@ public class AddTicket public TicketType Type { get; set; } public Guid EventId { get; set; } public Guid SeasonId { get; set; } = Guid.Empty; + public required Patron Patron { get; set; } } \ No newline at end of file diff --git a/source/ticketUI/src/app/app.component.ts b/source/ticketUI/src/app/app.component.ts index 9b5beb9..01723bc 100644 --- a/source/ticketUI/src/app/app.component.ts +++ b/source/ticketUI/src/app/app.component.ts @@ -1,7 +1,7 @@ import {Component} from '@angular/core'; -import {SidebarComponent} from './sidebar/sidebar.component'; +import {SidebarComponent} from './components/sidebar/sidebar.component'; import {RouterOutlet} from '@angular/router'; -import {SnackbarComponent} from './snackbar/snackbar.component'; +import {SnackbarComponent} from './components/snackbar/snackbar.component'; @Component({ selector: 'app-root', diff --git a/source/ticketUI/src/app/app.routes.ts b/source/ticketUI/src/app/app.routes.ts index c549f80..2c17fc7 100644 --- a/source/ticketUI/src/app/app.routes.ts +++ b/source/ticketUI/src/app/app.routes.ts @@ -1,14 +1,9 @@ import {Routes} from '@angular/router'; -import {DebugComponent} from './page/debug/debug.component'; import {EventComponent} from './page/event/event.component'; import {TicketComponent} from './page/ticket/ticket.component'; import {ScanComponent} from './page/scan/scan.component'; export const routes: Routes = [ - { - path: 'debug', - component: DebugComponent - }, { path: 'event', component: EventComponent diff --git a/source/ticketUI/src/app/event-browser/event-browser.component.html b/source/ticketUI/src/app/components/event-browser/event-browser.component.html similarity index 73% rename from source/ticketUI/src/app/event-browser/event-browser.component.html rename to source/ticketUI/src/app/components/event-browser/event-browser.component.html index b7b2d62..96b7310 100644 --- a/source/ticketUI/src/app/event-browser/event-browser.component.html +++ b/source/ticketUI/src/app/components/event-browser/event-browser.component.html @@ -1,6 +1,7 @@
- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ diff --git a/source/ticketUI/src/app/components/patron-info/patron-info.component.scss b/source/ticketUI/src/app/components/patron-info/patron-info.component.scss new file mode 100644 index 0000000..0a5d778 --- /dev/null +++ b/source/ticketUI/src/app/components/patron-info/patron-info.component.scss @@ -0,0 +1,3 @@ +label { + padding-right: 15px; +} diff --git a/source/ticketUI/src/app/components/patron-info/patron-info.component.ts b/source/ticketUI/src/app/components/patron-info/patron-info.component.ts new file mode 100644 index 0000000..902f735 --- /dev/null +++ b/source/ticketUI/src/app/components/patron-info/patron-info.component.ts @@ -0,0 +1,23 @@ +import { Component } from '@angular/core'; +import {FormControl, ReactiveFormsModule, Validators} from '@angular/forms'; + +@Component({ + selector: 'app-patron-info', + imports: [ + ReactiveFormsModule + ], + templateUrl: './patron-info.component.html', + styleUrl: './patron-info.component.scss' +}) +export class PatronInfoComponent { + public firstName = new FormControl('', [Validators.required]); + public middleName = new FormControl(''); + public lastName = new FormControl('', [Validators.required]); + public email = new FormControl('', [Validators.required]); + public phoneNumber = new FormControl(''); + public addressOne = new FormControl('', [Validators.required]); + public addressTwo = new FormControl(''); + public city = new FormControl('', [Validators.required]); + public state = new FormControl('', [Validators.required]); + public zip = new FormControl('', [Validators.required]); +} diff --git a/source/ticketUI/src/app/scan-result/scan-result.component.html b/source/ticketUI/src/app/components/scan-result/scan-result.component.html similarity index 100% rename from source/ticketUI/src/app/scan-result/scan-result.component.html rename to source/ticketUI/src/app/components/scan-result/scan-result.component.html diff --git a/source/ticketUI/src/app/scan-result/scan-result.component.scss b/source/ticketUI/src/app/components/scan-result/scan-result.component.scss similarity index 100% rename from source/ticketUI/src/app/scan-result/scan-result.component.scss rename to source/ticketUI/src/app/components/scan-result/scan-result.component.scss diff --git a/source/ticketUI/src/app/scan-result/scan-result.component.ts b/source/ticketUI/src/app/components/scan-result/scan-result.component.ts similarity index 73% rename from source/ticketUI/src/app/scan-result/scan-result.component.ts rename to source/ticketUI/src/app/components/scan-result/scan-result.component.ts index 90b4127..583c66c 100644 --- a/source/ticketUI/src/app/scan-result/scan-result.component.ts +++ b/source/ticketUI/src/app/components/scan-result/scan-result.component.ts @@ -1,7 +1,7 @@ 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 {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({ diff --git a/source/ticketUI/src/app/season-browser/season-browser.component.html b/source/ticketUI/src/app/components/season-browser/season-browser.component.html similarity index 73% rename from source/ticketUI/src/app/season-browser/season-browser.component.html rename to source/ticketUI/src/app/components/season-browser/season-browser.component.html index 880cb2f..650b32c 100644 --- a/source/ticketUI/src/app/season-browser/season-browser.component.html +++ b/source/ticketUI/src/app/components/season-browser/season-browser.component.html @@ -1,6 +1,7 @@
- + + + @for(type of ticketTypes | keyvalue; track type) { + + } + +
diff --git a/source/ticketUI/src/app/components/ticket-type-selector/ticket-type-selector.component.scss b/source/ticketUI/src/app/components/ticket-type-selector/ticket-type-selector.component.scss new file mode 100644 index 0000000..0a5d778 --- /dev/null +++ b/source/ticketUI/src/app/components/ticket-type-selector/ticket-type-selector.component.scss @@ -0,0 +1,3 @@ +label { + padding-right: 15px; +} diff --git a/source/ticketUI/src/app/components/ticket-type-selector/ticket-type-selector.component.ts b/source/ticketUI/src/app/components/ticket-type-selector/ticket-type-selector.component.ts new file mode 100644 index 0000000..f7286be --- /dev/null +++ b/source/ticketUI/src/app/components/ticket-type-selector/ticket-type-selector.component.ts @@ -0,0 +1,15 @@ +import { Component } from '@angular/core'; +import {TicketTypeEnumLabel} from '../../../models/enums/ticket-type.enum'; +import {KeyValuePipe} from '@angular/common'; + +@Component({ + selector: 'app-ticket-type-selector', + imports: [ + KeyValuePipe + ], + templateUrl: './ticket-type-selector.component.html', + styleUrl: './ticket-type-selector.component.scss' +}) +export class TicketTypeSelectorComponent { + public ticketTypes = TicketTypeEnumLabel; +} diff --git a/source/ticketUI/src/app/ticket/ticket.component.html b/source/ticketUI/src/app/components/ticket/ticket.component.html similarity index 77% rename from source/ticketUI/src/app/ticket/ticket.component.html rename to source/ticketUI/src/app/components/ticket/ticket.component.html index b147f07..d94f456 100644 --- a/source/ticketUI/src/app/ticket/ticket.component.html +++ b/source/ticketUI/src/app/components/ticket/ticket.component.html @@ -3,8 +3,5 @@
Embedded QR Code
-
- test -
} diff --git a/source/ticketUI/src/app/ticket/ticket.component.scss b/source/ticketUI/src/app/components/ticket/ticket.component.scss similarity index 100% rename from source/ticketUI/src/app/ticket/ticket.component.scss rename to source/ticketUI/src/app/components/ticket/ticket.component.scss diff --git a/source/ticketUI/src/app/ticket/ticket.component.ts b/source/ticketUI/src/app/components/ticket/ticket.component.ts similarity index 83% rename from source/ticketUI/src/app/ticket/ticket.component.ts rename to source/ticketUI/src/app/components/ticket/ticket.component.ts index dcf5890..55dbcf4 100644 --- a/source/ticketUI/src/app/ticket/ticket.component.ts +++ b/source/ticketUI/src/app/components/ticket/ticket.component.ts @@ -1,5 +1,5 @@ import {Component, inject} from '@angular/core'; -import {TicketService} from '../services/ticket.service'; +import {TicketService} from '../../services/ticket.service'; @Component({ selector: 'app-ticket', diff --git a/source/ticketUI/src/app/event-browser/event-browser.component.scss b/source/ticketUI/src/app/event-browser/event-browser.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/source/ticketUI/src/app/page/debug/debug.component.html b/source/ticketUI/src/app/page/debug/debug.component.html deleted file mode 100644 index fe87625..0000000 --- a/source/ticketUI/src/app/page/debug/debug.component.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/source/ticketUI/src/app/page/debug/debug.component.scss b/source/ticketUI/src/app/page/debug/debug.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/source/ticketUI/src/app/page/debug/debug.component.ts b/source/ticketUI/src/app/page/debug/debug.component.ts deleted file mode 100644 index f4433b7..0000000 --- a/source/ticketUI/src/app/page/debug/debug.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import {Component, inject} from '@angular/core'; -import {TicketComponent} from "../../ticket/ticket.component"; -import {TicketService} from '../../services/ticket.service'; -import {AddTicket} from '../../../models/request/add-ticket'; -import {TicketTypeEnum} from '../../../models/enums/ticket-type.enum'; - -@Component({ - selector: 'app-debug', - imports: [ - TicketComponent - ], - templateUrl: './debug.component.html', - styleUrl: './debug.component.scss' -}) -export class DebugComponent { - private ticketMinter = inject(TicketService); - - public getQrCode(): void { - 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 1d35736..f58d9a8 100644 --- a/source/ticketUI/src/app/page/event/event.component.html +++ b/source/ticketUI/src/app/page/event/event.component.html @@ -1,24 +1,3 @@ -
- -

Add Event

-
- - - - - - - - - - - - -
- - -
-

Add Season

@@ -42,3 +21,24 @@
+ +
+ +

Add Event

+
+ + + + + + + + + + + + +
+ + +
diff --git a/source/ticketUI/src/app/page/event/event.component.ts b/source/ticketUI/src/app/page/event/event.component.ts index 9675abb..fd6c089 100644 --- a/source/ticketUI/src/app/page/event/event.component.ts +++ b/source/ticketUI/src/app/page/event/event.component.ts @@ -1,8 +1,8 @@ import {Component, inject} from '@angular/core'; -import {FormControl, ReactiveFormsModule} from '@angular/forms'; +import {FormControl, ReactiveFormsModule, Validators} from '@angular/forms'; import {EventService} from '../../services/event.service'; import {SeasonService} from '../../services/season.service'; -import {SeasonBrowserComponent} from '../../season-browser/season-browser.component'; +import {SeasonBrowserComponent} from '../../components/season-browser/season-browser.component'; @Component({ selector: 'app-event', @@ -11,14 +11,14 @@ import {SeasonBrowserComponent} from '../../season-browser/season-browser.compon styleUrl: './event.component.scss' }) export class EventComponent { - public eventName = new FormControl(''); + public eventName = new FormControl('', [Validators.required]); public eventDescription = new FormControl(''); - public eventDate = new FormControl(new Date); + public eventDate = new FormControl(new Date, [Validators.required]); - public seasonName = new FormControl(''); + public seasonName = new FormControl('', [Validators.required]); public seasonDescription = new FormControl(''); - public seasonStartDate = new FormControl(new Date); - public seasonEndDate = new FormControl(new Date); + public seasonStartDate = new FormControl(new Date, [Validators.required]); + public seasonEndDate = new FormControl(new Date, [Validators.required]); private eventService = inject(EventService); private seasonService = inject(SeasonService); diff --git a/source/ticketUI/src/app/page/scan/scan.component.ts b/source/ticketUI/src/app/page/scan/scan.component.ts index 6e02164..6514ed0 100644 --- a/source/ticketUI/src/app/page/scan/scan.component.ts +++ b/source/ticketUI/src/app/page/scan/scan.component.ts @@ -1,6 +1,6 @@ import {Component, inject} from '@angular/core'; import {ZXingScannerModule} from '@zxing/ngx-scanner'; -import {ScanResultComponent} from '../../scan-result/scan-result.component'; +import {ScanResultComponent} from '../../components/scan-result/scan-result.component'; import {ScanService} from '../../services/scan.service'; @Component({ diff --git a/source/ticketUI/src/app/page/ticket/ticket.component.html b/source/ticketUI/src/app/page/ticket/ticket.component.html index 423b64d..0b0194b 100644 --- a/source/ticketUI/src/app/page/ticket/ticket.component.html +++ b/source/ticketUI/src/app/page/ticket/ticket.component.html @@ -1,4 +1,7 @@

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 2e1589a..3db80c2 100644 --- a/source/ticketUI/src/app/page/ticket/ticket.component.ts +++ b/source/ticketUI/src/app/page/ticket/ticket.component.ts @@ -1,14 +1,23 @@ -import { Component } from '@angular/core'; -import {EventBrowserComponent} from '../../event-browser/event-browser.component'; +import {Component, inject} from '@angular/core'; +import {EventBrowserComponent} from '../../components/event-browser/event-browser.component'; +import {TicketTypeSelectorComponent} from '../../components/ticket-type-selector/ticket-type-selector.component'; +import {PatronInfoComponent} from '../../components/patron-info/patron-info.component'; +import {TicketService} from '../../services/ticket.service'; @Component({ selector: 'app-ticket', imports: [ - EventBrowserComponent + EventBrowserComponent, + TicketTypeSelectorComponent, + PatronInfoComponent ], templateUrl: './ticket.component.html', styleUrl: './ticket.component.scss' }) export class TicketComponent { + public ticketService = inject(TicketService); + public saveTicket(): void { + + } } diff --git a/source/ticketUI/src/app/season-browser/season-browser.component.scss b/source/ticketUI/src/app/season-browser/season-browser.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/source/ticketUI/src/models/core/patron.ts b/source/ticketUI/src/models/core/patron.ts new file mode 100644 index 0000000..2bc1e56 --- /dev/null +++ b/source/ticketUI/src/models/core/patron.ts @@ -0,0 +1,12 @@ +export interface Patron { + firstName: string, + middleName: string | null, + lastName: string, + email: string, + phoneNumber: string | null, + addressOne: string, + addressTwo: string | null, + city: string, + state: string, + zip: string, +} diff --git a/source/ticketUI/src/models/core/ticket.ts b/source/ticketUI/src/models/core/ticket.ts new file mode 100644 index 0000000..86c217a --- /dev/null +++ b/source/ticketUI/src/models/core/ticket.ts @@ -0,0 +1,11 @@ +import {TicketTypeEnum} from '../enums/ticket-type.enum'; +import {Patron} from './patron'; + +export interface Ticket { + id: string, + seasonId: string, + eventId: string, + type: TicketTypeEnum, + qrCode: string, + patron: Patron +} diff --git a/source/ticketUI/src/models/enums/ticket-type.enum.ts b/source/ticketUI/src/models/enums/ticket-type.enum.ts index ed3a8cc..3c29373 100644 --- a/source/ticketUI/src/models/enums/ticket-type.enum.ts +++ b/source/ticketUI/src/models/enums/ticket-type.enum.ts @@ -7,3 +7,12 @@ export enum TicketTypeEnum { Senior, SeniorSeason } + +export const TicketTypeEnumLabel = new Map([ + [TicketTypeEnum.Single, 'Single'], + [TicketTypeEnum.SingleSeason, 'Single Season'], + [TicketTypeEnum.Family, 'Family'], + [TicketTypeEnum.FamilySeason, 'Family Season'], + [TicketTypeEnum.Senior, 'Senior'], + [TicketTypeEnum.SeniorSeason, 'Senior Season'], +]);