{ "name": "BrewPage HTML Page Structure", "description": "Logical structure for a BrewPage hosted HTML/Markdown page and how each field is sourced.", "entity": "HTMLPage", "fields": [ {"name": "id", "type": "string", "required": true, "source": "Server-issued 10-char identifier on POST /api/html"}, {"name": "namespace", "type": "string", "required": true, "source": "Query param `ns` (defaults to `public`)"}, {"name": "link", "type": "uri", "required": true, "source": "Composed by server: https://brewpage.app/{ns}/{id}"}, {"name": "ownerLink", "type": "uri", "source": "Owner-only API URL returned at creation"}, {"name": "ownerToken", "type": "string", "required": true, "source": "Issued at creation; required for PUT/DELETE via X-Owner-Token"}, {"name": "filename", "type": "string", "source": "Body field at creation; immutable on update"}, {"name": "format", "type": "enum", "values": ["html", "markdown", "md"], "source": "Query param `format` (defaults to html)"}, {"name": "tags", "type": "array", "source": "Query param `tags` (CSV); immutable on update"}, {"name": "ttlDays", "type": "integer", "source": "Query param `ttl` (1..30, default 15)"}, {"name": "passwordProtected", "type": "boolean", "source": "Derived: true when X-Password set at creation"}, {"name": "showTopBar", "type": "boolean", "source": "Body field; overrides global default; immutable on update"}, {"name": "createdAt", "type": "datetime", "source": "Server timestamp on POST"}, {"name": "expiresAt", "type": "datetime", "source": "createdAt + ttlDays"}, {"name": "views", "type": "integer", "source": "Incremented on each GET /{ns}/{id}"} ], "relationships": [ {"name": "shortLink", "type": "hasOne", "target": "ShortLink"}, {"name": "previewImage", "type": "hasOne", "target": "PreviewImage", "source": "Generated by GET /preview/{ns}/{id}.png"}, {"name": "reports", "type": "hasMany", "target": "AbuseReport"} ] }