UNPKG

bam-ticketing-sdk

Version:

SDK for B.A.M Ticketing API

1,336 lines (1,199 loc) 38.4 kB
import { AxiosInstance } from 'axios' import queryString from 'query-string' import { buildQuery, getStringifiedQuery } from '../common/query' import { HealthStatus, IdParam, ListInfo, QRCodePayload, StringIdParam, } from '../common/types' import { BlockchainFunction, BlockchainFunctionParams, } from '../blockchain/types' import { TicketConfigId, Event, OrganizerSpecificId, NewEvent, OrganizerName, UpdatableEvent, TicketConfig, ListEventsQuery, SingleEventQuery, MyEventsQuery, PublicKey, TicketCount, QrCodeTicketConfig, CreateNftDrop, NftDrop, NftDropQuery, SingleNftDropQuery, UpdateNftDrop, NftDropFilterId, ListOrganizerEventsQuery, ListOrganizerEventTicketConfigsQuery, SingleOrganizerEventQuery, TicketDiscount, CreateTicketDiscount, UpdateTicketDiscount, SingleTicketDiscountQuery, CreateDiscountBatch, ListTicketDiscountQuery, TicketDiscountIdParam, CreatePromoSection, PromoSectionId, UpdatePromoSection, PromoSection, PrivateEventQuery, CreateTicketConfig, Sector, CreateSector, UpdateSector, SectorId, SingleSectorQuery, ListSectorQuery, Timeslot, CreateTimeslot, TimeslotId, UpdateTimeslot, SingleTimeslotQuery, ListTimeslotsQuery, ListInformationEmailQuery, InformationEmail, SingleInformationEmailQuery, CreateInformationEmail, UpdateInformationEmail, InformationEmailId, TicketFormat, Category, ListCategoryQuery, EventHolderList, ListQuestionnaireQuery, Questionnaire, CreateQuestionnaire, QuestionnaireQuery, UpdateQuestionnaire, ListQuestionQuery, Question, CreateQuestion, SendTicketsData, SendTicketsResponse, } from './types' /** * Service class for event API calls. Requires an organizer to be set (call to `useOrganizer`) */ export class EventService { constructor(readonly client: AxiosInstance, readonly version: string) {} /** * Returns true if the service is reachable * * @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 } } /** * Creates a new event. Subobjects except for the subcategory can be added later. * `endAt` needs to be after `startAt` and both need to be in the future. * After an event is created, it needs to be published to be available for purchase. * To publish an event, it needs to have at least one ticket configuration. * * @returns new Event */ async createEvent(name: OrganizerName, newEvent: NewEvent): Promise<Event> { const res = await this.client.post( `event/${this.version}/organizer/${name.name}/event`, newEvent ) return res.data.data } /** * Updates existing event. * @param id Org ID and event ID of the event you want to update * @param updatedEventFields Fields on the event to be updated * @returns new Event */ async updateEvent( id: OrganizerSpecificId, updatedEventFields: UpdatableEvent ): Promise<Event> { const res = await this.client.patch( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}`, updatedEventFields ) return res.data.data } /** * Deletes existing event. * @param id Org ID and event ID of the event you want to delete */ async deleteEvent(id: OrganizerSpecificId) { const res = await this.client.delete( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}` ) return res.data.data } /** * Cancels existing event. * @param id Org ID and event ID of the event you want to cancel */ async cancelEvent(id: OrganizerSpecificId) { const res = await this.client.post( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/cancel` ) return res.data.data } /** * @param id Org ID and event ID of the event you want to publish * @returns Publish event payload */ async getEventPublishingPayload( id: OrganizerSpecificId ): Promise<BlockchainFunctionParams> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/chaincode_payload` ) return { fcn: BlockchainFunction.CreateEvent, args: res.data.data, } } /** * Returns payload when creating an event on the blockchain. * * @param id Org ID and event ID of the event you want to publish * @returns payload to be when creating it on the blockchain */ async getEventPublishPayload(id: OrganizerSpecificId): Promise<Event> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/chaincode/publish/proposal` ) return res.data.data } /** * Returns QR Code payload when creating an event on the blockchain. * * @param id Org ID and event ID of the event you want to publish * @returns QR Code payload */ async getEventPublishQRCodePayload( id: OrganizerSpecificId ): Promise<QRCodePayload> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/chaincode/publish/qrcode_payload` ) return res.data.data } /** * Returns payload when updating an event on the blockchain. * * @param id Org ID and event ID of the event you want to publish * @returns payload when updating an even on the blockchain */ async getEventUpdatePayload(id: OrganizerSpecificId): Promise<Event> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/chaincode/update/proposal` ) return res.data.data } /** * Returns QR Code payload when updating an event on the blockchain. * * @param id Org ID and event ID of the event you want to publish * @returns QR Code payload */ async getEventUpdateQRCodePayload( id: OrganizerSpecificId ): Promise<QRCodePayload> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/chaincode/update/qrcode_payload` ) return res.data.data } /** * Returns the public key for ticket signature validation * * @param id Org ID and event ID of the tickets * @returns Public key for signature validation */ async getTicketSigningKey(id: OrganizerSpecificId): Promise<PublicKey> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/public_key` ) return res.data.data } /** * Returns an event by its ID. * * @param req ID and additional query params * @returns Event object */ async getEvent(req: SingleEventQuery): Promise<Event> { const query = queryString.stringify( { include_occurrences: req.include_occurrences, q: req.query, public: true, with: !req.with ? '[ticket_config,ticket_discount,subcategory,ticket_format,timeslot,occurrence.ticket_config,sector]' : buildQuery(req.with), organizer_id: req.organizer_id, }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get( `event/${this.version}/event/${req.id}?${query}` ) return res.data.data } /** * Returns an unpublished event by its ID. * * @param req ID and access_token of the event and additional query params * @returns Event object */ async getPrivateEvent(req: PrivateEventQuery): Promise<Event> { 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}/event/${req.id}/private/${req.access_token}?${query}` ) return res.data.data } /** * Returns a list of active events. * * @param req.q String value for text-based search on event * @param req.start_at Date range where the event start_at field is filtered * @param req.include_occurrences If true, in case of recurring events it includes occurrences * @param req.with Field selector query attribute * @returns */ async listEvents(req: ListEventsQuery = {}): Promise<ListInfo<Event>> { const query = queryString.stringify( { include_occurrences: req.include_occurrences, q: req.query, public: true, with: !req.with ? undefined : buildQuery(req.with), start_at: req.start_at !== undefined ? `${req.start_at[0].toISOString()};${req.start_at[1].toISOString()}` : undefined, organizer_id: req.organizer_id, sort_by: req.sort_by, direction: req.direction, future_events: req.future_events, name: req.name, }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get(`event/${this.version}/event?${query}`) return res.data } async listOrganizerEvents( id: OrganizerName, req: ListOrganizerEventsQuery = {} ): Promise<ListInfo<Event>> { const query = queryString.stringify( { ...req, with: req?.with ? buildQuery(req.with) : undefined, }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get( `event/${this.version}/organizer/${id.name}/event?${query}` ) return res.data } async getOrganizerEvent( id: OrganizerSpecificId, req: SingleOrganizerEventQuery = {} ): Promise<Event> { const query = queryString.stringify( { ...req, with: req.with ? buildQuery(req.with) : undefined, }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}?${query}` ) return res.data.data } async listOrganizerEventTicketConfigs( id: OrganizerSpecificId, req: ListOrganizerEventTicketConfigsQuery = {} ): Promise<ListInfo<TicketConfig>> { const query = queryString.stringify( { ...req, with: req.with ? buildQuery(req.with) : undefined, }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/ticket_config?${query}` ) return res.data } /** * Returns a ticket configuration. * * @param id.organizerId Name of the organizer to whom the ticket config belongs to * @param id.eventId ID of the event to which the ticket config belongs to * @param id.ticketConfigId ID of the ticket config * @returns */ async getTicketConfig(id: TicketConfigId): Promise<TicketConfig> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_config/${id.ticketConfigId}` ) return res.data.data } /** * Returns newly created ticket configuration. * * @param id.organizerId Name of the organizer to whom the ticket config belongs to * @param id.id ID of the event to which the ticket config belongs to * @param ticketConfig data based on which ticket config should be created * @returns new ticket config */ async createTicketConfig( id: OrganizerSpecificId, ticketConfig: CreateTicketConfig ): Promise<TicketConfig> { const res = await this.client.post( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/ticket_config`, ticketConfig ) return res.data.data } /** * Returns updated ticket configuration. * * @param id.organizerId Name of the organizer to whom the ticket config belongs to * @param id.eventId ID of the event to which the ticket config belongs to * @param id.ticketConfigId ID of the ticket config to be updated * @param ticketConfig data based on which ticket config should be updated * @returns new ticket config */ async updateTicketConfig( id: TicketConfigId, ticketConfig: Partial<CreateTicketConfig> ): Promise<TicketConfig> { const res = await this.client.patch( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_config/${id.ticketConfigId}`, ticketConfig ) return res.data.data } /** * Deletes ticket config. * @param id.organizerId Name of the organizer to whom the ticket config belongs to * @param id.eventId ID of the event to which the ticket config belongs to * @param id.ticketConfigId ID of the ticket config to be deleted */ async deleteTicketConfig(id: TicketConfigId) { await this.client.delete( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_config/${id.ticketConfigId}` ) } /** * Returns payload when publishing a ticket config on the blockchain. * * @param id Org ID, event ID and ID of the ticket config you want to publish * @returns payload when publishing a ticket config on the blockchain. */ async getTicketConfigPublishPayload( id: TicketConfigId ): Promise<TicketConfig> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_config/${id.ticketConfigId}/chaincode/publish/payload` ) return res.data.data } /** * Returns QR Code payload when publishing a ticket config on the blockchain. * * @param id Org ID, event ID and ID of the ticket config you want to publish * @returns QR Code payload */ async getTicketConfigPublishQRCodePayload( id: TicketConfigId ): Promise<QRCodePayload> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_config/${id.ticketConfigId}/chaincode/publish/qrcode_payload` ) return res.data.data } /** * Returns payload when updating a ticket config on the blockchain. * * @param id Org ID, event ID and ID of the ticket config you want to update * @returns payload when updating a ticket config on the blockchain. */ async getTicketConfigUpdatePayload( id: TicketConfigId ): Promise<TicketConfig> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_config/${id.ticketConfigId}/chaincode/update/proposal` ) return res.data.data } /** * Returns QR Code payload when updating a ticket config on the blockchain. * * @param id Org ID, event ID and ID of the ticket config you want to update * @returns QR Code payload */ async getTicketConfigUpdateQRCodePayload( id: TicketConfigId ): Promise<QRCodePayload> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_config/${id.ticketConfigId}/chaincode/update/qrcode_payload` ) return res.data.data } /** * Returns events with secure tickets for the authorized enrolled user. * * @param req.date Filter events by `end_at` date comparing with `midnight`. Expected values are `future`, `past` and `all`. * @returns */ async getMyEvents(req: MyEventsQuery) { const query = queryString.stringify({ date: req.date, }) const res = await this.client.get( `event/${this.version}/my_events?${query}` ) return res.data.data } /** * Returns ticket counts for a given event (one entry per ticket-configuration) * * @param req * @returns */ async getTicketCount(req: SingleEventQuery): Promise<TicketCount[]> { const res = await this.client.get( `event/${this.version}/organizer/${req.organizer_id}/event/${req.id}/statistics/validator/ticket_count` ) return res.data.data } /** * Returns all qr-codes (for unused tickets) for a given event * * @param req * @returns */ async getQrCodes(req: SingleEventQuery): Promise<QrCodeTicketConfig[]> { const res = await this.client.get( `event/${this.version}/organizer/${req.organizer_id}/event/${req.id}/qr_codes` ) return res.data.data } async createNftDrop(nftDrop: CreateNftDrop): Promise<NftDrop> { const res = await this.client.post( `event/${this.version}/organizer/${nftDrop.organizerId}/nft_drop`, nftDrop ) return res.data.data } async updateNftDrop(nftDrop: UpdateNftDrop): Promise<NftDrop> { const res = await this.client.patch( `event/${this.version}/organizer/${nftDrop.organizerId}/nft_drop/${nftDrop.id}`, nftDrop ) return res.data.data } async sendNftDrop(id: OrganizerSpecificId) { await this.client.post( `event/${this.version}/organizer/${id.organizerId}/nft_drop/${id.id}/send` ) } async deleteNftDrop(id: OrganizerSpecificId) { await this.client.delete( `event/${this.version}/organizer/${id.organizerId}/nft_drop/${id.id}` ) } async deleteNftDropFilter(id: NftDropFilterId) { await this.client.delete( `event/${this.version}/organizer/${id.organizerId}/nft_drop/${id.nftDropId}/nft_drop_filter/${id.id}` ) } /** * Returns a specific NFT collection with the given relations */ async getNftDrop( id: OrganizerSpecificId, req: SingleNftDropQuery = {} ): Promise<NftDrop> { const query = queryString.stringify( { with: req.with ? buildQuery(req.with) : undefined }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/nft_drop/${id.id}?${query}` ) return res.data.data } async listNftDrops( id: OrganizerName, req: NftDropQuery = {} ): Promise<ListInfo<NftDrop>> { const query = queryString.stringify( { ...req, with: !req.with ? undefined : buildQuery(req.with), }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get( `event/${this.version}/organizer/${id.name}/nft_drop?${query}` ) return res.data } /** * Creates a ticket discount. * @param id.organizerId Name of the organizer to whom the ticket discount belongs to * @param id.eventId ID of the event to which the ticket discount belongs to * @returns new TicketDiscount */ async createTicketDiscount( id: OrganizerSpecificId, ticketDiscount: CreateTicketDiscount ): Promise<TicketDiscount> { const res = await this.client.post( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/ticket_discount`, ticketDiscount ) return res.data.data } /** * Updates ticket discount. * @param id.organizerId Name of the organizer to whom the ticket discount belongs to * @param id.eventId ID of the event to which the ticket discount belongs to * @param id.id ID of the ticket discount to update * @returns updated ticket discount */ async updateTicketDiscount( id: TicketDiscountIdParam, ticketDiscount: UpdateTicketDiscount ): Promise<TicketDiscount> { const res = await this.client.patch( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_discount/${id.id}`, ticketDiscount ) return res.data.data } /** * Deletes ticket discount. * @param id.organizerId Name of the organizer to whom the ticket discount belongs to * @param id.eventId ID of the event to which the ticket discount belongs to * @param id.id ID of the ticket discount to be deleted */ async deleteTicketDiscount(id: TicketDiscountIdParam) { await this.client.delete( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_discount/${id.id}` ) } /** * Fetches ticket discount. * @param id.organizerId Name of the organizer to whom the ticket discount belongs to * @param id.eventId ID of the event to which the ticket discount belongs to * @param id.id ID of the ticket discount to be fetched */ async getTicketDiscount( id: TicketDiscountIdParam, req: SingleTicketDiscountQuery = {} ): Promise<TicketDiscount> { const query = queryString.stringify( { ...req, with: req.with ? buildQuery(req.with) : undefined, }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_discount/${id.id}?${query}` ) return res.data.data } /** * Creates discounts in batches. * @param id.organizerId Name of the organizer to whom the ticket discount belongs to * @param id.eventId ID of the event to which the ticket discount belongs to * @param id.id ID of the ticket discount to be duplicated */ async createDiscountBatch( id: TicketDiscountIdParam, discountBatch: CreateDiscountBatch ): Promise<TicketDiscount> { const res = await this.client.post( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_discount/${id.id}/batch`, discountBatch ) return res.data.data } async listTicketDiscounts( id: OrganizerSpecificId, req: ListTicketDiscountQuery = {} ): Promise<ListInfo<TicketDiscount>> { const query = queryString.stringify( { ...req, with: !req.with ? undefined : buildQuery(req.with), }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/ticket_discount?${query}` ) return res.data } /** * Create a single promo section * @param id.organizerId Name of the organizer to whom the ticket config belongs to * @param id.eventId ID of the event to which the ticket config belongs to * @param id.TicketConfigId ID of the ticket config which the promo section should belong to * @param promoSection Created promo section * @returns The created promo section */ async createPromoSection( id: TicketConfigId, promoSection: CreatePromoSection ): Promise<PromoSection> { const res = await this.client.post( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_config/${id.ticketConfigId}/promo_section`, promoSection ) return res.data.data } /** * Update a single promo section * @param id.organizerId Name of the organizer to whom the ticket config belongs to * @param id.eventId ID of the event to which the ticket config belongs to * @param id.ticketConfigId ID of the ticket config which the promo section belongs to * @param id.id ID of the promo section * @param promoSection Updated promo section * @returns The updated promo section */ async updatePromoSection( id: PromoSectionId, promoSection: UpdatePromoSection ): Promise<PromoSection> { const res = await this.client.patch( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_config/${id.ticketConfigId}/promo_section/${id.id}`, promoSection ) return res.data.data } /** * Get a single promo section * @param id.organizerId Name of the organizer to whom the ticket config belongs to * @param id.eventId ID of the event to which the ticket config belongs to * @param id.ticketConfigId ID of the ticket config which the promo section belongs to * @param id.id ID of the promo section * @returns Single promo section */ async getPromoSection(id: PromoSectionId): Promise<PromoSection> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_config/${id.ticketConfigId}/promo_section/${id.id}` ) return res.data.data } /** * List promo sections * @param id.organizerId Name of the organizer to whom the ticket config belongs to * @param id.eventId ID of the event to which the ticket config belongs to * @param id.ticketConfigId ID of the ticket config which the promo section belongs to * @returns List of the promo sections */ async listPromoSections(id: TicketConfigId): Promise<ListInfo<PromoSection>> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_config/${id.ticketConfigId}/promo_section` ) return res.data } /** * Delete a single promo section * @param id.organizerId Name of the organizer to whom the ticket config belongs to * @param id.eventId ID of the event to which the ticket config belongs to * @param id.ticketConfigId ID of the ticket config which the promo section belongs to * @param id.id ID of the promo section */ async deletePromoSection(id: PromoSectionId): Promise<void> { await this.client.delete( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/ticket_config/${id.ticketConfigId}/promo_section/${id.id}` ) } /** * Create a sector on an event. * @param id.id ID of the event the sector should belong to * @param id.organizerId Name of the organizer whom the event belongs to * @param sector The sector that should be created * @param sector.ticketConfig IDs of the ticket configs that should be applied to the sector */ async createSector( id: OrganizerSpecificId, sector: CreateSector ): Promise<Sector> { const res = await this.client.post( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/sector`, sector ) return res.data.data } /** * Update a sector on an event. * @param id.eventId ID of the event which the sector belongs to * @param id.organizerId Name of the organizer the event is belonging to * @param id.id ID of the sector that should be updated * @param sector.ticketConfig IDs of the ticket configs that should be applied to the sector */ async updateSector(id: SectorId, sector: UpdateSector): Promise<Sector> { const res = await this.client.patch( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/sector/${id.id}`, sector ) return res.data.data } /** * List sectors on an event * @param id.id ID of the event the sector should belong to * @param id.organizerId Name of the organizer whom the event belongs to * @param query.with Allows fetching the associated ticket configs with the sector */ async listSectors( id: OrganizerSpecificId, query: ListSectorQuery = {} ): Promise<ListInfo<Sector>> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${ id.id }/sector?${getStringifiedQuery(query)}` ) return res.data } /** * Get a sector on an event * @param id.eventId ID of the event which the sector belongs to * @param id.organizerId Name of the organizer the event is belonging to * @param id.id ID of the sector that should be fetched * @param query Allows fetching the associated ticket configs with the sector */ async getSector( id: SectorId, query: SingleSectorQuery = {} ): Promise<Sector> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${ id.eventId }/sector/${id.id}?${getStringifiedQuery(query)}` ) return res.data.data } /** * Delete a sector from an event * @param id.eventId ID of the event which the sector belongs to * @param id.organizerId Name of the organizer the event is belonging to * @param id.id ID of the sector that should be deleted */ async deleteSector(id: SectorId): Promise<void> { await this.client.delete( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/sector/${id.id}` ) } /** * Create a timeslot on an event. * @param id.id ID of the event the timeslot should belong to * @param id.organizerId Name of the organizer whom the event belongs to * @param timeslot The timeslot that should be created * @param timeslot.ticketConfig IDs of the ticket configs that should be applied to the timeslot */ async createTimeslot( id: OrganizerSpecificId, timeslot: CreateTimeslot ): Promise<Timeslot> { const res = await this.client.post( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/timeslot`, timeslot ) return res.data.data } /** * Update a timeslot on an event. * @param id.eventId ID of the event which the timeslot belongs to * @param id.organizerId Name of the organizer the event is belonging to * @param id.id ID of the timeslot that should be updated * @param timeslot.ticketConfig IDs of the ticket configs that should be applied to the timeslot */ async updateTimeslot( id: TimeslotId, timeslot: UpdateTimeslot ): Promise<Timeslot> { const res = await this.client.patch( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/timeslot/${id.id}`, timeslot ) return res.data.data } /** * Get a timeslot on an event * @param id.eventId ID of the event which the timeslot belongs to * @param id.organizerId Name of the organizer the event is belonging to * @param id.id ID of the timeslot that should be fetched * @param query Allows fetching the associated ticket configs with the timeslot */ async getTimeslot( id: TimeslotId, query: SingleTimeslotQuery = {} ): Promise<Timeslot> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${ id.eventId }/timeslot/${id.id}?${getStringifiedQuery(query)}` ) return res.data.data } /** * Delete a timeslot from an event * @param id.eventId ID of the event which the timeslot belongs to * @param id.organizerId Name of the organizer the event is belonging to * @param id.id ID of the timeslot that should be deleted */ async deleteTimeslot(id: TimeslotId): Promise<void> { await this.client.delete( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/timeslot/${id.id}` ) } /** * List timeslots on an event * @param id.id ID of the event the timeslot should belong to * @param id.organizerId Name of the organizer whom the event belongs to * @param query.with Allows fetching the associated ticket configs with the timeslots */ async listTimeslots( id: OrganizerSpecificId, query: ListTimeslotsQuery = {} ): Promise<ListInfo<Timeslot>> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${ id.id }/timeslot?${getStringifiedQuery(query)}` ) return res.data } /** * List all emails in all states for an event. * @param id.id ID of the event the emails should belong to * @param id.organizerId Name of the organizer whom the event belongs to * @param query.with Allows fetching the associated ticket configs for the information email filter */ async listInformationEmails( id: OrganizerSpecificId, query: ListInformationEmailQuery = {} ): Promise<ListInfo<InformationEmail>> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${ id.id }/information_email?${getStringifiedQuery(query)}` ) return res.data } /** * Get one information email. * @param id.id ID of the event the emails should belong to * @param id.organizerId Name of the organizer whom the event belongs to * @param emailId ID of the information email that should be fetched */ async getInformationEmail( id: InformationEmailId, query: SingleInformationEmailQuery = {} ): Promise<InformationEmail> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${ id.eventId }/information_email/${id.id}?${getStringifiedQuery(query)}` ) return res.data.data } /** * Saves an information email. * @param id.id ID of the event the emails should belong to * @param id.organizerId Name of the organizer whom the event belongs to * @param informationEmail Information email data that should be saved */ async saveInformationEmail( id: OrganizerSpecificId, informationEmail: CreateInformationEmail ): Promise<InformationEmail> { const res = await this.client.post( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/information_email`, informationEmail ) return res.data.data } /** * Update an information email. * @param id.eventId ID of the event the emails should belong to * @param id.organizerId Name of the organizer whom the event belongs to * @param id.id ID of the information email that should be updated * @param informationEmail Information email data that should be updated */ async updateInformationEmail( id: InformationEmailId, informationEmail: UpdateInformationEmail ): Promise<InformationEmail> { const res = await this.client.patch( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/information_email/${id.id}`, informationEmail ) return res.data.data } /** * Send an information email to all recipients. * @param id.eventId ID of the event the emails should belong to * @param id.organizerId Name of the organizer whom the event belongs to * @param id.id ID of the information email that should be sent */ async sendInformationEmail(id: InformationEmailId) { await this.client.post( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/information_email/${id.id}/send` ) } /** * Delete an information email. * @param id.eventId ID of the event the emails should belong to * @param id.organizerId Name of the organizer whom the event belongs to * @param id.id ID of the information email that should be sent */ async deleteInformationEmail(id: InformationEmailId) { await this.client.delete( `event/${this.version}/organizer/${id.organizerId}/event/${id.eventId}/information_email/${id.id}` ) } /** * List ticket formats * @returns Array of ticket formats */ async listTicketFormats(): Promise<ListInfo<TicketFormat>> { const res = await this.client.get(`event/${this.version}/ticket_format`) return res.data } /** * Fetch ticket format * @param id.id ID of the ticket format * @returns ticket format */ async getTicketFormat(id: IdParam): Promise<TicketFormat> { const res = await this.client.get( `event/${this.version}/ticket_format/${id.id}` ) return res.data.data } /** * List event categories * @returns Array of categories */ async listEventCategories( req: ListCategoryQuery = {} ): Promise<ListInfo<Category>> { const query = queryString.stringify( { ...req, with: !req.with ? undefined : buildQuery(req.with), }, { arrayFormat: 'comma', skipNull: true, skipEmptyString: true } ) const res = await this.client.get(`event/${this.version}/category?${query}`) return res.data } /** * Returns a per-ticket-config array of enrollment IDs for ticket holders * * @param id Org ID and event ID of the tickets * @returns Public key for signature validation */ async getHolderList(id: OrganizerSpecificId): Promise<EventHolderList> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/event/${id.id}/holders` ) return res.data.data } /** * Returns all questionnaires for given organizer * * @param id.id Organizer ID */ async listOrganizerQuestionnaires( id: StringIdParam, query: ListQuestionnaireQuery = {} ): Promise<ListInfo<Questionnaire>> { const res = await this.client.get( `event/${this.version}/organizer/${ id.id }/questionnaire?${getStringifiedQuery(query)}` ) return res.data } /** * Creates new questionnaire * * @param id.id Organizer ID * @param questionnaireData Data based on which new questionnaire is created */ async createQuestionnaire( id: StringIdParam, questionnaireData: CreateQuestionnaire ): Promise<Questionnaire> { const res = await this.client.post( `event/${this.version}/organizer/${id.id}/questionnaire`, questionnaireData ) return res.data.data } /** * Fetches queried questionnaire * * @param id.id Questionnaire ID * @param id.organizerId Organizer ID */ async getOrganizerQuestionnaire( id: OrganizerSpecificId, query: QuestionnaireQuery = {} ): Promise<Questionnaire> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/questionnaire/${ id.id }?${getStringifiedQuery(query)}` ) return res.data.data } /** * Updates existing questionnaire * * @param id.id Questionnaire ID * @param id.organizerId Organizer ID * @param questionnaireData Data based on which questionnaire is updated */ async updateQuestionnaire( id: OrganizerSpecificId, questionnaireData: UpdateQuestionnaire ): Promise<Questionnaire> { const res = await this.client.patch( `event/${this.version}/organizer/${id.organizerId}/questionnaire/${id.id}`, questionnaireData ) return res.data.data } /** * Deletes questionnaire with specified ID * * @param id.id Questionnaire ID * @param id.organizerId Organizer ID */ async deleteQuestionnaire(id: OrganizerSpecificId) { await this.client.delete( `event/${this.version}/organizer/${id.organizerId}/questionnaire/${id.id}` ) } /** * Fetches queried questionnaire * * @param id.id Questionnaire ID */ async getQuestionnaire( id: StringIdParam, query: QuestionnaireQuery = {} ): Promise<Questionnaire> { const res = await this.client.get( `event/${this.version}/questionnaire/${id.id}?${getStringifiedQuery( query )}` ) return res.data.data } /** * Returns all questions for given organizer * * @param id.id Organizer ID */ async listOrganizerQuestions( id: StringIdParam, query: ListQuestionQuery = {} ): Promise<ListInfo<Question>> { const res = await this.client.get( `event/${this.version}/organizer/${id.id}/question?${getStringifiedQuery( query )}` ) return res.data } /** * Creates new question * * @param id.id Organizer ID * @param questionData Data based on which new question is created */ async createQuestion( id: StringIdParam, questionData: CreateQuestion ): Promise<Question> { const res = await this.client.post( `event/${this.version}/organizer/${id.id}/question`, questionData ) return res.data.data } /** * Fetches queried question * * @param id.id Question ID * @param id.organizerId Organizer ID */ async getQuestion(id: OrganizerSpecificId): Promise<Question> { const res = await this.client.get( `event/${this.version}/organizer/${id.organizerId}/question/${id.id}` ) return res.data.data } /** * Deletes question with specified ID * * @param id.id Question ID * @param id.organizerId Organizer ID */ async deleteQuestion(id: OrganizerSpecificId) { await this.client.delete( `event/${this.version}/organizer/${id.organizerId}/question/${id.id}` ) } /** * Sends tickets to users with provided emails * * @param ticketsData Data based on which the tickets are sent */ async sendTickets(ticketsData: SendTicketsData): Promise<SendTicketsResponse> { const res = await this.client.post(`event/${this.version}/ticket/send-group`, ticketsData); return res.data.data; } }