@goteborgco/open-api-js-client
Version:
Official JavaScript client for the Göteborg & Co GraphQL API
189 lines (188 loc) • 4.78 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Events = void 0;
const WpEntity_1 = require("../entities/WpEntity");
const Related_1 = require("../entities/Related");
const Markers_1 = require("../entities/Markers");
const gql_1 = require("../utils/gql");
/**
* Events API for accessing event content
*
* This class provides type-safe methods for querying and retrieving event content
* from the GraphQL API.
*/
class Events {
constructor(client) {
this.client = client;
this.defaultEventFields = `
areas
categories
category_heading
classification
contact {
email
facebook
instagram
phone
website
}
currentInTime {
months
weekdays
}
date
dates {
end
start
}
excerpt
featuredmedia {
alt_text
caption
credit
id
media_type
mime_type
sizes {
full {
height
source_url
width
}
}
}
free
id
invisible_tags
lang
link
place_id
tags
title
link
translations {
en
sv
}
type
`;
this.defaultMarkersFields = `
features {
type
geometry {
type
coordinates
}
properties {
id
name
icon
type
slug
}
}
type
`;
}
/**
* List events with optional filtering and sorting
*
* @param filter Optional filtering options
* @param sortBy Optional sorting options
* @param fields Optional GraphQL fields to return
* @returns Array of event entities and markers
*/
async list(filter, sortBy, fields) {
const defaultFields = `
events {
${this.defaultEventFields}
}
markers {
${this.defaultMarkersFields}
}
`;
// Convert filter object to GraphQL arguments format
const filterArgs = Object.entries(filter)
.map(([key, value]) => {
if (Array.isArray(value)) {
return `${key}: [${value.join(', ')}]`;
}
if (typeof value === 'string') {
return `${key}: "${value}"`;
}
return `${key}: ${value}`;
})
.join(', ');
// Convert sortBy object to GraphQL arguments format if provided
const sortArgs = sortBy ? Object.entries(sortBy)
.map(([key, value]) => {
if (key === 'orders') {
// Handle orders as enum values
if (Array.isArray(value)) {
return `${key}: [${value.join(', ')}]`;
}
return `${key}: ${value}`;
}
if (Array.isArray(value)) {
return `${key}: [${value.map(v => `"${v}"`).join(', ')}]`;
}
return `${key}: "${value}"`;
})
.join(', ') : '';
const query = (0, gql_1.gql) `
query ListEvents {
events(${filterArgs ? `filter: { ${filterArgs} }` : ''}${sortArgs ? `, sortBy: { ${sortArgs} }` : ''}) {
${fields || defaultFields}
}
}
`;
const response = await this.client.execute(query);
return {
events: response.events.events.map(event => new WpEntity_1.WpEntity(event)),
markers: response.events.markers ? new Markers_1.Markers(response.events.markers) : undefined
};
}
/**
* Get a specific event by ID
*
* @param id The event ID
* @param lang Language code ('en' or 'sv')
* @param fields Optional GraphQL fields to return
* @returns Event entity with related content and markers
*/
async getById(id, lang, fields) {
const defaultFields = `
event {
${this.defaultEventFields}
}
related {
events {
${this.defaultEventFields}
}
guides {
${this.defaultEventFields}
}
places {
${this.defaultEventFields}
}
}
markers {
${this.defaultMarkersFields}
}
`;
const query = (0, gql_1.gql) `
query GetEventById {
eventById(filter: { id: ${id}, lang: ${lang} }) {
${fields || defaultFields}
}
}
`;
const response = await this.client.execute(query);
return {
event: new WpEntity_1.WpEntity(response.eventById.event),
related: response.eventById.related ? new Related_1.Related(response.eventById.related) : undefined,
markers: response.eventById.markers ? new Markers_1.Markers(response.eventById.markers) : undefined
};
}
}
exports.Events = Events;