added roominvites in frontend in a notifications page and added clap to define backend port

This commit is contained in:
2025-12-31 12:14:46 +01:00
parent bd99c82d2d
commit 6bd1921806
5 changed files with 177 additions and 14 deletions

View File

@@ -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()))
}

View File

@@ -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();

View File

@@ -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?,
}),