Commit Graph
32 Commits
Author SHA1 Message Date
robot e2356954ef feat(seo): Phase 3 — preload LCP image and reduce APP_INITIALIZER blocking
CI Pipeline / backend-test (push) Successful in 10m9s
CI Pipeline / frontend-build (push) Successful in 30s
CI Pipeline / backend-lint (push) Successful in 9s
CI Pipeline / frontend-test (push) Successful in 30s
CI Pipeline / backend-test (pull_request) Successful in 10m30s
CI Pipeline / frontend-test (pull_request) Successful in 25s
CI Pipeline / frontend-build (pull_request) Successful in 41s
CI Pipeline / backend-lint (pull_request) Successful in 9s
CI Pipeline / quality-gate (push) Successful in 3s
CI Pipeline / quality-gate (pull_request) Successful in 3s
- Add <link rel="preload"> for hero background image (LCP element) in index.html
- Remove blocking APP_INITIALIZER for config.json and station config loading
- Config loads now fire asynchronously in App.ngOnInit() (browser only)
- SSR/prerender renders instantly with default config — no network wait
- Improves LCP, Time to First Byte, and initial paint for SEO
2026-08-06 21:29:30 +00:00
Hermes Agent e95a158d57 fix(ssr): apply theme CSS vars during SSR and enable client hydration
CI Pipeline / backend-test (push) Successful in 9m4s
CI Pipeline / frontend-test (push) Successful in 24s
CI Pipeline / frontend-build (push) Successful in 32s
CI Pipeline / backend-lint (push) Successful in 14s
CI Pipeline / backend-test (pull_request) Successful in 9m17s
CI Pipeline / frontend-test (pull_request) Successful in 24s
CI Pipeline / frontend-build (pull_request) Successful in 30s
CI Pipeline / backend-lint (pull_request) Successful in 10s
CI Pipeline / quality-gate (push) Successful in 2s
CI Pipeline / quality-gate (pull_request) Successful in 2s
- ThemeService: remove isPlatformBrowser guard so CSS custom properties
  are applied during SSR/prerender — server-rendered HTML now carries the
  correct color scheme and gradients (fixes missing colors on test site).

- main.ts: add provideClientHydration() so Angular preserves the server-
  rendered DOM on the client instead of destroying and rebuilding it
  (fixes jarring full-page reload between static and dynamic versions).

- Tests: update theme.service.spec.ts to match new behaviour, expand
  coverage with gradient tests and empty-value handling (9 tests).
  Fix structured-data.component.spec.ts import paths. All 54 tests pass.
2026-08-06 03:24:57 +00:00
robot 0bde1cfc75 fix(tests): load JIT compiler before router imports in seo.service.spec
CI Pipeline / backend-test (push) Successful in 14m20s
CI Pipeline / frontend-test (push) Failing after 14s
CI Pipeline / frontend-build (push) Failing after 10s
CI Pipeline / backend-lint (push) Successful in 10s
CI Pipeline / backend-test (pull_request) Successful in 11m56s
CI Pipeline / frontend-test (pull_request) Failing after 22s
CI Pipeline / frontend-build (pull_request) Failing after 19s
CI Pipeline / quality-gate (pull_request) Successful in 3s
CI Pipeline / backend-lint (pull_request) Successful in 11s
CI Pipeline / quality-gate (push) Successful in 3s
The PlatformLocation static initializer in @angular/common/router
requires @angular/compiler to be loaded first. Move the compiler
import before any Angular router/common imports so the JIT facade
is available when the module loads.
2026-08-05 21:24:52 +00:00
robot a783626f34 feat: add SSR and prerendering support
CI Pipeline / backend-test (push) Successful in 10m24s
CI Pipeline / frontend-test (push) Failing after 19s
CI Pipeline / frontend-build (push) Failing after 23s
CI Pipeline / backend-lint (push) Successful in 12s
CI Pipeline / backend-test (pull_request) Successful in 10m45s
CI Pipeline / frontend-test (pull_request) Failing after 20s
CI Pipeline / frontend-build (pull_request) Failing after 12s
CI Pipeline / backend-lint (pull_request) Successful in 13s
CI Pipeline / quality-gate (push) Successful in 3s
CI Pipeline / quality-gate (pull_request) Successful in 3s
- Install @angular/ssr and @angular/platform-server (v21.2.x)
- Create server entry point (server.ts) and server bootstrap (main.server.ts)
- Add server routes config (app.server.routes.ts) with 5 prerendered routes:
  /, /about, /schedule, /events, /contact
- Update angular.json with server/ssr/prerender build configuration
- Add prerender-routes.txt for build-time static route generation
- Fix SSR compatibility:
  - App component: guard DOM access with isPlatformBrowser
  - StructuredDataComponent: skip head manipulation on server
  - ThemeService: skip CSS variable application on server
  - ShowService/EventService: return empty arrays on API failure
    (graceful fallback during prerender with no backend)
- Prerendered output verified: 5 static HTML routes in dist/
2026-08-05 20:22:43 +00:00
robot c61162bff4 fix(seo): use bracket notation for Record index signature properties (TS4111)
CI Pipeline / backend-test (push) Successful in 5m10s
CI Pipeline / frontend-test (push) Successful in 27s
CI Pipeline / quality-gate (push) Successful in 1s
CI Pipeline / quality-gate (pull_request) Successful in 2s
CI Pipeline / frontend-build (push) Successful in 29s
CI Pipeline / backend-lint (push) Successful in 8s
CI Pipeline / backend-test (pull_request) Successful in 5m11s
CI Pipeline / frontend-test (pull_request) Successful in 28s
CI Pipeline / frontend-build (pull_request) Successful in 30s
CI Pipeline / backend-lint (pull_request) Successful in 8s
2026-08-05 10:32:04 +00:00
robot 58267e8f59 feat(seo): Phase 2 — route-level metadata service and JSON-LD structured data
CI Pipeline / backend-test (push) Successful in 5m16s
CI Pipeline / backend-test (pull_request) Successful in 5m5s
CI Pipeline / frontend-test (pull_request) Successful in 27s
CI Pipeline / frontend-build (pull_request) Failing after 29s
CI Pipeline / backend-lint (pull_request) Successful in 8s
CI Pipeline / quality-gate (push) Successful in 2s
CI Pipeline / frontend-test (push) Successful in 28s
CI Pipeline / frontend-build (push) Failing after 29s
CI Pipeline / backend-lint (push) Successful in 8s
CI Pipeline / quality-gate (pull_request) Successful in 2s
Add SeoService for dynamic metadata management:
- Per-route document titles (e.g., 'KMountain Flower Radio — About')
- Meta descriptions from station config per route
- Canonical URLs, Open Graph tags, Twitter Card tags
- Input sanitization (HTML stripping, URL validation, attribute escaping)
- noindex robots directives for /login and /admin routes
- Centralized router watcher (zero per-component boilerplate)

Add StructuredDataService + StructuredDataComponent for JSON-LD:
- Organization schema (NCBOrganization) site-wide with contact info
- WebSite schema with publisher info
- WebPage schema per-route with breadcrumbs
- Dynamic Event schema on /events page
- RadioSeason schema on /schedule page

Wire up SeoService.watchRouter() in app-root ngOnInit.
Wire up StructuredDataComponent in app-root template.
Wire up EventsComponent and ScheduleComponent to feed data to
StructuredDataService for dynamic schema injection.

Includes full test suite for SeoService (22 tests).
2026-08-05 10:12:55 +00:00
Hermes Agent e3a742b708 fix(seo): add RouterLinkWithHref imports + default social media fields
CI Pipeline / backend-test (push) Successful in 4m24s
CI Pipeline / backend-lint (pull_request) Successful in 8s
CI Pipeline / quality-gate (pull_request) Successful in 2s
CI Pipeline / frontend-test (push) Successful in 28s
CI Pipeline / frontend-build (push) Successful in 29s
CI Pipeline / backend-lint (push) Successful in 9s
CI Pipeline / backend-test (pull_request) Successful in 4m19s
CI Pipeline / frontend-test (pull_request) Successful in 27s
CI Pipeline / frontend-build (pull_request) Successful in 30s
CI Pipeline / quality-gate (push) Successful in 2s
- Import RouterLinkWithHref in footer and events components (required for queryParams binding on <a>)
- Add social media fields to DEFAULT_CONFIG in station-config.service.ts
2026-08-04 10:32:47 +00:00
Hermes Agent f29640eb47 Add admin user management API and frontend UI
CI Pipeline / backend-test (pull_request) Failing after 22s
CI Pipeline / frontend-test (pull_request) Successful in 31s
CI Pipeline / backend-lint (pull_request) Successful in 9s
CI Pipeline / quality-gate (pull_request) Successful in 2s
Backend:
- /api/admin/users: GET list, POST create, PUT update, DELETE
- Admin users can be added with email, display name, and password
- Self-deletion and last-admin deletion are blocked
- Admin role auto-assigned on creation

Frontend:
- AdminUsersTabComponent: list + add/delete admin users
- AdminUserService: HTTP client for admin user CRUD
- AdminUser interface
- 'Admins' tab added to admin dashboard

Tests:
- 10 new tests for admin user management endpoints
- 140 total tests pass (130 original + 10 new)
2026-07-30 07:41:23 +00:00
kfj001 39b3e633a6 Fixes security issue: potential remote Path Traversal via File Upload 2026-07-19 05:55:58 +00:00
kfj001 a4093e86b1 fixes generated image download 2026-07-08 23:18:07 -07:00
kfj001 2c66a802c0 incorporates and implements mobile build service functionality. 2026-07-08 15:02:22 -07:00
Your Name 8cd54459ec Adds website theme serialization system 2026-07-06 06:52:18 +00:00
kfj001 7a04fa7c84 sets default admin creds in docker compose. first pass remote builder feature 2026-07-04 18:40:29 +00:00
kfj001 d2ab2240d5 transforms landing, about and schedule page content to data driven 2026-07-01 03:24:30 +00:00
kfj001 f62f8188bf additional colors under admin control 2026-06-29 22:31:37 +00:00
kfj001 ee79662e5d adds color themeing support to the site 2026-06-29 21:23:51 +00:00
kfj001 77d1c04d86 Adds visitor dashboard and related features 2026-06-28 06:41:23 +00:00
kfj001 bce9f8663d Pro firefox enhancements 2026-06-26 06:23:38 +00:00
kfj001 4bb21f70ed new app store links feature 2026-06-25 08:24:45 +00:00
kfj001 d9b0964f07 new media player functionality 2026-06-25 06:09:28 +00:00
kfj001 2295f841c9 Adds Underwriter's carousel and admin features 2026-06-23 06:50:08 +00:00
kfj001 9b95bef9c6 Retires Support/donation/tiers page in favor of simple configurable link 2026-06-23 00:30:47 +00:00
kfj001 3b61a131c1 database driven image uploader and storage service model 2026-06-22 19:29:06 +00:00
kfj001 9049b066ba Remove Programs tab and all supporting code
The Programs feature is superseded by Shows, which provides a more
flexible model with schedule slots. This commit removes all Programs
code across frontend and backend:

Frontend:
- Delete admin-program-form component (ts/html/scss)
- Delete program.service.ts and program.ts interface
- Remove Programs tab, form modal, and all CRUD logic from admin
  component (ts + html)

Backend:
- Delete programs API router
- Remove Program ORM model and ProgramCreate/Update/Response schemas
- Remove programs router registration from main.py
- Remove Program from seed data, seed helpers, and truncate/reset
2026-06-22 05:42:43 +00:00
kfj001 eb9a00f21a Adds the new shows admin screen and drives schedule from it 2026-06-22 04:19:51 +00:00
kfj001 e627fe3637 New programming screen 2026-06-21 21:55:55 +00:00
kfj001 1b537b3dfd data driven about us screen 2026-06-21 05:24:40 +00:00
kfj001 f52625b37b working basic site admin 2026-06-21 02:56:49 +00:00
kfj001 e335e257a2 feat: add bootstrap admin auth docs and fix config loading
- Document bootstrap admin login via KMTN_ADMIN_USERNAME/PASSWORD
  env vars, including setup guide, curl examples, and config table
  entries across docker-compose and bare-metal deployment sections
- Add KMTN_JWT_SECRET_KEY to all deployment config examples and
  production checklist
- Fix docker-entrypoint.sh: remove unused API_UPSTREAM variable from
  config.json envsubst (only API_PUBLIC_URL is needed)
- Fix app-config.service: default apiBaseUrl now reads from Angular
  environment instead of empty string, and config.json path drops
  leading ./ for cleaner resolution
2026-06-20 07:18:47 +00:00
kfj001 f133d11123 working test deploy config 2026-06-19 22:55:00 -07:00
kfj001 266c2451f1 Admin mode. Data driven content sections. Bugfixes. 2026-06-19 17:36:35 +00:00
kfj001 e5fef8b181 working 3 tier approach 2026-06-11 22:34:55 -07:00