Files
2026-03-09 22:30:41 +00:00

357 lines
8.0 KiB
JSON

[
{
"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": "string",
"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"
}
],
"relations": {
"creator": {
"type": "belongs-to",
"entity": "User",
"foreign_key": "createdBy",
"nullable": true,
"on_delete": "set_null",
"description": "User who created this channel"
},
"messages": {
"type": "has-many",
"entity": "IRCMessage",
"foreign_key": "channelId",
"cascade_delete": true,
"description": "Messages posted in this channel"
},
"members": {
"type": "has-many",
"entity": "IRCMembership",
"foreign_key": "channelId",
"cascade_delete": true,
"description": "Users who are members of this channel"
}
},
"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": "string",
"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"
}
],
"relations": {
"channel": {
"type": "belongs-to",
"entity": "IRCChannel",
"foreign_key": "channelId",
"on_delete": "cascade",
"description": "Channel this message was posted in"
},
"author": {
"type": "belongs-to",
"entity": "User",
"foreign_key": "userId",
"on_delete": "restrict",
"description": "User who sent this message"
}
},
"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"
}
],
"relations": {
"channel": {
"type": "belongs-to",
"entity": "IRCChannel",
"foreign_key": "channelId",
"on_delete": "cascade",
"description": "Channel the user is a member of"
},
"user": {
"type": "belongs-to",
"entity": "User",
"foreign_key": "userId",
"on_delete": "cascade",
"description": "User who is a member of the channel"
}
},
"acl": {
"create": {
"user": true
},
"read": {
"user": true
},
"update": {
"moderator": true
},
"delete": {
"moderator": true
}
}
}
]