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 {
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<TicketResponse[]> {
getTickets(eventId?: number): Promise<TicketResponse[]> {
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 ?? []);
}

View File

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

View File

@@ -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<TicketResponse[]>([]);
protected readonly activeTickets = computed(() =>
@@ -36,7 +38,9 @@ export class TicketsPage implements OnInit {
async ngOnInit(): Promise<void> {
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(),