remove surrealdb
This commit is contained in:
commit
f442689d03
|
@ -0,0 +1 @@
|
|||
/target
|
|
@ -0,0 +1,8 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="CPP_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="MarkdownSettingsMigration">
|
||||
<option name="stateVersion" value="1" />
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/hotel.iml" filepath="$PROJECT_DIR$/.idea/hotel.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,15 @@
|
|||
[package]
|
||||
name = "hotel"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
actix-web = "4"
|
||||
serde = { version = "1.0.158", features = ["derive"] }
|
||||
futures = "0.3.27"
|
||||
once_cell = "1.17.1"
|
||||
toml = "0.7.3"
|
||||
log = "0.4.17"
|
||||
simple_logger = "4.1.0"
|
|
@ -0,0 +1,31 @@
|
|||
use std::fs;
|
||||
use log::error;
|
||||
use once_cell::sync::Lazy;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
pub static CONFIG: Lazy<HotelConfig> = Lazy::new(|| {
|
||||
let config_str = match fs::read_to_string("/etc/hotel.toml") {
|
||||
Ok(str) => str,
|
||||
Err(e) => {
|
||||
error!("Unable to read config file: {}", e);
|
||||
std::process::exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
let config = match toml::from_str(&config_str) {
|
||||
Ok(cfg) => cfg,
|
||||
Err(e) => {
|
||||
error!("Unable to parse config file: {}", e);
|
||||
std::process::exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
config
|
||||
});
|
||||
|
||||
#[derive(Serialize, Debug, Deserialize)]
|
||||
pub struct HotelConfig {
|
||||
pub db_uri: String,
|
||||
pub authorized_3fa_tokens: Vec<String>
|
||||
}
|
||||
|
|
@ -0,0 +1,112 @@
|
|||
use actix_web::{error, HttpRequest};
|
||||
use actix_web::error::{JsonPayloadError, PayloadError};
|
||||
use actix_web::web::JsonConfig;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct APIErrorResponse {
|
||||
pub errors: Vec<APIError>
|
||||
}
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct APIError {
|
||||
pub code: String,
|
||||
pub message: String
|
||||
}
|
||||
|
||||
impl From<&JsonPayloadError> for APIError {
|
||||
fn from(value: &JsonPayloadError) -> Self {
|
||||
match value {
|
||||
JsonPayloadError::OverflowKnownLength { length, limit } => {
|
||||
APIError {
|
||||
code: "ERR_PAYLOAD_OVERFLOW_KNOWN_LENGTH".to_string(),
|
||||
message: format!("Payload size is bigger than allowed & content length header set. (length: {}, limit: {})", length, limit),
|
||||
}
|
||||
},
|
||||
JsonPayloadError::Overflow { limit } => {
|
||||
APIError {
|
||||
code: "ERR_PAYLOAD_OVERFLOW".to_string(),
|
||||
message: format!("Payload size is bigger than allowed but no content-length header is set. (limit: {})", limit)
|
||||
}
|
||||
},
|
||||
JsonPayloadError::ContentType => {
|
||||
APIError {
|
||||
code: "ERR_NOT_JSON".to_string(),
|
||||
message: "Content-Type header not set to expected application/json".to_string()
|
||||
}
|
||||
},
|
||||
JsonPayloadError::Deserialize(e) => {
|
||||
APIError {
|
||||
code: "ERR_JSON_DESERIALIZE".to_string(),
|
||||
message: format!("Error deserializing JSON: {}", e)
|
||||
}
|
||||
},
|
||||
JsonPayloadError::Serialize(e) => {
|
||||
APIError {
|
||||
code: "ERR_JSON_SERIALIZE".to_string(),
|
||||
message: format!("Error serializing JSON: {}", e)
|
||||
}
|
||||
},
|
||||
JsonPayloadError::Payload(e) => {
|
||||
e.into()
|
||||
},
|
||||
_ => {
|
||||
APIError {
|
||||
code: "ERR_UNKNOWN_ERROR".to_string(),
|
||||
message: "An unknown error has occured".to_string()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&PayloadError> for APIError {
|
||||
fn from(value: &PayloadError) -> Self {
|
||||
match value {
|
||||
PayloadError::Incomplete(e) => {
|
||||
APIError {
|
||||
code: "ERR_UNEXPECTED_EOF".to_string(),
|
||||
message: match e {
|
||||
None => "Payload reached EOF but was incomplete".to_string(),
|
||||
Some(e) => format!("Payload reached EOF but was incomplete: {}", e)
|
||||
}
|
||||
}
|
||||
}
|
||||
PayloadError::EncodingCorrupted => {
|
||||
APIError {
|
||||
code: "ERR_CORRUPTED_PAYLOAD".to_string(),
|
||||
message: "Payload content encoding corrupted".to_string()
|
||||
}
|
||||
}
|
||||
PayloadError::Overflow => {
|
||||
APIError {
|
||||
code: "ERR_PAYLOAD_OVERFLOW".to_string(),
|
||||
message: "Payload reached size limit".to_string()
|
||||
}
|
||||
}
|
||||
PayloadError::UnknownLength => {
|
||||
APIError {
|
||||
code: "ERR_PAYLOAD_UNKNOWN_LENGTH".to_string(),
|
||||
message: "Unable to determine payload length".to_string()
|
||||
}
|
||||
}
|
||||
PayloadError::Http2Payload(e) => {
|
||||
APIError {
|
||||
code: "ERR_HTTP2_ERROR".to_string(),
|
||||
message: format!("HTTP/2 error: {}", e)
|
||||
}
|
||||
}
|
||||
PayloadError::Io(e) => {
|
||||
APIError {
|
||||
code: "ERR_IO_ERROR".to_string(),
|
||||
message: format!("I/O error: {}", e)
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
APIError {
|
||||
code: "ERR_UNKNOWN_ERROR".to_string(),
|
||||
message: "An unknown error has occured".to_string()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
use actix_web::{App, HttpResponse, HttpServer, web, get, post, Responder, HttpRequest};
|
||||
use actix_web::web::{Data, Json, JsonConfig};
|
||||
use log::{error, Level};
|
||||
use serde::{Serialize, Deserialize};
|
||||
use crate::config::CONFIG;
|
||||
use crate::error::{APIError, APIErrorResponse};
|
||||
|
||||
pub mod config;
|
||||
pub mod error;
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct CodeRequest3FA {
|
||||
token: String,
|
||||
user: String
|
||||
}
|
||||
|
||||
#[post("/v1/3fa_code")]
|
||||
pub async fn get_3fa_code(req: Json<CodeRequest3FA>) -> HttpResponse {
|
||||
if !CONFIG.authorized_3fa_tokens.contains(&req.token) {
|
||||
return HttpResponse::Unauthorized().json(APIErrorResponse {
|
||||
errors: vec![
|
||||
APIError {
|
||||
code: "ERR_INVALID_CODEREQ_TOKEN".to_string(),
|
||||
message: "Invalid codereq token".to_string(),
|
||||
}
|
||||
],
|
||||
})
|
||||
}
|
||||
|
||||
HttpResponse::Ok().body("d")
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
async fn main() -> std::io::Result<()> {
|
||||
simple_logger::init_with_level(Level::Debug).unwrap();
|
||||
|
||||
HttpServer::new(move || {
|
||||
App::new()
|
||||
.app_data(JsonConfig::default().error_handler(|err, req| {
|
||||
let err2: APIError = (&err).into();
|
||||
actix_web::error::InternalError::from_response(
|
||||
err,
|
||||
HttpResponse::BadRequest().json(APIErrorResponse {
|
||||
errors: vec![
|
||||
err2
|
||||
],
|
||||
})
|
||||
).into()
|
||||
}))
|
||||
.service(get_3fa_code)
|
||||
})
|
||||
.bind(("127.0.0.1", 8080))?
|
||||
.run()
|
||||
.await
|
||||
}
|
Loading…
Reference in New Issue