From 346535221859d9ea4d5b4fa779a4131713e81f11 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Tue, 22 Sep 2026 12:26:12 -0300 Subject: [PATCH] feat(tickets): support event-based ticket queries --- .../pages/tickets-page/ticket.service.ts | 21 +++++++++++++++++-- .../pages/tickets-page/tickets-page.spec.ts | 1 + .../pages/tickets-page/tickets-page.ts | 13 +++++++++++- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/app/features/store/pages/account-page/pages/tickets-page/ticket.service.ts b/src/app/features/store/pages/account-page/pages/tickets-page/ticket.service.ts index 2e73168..95f10ee 100644 --- a/src/app/features/store/pages/account-page/pages/tickets-page/ticket.service.ts +++ b/src/app/features/store/pages/account-page/pages/tickets-page/ticket.service.ts @@ -7,6 +7,7 @@ import { TenantService } from '../../../../../../core/services/tenant.service'; export interface TicketResponse { id: number; tenant_code: string; + event_id: number | null; ticket: string; name: string; description: string | null; @@ -22,13 +23,29 @@ export interface TicketResponse { is_used: boolean; } +export interface TicketEventResponse { + id: number; + title: string; + image: string | null; +} + @Injectable() export class TicketService extends BaseApiService { private readonly tenantService = inject(TenantService); - getTickets(): Promise { + getTickets(eventId?: number): Promise { return firstValueFrom( - this.http.get<{ data: TicketResponse[] }>(`${this.tenantService.getTenantApiUrl()}/tickets`), + this.http.get<{ data: TicketResponse[] }>(`${this.tenantService.getTenantApiUrl()}/tickets`, { + params: eventId === undefined ? {} : { event_id: eventId }, + }), + ).then((response) => response.data ?? []); + } + + getTicketEvents(): Promise { + return firstValueFrom( + this.http.get<{ data: TicketEventResponse[] }>( + `${this.tenantService.getTenantApiUrl()}/tickets/events`, + ), ).then((response) => response.data ?? []); } diff --git a/src/app/features/store/pages/account-page/pages/tickets-page/tickets-page.spec.ts b/src/app/features/store/pages/account-page/pages/tickets-page/tickets-page.spec.ts index cebca14..63223c7 100644 --- a/src/app/features/store/pages/account-page/pages/tickets-page/tickets-page.spec.ts +++ b/src/app/features/store/pages/account-page/pages/tickets-page/tickets-page.spec.ts @@ -19,6 +19,7 @@ function withCustomLoading(service: T): T & { withCustomLoadin const ticket = (overrides: Partial): TicketResponse => ({ id: 1, tenant_code: 'tenant', + event_id: null, ticket: 'ticket-1', name: 'Entrada general', description: null, diff --git a/src/app/features/store/pages/account-page/pages/tickets-page/tickets-page.ts b/src/app/features/store/pages/account-page/pages/tickets-page/tickets-page.ts index affdf19..246156a 100644 --- a/src/app/features/store/pages/account-page/pages/tickets-page/tickets-page.ts +++ b/src/app/features/store/pages/account-page/pages/tickets-page/tickets-page.ts @@ -1,4 +1,5 @@ import { Component, computed, inject, OnInit, signal } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; import { ModalService } from '../../../../../../core/services/modal.service'; import { ToastService } from '../../../../../../core/services/toast.service'; @@ -18,6 +19,7 @@ export class TicketsPage implements OnInit { private readonly ticketService = inject(TicketService); private readonly toastService = inject(ToastService); private readonly modalService = inject(ModalService); + private readonly route = inject(ActivatedRoute, { optional: true }); protected readonly tickets = signal([]); protected readonly activeTickets = computed(() => @@ -36,7 +38,9 @@ export class TicketsPage implements OnInit { async ngOnInit(): Promise { try { - this.tickets.set(await this.ticketService.withCustomLoading().getTickets()); + this.tickets.set( + await this.ticketService.withCustomLoading().getTickets(this.eventIdFromRoute()), + ); } catch { this.toastService.danger('Hubo un error al cargar los tickets'); } finally { @@ -44,6 +48,13 @@ export class TicketsPage implements OnInit { } } + private eventIdFromRoute(): number | undefined { + const value = this.route?.snapshot.paramMap.get('eventId'); + const eventId = value === null || value === undefined ? Number.NaN : Number(value); + + return Number.isInteger(eventId) && eventId > 0 ? eventId : undefined; + } + protected toggleAll(selected: boolean): void { this.selectedIds.set( selected ? new Set(this.activeTickets().map((ticket) => ticket.id)) : new Set(),