187 lines
6.3 KiB
TypeScript
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'
|
|
}
|
|
});
|
|
};
|