Initial commit

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
2026-05-11 15:55:14 -04:00
commit 290ff0bc1e
41 changed files with 7998 additions and 0 deletions
+84
View File
@@ -0,0 +1,84 @@
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');