idk
This commit is contained in:
@@ -1,3 +1,17 @@
|
||||
DEFINE FUNCTION auth::credentials::validate($username: string, $password: string) {
|
||||
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
|
||||
{ NONE }
|
||||
;
|
||||
}
|
||||
|
||||
DEFINE FUNCTION auth::sessiontoken::new($user: uuid) {
|
||||
LET $token = rand::string(64);
|
||||
|
||||
@@ -10,3 +24,76 @@ DEFINE FUNCTION auth::sessiontoken::new($user: uuid) {
|
||||
};
|
||||
}
|
||||
|
||||
DEFINE FUNCTION 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;
|
||||
}
|
||||
|
||||
DEFINE FUNCTION auth::accesstoken::new($user: uuid, $max_uses: option<int>) {
|
||||
|
||||
IF $max_uses = NONE {
|
||||
LET $max_uses = 1;
|
||||
};
|
||||
|
||||
LET $token = rand::string(64);
|
||||
|
||||
CREATE AccessToken CONTENT {
|
||||
id: rand::uuid::v4(),
|
||||
max_uses: 1,
|
||||
token: $token,
|
||||
created: time::now(),
|
||||
expires: time::now() + 7d,
|
||||
creator: Entity:user
|
||||
uses: 0,
|
||||
};
|
||||
|
||||
RETURN $token;
|
||||
}
|
||||
|
||||
|
||||
DEFINE FUNCTION auth::user::signup(
|
||||
$email: string,
|
||||
$username: string,
|
||||
$password: string,
|
||||
$displayname: option<string>,
|
||||
$accesstoken: option<string>,
|
||||
){
|
||||
LET $entity_id = rand::uuid::v4();
|
||||
|
||||
IF $displayname = NONE {
|
||||
LET $displayname = $username;
|
||||
};
|
||||
|
||||
CREATE Entity CONTENT {
|
||||
id: $entity_id,
|
||||
deleted: false,
|
||||
displayname: $displayname,
|
||||
joined: time::now(),
|
||||
username: $username,
|
||||
};
|
||||
|
||||
LET $human_id = rand::uuid::v4();
|
||||
|
||||
CREATE Human CONTENT {
|
||||
id: $human_id,
|
||||
email: $email,
|
||||
passhash: crypto::argon2::generate($password),
|
||||
entity: Entity:entity_id
|
||||
};
|
||||
|
||||
IF !$accesstoken = NONE {
|
||||
RELATE Human:human_id -> UserJoinedBy -> AccessToken:(SELECT id FROM AccessToken WHERE token = $accesstoken)[0]
|
||||
}
|
||||
|
||||
RETURN $human_id
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
DEFINE FUNCTION message::send($from: uuid, $channel: uuid, $content: string, $reply_to: option<uuid>) {
|
||||
|
||||
LET $content_id = rand::uuid::v4();
|
||||
CREATE MessageStringContent CONTENT {
|
||||
id: $content_id,
|
||||
content: $content
|
||||
};
|
||||
|
||||
LET $message_id = rand::uuid::v4();
|
||||
CREATE Message CONTENT {
|
||||
id: $message_id,
|
||||
channel: Channel:channel,
|
||||
edited: false,
|
||||
sent: time::now(),
|
||||
reply_to: $reply_to,
|
||||
};
|
||||
|
||||
RELATE Message:message_id -> HasContent -> MessageStringContent:content_id;
|
||||
RELATE Entity:from -> SentMessage -> Message:message_id;
|
||||
}
|
||||
|
||||
DEFINE FUNCTION 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;
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
DEFINE FUNCTION user::human::new(
|
||||
$email: string,
|
||||
$username: string,
|
||||
$password: string,
|
||||
$displayname: option<string>,
|
||||
$accesstoken: option<string>,
|
||||
){
|
||||
LET $entity_id = rand::uuid::v4();
|
||||
|
||||
IF $displayname = NONE {
|
||||
LET $displayname = $username;
|
||||
};
|
||||
|
||||
CREATE Entity CONTENT {
|
||||
id: $entity_id,
|
||||
deleted: false,
|
||||
displayname: $displayname,
|
||||
joined: time::now(),
|
||||
username: $username,
|
||||
};
|
||||
|
||||
LET $human_id = rand::uuid::v4();
|
||||
|
||||
CREATE Human CONTENT {
|
||||
id: $human_id,
|
||||
email: $email,
|
||||
passhash: crypto::argon2::generate($password),
|
||||
entity: Entity:entity_id
|
||||
};
|
||||
|
||||
IF !$accesstoken = NONE {
|
||||
RELATE Human:human_id -> UserJoinedBy -> AccessToken:(SELECT id FROM AccessToken WHERE token = $accesstoken)[0]
|
||||
}
|
||||
|
||||
RETURN $human_id
|
||||
}
|
||||
|
||||
DEFINE FUNCTION objects::human::get($id: uuid) {
|
||||
|
||||
LET $human = (SELECT * FROM Human WHERE id = $id)[0];
|
||||
LET $entity = (SELECT * FROM Entity WHERE id = $human.entity)[0];
|
||||
|
||||
RETURN {
|
||||
id: $human.id,
|
||||
email: $human.email,
|
||||
passhash: $human.passhash,
|
||||
username: $entity.username,
|
||||
displayname: $entity.displayname,
|
||||
joined: $entity.joined
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user