added roominvites in frontend in a notifications page and added clap to define backend port
This commit is contained in:
14
src/db.rs
14
src/db.rs
@@ -20,8 +20,7 @@ pub async fn room_id_from_uuid(db: &PgPool, room_uuid: Uuid) -> Result<i32, (Sta
|
||||
.bind(room_uuid)
|
||||
.fetch_one(db)
|
||||
.await
|
||||
// FIX: hmm probably the wrong error here
|
||||
.map_err(|_| (StatusCode::UNAUTHORIZED, String::from("Wrong token")))
|
||||
.map_err(|_| (StatusCode::NOT_FOUND, "Failed to find room".into()))
|
||||
}
|
||||
|
||||
pub async fn username_from_uuid(
|
||||
@@ -50,3 +49,14 @@ pub async fn id_from_username(db: &PgPool, username: String) -> Result<i32, (Sta
|
||||
.await
|
||||
.map_err(|_| (StatusCode::NOT_FOUND, "User not found".into()))
|
||||
}
|
||||
|
||||
pub async fn room_name_from_uuid(
|
||||
db: &PgPool,
|
||||
room_uuid: Uuid,
|
||||
) -> Result<String, (StatusCode, String)> {
|
||||
sqlx::query_scalar("SELECT name FROM room_ WHERE uuid = $1")
|
||||
.bind(room_uuid)
|
||||
.fetch_one(db)
|
||||
.await
|
||||
.map_err(|_| (StatusCode::NOT_FOUND, "Failed to find room".into()))
|
||||
}
|
||||
|
||||
40
src/main.rs
40
src/main.rs
@@ -2,17 +2,36 @@ use axum::{
|
||||
Extension, Router,
|
||||
http::{Method, header},
|
||||
};
|
||||
use std::{env::var, net::SocketAddr, time::Duration};
|
||||
use clap::Parser;
|
||||
use std::{net::SocketAddr, time::Duration};
|
||||
use tower_governor::{GovernorLayer, governor::GovernorConfigBuilder};
|
||||
use tower_http::cors::{Any, CorsLayer};
|
||||
use tower_http::{
|
||||
cors::{Any, CorsLayer},
|
||||
trace::{DefaultMakeSpan, DefaultOnResponse, TraceLayer},
|
||||
};
|
||||
use tracing::Level;
|
||||
|
||||
mod auth;
|
||||
mod db;
|
||||
mod realtime;
|
||||
mod routes;
|
||||
|
||||
#[derive(clap::Parser, Debug)]
|
||||
#[command(author, version, about, long_about = None)]
|
||||
pub struct Cli {
|
||||
/// Server port
|
||||
#[arg(short, long, default_value = "8080")]
|
||||
port: String,
|
||||
|
||||
/// Verbose mode
|
||||
#[arg(short, long)]
|
||||
verbose: bool,
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> anyhow::Result<()> {
|
||||
let cli = Cli::parse();
|
||||
|
||||
tracing_subscriber::fmt()
|
||||
.with_max_level(tracing::Level::INFO)
|
||||
.init();
|
||||
@@ -45,7 +64,7 @@ async fn main() -> anyhow::Result<()> {
|
||||
|
||||
let realtime = realtime::Realtime::new();
|
||||
|
||||
let app = Router::new()
|
||||
let mut app = Router::new()
|
||||
.merge(routes::users::routes())
|
||||
.merge(routes::rooms::routes())
|
||||
.merge(routes::messages::routes())
|
||||
@@ -54,14 +73,17 @@ async fn main() -> anyhow::Result<()> {
|
||||
.layer(Extension(db_pool))
|
||||
.layer(Extension(realtime))
|
||||
.layer(GovernorLayer::new(governor_conf))
|
||||
// .layer(
|
||||
// TraceLayer::new_for_http()
|
||||
// .make_span_with(DefaultMakeSpan::new().level(Level::INFO))
|
||||
// .on_response(DefaultOnResponse::new().level(Level::INFO)),
|
||||
// )
|
||||
.layer(cors);
|
||||
|
||||
let port = var("CHATAPP_SERVER_PORT").unwrap_or_else(|_| "8080".to_string());
|
||||
if cli.verbose {
|
||||
app = app.layer(
|
||||
TraceLayer::new_for_http()
|
||||
.make_span_with(DefaultMakeSpan::new().level(Level::INFO))
|
||||
.on_response(DefaultOnResponse::new().level(Level::INFO)),
|
||||
);
|
||||
}
|
||||
|
||||
let port = cli.port;
|
||||
let addr = format!("0.0.0.0:{port}");
|
||||
|
||||
let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();
|
||||
|
||||
@@ -7,7 +7,7 @@ use axum::{
|
||||
use sqlx::{PgPool, Pool, Postgres};
|
||||
use uuid::Uuid;
|
||||
|
||||
use crate::db::{id_from_username, user_id_from_uuid, username_from_id};
|
||||
use crate::db::{id_from_username, room_name_from_uuid, user_id_from_uuid, username_from_id};
|
||||
use crate::{auth::verify_jwt, db::room_id_from_uuid};
|
||||
|
||||
#[derive(sqlx::FromRow, serde::Serialize)]
|
||||
@@ -27,6 +27,7 @@ pub struct NewRoomPayload {
|
||||
#[derive(sqlx::FromRow, serde::Serialize)]
|
||||
pub struct RoomInvite {
|
||||
pub room_uuid: Uuid,
|
||||
pub room_name: String,
|
||||
pub sender_uuid: Uuid,
|
||||
pub sender_username: String,
|
||||
}
|
||||
@@ -197,7 +198,11 @@ async fn list_invites(
|
||||
|
||||
let requests = sqlx::query_as::<_, RoomInvite>(
|
||||
r#"
|
||||
SELECT r.uuid AS room_uuid, u.uuid AS sender_uuid, u.username AS sender_username
|
||||
SELECT
|
||||
r.uuid AS room_uuid,
|
||||
r.name AS room_name,
|
||||
u.uuid AS sender_uuid,
|
||||
u.username AS sender_username
|
||||
FROM room_invite_ AS i
|
||||
JOIN user_ u ON u.id = i.sender
|
||||
JOIN room_ r ON r.id = i.room
|
||||
@@ -207,7 +212,8 @@ async fn list_invites(
|
||||
.bind(user_id)
|
||||
.fetch_all(&db)
|
||||
.await
|
||||
.map_err(|_| {
|
||||
.map_err(|e| {
|
||||
tracing::error!("{e}");
|
||||
(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
"Could not list room invites".into(),
|
||||
@@ -267,10 +273,13 @@ async fn send_invite(
|
||||
|
||||
tracing::info!("bro");
|
||||
|
||||
let room_name = room_name_from_uuid(&db, payload.room_uuid).await?;
|
||||
|
||||
Ok((
|
||||
StatusCode::CREATED,
|
||||
Json(RoomInvite {
|
||||
room_uuid: payload.room_uuid,
|
||||
room_name,
|
||||
sender_uuid: claims.sub,
|
||||
sender_username: username_from_id(&db, receiver_id).await?,
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user