Files
Primora/apps/backend/internal/database/db/models.go
T
Tomas DvorakandDevin 9e9a3d5f98 feat: phase 7 automation & realtime — scheduled jobs, domain events, SSE
Scheduled jobs (migration 00009): cron expressions + @every descriptors,
in-process scheduler (15s scan, missed-run collapse), signed HTTP POST
delivery (X-Primora-Signature), AES-256-GCM sealed secrets returned once,
run history with status/duration/http-code, manual execution, retention
pruning. Viewer reads, admin/developer writes.

Domain events: publishEvent fans document/object/issue/deploy/job
mutations to realtime subscribers and matching webhooks through one
path. Webhook event filter extended to job.run, document.*, object.*.

Realtime: GET /projects/:id/realtime/stream SSE with 25s keepalives and
?token=/?api_key= auth for EventSource clients.

Automation dashboard page: Schedules tab (CRUD, run history, manual run,
secret-once banner) + Live events tab (live badge, pause/clear). Demo
mode parity. primora jobs:* CLI group, six primora_*_job* MCP tools,
AutomationService in the generated client.

Fixes folded in: gzip middleware buffered SSE flushes (broke EventSource
on both streams — */stream now bypasses compression); event payloads
double-marshaled json.RawMessage as base64; compose hardcoded localhost
trusted origins so non-default ports broke sign-in; frontend auth base
URL baked an absolute localhost instead of resolving /auth on origin.

Verified live: stack up on :8085, signed delivery HMAC-checked at sink,
@every 30s schedule firing, run history rendering, document.created
landing in the live events feed.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 15:15:01 +02:00

375 lines
13 KiB
Go

// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.29.0
package db
import (
"database/sql/driver"
"fmt"
"github.com/google/uuid"
"github.com/jackc/pgx/v5/pgtype"
)
type CoreBucketVisibility string
const (
CoreBucketVisibilityPrivate CoreBucketVisibility = "private"
CoreBucketVisibilityPublic CoreBucketVisibility = "public"
)
func (e *CoreBucketVisibility) Scan(src interface{}) error {
switch s := src.(type) {
case []byte:
*e = CoreBucketVisibility(s)
case string:
*e = CoreBucketVisibility(s)
default:
return fmt.Errorf("unsupported scan type for CoreBucketVisibility: %T", src)
}
return nil
}
type NullCoreBucketVisibility struct {
CoreBucketVisibility CoreBucketVisibility `json:"core_bucket_visibility"`
Valid bool `json:"valid"` // Valid is true if CoreBucketVisibility is not NULL
}
// Scan implements the Scanner interface.
func (ns *NullCoreBucketVisibility) Scan(value interface{}) error {
if value == nil {
ns.CoreBucketVisibility, ns.Valid = "", false
return nil
}
ns.Valid = true
return ns.CoreBucketVisibility.Scan(value)
}
// Value implements the driver Valuer interface.
func (ns NullCoreBucketVisibility) Value() (driver.Value, error) {
if !ns.Valid {
return nil, nil
}
return string(ns.CoreBucketVisibility), nil
}
type CoreOrgRole string
const (
CoreOrgRoleOwner CoreOrgRole = "owner"
CoreOrgRoleAdmin CoreOrgRole = "admin"
CoreOrgRoleMember CoreOrgRole = "member"
)
func (e *CoreOrgRole) Scan(src interface{}) error {
switch s := src.(type) {
case []byte:
*e = CoreOrgRole(s)
case string:
*e = CoreOrgRole(s)
default:
return fmt.Errorf("unsupported scan type for CoreOrgRole: %T", src)
}
return nil
}
type NullCoreOrgRole struct {
CoreOrgRole CoreOrgRole `json:"core_org_role"`
Valid bool `json:"valid"` // Valid is true if CoreOrgRole is not NULL
}
// Scan implements the Scanner interface.
func (ns *NullCoreOrgRole) Scan(value interface{}) error {
if value == nil {
ns.CoreOrgRole, ns.Valid = "", false
return nil
}
ns.Valid = true
return ns.CoreOrgRole.Scan(value)
}
// Value implements the driver Valuer interface.
func (ns NullCoreOrgRole) Value() (driver.Value, error) {
if !ns.Valid {
return nil, nil
}
return string(ns.CoreOrgRole), nil
}
type CoreProjectRole string
const (
CoreProjectRoleAdmin CoreProjectRole = "admin"
CoreProjectRoleDeveloper CoreProjectRole = "developer"
CoreProjectRoleViewer CoreProjectRole = "viewer"
)
func (e *CoreProjectRole) Scan(src interface{}) error {
switch s := src.(type) {
case []byte:
*e = CoreProjectRole(s)
case string:
*e = CoreProjectRole(s)
default:
return fmt.Errorf("unsupported scan type for CoreProjectRole: %T", src)
}
return nil
}
type NullCoreProjectRole struct {
CoreProjectRole CoreProjectRole `json:"core_project_role"`
Valid bool `json:"valid"` // Valid is true if CoreProjectRole is not NULL
}
// Scan implements the Scanner interface.
func (ns *NullCoreProjectRole) Scan(value interface{}) error {
if value == nil {
ns.CoreProjectRole, ns.Valid = "", false
return nil
}
ns.Valid = true
return ns.CoreProjectRole.Scan(value)
}
// Value implements the driver Valuer interface.
func (ns NullCoreProjectRole) Value() (driver.Value, error) {
if !ns.Valid {
return nil, nil
}
return string(ns.CoreProjectRole), nil
}
type CoreApiKey struct {
ID uuid.UUID `json:"id"`
ProjectID uuid.UUID `json:"project_id"`
Name string `json:"name"`
Prefix string `json:"prefix"`
SecretHash []byte `json:"secret_hash"`
CreatedByUserID pgtype.UUID `json:"created_by_user_id"`
LastUsedAt pgtype.Timestamptz `json:"last_used_at"`
RevokedAt pgtype.Timestamptz `json:"revoked_at"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
Scopes []string `json:"scopes"`
}
type CoreAuditLog struct {
ID uuid.UUID `json:"id"`
OrganizationID pgtype.UUID `json:"organization_id"`
ProjectID pgtype.UUID `json:"project_id"`
ActorUserID pgtype.UUID `json:"actor_user_id"`
ActorApiKeyID pgtype.UUID `json:"actor_api_key_id"`
Action string `json:"action"`
ResourceType string `json:"resource_type"`
ResourceID string `json:"resource_id"`
Metadata []byte `json:"metadata"`
RequestID string `json:"request_id"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
}
type CoreBucket struct {
ID uuid.UUID `json:"id"`
ProjectID uuid.UUID `json:"project_id"`
Slug string `json:"slug"`
Name string `json:"name"`
Visibility string `json:"visibility"`
CreatedByUserID pgtype.UUID `json:"created_by_user_id"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
}
type CoreBucketObject struct {
ID uuid.UUID `json:"id"`
BucketID uuid.UUID `json:"bucket_id"`
ObjectKey string `json:"object_key"`
ContentType string `json:"content_type"`
SizeBytes int64 `json:"size_bytes"`
ChecksumSha256 string `json:"checksum_sha256"`
StoragePath string `json:"storage_path"`
UploadedByUserID pgtype.UUID `json:"uploaded_by_user_id"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
}
type CoreCollection struct {
ID uuid.UUID `json:"id"`
ProjectID uuid.UUID `json:"project_id"`
Slug string `json:"slug"`
Name string `json:"name"`
Description *string `json:"description"`
Schema []byte `json:"schema"`
CreatedByUserID pgtype.UUID `json:"created_by_user_id"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
}
type CoreComponent struct {
ID uuid.UUID `json:"id"`
ProjectID uuid.UUID `json:"project_id"`
Name string `json:"name"`
Kind string `json:"kind"`
Meta []byte `json:"meta"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
}
type CoreDbConnection struct {
ID uuid.UUID `json:"id"`
ProjectID uuid.UUID `json:"project_id"`
Name string `json:"name"`
DbType string `json:"db_type"`
Config []byte `json:"config"`
IsManaged bool `json:"is_managed"`
CreatedByUserID pgtype.UUID `json:"created_by_user_id"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
}
type CoreDocument struct {
ID uuid.UUID `json:"id"`
CollectionID uuid.UUID `json:"collection_id"`
Data []byte `json:"data"`
CreatedByUserID pgtype.UUID `json:"created_by_user_id"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
}
type CoreEvent struct {
ID int64 `json:"id"`
ProjectID uuid.UUID `json:"project_id"`
ComponentID pgtype.UUID `json:"component_id"`
Type string `json:"type"`
Severity string `json:"severity"`
Message string `json:"message"`
Payload []byte `json:"payload"`
Fingerprint string `json:"fingerprint"`
Ts pgtype.Timestamptz `json:"ts"`
}
type CoreIntegration struct {
ID uuid.UUID `json:"id"`
ProjectID uuid.UUID `json:"project_id"`
Type string `json:"type"`
Name string `json:"name"`
BaseUrl string `json:"base_url"`
Config []byte `json:"config"`
Credentials []byte `json:"credentials"`
Status string `json:"status"`
LastHealthAt pgtype.Timestamptz `json:"last_health_at"`
CreatedByUserID pgtype.UUID `json:"created_by_user_id"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
}
type CoreOrganization struct {
ID uuid.UUID `json:"id"`
Slug string `json:"slug"`
Name string `json:"name"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
}
type CoreOrganizationMember struct {
ID uuid.UUID `json:"id"`
OrganizationID uuid.UUID `json:"organization_id"`
UserID uuid.UUID `json:"user_id"`
Role string `json:"role"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
}
type CoreProject struct {
ID uuid.UUID `json:"id"`
OrganizationID uuid.UUID `json:"organization_id"`
Slug string `json:"slug"`
Name string `json:"name"`
Description *string `json:"description"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
RetentionEventsDays int32 `json:"retention_events_days"`
RetentionAuditDays int32 `json:"retention_audit_days"`
RetentionWebhookDays int32 `json:"retention_webhook_days"`
}
type CoreProjectInvitation struct {
ID uuid.UUID `json:"id"`
OrganizationID uuid.UUID `json:"organization_id"`
ProjectID pgtype.UUID `json:"project_id"`
Email string `json:"email"`
OrgRole string `json:"org_role"`
ProjectRole NullCoreProjectRole `json:"project_role"`
TokenHash string `json:"token_hash"`
ExpiresAt pgtype.Timestamptz `json:"expires_at"`
AcceptedAt pgtype.Timestamptz `json:"accepted_at"`
InvitedByUserID pgtype.UUID `json:"invited_by_user_id"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
}
type CoreProjectMember struct {
ID uuid.UUID `json:"id"`
ProjectID uuid.UUID `json:"project_id"`
UserID uuid.UUID `json:"user_id"`
Role string `json:"role"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
}
type CoreScheduledJob struct {
ID uuid.UUID `json:"id"`
ProjectID uuid.UUID `json:"project_id"`
Name string `json:"name"`
Schedule string `json:"schedule"`
Url string `json:"url"`
Secret []byte `json:"secret"`
Payload []byte `json:"payload"`
Enabled bool `json:"enabled"`
LastRunAt pgtype.Timestamptz `json:"last_run_at"`
LastStatus string `json:"last_status"`
NextRunAt pgtype.Timestamptz `json:"next_run_at"`
CreatedByUserID pgtype.UUID `json:"created_by_user_id"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
}
type CoreScheduledJobRun struct {
ID uuid.UUID `json:"id"`
JobID uuid.UUID `json:"job_id"`
Status string `json:"status"`
TriggeredBy string `json:"triggered_by"`
StatusCode *int32 `json:"status_code"`
Error string `json:"error"`
DurationMs *int32 `json:"duration_ms"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
FinishedAt pgtype.Timestamptz `json:"finished_at"`
}
type CoreUser struct {
ID uuid.UUID `json:"id"`
AuthSubject string `json:"auth_subject"`
Email string `json:"email"`
Name string `json:"name"`
EmailVerified bool `json:"email_verified"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
LastSeenAt pgtype.Timestamptz `json:"last_seen_at"`
}
type CoreWebhook struct {
ID uuid.UUID `json:"id"`
ProjectID uuid.UUID `json:"project_id"`
Url string `json:"url"`
Secret []byte `json:"secret"`
Events []string `json:"events"`
Enabled bool `json:"enabled"`
CreatedByUserID pgtype.UUID `json:"created_by_user_id"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
}
type CoreWebhookDelivery struct {
ID uuid.UUID `json:"id"`
WebhookID uuid.UUID `json:"webhook_id"`
EventType string `json:"event_type"`
Payload []byte `json:"payload"`
Status string `json:"status"`
Attempts int32 `json:"attempts"`
LastStatusCode *int32 `json:"last_status_code"`
LastError string `json:"last_error"`
DeliveredAt pgtype.Timestamptz `json:"delivered_at"`
NextRetryAt pgtype.Timestamptz `json:"next_retry_at"`
CreatedAt pgtype.Timestamptz `json:"created_at"`
}