feat(tickets): support event-based ticket queries
This commit is contained in:
@@ -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 ?? []);
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user