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"] } 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 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) ) "#, )