Files
OSIT-AE-App-Svelte/src/routes/manifest.webmanifest/+server.ts
2026-03-24 12:18:27 -04:00

187 lines
6.3 KiB
TypeScript

import { json } from '@sveltejs/kit';
import { api } from '$lib/api/api';
import * as public_env from '$env/static/public';
import type { RequestHandler } from './$types';
/**
* Modern Dynamic Web Manifest Generator
* Reference: https://web.dev/articles/add-manifest
*/
export const GET: RequestHandler = async ({ url, fetch }) => {
const fqdn = url.host;
const protocol = public_env.PUBLIC_AE_API_PROTOCOL || 'https';
const server = public_env.PUBLIC_AE_API_SERVER || 'api.oneskyit.com';
const port = public_env.PUBLIC_AE_API_PORT || '443';
const path = public_env.PUBLIC_AE_API_PATH || '';
const api_base_url = `${protocol}://${server}${port === '443' || port === '80' ? '' : ':' + port}${path}`;
const api_cfg = {
base_url: api_base_url,
headers: {
// Bootstrap key: limited-permission key for unauthenticated domain lookups (least privilege)
'x-aether-api-key': public_env.PUBLIC_AE_BOOTSTRAP_KEY,
'x-no-account-id': public_env.PUBLIC_AE_NO_ACCOUNT_ID
},
fetch
};
let site_domain = null;
try {
// Use structured filter for exact matching
const search_query = {
and: [{ field: 'fqdn', op: 'eq', value: fqdn }]
};
const result_li = await api.search_ae_obj({
api_cfg,
obj_type: 'site_domain',
search_query,
view: 'base',
limit: 1,
log_lvl: 0
});
if (result_li && result_li.length > 0) {
site_domain = result_li[0];
}
} catch (e) {
console.error(`PWA Manifest: Lookup failed for domain ${fqdn}`);
}
// Default branding
const branding_name =
site_domain?.account_name || site_domain?.name || 'Aether';
const name = `One Sky IT - ${branding_name} Aether PWA`;
const short_name = `${site_domain?.account_code || site_domain?.code || 'Aether'} PWA`;
const background_color =
site_domain?.cfg_json?.pwa_background_color || 'hsl(220, 65%, 31%)';
const theme_color = '#3a5997';
const manifest = {
id: `ae-pwa-${fqdn}`, // Unique ID for this installation
name: name,
short_name: short_name,
description: `The ${name} platform for unified event and documentation management.`,
start_url: '/',
scope: '/',
display: 'fullscreen',
background_color: background_color,
theme_color: theme_color,
orientation: 'any',
categories: ['business', 'productivity', 'utilities'],
icons: [
// Standard Icons (Small/Med)
{
sizes: '24x24',
src: 'https://static.oneskyit.com/images/OSIT_logo_2022_24px.png',
type: 'image/png'
},
{
sizes: '48x48',
src: 'https://static.oneskyit.com/images/OSIT_logo_2022_48px.png',
type: 'image/png'
},
{
sizes: '96x96',
src: 'https://static.oneskyit.com/images/OSIT_logo_2022_96px.png',
type: 'image/png'
},
{
sizes: '144x144',
src: 'https://static.oneskyit.com/images/OSIT_logo_2022_144px.png',
type: 'image/png'
},
{
sizes: '180x180',
src: 'https://static.oneskyit.com/images/OSIT_logo_2022_180px.png',
type: 'image/png'
},
// High-res Maskable Icons (WebP preferred for efficiency)
{
sizes: '192x192',
src: 'https://static.oneskyit.com/images/OSIT_logo_2022_192px.webp',
type: 'image/webp',
purpose: 'any maskable'
},
{
sizes: '192x192',
src: 'https://static.oneskyit.com/images/OSIT_logo_2022_192px.png',
type: 'image/png',
purpose: 'any maskable'
},
{
sizes: '512x512',
src: 'https://static.oneskyit.com/images/OSIT_logo_2022_512px.webp',
type: 'image/webp',
purpose: 'any maskable'
},
{
sizes: '512x512',
src: 'https://static.oneskyit.com/images/OSIT_logo_2022_512px.png',
type: 'image/png',
purpose: 'any maskable'
},
{
sizes: '1024x1024',
src: 'https://static.oneskyit.com/images/OSIT_logo_2022_1024px.webp',
type: 'image/webp',
purpose: 'any maskable'
},
{
sizes: '1024x1024',
src: 'https://static.oneskyit.com/images/OSIT_logo_2022_1024px.png',
type: 'image/png',
purpose: 'any maskable'
}
],
// App Shortcuts (Long-press icon features)
shortcuts: [
{
name: 'Journals',
short_name: 'Journals',
description: 'View and manage journal entries',
url: '/journals',
icons: [
{
src: 'https://static.oneskyit.com/images/OSIT_logo_2022_192px.png',
sizes: '192x192'
}
]
},
{
name: 'Events',
short_name: 'Events',
description: 'Access active event management',
url: '/events',
icons: [
{
src: 'https://static.oneskyit.com/images/OSIT_logo_2022_192px.png',
sizes: '192x192'
}
]
},
{
name: 'Testing',
short_name: 'Testing',
description: 'System diagnostic dashboard',
url: '/testing',
icons: [
{
src: 'https://static.oneskyit.com/images/OSIT_logo_2022_192px.png',
sizes: '192x192'
}
]
}
],
testing: 'One Sky IT'
};
return json(manifest, {
headers: {
'Content-Type': 'application/manifest+json',
'Cache-Control': 'public, max-age=3600'
}
});
};