From 838947a7ca9d0b6ab484a6cee25daeeca5c331a8 Mon Sep 17 00:00:00 2001 From: Radiicall Date: Sat, 3 May 2025 05:27:38 +0200 Subject: [PATCH 1/3] build: add tokio-tungstenite dependency --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index e34d9b6..68f4c0b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,7 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" simple_logger = "5.0.0" sqlx = { version = "0.8", features = ["runtime-tokio", "tls-native-tls", "postgres"] } +tokio-tungstenite = { version = "0.26", features = ["native-tls", "url"] } toml = "0.8" url = { version = "2.5", features = ["serde"] } uuid = { version = "1.16", features = ["serde", "v7"] } From 34b984a1b552336754289615c4c924de1241c7db Mon Sep 17 00:00:00 2001 From: Radiicall Date: Sat, 3 May 2025 05:31:35 +0200 Subject: [PATCH 2/3] feat: add tables for guilds, members, channels, messages, emojis and reactions --- src/main.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/main.rs b/src/main.rs index 4c909b1..a591c1f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -71,6 +71,42 @@ async fn main() -> Result<(), Error> { refresh_token varchar(64) UNIQUE NOT NULL REFERENCES refresh_tokens(token), uuid uuid NOT NULL REFERENCES users(uuid), created int8 NOT NULL + ); + CREATE TABLE IF NOT EXISTS guilds ( + uuid uuid PRIMARY KEY NOT NULL, + name VARCHAR(100), + description VARCHAR(300), + created_at int8 NOT NULL + ); + CREATE TABLE IF NOT EXISTS guild_members ( + guild_uuid uuid NOT NULL REFERENCES guilds(uuid), + user_uuid uuid NOT NULL REFERENCES users(uuid), + permissions int8 NOT NULL DEFAULT 0, + PRIMARY KEY (guild_uuid, user_uuid) + ); + CREATE TABLE IF NOT EXISTS channels ( + uuid uuid PRIMARY KEY NOT NULL, + guild_uuid NOT NULL REFERENCES guilds(uuid), + name varchar(32) NOT NULL, + description varchar(500) NOT NULL + ); + CREATE TABLE IF NOT EXISTS messages ( + uuid uuid PRIMARY KEY NOT NULL, + channel_uuid uuid NOT NULL REFERENCES channels(uuid), + user_uuid uuid NOT NULL REFERENCES users(uuid), + message varchar(2000) NOT NULL, + created_at int8 NOT NULL + ); + CREATE TABLE IF NOT EXISTS emojis ( + uuid uuid PRIMARY KEY NOT NULL, + name varchar(32) NOT NULL, + guild_uuid uuid REFERENCES guilds(uuid) + ); + CREATE TABLE IF NOT EXISTS message_reactions ( + message_uuid uuid NOT NULL REFERENCES messages(uuid), + user_uuid uuid NOT NULL REFERENCES users(uuid), + emoji_uuid uuid NOT NULL REFERENCES emojis(uuid), + PRIMARY KEY (message_uuid, user_uuid, emoji_uuid) ) "#, ) From 8241196284001839641c0bcfede39b4740c59ed6 Mon Sep 17 00:00:00 2001 From: Radiicall Date: Sat, 3 May 2025 05:32:22 +0200 Subject: [PATCH 3/3] feat: add boilerplate rust files --- src/api/v1/mod.rs | 1 + src/api/v1/servers/channels/mod.rs | 3 ++ src/api/v1/servers/channels/uuid/messages.rs | 0 src/api/v1/servers/channels/uuid/mod.rs | 0 src/api/v1/servers/mod.rs | 48 ++++++++++++++++++++ src/api/v1/servers/uuid.rs | 0 6 files changed, 52 insertions(+) create mode 100644 src/api/v1/servers/channels/mod.rs create mode 100644 src/api/v1/servers/channels/uuid/messages.rs create mode 100644 src/api/v1/servers/channels/uuid/mod.rs create mode 100644 src/api/v1/servers/mod.rs create mode 100644 src/api/v1/servers/uuid.rs diff --git a/src/api/v1/mod.rs b/src/api/v1/mod.rs index a5fd58a..7e62f06 100644 --- a/src/api/v1/mod.rs +++ b/src/api/v1/mod.rs @@ -3,6 +3,7 @@ use actix_web::{Scope, web}; mod auth; mod stats; mod users; +mod servers; pub fn web() -> Scope { web::scope("/v1") diff --git a/src/api/v1/servers/channels/mod.rs b/src/api/v1/servers/channels/mod.rs new file mode 100644 index 0000000..b9cf990 --- /dev/null +++ b/src/api/v1/servers/channels/mod.rs @@ -0,0 +1,3 @@ +pub fn web() -> Scope { + web::scope("/channels") +} \ No newline at end of file diff --git a/src/api/v1/servers/channels/uuid/messages.rs b/src/api/v1/servers/channels/uuid/messages.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/api/v1/servers/channels/uuid/mod.rs b/src/api/v1/servers/channels/uuid/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/api/v1/servers/mod.rs b/src/api/v1/servers/mod.rs new file mode 100644 index 0000000..6b88e68 --- /dev/null +++ b/src/api/v1/servers/mod.rs @@ -0,0 +1,48 @@ +use actix_web::{Error, HttpResponse, error, post, web}; +use futures::StreamExt; +use log::error; +use serde::{Deserialize, Serialize}; +use std::time::{SystemTime, UNIX_EPOCH}; + +mod uuid; +mod channels; + +use crate::Data; + +#[derive(Deserialize)] +struct Request { + access_token: String, + name: String +} + +#[derive(Serialize)] +struct Response { + refresh_token: String, + access_token: String, +} + +const MAX_SIZE: usize = 262_144; + +pub fn web() -> Scope { + web::scope("/servers") + .service(channels::web()) + .service(uuid::res) +} + +#[post("")] +pub async fn res(mut payload: web::Payload, data: web::Data) -> Result { + let mut body = web::BytesMut::new(); + while let Some(chunk) = payload.next().await { + let chunk = chunk?; + // limit max size of in-memory payload + if (body.len() + chunk.len()) > MAX_SIZE { + return Err(error::ErrorBadRequest("overflow")); + } + body.extend_from_slice(&chunk); + } + + let request = serde_json::from_slice::(&body)?; + + Ok(HttpResponse::Unauthorized().finish()) +} + diff --git a/src/api/v1/servers/uuid.rs b/src/api/v1/servers/uuid.rs new file mode 100644 index 0000000..e69de29