Documentation
¶
Overview ¶
Package internal implements the workflow-plugin-cms plugin — the CMS engine used by gocodealone-multisite to serve multi-tenant content sites from a single workflow app.
Module types provided:
- cms.tenant_resolver — Host → tenant_id middleware (V1, V2)
- cms.static_serve_before_dynamic — static-wins routing (V3)
- cms.engine — page CRUD + render + dynamic-section substitution + theme resolver
- analytics.injection — per-tenant Google Analytics injection (delegated to workflow-plugin-analytics when present; V25)
Step types provided:
- step.cms_render_page — render a CMS page for the resolved tenant
- step.cms_bundle_activate — atomic-swap a fetched bundle into place
All of the above are stub-implemented in this initial commit. The full implementations follow per SPEC.md §T tasks T3-T28.
Index ¶
Constants ¶
This section is empty.
Variables ¶
var Version = "0.0.0"
Version is set at build time via -ldflags.
Functions ¶
func WithTenant ¶
func WithTenant(ctx context.Context, info TenantInfo) context.Context
WithTenant returns a context carrying the resolved tenant.
Types ¶
type AdminAPI ¶
type AdminAPI struct {
ReloadFunc func() error
PreviewBase string
// contains filtered or unexported fields
}
AdminAPI is the HTTP surface for the multisite admin.
Per SPEC §I/T16: tenant CRUD, domain CRUD, page CRUD. Routes are mounted by the host at /api/v1/admin/* (see gocodealone-multisite app.yaml). The host wraps every endpoint with auth + authz middleware; this layer assumes the request is already authenticated.
Tenant scope for page endpoints comes from the URL path (/api/v1/admin/tenants/:id/pages...) — V12 isolation is enforced by passing tenantID as the first arg after ctx into every store call.
ReloadFunc is optional; when set, POST /api/v1/admin/reload invokes it to flush in-memory caches (tenant resolver, page renderer). See SPEC T31.
PreviewBase is the FQDN suffix for auto-provisioned preview subdomains. When non-empty, CreateTenant also creates a `<slug>.<preview_base>` domain row (V18 / T32). Empty disables auto-provision.
func NewAdminAPI ¶
func NewAdminAPI(tenants store.TenantAdminStore, pages store.PageStore) *AdminAPI
NewAdminAPI returns a handler using the given stores. Either store may be the in-memory implementation (default) or a postgres-backed production impl.
type CMSPlugin ¶
type CMSPlugin struct{}
CMSPlugin implements sdk.PluginProvider.
func (*CMSPlugin) CreateModule ¶
func (p *CMSPlugin) CreateModule(typeName, name string, config map[string]any) (sdk.ModuleInstance, error)
CreateModule creates a module instance of the given type.
func (*CMSPlugin) Manifest ¶
func (p *CMSPlugin) Manifest() sdk.PluginManifest
Manifest returns plugin metadata.
func (*CMSPlugin) ModuleTypes ¶
ModuleTypes returns the module types this plugin provides.
type TenantInfo ¶
type TenantInfo struct {
TenantID int64
TenantSlug string
SubsiteLabel string // empty if no subsite scope
Kind string // "vanity" | "preview" | "subdomain"
}
TenantInfo is the resolved tenant + optional subsite for a request.
func TenantFromContext ¶
func TenantFromContext(ctx context.Context) (TenantInfo, bool)
TenantFromContext returns the tenant resolved upstream, or ok=false if none was set (request would not have reached this point through the normal flow).
type TenantStore ¶
type TenantStore interface {
// Lookup returns the tenant for an exact domain match. ok=false on miss.
Lookup(ctx context.Context, host string) (TenantInfo, bool)
// LookupBySlug resolves a preview subdomain pattern (<slug>.<base>).
LookupBySlug(ctx context.Context, slug string) (TenantInfo, bool)
}
TenantStore looks up tenants by domain. Host wires the production postgres-backed implementation at boot.