feat: added profile session route

This commit is contained in:
əlemi 2023-01-22 16:27:03 +01:00
parent 430342ac74
commit 3fadbbba3d
No known key found for this signature in database
GPG key ID: BBCBFE5D7244634E
3 changed files with 34 additions and 5 deletions

View file

@ -12,8 +12,10 @@ use tokio::sync::Mutex;
use uuid::Uuid; use uuid::Uuid;
use tracing::info; use tracing::info;
use crate::routes::auth::{authenticate, validate, refresh}; use crate::routes::{
use crate::routes::session::{join, has_joined}; auth::{authenticate, validate, refresh},
session::{join, has_joined, profile},
};
/// Reimplementation of legacy auth server for minecraft /// Reimplementation of legacy auth server for minecraft
#[derive(Parser, Debug, Clone)] #[derive(Parser, Debug, Clone)]
@ -62,13 +64,15 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let addr = cfg.bind_addr.parse()?; let addr = cfg.bind_addr.parse()?;
let app = Router::new() let app = Router::new()
// AUTH
.route("/auth/authenticate", post(authenticate)) //in: username, pass; out: token .route("/auth/authenticate", post(authenticate)) //in: username, pass; out: token
.route("/auth/validate", post(validate)) //in: token; out: boolean valid .route("/auth/validate", post(validate)) //in: token; out: boolean valid
.route("/auth/refresh", post(refresh)) //in: token out: refreshed token .route("/auth/refresh", post(refresh)) //in: token out: refreshed token
// .route("/signout", post(signout)) // SESSION
// .route("/invalidate", post(invalidate))
.route("/session/minecraft/join", post(join)) .route("/session/minecraft/join", post(join))
.route("/session/minecraft/hasJoined", get(has_joined)) .route("/session/minecraft/hasJoined", get(has_joined))
.route("/session/minecraft/profile/:user_id", get(profile))
// CUSTOM
.route("/register", post(register_tmp)) .route("/register", post(register_tmp))
.fallback(fallback_route) .fallback(fallback_route)
.with_state(AppState { store, db, cfg }); .with_state(AppState { store, db, cfg });

View file

@ -30,6 +30,14 @@ pub struct User {
pub properties: Option<Vec<Property>>, pub properties: Option<Vec<Property>>,
} }
/// Damn Mojang! Same as above, except for 'username' -> 'name'
#[derive(Serialize, Deserialize)]
pub struct SessionUser {
pub id: Uuid,
pub name: String,
pub properties: Option<Vec<Property>>,
}
#[derive(Serialize, Deserialize, Clone)] #[derive(Serialize, Deserialize, Clone)]
pub struct Profile { pub struct Profile {
pub name: String, pub name: String,

View file

@ -1,9 +1,10 @@
use std::collections::HashMap; use std::collections::HashMap;
use axum::{extract::{State, Query}, http::StatusCode, Json}; use axum::{extract::{State, Query, Path}, http::StatusCode, Json};
use chrono::{Duration, Utc}; use chrono::{Duration, Utc};
use sea_orm::{ColumnTrait, EntityTrait, QueryFilter}; use sea_orm::{ColumnTrait, EntityTrait, QueryFilter};
use tracing::{info, warn}; use tracing::{info, warn};
use uuid::Uuid;
use crate::{AppState, proto, JoinAttempt, entities}; use crate::{AppState, proto, JoinAttempt, entities};
@ -71,3 +72,19 @@ pub async fn has_joined(State(state): State<AppState>, Query(query): Query<HashM
}, },
} }
} }
pub async fn profile(State(state): State<AppState>, Path(user_id): Path<Uuid>) -> Result<Json<proto::SessionUser>, StatusCode> {
let user = entities::user::Entity::find().filter(
entities::user::Column::Uuid.eq(user_id)
).one(&state.db).await.unwrap();
if let Some(u) = user {
Ok(Json(proto::SessionUser {
id: u.uuid,
name: u.name,
properties: Some(vec![]),
}))
} else {
Err(StatusCode::NOT_FOUND)
}
}