source: Klonkt/src/routes/og.js@ 03583f6

main
Last change on this file since 03583f6 was 3b4095f, checked in by roboburr <roboburr@…>, 2 months ago

feat(seo): og:image light/dark override setting

The auto-generated share card followed the site's default theme (1.2.0); Admin →
SEO now has an explicit override: Auto (follow site theme) / Light / Dark.

  • src/config/database.js — sites.og_theme column (NULL = auto).
  • src/services/OgImageService.js — og_theme wins over theme_override when set.
  • src/routes/og.js — select og_theme for the card route.
  • src/routes/admin-seo.js — save og_theme (validated to light/dark, else auto).
  • src/views/pages/admin-seo.ejs — select under the share-image field.
  • src/services/i18n.js — aseo.og_theme* (nl/en/de).
  • CHANGELOG(.nl/.de).md — under Added.

Closes prutfolio-src-krm.

Co-Authored-By: Claude <noreply@…>

  • Property mode set to 100644
File size: 982 bytes
Line 
1/**
2 * GET /og/:slug.png — themed Open Graph card for a site (1200x630 PNG).
3 * Generated from the site's palette + accent (see OgImageService), cached.
4 * Used as the default og:image so every site has a branded social preview.
5 */
6import express from 'express';
7import db from '../config/database.js';
8import { ogImageFor } from '../services/OgImageService.js';
9
10const router = express.Router();
11
12router.get('/:slug.png', (req, res) => {
13 let site;
14 try {
15 site = db.prepare(
16 'SELECT slug, title, tagline, description, palette, accent, theme_override, og_theme FROM sites WHERE slug = ?'
17 ).get(req.params.slug);
18 } catch { /* db error → 404 below */ }
19 if (!site) return res.status(404).end();
20
21 const png = ogImageFor(site);
22 if (!png) return res.status(404).end(); // resvg unavailable → no card (graceful)
23
24 res.set('Content-Type', 'image/png');
25 res.set('Cache-Control', 'public, max-age=86400');
26 return res.send(png);
27});
28
29export default router;
Note: See TracBrowser for help on using the repository browser.