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 {
|
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 ?? []);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
Reference in New Issue
Block a user