@goteborgco/open-api-js-client
Version:
Official JavaScript client for the Göteborg & Co GraphQL API
199 lines (198 loc) • 4.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Places = 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");
/**
* Places API for accessing place content
*
* This class provides type-safe methods for querying and retrieving place content
* from the GraphQL API.
*/
class Places {
constructor(client) {
this.client = client;
this.defaultPlaceFields = `
id
title
excerpt
content
date
modified
link
categories
areas
tags
link
category_heading
featuredmedia {
id
credit
caption
alt_text
media_type
mime_type
sizes {
medium {
width
height
source_url
}
full {
width
height
source_url
}
}
}
gallery {
id
credit
caption
sizes {
full {
width
height
source_url
}
}
}
contact {
email
phone
website
facebook
instagram
}
location {
address
lat
lng
zoom
place_id
name
street_number
street_name
state
post_code
country
country_short
}
currentInTime {
months
weekdays
}
translations {
en
sv
}
`;
this.defaultMarkersFields = `
type
features {
type
geometry {
type
coordinates
}
properties {
id
name
icon
type
slug
}
}
`;
}
/**
* List places with optional filtering
*
* @param filter Optional filtering options
* @param fields Optional GraphQL fields to return
* @returns Array of place entities and optional markers
*/
async list(filter, fields) {
const defaultFields = `
places {
${this.defaultPlaceFields}
}
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(', ');
const query = (0, gql_1.gql) `
query ListPlaces {
places(${filterArgs ? `filter: { ${filterArgs} }` : ''}) {
${fields || defaultFields}
}
}
`;
const response = await this.client.execute(query);
return {
places: response.places.places.map(place => new WpEntity_1.WpEntity(place)),
markers: response.places.markers ? new Markers_1.Markers(response.places.markers) : undefined
};
}
/**
* Get a specific place by ID
*
* @param id The place ID
* @param lang Language code ('en' or 'sv')
* @param fields Optional GraphQL fields to return
* @returns Place entity with associated events, related content, and markers
*/
async getById(id, lang, fields) {
const defaultFields = `
place {
${this.defaultPlaceFields}
}
events {
${this.defaultPlaceFields}
}
related {
events {
${this.defaultPlaceFields}
}
guides {
${this.defaultPlaceFields}
}
places {
${this.defaultPlaceFields}
}
}
markers {
${this.defaultMarkersFields}
}
`;
const query = (0, gql_1.gql) `
query GetPlaceById {
placeById(filter: { id: ${id}, lang: ${lang} }) {
${fields || defaultFields}
}
}
`;
const response = await this.client.execute(query);
return {
place: new WpEntity_1.WpEntity(response.placeById.place),
events: response.placeById.events?.map(event => new WpEntity_1.WpEntity(event)) || [],
related: response.placeById.related ? new Related_1.Related(response.placeById.related) : undefined,
markers: response.placeById.markers ? new Markers_1.Markers(response.placeById.markers) : undefined
};
}
}
exports.Places = Places;