feat(tickets): support event-based ticket queries

This commit is contained in:
2026-09-22 12:26:12 -03:00
parent 8adbfecc35
commit 3465352218
3 changed files with 32 additions and 3 deletions

View File

@@ -7,6 +7,7 @@ import { TenantService } from '../../../../../../core/services/tenant.service';
export interface TicketResponse { export interface TicketResponse {
id: number; id: number;
tenant_code: string; tenant_code: string;
event_id: number | null;
ticket: string; ticket: string;
name: string; name: string;
description: string | null; description: string | null;
@@ -22,13 +23,29 @@ export interface TicketResponse {
is_used: boolean; is_used: boolean;
} }
export interface TicketEventResponse {
id: number;
title: string;
image: string | null;
}
@Injectable() @Injectable()
export class TicketService extends BaseApiService { export class TicketService extends BaseApiService {
private readonly tenantService = inject(TenantService); private readonly tenantService = inject(TenantService);
getTickets(): Promise<TicketResponse[]> { getTickets(eventId?: number): Promise<TicketResponse[]> {
return firstValueFrom( 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<TicketEventResponse[]> {
return firstValueFrom(
this.http.get<{ data: TicketEventResponse[] }>(
`${this.tenantService.getTenantApiUrl()}/tickets/events`,
),
).then((response) => response.data ?? []); ).then((response) => response.data ?? []);
} }

View File

@@ -19,6 +19,7 @@ function withCustomLoading<T extends object>(service: T): T & { withCustomLoadin
const ticket = (overrides: Partial<TicketResponse>): TicketResponse => ({ const ticket = (overrides: Partial<TicketResponse>): TicketResponse => ({
id: 1, id: 1,
tenant_code: 'tenant', tenant_code: 'tenant',
event_id: null,
ticket: 'ticket-1', ticket: 'ticket-1',
name: 'Entrada general', name: 'Entrada general',
description: null, description: null,

View File

@@ -1,4 +1,5 @@
import { Component, computed, inject, OnInit, signal } from '@angular/core'; import { Component, computed, inject, OnInit, signal } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { ModalService } from '../../../../../../core/services/modal.service'; import { ModalService } from '../../../../../../core/services/modal.service';
import { ToastService } from '../../../../../../core/services/toast.service'; import { ToastService } from '../../../../../../core/services/toast.service';
@@ -18,6 +19,7 @@ export class TicketsPage implements OnInit {
private readonly ticketService = inject(TicketService); private readonly ticketService = inject(TicketService);
private readonly toastService = inject(ToastService); private readonly toastService = inject(ToastService);
private readonly modalService = inject(ModalService); private readonly modalService = inject(ModalService);
private readonly route = inject(ActivatedRoute, { optional: true });
protected readonly tickets = signal<TicketResponse[]>([]); protected readonly tickets = signal<TicketResponse[]>([]);
protected readonly activeTickets = computed(() => protected readonly activeTickets = computed(() =>
@@ -36,7 +38,9 @@ export class TicketsPage implements OnInit {
async ngOnInit(): Promise<void> { async ngOnInit(): Promise<void> {
try { try {
this.tickets.set(await this.ticketService.withCustomLoading().getTickets()); this.tickets.set(
await this.ticketService.withCustomLoading().getTickets(this.eventIdFromRoute()),
);
} catch { } catch {
this.toastService.danger('Hubo un error al cargar los tickets'); this.toastService.danger('Hubo un error al cargar los tickets');
} finally { } 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 { protected toggleAll(selected: boolean): void {
this.selectedIds.set( this.selectedIds.set(
selected ? new Set(this.activeTickets().map((ticket) => ticket.id)) : new Set(), selected ? new Set(this.activeTickets().map((ticket) => ticket.id)) : new Set(),