89866e8f

By: Michael Lynch <git@mtlynch.io>

Add owner photo uploads

Owners can upload a JPEG from a new /upload page. The photo is sanitized
(metadata stripped via re-encode), resized, and thumbnailed, then stored to the
configured media backend, and the owner is redirected to its media page.

This adds the shared foundation for owner-only actions:
- ReadUserByID, AuthService.UserID, and the currentUser helper
- requireOwner middleware and an owner-only /upload subrouter
- pageData.IsOwner, threaded through every page, plus a navbar Upload button

Animated GIF and video uploads are not yet supported and are rejected with a
clear message; they arrive in later slices.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

Suite timing

Time to Start Worker time Duration Time to finish
Config 1s 6s 6s 8s
Eval 7s 2m05s 2m05s 2m13s
Build 25s 10m32s 6m07s 6m33s
Test - - - -
Deploy - - - -
Suite 1s 12m44s 6m31s 6m33s

Timeline

0s1m2m3m4m6m