From 78b9ff896fac27dfe55aeba27c610c586571ada3 Mon Sep 17 00:00:00 2001 From: Richard Ward Date: Tue, 30 Dec 2025 21:27:49 +0000 Subject: [PATCH] config: yaml,shared,dbal (2 files) --- .../api/schema/entities/packages/irc.yaml | 249 +++++++++++++++ .../schema/entities/packages/streaming.yaml | 291 ++++++++++++++++++ 2 files changed, 540 insertions(+) create mode 100644 dbal/shared/api/schema/entities/packages/irc.yaml create mode 100644 dbal/shared/api/schema/entities/packages/streaming.yaml diff --git a/dbal/shared/api/schema/entities/packages/irc.yaml b/dbal/shared/api/schema/entities/packages/irc.yaml new file mode 100644 index 000000000..e83ecfb40 --- /dev/null +++ b/dbal/shared/api/schema/entities/packages/irc.yaml @@ -0,0 +1,249 @@ +entity: IRCChannel +version: "1.0" +description: "IRC-style chat channel" +package: irc_webchat + +fields: + id: + type: cuid + primary: true + generated: true + description: "Unique channel identifier" + + tenantId: + type: uuid + required: true + index: true + description: "Tenant this channel belongs to" + + name: + type: string + required: true + max_length: 50 + pattern: "^#[a-zA-Z0-9_-]+$" + description: "Channel name (e.g., #general)" + + topic: + type: string + nullable: true + max_length: 500 + description: "Channel topic" + + description: + type: string + nullable: true + description: "Channel description" + + mode: + type: enum + required: true + values: [public, private, secret] + default: public + description: "Channel visibility mode" + + password: + type: string + nullable: true + description: "Password for private channels" + + maxUsers: + type: integer + nullable: true + description: "Maximum users limit" + + slowMode: + type: integer + nullable: true + description: "Seconds between messages" + + isDefault: + type: boolean + default: false + index: true + description: "Whether users auto-join this channel" + + createdAt: + type: bigint + required: true + description: "Creation timestamp" + + createdBy: + type: uuid + nullable: true + description: "Creator user ID" + +indexes: + - fields: [tenantId, name] + unique: true + name: tenant_name + +acl: + create: + moderator: true + read: + user: true + update: + moderator: true + delete: + admin: true + +--- + +entity: IRCMessage +version: "1.0" +description: "IRC chat message" +package: irc_webchat + +fields: + id: + type: cuid + primary: true + generated: true + description: "Unique message identifier" + + tenantId: + type: uuid + required: true + description: "Tenant this message belongs to" + + channelId: + type: cuid + required: true + index: true + description: "Channel this message belongs to" + + userId: + type: uuid + required: true + index: true + description: "User who sent the message" + + username: + type: string + required: true + description: "Username at time of message" + + type: + type: enum + required: true + values: [message, action, notice, system, join, part, kick, ban] + default: message + description: "Message type" + + content: + type: string + required: true + description: "Message content" + + isCommand: + type: boolean + default: false + description: "Whether message was a command" + + metadata: + type: json + nullable: true + description: "Additional data (mentions, links, etc.)" + + createdAt: + type: bigint + required: true + index: true + description: "Message timestamp" + +indexes: + - fields: [channelId, createdAt] + name: channel_time + +acl: + create: + user: true + read: + user: true + update: + supergod: true + delete: + moderator: true + +--- + +entity: IRCMembership +version: "1.0" +description: "User membership in an IRC channel" +package: irc_webchat + +fields: + id: + type: cuid + primary: true + generated: true + description: "Unique membership identifier" + + channelId: + type: cuid + required: true + index: true + description: "Channel ID" + + userId: + type: uuid + required: true + index: true + description: "User ID" + + username: + type: string + required: true + description: "Username" + + role: + type: enum + required: true + values: [user, voice, halfop, op, admin, owner] + default: user + description: "User role in channel" + + joinedAt: + type: bigint + required: true + description: "Join timestamp" + + lastActive: + type: bigint + nullable: true + description: "Last activity timestamp" + + isBanned: + type: boolean + default: false + description: "Whether user is banned" + + isKicked: + type: boolean + default: false + description: "Whether user was kicked" + + kickReason: + type: string + nullable: true + description: "Reason for kick" + + metadata: + type: json + nullable: true + description: "User preferences in channel" + +indexes: + - fields: [channelId, userId] + unique: true + name: channel_user + +acl: + create: + user: true + read: + user: true + update: + moderator: true + delete: + moderator: true diff --git a/dbal/shared/api/schema/entities/packages/streaming.yaml b/dbal/shared/api/schema/entities/packages/streaming.yaml new file mode 100644 index 000000000..2d22fe5e8 --- /dev/null +++ b/dbal/shared/api/schema/entities/packages/streaming.yaml @@ -0,0 +1,291 @@ +entity: StreamChannel +version: "1.0" +description: "Live streaming channel" +package: stream_cast + +fields: + id: + type: cuid + primary: true + generated: true + description: "Unique stream channel identifier" + + tenantId: + type: uuid + required: true + index: true + description: "Tenant this channel belongs to" + + name: + type: string + required: true + max_length: 100 + description: "Channel name" + + slug: + type: string + required: true + pattern: "^[a-z0-9-]+$" + description: "URL-friendly slug" + + description: + type: string + nullable: true + description: "Channel description" + + thumbnail: + type: string + nullable: true + description: "Thumbnail image path" + + category: + type: string + nullable: true + index: true + description: "Content category" + + status: + type: enum + required: true + values: [offline, live, scheduled] + default: offline + index: true + description: "Current stream status" + + viewerCount: + type: integer + default: 0 + description: "Current viewer count" + + streamKey: + type: string + nullable: true + unique: true + description: "Secret stream key" + + rtmpUrl: + type: string + nullable: true + description: "RTMP ingest URL" + + hlsUrl: + type: string + nullable: true + description: "HLS playback URL" + + chatEnabled: + type: boolean + default: true + description: "Whether chat is enabled" + + isPublic: + type: boolean + default: true + description: "Whether channel is publicly visible" + + isMature: + type: boolean + default: false + description: "Whether content is mature" + + metadata: + type: json + nullable: true + description: "Additional data (bitrate, resolution, etc.)" + + createdAt: + type: bigint + required: true + description: "Creation timestamp" + + updatedAt: + type: bigint + nullable: true + description: "Last update timestamp" + + createdBy: + type: uuid + required: true + description: "Channel owner" + +indexes: + - fields: [tenantId, slug] + unique: true + name: tenant_slug + - fields: [status, viewerCount] + name: live_popular + +acl: + create: + user: true + read: + public: true + update: + self: true + row_level: "createdBy = $user.id" + admin: true + delete: + self: true + row_level: "createdBy = $user.id" + admin: true + +--- + +entity: StreamSchedule +version: "1.0" +description: "Scheduled stream event" +package: stream_cast + +fields: + id: + type: cuid + primary: true + generated: true + description: "Unique schedule identifier" + + channelId: + type: cuid + required: true + index: true + description: "Parent channel" + + title: + type: string + required: true + max_length: 200 + description: "Stream title" + + description: + type: string + nullable: true + description: "Stream description" + + startTime: + type: bigint + required: true + index: true + description: "Scheduled start timestamp" + + endTime: + type: bigint + nullable: true + description: "Expected end timestamp" + + duration: + type: integer + nullable: true + description: "Expected duration in minutes" + + isRecurring: + type: boolean + default: false + description: "Whether schedule repeats" + + recurrence: + type: json + nullable: true + description: "Recurrence rule (cron/rrule)" + + notifyAt: + type: bigint + nullable: true + description: "Notification timestamp" + + metadata: + type: json + nullable: true + description: "Additional data (guests, topics, etc.)" + + createdAt: + type: bigint + required: true + description: "Creation timestamp" + +indexes: + - fields: [channelId, startTime] + name: channel_time + +acl: + create: + user: true + read: + public: true + update: + self: true + admin: true + delete: + self: true + admin: true + +--- + +entity: StreamScene +version: "1.0" +description: "Stream scene/layout configuration" +package: stream_cast + +fields: + id: + type: cuid + primary: true + generated: true + description: "Unique scene identifier" + + channelId: + type: cuid + required: true + index: true + description: "Parent channel" + + name: + type: string + required: true + max_length: 100 + description: "Scene name" + + layout: + type: json + required: true + description: "Scene layout composition" + + sources: + type: json + required: true + description: "Media sources (cameras, screens, overlays)" + + transitions: + type: json + nullable: true + description: "Scene transitions" + + isActive: + type: boolean + default: false + index: true + description: "Whether scene is currently active" + + sortOrder: + type: integer + default: 0 + description: "Display order" + + createdAt: + type: bigint + required: true + description: "Creation timestamp" + +indexes: + - fields: [channelId, isActive] + name: channel_active + +acl: + create: + user: true + read: + user: true + update: + self: true + admin: true + delete: + self: true + admin: true