Compare commits
No commits in common. "8ddcbc49554879052bec94e7149ec66431db93a1" and "d102966198cae443c6d28518f8b81e8c3fcaa415" have entirely different histories.
8ddcbc4955
...
d102966198
19 changed files with 75 additions and 113 deletions
|
@ -1,16 +1,27 @@
|
||||||
use actix_web::{HttpRequest, HttpResponse, get, post, web};
|
use actix_web::{HttpRequest, HttpResponse, get, post, web};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
api::v1::auth::check_access_token, error::Error, structs::{Guild, Invite, Member}, utils::{get_auth_header, global_checks}, Data
|
Data,
|
||||||
|
api::v1::auth::check_access_token,
|
||||||
|
error::Error,
|
||||||
|
structs::{Guild, Invite, Member},
|
||||||
|
utils::get_auth_header,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[get("{id}")]
|
#[get("{id}")]
|
||||||
pub async fn get(
|
pub async fn get(
|
||||||
|
req: HttpRequest,
|
||||||
path: web::Path<(String,)>,
|
path: web::Path<(String,)>,
|
||||||
data: web::Data<Data>,
|
data: web::Data<Data>,
|
||||||
) -> Result<HttpResponse, Error> {
|
) -> Result<HttpResponse, Error> {
|
||||||
|
let headers = req.headers();
|
||||||
|
|
||||||
|
let auth_header = get_auth_header(headers)?;
|
||||||
|
|
||||||
let mut conn = data.pool.get().await?;
|
let mut conn = data.pool.get().await?;
|
||||||
|
|
||||||
|
check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
let invite_id = path.into_inner().0;
|
let invite_id = path.into_inner().0;
|
||||||
|
|
||||||
let invite = Invite::fetch_one(&mut conn, invite_id).await?;
|
let invite = Invite::fetch_one(&mut conn, invite_id).await?;
|
||||||
|
@ -36,8 +47,6 @@ pub async fn join(
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
let invite = Invite::fetch_one(&mut conn, invite_id).await?;
|
let invite = Invite::fetch_one(&mut conn, invite_id).await?;
|
||||||
|
|
||||||
let guild = Guild::fetch_one(&mut conn, invite.guild_uuid).await?;
|
let guild = Guild::fetch_one(&mut conn, invite.guild_uuid).await?;
|
||||||
|
|
|
@ -3,7 +3,7 @@ use actix_web::{HttpRequest, HttpResponse, Scope, get, patch, web};
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
api::v1::auth::check_access_token, error::Error, structs::Me, utils::{get_auth_header, global_checks}, Data
|
Data, api::v1::auth::check_access_token, error::Error, structs::Me, utils::get_auth_header,
|
||||||
};
|
};
|
||||||
|
|
||||||
mod servers;
|
mod servers;
|
||||||
|
@ -27,7 +27,7 @@ pub async fn get(req: HttpRequest, data: web::Data<Data>) -> Result<HttpResponse
|
||||||
Ok(HttpResponse::Ok().json(me))
|
Ok(HttpResponse::Ok().json(me))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, Clone)]
|
#[derive(Debug, Deserialize)]
|
||||||
struct NewInfo {
|
struct NewInfo {
|
||||||
username: Option<String>,
|
username: Option<String>,
|
||||||
display_name: Option<String>,
|
display_name: Option<String>,
|
||||||
|
@ -39,7 +39,7 @@ struct NewInfo {
|
||||||
struct UploadForm {
|
struct UploadForm {
|
||||||
#[multipart(limit = "100MB")]
|
#[multipart(limit = "100MB")]
|
||||||
avatar: Option<TempFile>,
|
avatar: Option<TempFile>,
|
||||||
json: MpJson<Option<NewInfo>>,
|
json: Option<MpJson<NewInfo>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[patch("")]
|
#[patch("")]
|
||||||
|
@ -56,10 +56,6 @@ pub async fn update(
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
if form.avatar.is_some() || form.json.0.clone().is_some_and(|ni| ni.username.is_some() || ni.display_name.is_some()) {
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut me = Me::get(&mut conn, uuid).await?;
|
let mut me = Me::get(&mut conn, uuid).await?;
|
||||||
|
|
||||||
if let Some(avatar) = form.avatar {
|
if let Some(avatar) = form.avatar {
|
||||||
|
@ -76,7 +72,7 @@ pub async fn update(
|
||||||
.await?;
|
.await?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(new_info) = form.json.0 {
|
if let Some(new_info) = form.json {
|
||||||
if let Some(username) = &new_info.username {
|
if let Some(username) = &new_info.username {
|
||||||
me.set_username(&mut conn, username.clone()).await?;
|
me.set_username(&mut conn, username.clone()).await?;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
use actix_web::{get, web, HttpRequest, HttpResponse};
|
use actix_web::{get, web, HttpRequest, HttpResponse};
|
||||||
|
|
||||||
use crate::{api::v1::auth::check_access_token, error::Error, structs::Me, utils::{get_auth_header, global_checks}, Data};
|
use crate::{api::v1::auth::check_access_token, error::Error, structs::Me, utils::get_auth_header, Data};
|
||||||
|
|
||||||
|
|
||||||
/// `GET /api/v1/me/servers` Returns all guild memberships in a list
|
/// `GET /api/v1/me/servers` Returns all guild memberships in a list
|
||||||
|
@ -37,8 +37,6 @@ pub async fn get(req: HttpRequest, data: web::Data<Data>) -> Result<HttpResponse
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
let me = Me::get(&mut conn, uuid).await?;
|
let me = Me::get(&mut conn, uuid).await?;
|
||||||
|
|
||||||
let memberships = me.fetch_memberships(&mut conn).await?;
|
let memberships = me.fetch_memberships(&mut conn).await?;
|
||||||
|
|
|
@ -6,7 +6,11 @@ use serde::Deserialize;
|
||||||
mod uuid;
|
mod uuid;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
api::v1::auth::check_access_token, error::Error, structs::{Guild, StartAmountQuery}, utils::{get_auth_header, global_checks}, Data
|
Data,
|
||||||
|
api::v1::auth::check_access_token,
|
||||||
|
error::Error,
|
||||||
|
structs::{Guild, StartAmountQuery},
|
||||||
|
utils::get_auth_header,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
|
@ -130,9 +134,7 @@ pub async fn get(
|
||||||
|
|
||||||
let amount = request_query.amount.unwrap_or(10);
|
let amount = request_query.amount.unwrap_or(10);
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut data.pool.get().await?).await?;
|
check_access_token(auth_header, &mut data.pool.get().await?).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
let guilds = Guild::fetch_amount(&data.pool, start, amount).await?;
|
let guilds = Guild::fetch_amount(&data.pool, start, amount).await?;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
api::v1::auth::check_access_token, error::Error, structs::{Channel, Member}, utils::{get_auth_header, global_checks, order_by_is_above}, Data
|
api::v1::auth::check_access_token, error::Error, structs::{Channel, Member}, utils::{get_auth_header, order_by_is_above}, Data
|
||||||
};
|
};
|
||||||
use ::uuid::Uuid;
|
use ::uuid::Uuid;
|
||||||
use actix_web::{HttpRequest, HttpResponse, get, post, web};
|
use actix_web::{HttpRequest, HttpResponse, get, post, web};
|
||||||
|
@ -29,8 +29,6 @@ pub async fn get(
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
||||||
|
|
||||||
if let Ok(cache_hit) = data.get_cache_key(format!("{}_channels", guild_uuid)).await {
|
if let Ok(cache_hit) = data.get_cache_key(format!("{}_channels", guild_uuid)).await {
|
||||||
|
@ -70,8 +68,6 @@ pub async fn create(
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
||||||
|
|
||||||
// FIXME: Logic to check permissions, should probably be done in utils.rs
|
// FIXME: Logic to check permissions, should probably be done in utils.rs
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
//! `/api/v1/servers/{uuid}/channels/{uuid}/messages` Endpoints related to channel messages
|
//! `/api/v1/servers/{uuid}/channels/{uuid}/messages` Endpoints related to channel messages
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
api::v1::auth::check_access_token, error::Error, structs::{Channel, Member}, utils::{get_auth_header, global_checks}, Data
|
Data,
|
||||||
|
api::v1::auth::check_access_token,
|
||||||
|
error::Error,
|
||||||
|
structs::{Channel, Member},
|
||||||
|
utils::get_auth_header,
|
||||||
};
|
};
|
||||||
use ::uuid::Uuid;
|
use ::uuid::Uuid;
|
||||||
use actix_web::{HttpRequest, HttpResponse, get, web};
|
use actix_web::{HttpRequest, HttpResponse, get, web};
|
||||||
|
@ -60,8 +64,6 @@ pub async fn get(
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
||||||
|
|
||||||
let channel: Channel;
|
let channel: Channel;
|
||||||
|
|
|
@ -2,7 +2,11 @@ pub mod messages;
|
||||||
pub mod socket;
|
pub mod socket;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
api::v1::auth::check_access_token, error::Error, structs::{Channel, Member}, utils::{get_auth_header, global_checks}, Data
|
Data,
|
||||||
|
api::v1::auth::check_access_token,
|
||||||
|
error::Error,
|
||||||
|
structs::{Channel, Member},
|
||||||
|
utils::get_auth_header,
|
||||||
};
|
};
|
||||||
use actix_web::{HttpRequest, HttpResponse, delete, get, web};
|
use actix_web::{HttpRequest, HttpResponse, delete, get, web};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
@ -23,8 +27,6 @@ pub async fn get(
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
||||||
|
|
||||||
if let Ok(cache_hit) = data.get_cache_key(format!("{}", channel_uuid)).await {
|
if let Ok(cache_hit) = data.get_cache_key(format!("{}", channel_uuid)).await {
|
||||||
|
@ -57,8 +59,6 @@ pub async fn delete(
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
||||||
|
|
||||||
let channel: Channel;
|
let channel: Channel;
|
||||||
|
|
|
@ -8,7 +8,10 @@ use futures_util::StreamExt as _;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
api::v1::auth::check_access_token, structs::{Channel, Member}, utils::{get_ws_protocol_header, global_checks}, Data
|
Data,
|
||||||
|
api::v1::auth::check_access_token,
|
||||||
|
structs::{Channel, Member},
|
||||||
|
utils::get_ws_protocol_header,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[get("{uuid}/channels/{channel_uuid}/socket")]
|
#[get("{uuid}/channels/{channel_uuid}/socket")]
|
||||||
|
@ -32,8 +35,6 @@ pub async fn ws(
|
||||||
// Authorize client using auth header
|
// Authorize client using auth header
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
// Get server member from psql
|
// Get server member from psql
|
||||||
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,11 @@ use futures_util::StreamExt as _;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
api::v1::auth::check_access_token, error::Error, structs::{Guild, Member}, utils::{get_auth_header, global_checks}, Data
|
Data,
|
||||||
|
api::v1::auth::check_access_token,
|
||||||
|
error::Error,
|
||||||
|
structs::{Guild, Member},
|
||||||
|
utils::get_auth_header,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// `PUT /api/v1/servers/{uuid}/icon` Icon upload
|
/// `PUT /api/v1/servers/{uuid}/icon` Icon upload
|
||||||
|
@ -30,8 +34,6 @@ pub async fn upload(
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
||||||
|
|
||||||
let mut guild = Guild::fetch_one(&mut conn, guild_uuid).await?;
|
let mut guild = Guild::fetch_one(&mut conn, guild_uuid).await?;
|
||||||
|
|
|
@ -3,7 +3,11 @@ use serde::Deserialize;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
api::v1::auth::check_access_token, error::Error, structs::{Guild, Member}, utils::{get_auth_header, global_checks}, Data
|
Data,
|
||||||
|
api::v1::auth::check_access_token,
|
||||||
|
error::Error,
|
||||||
|
structs::{Guild, Member},
|
||||||
|
utils::get_auth_header,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
|
@ -27,8 +31,6 @@ pub async fn get(
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
||||||
|
|
||||||
let guild = Guild::fetch_one(&mut conn, guild_uuid).await?;
|
let guild = Guild::fetch_one(&mut conn, guild_uuid).await?;
|
||||||
|
@ -55,8 +57,6 @@ pub async fn create(
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
let member = Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
let member = Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
||||||
|
|
||||||
let guild = Guild::fetch_one(&mut conn, guild_uuid).await?;
|
let guild = Guild::fetch_one(&mut conn, guild_uuid).await?;
|
||||||
|
|
|
@ -9,7 +9,11 @@ mod invites;
|
||||||
mod roles;
|
mod roles;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
api::v1::auth::check_access_token, error::Error, structs::{Guild, Member}, utils::{get_auth_header, global_checks}, Data
|
Data,
|
||||||
|
api::v1::auth::check_access_token,
|
||||||
|
error::Error,
|
||||||
|
structs::{Guild, Member},
|
||||||
|
utils::get_auth_header,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn web() -> Scope {
|
pub fn web() -> Scope {
|
||||||
|
@ -83,8 +87,6 @@ pub async fn get(
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
||||||
|
|
||||||
let guild = Guild::fetch_one(&mut conn, guild_uuid).await?;
|
let guild = Guild::fetch_one(&mut conn, guild_uuid).await?;
|
||||||
|
|
|
@ -3,7 +3,7 @@ use actix_web::{HttpRequest, HttpResponse, get, post, web};
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
api::v1::auth::check_access_token, error::Error, structs::{Member, Role}, utils::{get_auth_header, global_checks, order_by_is_above}, Data
|
api::v1::auth::check_access_token, error::Error, structs::{Member, Role}, utils::{get_auth_header, order_by_is_above}, Data
|
||||||
};
|
};
|
||||||
|
|
||||||
pub mod uuid;
|
pub mod uuid;
|
||||||
|
@ -64,8 +64,6 @@ pub async fn create(
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
||||||
|
|
||||||
// FIXME: Logic to check permissions, should probably be done in utils.rs
|
// FIXME: Logic to check permissions, should probably be done in utils.rs
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
api::v1::auth::check_access_token, error::Error, structs::{Member, Role}, utils::{get_auth_header, global_checks}, Data
|
Data,
|
||||||
|
api::v1::auth::check_access_token,
|
||||||
|
error::Error,
|
||||||
|
structs::{Member, Role},
|
||||||
|
utils::get_auth_header,
|
||||||
};
|
};
|
||||||
use ::uuid::Uuid;
|
use ::uuid::Uuid;
|
||||||
use actix_web::{HttpRequest, HttpResponse, get, web};
|
use actix_web::{HttpRequest, HttpResponse, get, web};
|
||||||
|
@ -20,8 +24,6 @@ pub async fn get(
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
let uuid = check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
Member::fetch_one(&mut conn, uuid, guild_uuid).await?;
|
||||||
|
|
||||||
if let Ok(cache_hit) = data.get_cache_key(format!("{}", role_uuid)).await {
|
if let Ok(cache_hit) = data.get_cache_key(format!("{}", role_uuid)).await {
|
||||||
|
|
|
@ -18,8 +18,6 @@ struct Response {
|
||||||
accounts: i64,
|
accounts: i64,
|
||||||
uptime: u64,
|
uptime: u64,
|
||||||
version: String,
|
version: String,
|
||||||
registration_enabled: bool,
|
|
||||||
email_verification_required: bool,
|
|
||||||
build_number: String,
|
build_number: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,8 +31,6 @@ struct Response {
|
||||||
/// "accounts": 3,
|
/// "accounts": 3,
|
||||||
/// "uptime": 50000,
|
/// "uptime": 50000,
|
||||||
/// "version": "0.1.0",
|
/// "version": "0.1.0",
|
||||||
/// "registration_enabled": true,
|
|
||||||
/// "email_verification_required": true,
|
|
||||||
/// "build_number": "39d01bb"
|
/// "build_number": "39d01bb"
|
||||||
/// });
|
/// });
|
||||||
/// ```
|
/// ```
|
||||||
|
@ -54,8 +50,6 @@ pub async fn res(data: web::Data<Data>) -> Result<HttpResponse, Error> {
|
||||||
.expect("Seriously why dont you have time??")
|
.expect("Seriously why dont you have time??")
|
||||||
.as_secs(),
|
.as_secs(),
|
||||||
version: String::from(VERSION.unwrap_or("UNKNOWN")),
|
version: String::from(VERSION.unwrap_or("UNKNOWN")),
|
||||||
registration_enabled: data.config.instance.registration,
|
|
||||||
email_verification_required: data.config.instance.require_email_verification,
|
|
||||||
// TODO: Get build number from git hash or remove this from the spec
|
// TODO: Get build number from git hash or remove this from the spec
|
||||||
build_number: String::from("how do i implement this?"),
|
build_number: String::from("how do i implement this?"),
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,7 +3,11 @@
|
||||||
use actix_web::{HttpRequest, HttpResponse, Scope, get, web};
|
use actix_web::{HttpRequest, HttpResponse, Scope, get, web};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
api::v1::auth::check_access_token, error::Error, structs::{StartAmountQuery, User}, utils::{get_auth_header, global_checks}, Data
|
Data,
|
||||||
|
api::v1::auth::check_access_token,
|
||||||
|
error::Error,
|
||||||
|
structs::{StartAmountQuery, User},
|
||||||
|
utils::get_auth_header,
|
||||||
};
|
};
|
||||||
|
|
||||||
mod uuid;
|
mod uuid;
|
||||||
|
@ -64,9 +68,7 @@ pub async fn get(
|
||||||
|
|
||||||
let mut conn = data.pool.get().await?;
|
let mut conn = data.pool.get().await?;
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
|
||||||
|
|
||||||
let users = User::fetch_amount(&mut conn, start, amount).await?;
|
let users = User::fetch_amount(&mut conn, start, amount).await?;
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ use actix_web::{HttpRequest, HttpResponse, get, web};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
api::v1::auth::check_access_token, error::Error, structs::User, utils::{get_auth_header, global_checks}, Data
|
Data, api::v1::auth::check_access_token, error::Error, structs::User, utils::get_auth_header,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// `GET /api/v1/users/{uuid}` Returns user with the given UUID
|
/// `GET /api/v1/users/{uuid}` Returns user with the given UUID
|
||||||
|
@ -31,17 +31,15 @@ pub async fn get(
|
||||||
) -> Result<HttpResponse, Error> {
|
) -> Result<HttpResponse, Error> {
|
||||||
let headers = req.headers();
|
let headers = req.headers();
|
||||||
|
|
||||||
let user_uuid = path.into_inner().0;
|
let uuid = path.into_inner().0;
|
||||||
|
|
||||||
let auth_header = get_auth_header(headers)?;
|
let auth_header = get_auth_header(headers)?;
|
||||||
|
|
||||||
let mut conn = data.pool.get().await?;
|
let mut conn = data.pool.get().await?;
|
||||||
|
|
||||||
let uuid = check_access_token(auth_header, &mut conn).await?;
|
check_access_token(auth_header, &mut conn).await?;
|
||||||
|
|
||||||
global_checks(&data, uuid).await?;
|
let user = User::fetch_one(&data, uuid).await?;
|
||||||
|
|
||||||
let user = User::fetch_one(&data, user_uuid).await?;
|
|
||||||
|
|
||||||
Ok(HttpResponse::Ok().json(user))
|
Ok(HttpResponse::Ok().json(user))
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ pub struct ConfigBuilder {
|
||||||
database: Database,
|
database: Database,
|
||||||
cache_database: CacheDatabase,
|
cache_database: CacheDatabase,
|
||||||
web: WebBuilder,
|
web: WebBuilder,
|
||||||
instance: Option<InstanceBuilder>,
|
instance: Option<Instance>,
|
||||||
bunny: BunnyBuilder,
|
bunny: BunnyBuilder,
|
||||||
mail: Mail,
|
mail: Mail,
|
||||||
}
|
}
|
||||||
|
@ -42,10 +42,9 @@ struct WebBuilder {
|
||||||
_ssl: Option<bool>,
|
_ssl: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize, Clone)]
|
||||||
struct InstanceBuilder {
|
pub struct Instance {
|
||||||
registration: Option<bool>,
|
pub registration: bool,
|
||||||
require_email_verification: Option<bool>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
|
@ -107,22 +106,11 @@ impl ConfigBuilder {
|
||||||
cdn_url: self.bunny.cdn_url,
|
cdn_url: self.bunny.cdn_url,
|
||||||
};
|
};
|
||||||
|
|
||||||
let instance = match self.instance {
|
|
||||||
Some(instance) => Instance {
|
|
||||||
registration: instance.registration.unwrap_or(true),
|
|
||||||
require_email_verification: instance.require_email_verification.unwrap_or(false),
|
|
||||||
},
|
|
||||||
None => Instance {
|
|
||||||
registration: true,
|
|
||||||
require_email_verification: false,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Config {
|
Config {
|
||||||
database: self.database,
|
database: self.database,
|
||||||
cache_database: self.cache_database,
|
cache_database: self.cache_database,
|
||||||
web,
|
web,
|
||||||
instance,
|
instance: self.instance.unwrap_or(Instance { registration: true }),
|
||||||
bunny,
|
bunny,
|
||||||
mail: self.mail,
|
mail: self.mail,
|
||||||
}
|
}
|
||||||
|
@ -146,12 +134,6 @@ pub struct Web {
|
||||||
pub url: Url,
|
pub url: Url,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub struct Instance {
|
|
||||||
pub registration: bool,
|
|
||||||
pub require_email_verification: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Bunny {
|
pub struct Bunny {
|
||||||
pub api_key: String,
|
pub api_key: String,
|
||||||
|
|
|
@ -16,7 +16,7 @@ use argon2::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
error::Error, schema::*, utils::{generate_refresh_token, global_checks, image_check, order_by_is_above, user_uuid_from_identifier, EMAIL_REGEX, PASSWORD_REGEX, USERNAME_REGEX}, Conn, Data
|
error::Error, schema::*, utils::{generate_refresh_token, image_check, order_by_is_above, user_uuid_from_identifier, EMAIL_REGEX, PASSWORD_REGEX, USERNAME_REGEX}, Conn, Data
|
||||||
};
|
};
|
||||||
|
|
||||||
pub trait HasUuid {
|
pub trait HasUuid {
|
||||||
|
@ -1070,8 +1070,6 @@ impl PasswordResetToken {
|
||||||
|
|
||||||
let user_uuid = user_uuid_from_identifier(&mut conn, &identifier).await?;
|
let user_uuid = user_uuid_from_identifier(&mut conn, &identifier).await?;
|
||||||
|
|
||||||
global_checks(&data, user_uuid).await?;
|
|
||||||
|
|
||||||
use users::dsl as udsl;
|
use users::dsl as udsl;
|
||||||
let (username, email_address): (String, String) = udsl::users
|
let (username, email_address): (String, String) = udsl::users
|
||||||
.filter(udsl::uuid.eq(user_uuid))
|
.filter(udsl::uuid.eq(user_uuid))
|
||||||
|
|
20
src/utils.rs
20
src/utils.rs
|
@ -161,26 +161,6 @@ pub async fn user_uuid_from_identifier(conn: &mut Conn, identifier: &String) ->
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn global_checks(data: &Data, user_uuid: Uuid) -> Result<(), Error> {
|
|
||||||
if data.config.instance.require_email_verification {
|
|
||||||
let mut conn = data.pool.get().await?;
|
|
||||||
|
|
||||||
use users::dsl;
|
|
||||||
let email_verified: bool = dsl::users
|
|
||||||
.filter(dsl::uuid.eq(user_uuid))
|
|
||||||
.select(dsl::email_verified)
|
|
||||||
.get_result(&mut conn)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
if !email_verified {
|
|
||||||
return Err(Error::Forbidden("server requires email verification".to_string()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn order_by_is_above<T>(mut items: Vec<T>) -> Result<Vec<T>, Error>
|
pub async fn order_by_is_above<T>(mut items: Vec<T>) -> Result<Vec<T>, Error>
|
||||||
where
|
where
|
||||||
T: HasUuid + HasIsAbove,
|
T: HasUuid + HasIsAbove,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue