290ff0bc1e
Co-authored-by: Copilot <copilot@github.com>
85 lines
2.4 KiB
TypeScript
85 lines
2.4 KiB
TypeScript
import {
|
|
fallbackContacts,
|
|
fallbackDocuments,
|
|
fallbackEvents,
|
|
fallbackFuelPrices,
|
|
fallbackNews,
|
|
fallbackNotices,
|
|
type ContactItem,
|
|
type DocumentItem,
|
|
type EventItem,
|
|
type FuelPrice,
|
|
type NewsItem,
|
|
type Notice,
|
|
} from './fallback-data';
|
|
|
|
type CollectionName = 'news' | 'events' | 'notices' | 'fuel_prices' | 'documents' | 'contacts';
|
|
|
|
const defaultSortByCollection: Partial<Record<CollectionName, string>> = {
|
|
news: '-publish_date',
|
|
events: '-start_datetime',
|
|
notices: '-priority',
|
|
fuel_prices: '-last_updated',
|
|
documents: '-uploaded_at',
|
|
contacts: 'order',
|
|
};
|
|
|
|
declare const process: {
|
|
env: Record<string, string | undefined>;
|
|
};
|
|
|
|
const directusUrl = process.env.DIRECTUS_URL ?? 'http://directus:8055';
|
|
const directusToken = process.env.DIRECTUS_ADMIN_TOKEN;
|
|
|
|
async function readCollection<T>(collection: CollectionName): Promise<T[]> {
|
|
const endpoint = new URL(`/items/${collection}`, directusUrl);
|
|
endpoint.searchParams.set('limit', '100');
|
|
const sort = defaultSortByCollection[collection];
|
|
if (sort) {
|
|
endpoint.searchParams.set('sort', sort);
|
|
}
|
|
|
|
try {
|
|
const headers: Record<string, string> = {};
|
|
if (directusToken) {
|
|
headers['Authorization'] = `Bearer ${directusToken}`;
|
|
}
|
|
|
|
const response = await fetch(endpoint, {
|
|
headers: Object.keys(headers).length > 0 ? headers : undefined,
|
|
});
|
|
if (!response.ok) {
|
|
throw new Error(`Directus responded with ${response.status}`);
|
|
}
|
|
|
|
const payload = (await response.json()) as { data?: T[] };
|
|
return payload.data ?? [];
|
|
} catch {
|
|
return fallbackFor(collection) as T[];
|
|
}
|
|
}
|
|
|
|
function fallbackFor(collection: CollectionName) {
|
|
switch (collection) {
|
|
case 'news':
|
|
return fallbackNews;
|
|
case 'events':
|
|
return fallbackEvents;
|
|
case 'notices':
|
|
return fallbackNotices;
|
|
case 'fuel_prices':
|
|
return fallbackFuelPrices;
|
|
case 'documents':
|
|
return fallbackDocuments;
|
|
case 'contacts':
|
|
return fallbackContacts;
|
|
}
|
|
}
|
|
|
|
export const getNews = () => readCollection<NewsItem>('news');
|
|
export const getEvents = () => readCollection<EventItem>('events');
|
|
export const getNotices = () => readCollection<Notice>('notices');
|
|
export const getFuelPrices = () => readCollection<FuelPrice>('fuel_prices');
|
|
export const getDocuments = () => readCollection<DocumentItem>('documents');
|
|
export const getContacts = () => readCollection<ContactItem>('contacts');
|