UNPKG

bam-ticketing-sdk

Version:

SDK for B.A.M Ticketing API

194 lines (173 loc) 4.52 kB
import { AxiosInstance } from 'axios' import queryString from 'query-string' import { BlockchainFunction, BlockchainFunctionParams, TransferTicketsRequest, } from '../blockchain/types' import { buildQuery } from '../common/query' import { BlockchainTicket, CreateTicketHolder, GetTicket, GetTickets, QRCode, TicketHolderId, TransferParams, UpdateTicketHolder, } from './types' import { Ticket, TicketHolder } from '../event/types' import { HealthStatus, IdParam } from '../common/types' /** * Service class for ticket API calls. Requires an organizer to be set (call to `useOrganizer`) */ export class TicketService { constructor(readonly client: AxiosInstance, readonly version: string) { } /** * Returns true if the service is reachable * Currently the * * @returns Services' online status */ async health(): Promise<HealthStatus> { try { const res = await this.client.get(`event/health`) if (res.data.status === 'ok') { return { online: true } } } catch (e) { // Do nothing } return { online: false } } /** * Returns a ticket by its ID * * @param req ID of the order * @returns `Ticket` */ async getTicket(req: GetTicket): Promise<Ticket> { const query = queryString.stringify( { with: !req.with ? undefined : buildQuery(req.with), }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get( `event/${this.version}/ticket/${req.id}?${query}` ) return res.data.data } /** * Returns a list of tickets accessible to the user * * @param req Filters * @returns `Ticket[]` Tickets which belong to the user */ async getTickets(req: GetTickets): Promise<Ticket[]> { const query = queryString.stringify( { with: !req.with ? undefined : buildQuery(req.with), with_enrollment_id: req.withEnrollmentId, format: req.format, status: req.status, }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get(`event/${this.version}/ticket?${query}`) return res.data.data } /** * Get ticket holder information together with the questionnaire attached to it * * @param ticketId * @param ticketHolderId */ async getTicketHolder( ticketHolderId: TicketHolderId ): Promise<TicketHolder> { const res = await this.client.get( `event/${this.version}/ticket/${ticketHolderId.ticketId}/ticket_holder/${ticketHolderId.id}?with=questionnaire.questionnaire_item.question` ) return res.data.data } /** * Creates a ticket holder for the specified ticket * * @param ticketId Id of the ticket for which the ticket holder gets created * @param holder Ticket holder information * @returns TicketHolder */ async createTicketHolder( ticketId: IdParam, holder: CreateTicketHolder ): Promise<TicketHolder> { const res = await this.client.post( `event/${this.version}/ticket/${ticketId.id}/ticket_holder`, holder ) return res.data.data } /** * Creates a ticket holder for the specified ticket * * @param holder Ticket holder information * @returns TicketHolder */ async updateTicketHolder( id: TicketHolderId, holder: UpdateTicketHolder ): Promise<TicketHolder> { const res = await this.client.patch( `event/${this.version}/ticket/${id.ticketId}/ticket_holder/${id.id}`, holder ) return res.data.data } /** * Returns a ticket transfer payload * * @param data Ticket ids and the new owner * @returns Payload to use for `sendTransaction` */ async getTransferPayload( data: TransferParams ): Promise<BlockchainFunctionParams<TransferTicketsRequest>> { const res = await this.client.post( `event/${this.version}/ticket/transfer`, data ) return { fcn: BlockchainFunction.TransferTicket, args: res.data.data, } } /** * Returns the base64 encoded QR-Code image for a given ticket * * @param ticketId ID of ticket * @returns */ async getQrCode(ticketId: IdParam): Promise<QRCode> { const res = await this.client.post( `event/${this.version}/ticket/${ticketId.id}/qrcode`, { action: 'trx', fcn: 'ticket.invalidate', } ) return res.data.data } /** * Get ticket info based on the blockchain id * * @param blockchainTicket * @returns */ async getTicketByBlockchainId(blockchainTicket: BlockchainTicket): Promise<Ticket> { const res = await this.client.get( `event/${this.version}/ticket/bc/${blockchainTicket.id}` ) return res.data.data } }