-- ------------------------------ -- OPTION -- ------------------------------ OPTION IMPORT; -- ------------------------------ -- FUNCTIONS -- ------------------------------ DEFINE FUNCTION fn::auth::credentials::validate($username: string, $password: string) -> option { LET $user = (SELECT id, passhash FROM User WHERE username = $username)[0]; IF $user { RETURN { authenticated: crypto::argon2::compare($user.passhash, $password), id: $user.id }; } ELSE { RETURN NONE }; } PERMISSIONS FULL; DEFINE FUNCTION fn::auth::sessiontoken::new($user: uuid) { LET $token = rand::string(64); CREATE SessionToken CONTENT { created: time::now(), expires: time::now() + 1w, id: rand::uuid::v4(), token: $token, user: Entity:user }; } PERMISSIONS FULL; DEFINE FUNCTION fn::auth::sessiontoken::validate($token: string) { LET $exists = (SELECT * FROM SessionToken WHERE token = $token)[0]; IF $exists = NONE { RETURN NONE; }; IF time::now() > $exists.expires { DELETE SessionToken:exists.id; RETURN NONE; }; RETURN $exists.user; } PERMISSIONS FULL; DEFINE FUNCTION fn::channel::new() {} PERMISSIONS FULL; DEFINE FUNCTION fn::friend::accept($from: uuid, $to: uuid) { IF (SELECT * FROM HasFriendRequest WHERE in = Entity:from AND out = Entity:to)[0] = NONE { RETURN NONE; } ELSE { DELETE HasFriendRequest WHERE in = Entity:from AND out = Entity:to; }; LET $fsid: uuid = rand::uuid::v4(); CREATE Friendship SET id = $fsid, channel_id = fn::channel::new(), since = time::now(); RELATE Entity:from -> HasFriendship -> Friendship:fsid CONTENT { nickname = Entity:from.displayname }; RELATE Entity:to -> HasFriendship -> Friendship:fsid CONTENT { nickname = Entity:to.displayname }; } PERMISSIONS FULL; DEFINE FUNCTION fn::friend::reject($from: uuid, $to: uuid) { DELETE Entity:from->FriendRequest WHERE out = Entity:to; } PERMISSIONS FULL; DEFINE FUNCTION fn::friend::remove($from: uuid, $to: uuid) { DELETE Entity:from->HasFriendship->Friendship WHERE <-HasFriendship.out = Entity:to; } PERMISSIONS FULL; DEFINE FUNCTION fn::friend::request($from: uuid, $to: uuid) { RELATE Entity:from -> HasFriendRequest -> Entity:to CONTENT { created = time::now() }; } PERMISSIONS FULL; DEFINE FUNCTION fn::icon::default() -> string { RETURN '/static/public/server_default.png'; } PERMISSIONS FULL; DEFINE FUNCTION fn::message::edit($user: uuid, $message: uuid, $content: string) { LET $id = (SELECT id FROM Entity:user->SentMessage->(Message WHERE id = $message)->HasContent->MessageStringContent)[0]; UPDATE MessageStringContent SET content = $content WHERE id = $id.id; UPDATE Message:message SET edited = true; } PERMISSIONS FULL; DEFINE FUNCTION fn::server::join($entity: uuid, $server: uuid) { LET $user = (SELECT displayname FROM Entity WHERE id = $entity); RELATE Entity:entity -> HasServer -> Server:server CONTENT { joined: time::now(), nickname: $user.displayname }; } PERMISSIONS FULL; DEFINE FUNCTION fn::server::leave($server: uuid, $entity: uuid) { DELETE HasServer WHERE out = Server:server AND in = Entity:entity; DELETE HasRole WHERE in = Entity:entity AND ->Role.server = Server:server; } PERMISSIONS FULL; DEFINE FUNCTION fn::server::new($name: string, $creator: uuid) { LET $id = rand::uuid::v4(); CREATE Server CONTENT { created: time::now(), icon_uri: fn::icon::default(), id: $id, name: $name, owner: $creator }; fn::server::join($id, $creator); } PERMISSIONS FULL; DEFINE FUNCTION fn::sessiontoken::new() -> string { LET $token = rand::string(64); CREATE SessionToken CONTENT { created: time::now(), expires: time::now() + 1w, id: rand::uuid::v4(), token: $token, user: Entity:user }; } PERMISSIONS FULL; -- ------------------------------ -- TABLE: AccessToken -- ------------------------------ DEFINE TABLE AccessToken TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD created ON AccessToken TYPE datetime PERMISSIONS FULL; DEFINE FIELD creator ON AccessToken TYPE record PERMISSIONS FULL; DEFINE FIELD expires ON AccessToken TYPE datetime PERMISSIONS FULL; DEFINE FIELD id ON AccessToken TYPE uuid PERMISSIONS FULL; DEFINE FIELD max_uses ON AccessToken TYPE option PERMISSIONS FULL; DEFINE FIELD token ON AccessToken TYPE string PERMISSIONS FULL; DEFINE FIELD uses ON AccessToken TYPE int PERMISSIONS FULL; -- ------------------------------ -- TABLE: Channel -- ------------------------------ DEFINE TABLE Channel TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD id ON Channel TYPE uuid PERMISSIONS FULL; -- ------------------------------ -- TABLE: DataPool -- ------------------------------ DEFINE TABLE DataPool TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD `value` ON DataPool TYPE string PERMISSIONS FULL; DEFINE FIELD id ON DataPool TYPE uuid PERMISSIONS FULL; DEFINE FIELD key ON DataPool TYPE string PERMISSIONS FULL; DEFINE FIELD owner ON DataPool TYPE record PERMISSIONS FULL; -- ------------------------------ -- TABLE: Entity -- ------------------------------ DEFINE TABLE Entity TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD deleted ON Entity TYPE bool VALUE false PERMISSIONS FULL; DEFINE FIELD displayname ON Entity TYPE string PERMISSIONS FULL; DEFINE FIELD id ON Entity TYPE uuid PERMISSIONS FULL; DEFINE FIELD joined ON Entity TYPE datetime PERMISSIONS FULL; DEFINE FIELD username ON Entity TYPE string PERMISSIONS FULL; -- ------------------------------ -- TABLE: Faction -- ------------------------------ DEFINE TABLE Faction TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD id ON Faction TYPE uuid PERMISSIONS FULL; DEFINE FIELD name ON Faction TYPE string PERMISSIONS FULL; DEFINE FIELD owner ON Faction TYPE record PERMISSIONS FULL; -- ------------------------------ -- TABLE: Friendship -- ------------------------------ DEFINE TABLE Friendship TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD dm_channel ON Friendship TYPE record PERMISSIONS FULL; DEFINE FIELD id ON Friendship TYPE uuid PERMISSIONS FULL; DEFINE FIELD since ON Friendship TYPE datetime PERMISSIONS FULL; -- ------------------------------ -- TABLE: GroupChat -- ------------------------------ DEFINE TABLE GroupChat TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD channel ON GroupChat TYPE record PERMISSIONS FULL; DEFINE FIELD icon_uri ON GroupChat TYPE string PERMISSIONS FULL; DEFINE FIELD name ON GroupChat TYPE string PERMISSIONS FULL; DEFINE FIELD owner ON GroupChat TYPE record PERMISSIONS FULL; -- ------------------------------ -- TABLE: HasChannel -- ------------------------------ DEFINE TABLE HasChannel TYPE RELATION IN Server OUT Channel SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD in ON HasChannel TYPE record PERMISSIONS FULL; DEFINE FIELD out ON HasChannel TYPE record PERMISSIONS FULL; -- ------------------------------ -- TABLE: HasContent -- ------------------------------ DEFINE TABLE HasContent TYPE RELATION IN Message OUT MessageStringContent SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD in ON HasContent TYPE record PERMISSIONS FULL; DEFINE FIELD out ON HasContent TYPE record PERMISSIONS FULL; -- ------------------------------ -- TABLE: HasDomain -- ------------------------------ DEFINE TABLE HasDomain TYPE RELATION IN DataPool OUT Server | GroupChat | Friendship SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD in ON HasDomain TYPE record PERMISSIONS FULL; DEFINE FIELD out ON HasDomain TYPE record PERMISSIONS FULL; -- ------------------------------ -- TABLE: HasFriendRequest -- ------------------------------ DEFINE TABLE HasFriendRequest TYPE RELATION IN Entity OUT Entity SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD created ON HasFriendRequest TYPE datetime PERMISSIONS FULL; DEFINE FIELD in ON HasFriendRequest TYPE record PERMISSIONS FULL; DEFINE FIELD out ON HasFriendRequest TYPE record PERMISSIONS FULL; -- ------------------------------ -- TABLE: HasFriendship -- ------------------------------ DEFINE TABLE HasFriendship TYPE RELATION IN Entity OUT Friendship SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD in ON HasFriendship TYPE record PERMISSIONS FULL; DEFINE FIELD nickname ON HasFriendship TYPE string PERMISSIONS FULL; DEFINE FIELD out ON HasFriendship TYPE record PERMISSIONS FULL; -- ------------------------------ -- TABLE: HasGroupChat -- ------------------------------ DEFINE TABLE HasGroupChat TYPE RELATION IN Entity OUT GroupChat SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD in ON HasGroupChat TYPE record PERMISSIONS FULL; DEFINE FIELD out ON HasGroupChat TYPE record PERMISSIONS FULL; -- ------------------------------ -- TABLE: HasPermission -- ------------------------------ DEFINE TABLE HasPermission TYPE RELATION IN HasServer | ServerRole OUT Permission SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD in ON HasPermission TYPE record PERMISSIONS FULL; DEFINE FIELD out ON HasPermission TYPE record PERMISSIONS FULL; -- ------------------------------ -- TABLE: HasRole -- ------------------------------ DEFINE TABLE HasRole TYPE RELATION IN Entity OUT ServerRole SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD in ON HasRole TYPE record PERMISSIONS FULL; DEFINE FIELD out ON HasRole TYPE record PERMISSIONS FULL; -- ------------------------------ -- TABLE: HasServer -- ------------------------------ DEFINE TABLE HasServer TYPE RELATION IN Entity OUT Server SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD in ON HasServer TYPE record PERMISSIONS FULL; DEFINE FIELD joined ON HasServer TYPE datetime PERMISSIONS FULL; DEFINE FIELD nickname ON HasServer TYPE string PERMISSIONS FULL; DEFINE FIELD out ON HasServer TYPE record PERMISSIONS FULL; -- ------------------------------ -- TABLE: HasTitle -- ------------------------------ DEFINE TABLE HasTitle TYPE RELATION IN Entity OUT Title SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD in ON HasTitle TYPE record PERMISSIONS FULL; DEFINE FIELD out ON HasTitle TYPE record PERMISSIONS FULL; -- ------------------------------ -- TABLE: Human -- ------------------------------ DEFINE TABLE Human TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD email ON Human TYPE string PERMISSIONS FULL; DEFINE FIELD entity ON Human TYPE record<Entity> PERMISSIONS FULL; DEFINE FIELD id ON Human TYPE uuid PERMISSIONS FULL; DEFINE FIELD passhash ON Human TYPE string PERMISSIONS FULL; -- ------------------------------ -- TABLE: Message -- ------------------------------ DEFINE TABLE Message TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD channel ON Message TYPE record<Channel> PERMISSIONS FULL; DEFINE FIELD edited ON Message TYPE bool PERMISSIONS FULL; DEFINE FIELD id ON Message TYPE uuid PERMISSIONS FULL; DEFINE FIELD reply_to ON Message TYPE option<record<Message>> PERMISSIONS FULL; DEFINE FIELD sent ON Message TYPE datetime PERMISSIONS FULL; -- ------------------------------ -- TABLE: MessageStringContent -- ------------------------------ DEFINE TABLE MessageStringContent TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD content ON MessageStringContent TYPE string PERMISSIONS FULL; DEFINE FIELD id ON MessageStringContent TYPE uuid PERMISSIONS FULL; -- ------------------------------ -- TABLE: Permission -- ------------------------------ DEFINE TABLE Permission TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD id ON Permission TYPE uuid PERMISSIONS FULL; DEFINE FIELD name ON Permission TYPE string PERMISSIONS FULL; DEFINE FIELD server ON Permission TYPE record<Server> PERMISSIONS FULL; -- ------------------------------ -- TABLE: Plugin -- ------------------------------ DEFINE TABLE Plugin TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD created ON Plugin TYPE datetime PERMISSIONS FULL; DEFINE FIELD id ON Plugin TYPE uuid PERMISSIONS FULL; DEFINE FIELD name ON Plugin TYPE string PERMISSIONS FULL; -- ------------------------------ -- TABLE: PluginEntity -- ------------------------------ DEFINE TABLE PluginEntity TYPE RELATION IN Plugin OUT Entity SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD in ON PluginEntity TYPE record<Plugin> PERMISSIONS FULL; DEFINE FIELD out ON PluginEntity TYPE record<Entity> PERMISSIONS FULL; -- ------------------------------ -- TABLE: SentMessage -- ------------------------------ DEFINE TABLE SentMessage TYPE RELATION IN Entity OUT Message SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD in ON SentMessage TYPE record<Entity> PERMISSIONS FULL; DEFINE FIELD out ON SentMessage TYPE record<Message> PERMISSIONS FULL; -- ------------------------------ -- TABLE: Server -- ------------------------------ DEFINE TABLE Server TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD created ON Server TYPE datetime PERMISSIONS FULL; DEFINE FIELD icon_uri ON Server TYPE string PERMISSIONS FULL; DEFINE FIELD id ON Server TYPE uuid PERMISSIONS FULL; DEFINE FIELD name ON Server TYPE string PERMISSIONS FULL; DEFINE FIELD owner ON Server TYPE record<Entity> PERMISSIONS FULL; -- ------------------------------ -- TABLE: ServerRole -- ------------------------------ DEFINE TABLE ServerRole TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD colour ON ServerRole TYPE string PERMISSIONS FULL; DEFINE FIELD name ON ServerRole TYPE string PERMISSIONS FULL; DEFINE FIELD server ON ServerRole TYPE record<Server> PERMISSIONS FULL; -- ------------------------------ -- TABLE: SessionToken -- ------------------------------ DEFINE TABLE SessionToken TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD created ON SessionToken TYPE datetime PERMISSIONS FULL; DEFINE FIELD expires ON SessionToken TYPE datetime PERMISSIONS FULL; DEFINE FIELD id ON SessionToken TYPE uuid PERMISSIONS FULL; DEFINE FIELD token ON SessionToken TYPE string PERMISSIONS FULL; DEFINE FIELD user ON SessionToken TYPE record<Human> PERMISSIONS FULL; -- ------------------------------ -- TABLE: Title -- ------------------------------ DEFINE TABLE Title TYPE NORMAL SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD colour ON Title TYPE string PERMISSIONS FULL; DEFINE FIELD faction ON Title TYPE record<Faction> PERMISSIONS FULL; DEFINE FIELD name ON Title TYPE string PERMISSIONS FULL; -- ------------------------------ -- TABLE: UserJoinedBy -- ------------------------------ DEFINE TABLE UserJoinedBy TYPE RELATION IN Human OUT AccessToken SCHEMAFULL PERMISSIONS NONE; DEFINE FIELD in ON UserJoinedBy TYPE record<Human> PERMISSIONS FULL; DEFINE FIELD out ON UserJoinedBy TYPE record<AccessToken> PERMISSIONS FULL;