feat : remove legacy feature
CI / Verify (push) Successful in 1m21s
CI / Build immutable images and deploy (push) Successful in 4m32s

This commit is contained in:
2026-09-10 19:45:06 +07:00 Unverified
parent cc0757d0a0
commit 249af29e9b
56 changed files with 5491 additions and 9393 deletions
+10 -32
View File
@@ -1,29 +1,18 @@
# Buzz Sheet
Buzz Sheet is a Thai-first guide CMS for turning structured character, build,
team, rotation, and comparison data into responsive game-guide pages. Authors
work in a visual block editor; visitors get readable guides rather than a
spreadsheet interface.
team, rotation, and comparison data into responsive game-guide pages.
Production target: `https://guide.sudloh.com`
## Included capabilities
- Searchable character directory with element and role filters.
- Unlimited character pages with custom slugs, ordering, notes, and visibility.
- Visual admin workspace with inline editing, inspector, preview, keyboard and
pointer reordering, 750 ms autosave, conflict recovery, and revisions.
- Six reusable templates covering classic guides, rotations, one-page builds,
multi-role builds, team databases, and calculation-backed comparisons.
- Validated block schemas with migrations and a safe fallback for unknown
future block types.
- Restricted decimal formula engine with named references, dependency ordering,
cycle detection, typed failures, and presentation-only rounding.
- Read-only comparison charts with visible values and accessible table fallbacks.
- Searchable character guide directory.
- Structured editors for overview, weapons, artifacts, constellations, teams,
and custom sections with autosave and conflict recovery.
- Better Auth email/password login with administrator-managed accounts.
- Private S3-compatible media uploads with reference-aware same-origin delivery.
- PostgreSQL transactions, immutable data-source versions, revisions, and a
retryable outbox.
- PostgreSQL transactions and a retryable outbox.
- Shared Redis cache invalidation and privacy-safe Server-Sent Events across
replicas.
- Discord-triggered Lunaris catalog updates with exact-version synchronization.
@@ -75,13 +64,9 @@ Prepare the database and start the application:
```bash
bun run db:migrate
bun run db:seed
bun run dev
```
The seed command installs the six starter built-in templates; it does not publish
reference workbook content.
### Fixture-only demo
The UI can be inspected without PostgreSQL, Redis, S3, or authentication
@@ -106,16 +91,14 @@ and external services. Never enable it in a deployed environment.
| `bun run build` | Compile the production application |
| `bun run db:generate` | Generate a Drizzle migration from schema changes |
| `bun run db:migrate` | Apply committed Drizzle migrations |
| `bun run db:seed` | Upsert the built-in templates |
| `bun run import:guides` | Preview the one-time Google Sheets guide migration (`-- --apply` to write) |
| `bun run worker:discord` | Listen for Lunaris update announcements |
| `bun run worker:outbox` | Process cache and event outbox records |
## Runtime design
Accepted edits use an `expectedVersion` and commit content, immutable data-source
versions, revision snapshots, media references, and outbox records in one
PostgreSQL transaction. The outbox worker then invalidates affected Redis tags
Accepted edits use an `expectedVersion` and commit guide content, media reference
counts, and outbox records in one PostgreSQL transaction. The outbox worker then invalidates affected Redis tags
before publishing an opaque `{ type, id, version }` event. Connected clients
refetch authoritative state; SSE never contains page content and is not the
source of truth.
@@ -128,18 +111,13 @@ Worker and sync results are sent to `DISCORD_LOG_CHANNEL_ID`. Enable the Discord
Message Content intent and grant the bot View Channel and Send Messages in the
configured channels.
Public snapshots use a shared Redis-backed Next.js cache. Admin routes remain
Public guides use a shared Redis-backed Next.js cache. Admin routes remain
dynamic. SSE streams send a 90-second heartbeat and close after 30 minutes so
clients reconnect. Traefik buffering is disabled by the response headers.
Media objects remain private in S3. `/media/[id]` serves an object publicly only
while a visible current snapshot references it; otherwise administrator
authorization is required. Retained revisions keep their referenced objects
alive.
Formula fields accept arithmetic only: `+`, `-`, `*`, `/`, parentheses,
percentages, unary signs, and stable field references. They cannot execute HTML,
JavaScript, React, CSS, external scripts, packages, or network calls.
while a published guide references it; otherwise administrator authorization is
required.
## Verification