use axum::{
body::Body,
extract::{State, Query},
http::{HeaderValue, StatusCode},
response::{IntoResponse, Response},
Router,
};
use tower_http::cors::{Any, CorsLayer};
use crate::db;
#[path = "validate.rs"]
mod validate;
use base64::{Engine as _, engine::general_purpose::STANDARD};
use image::GenericImageView;
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use std::num::NonZeroUsize;
use lru::LruCache;
use tokio::sync::Semaphore;
fn get_api_key() -> String {
std::env::var("MOMENTRY_API_KEY")
.expect("MOMENTRY_API_KEY environment variable must be set")
}
pub fn get_output_dir() -> std::path::PathBuf {
std::env::var_os("MOMENTRY_OUTPUT_DIR")
.map(std::path::PathBuf::from)
.or_else(|| {
std::env::current_exe()
.ok()
.and_then(|p| p.parent().map(|d| d.join("output")))
})
.unwrap_or_else(|| std::path::PathBuf::from("output"))
}
fn get_data_dir() -> std::path::PathBuf {
std::env::var_os("MOMENTRY_DATA_DIR")
.map(std::path::PathBuf::from)
.or_else(|| {
std::env::current_exe()
.ok()
.and_then(|p| p.parent().map(|d| d.join("data")))
})
.unwrap_or_else(|| std::path::PathBuf::from("data"))
}
fn get_admin_config_path() -> std::path::PathBuf {
std::env::var_os("MOMENTRY_ADMIN_CONFIG")
.map(std::path::PathBuf::from)
.or_else(|| {
std::env::current_exe()
.ok()
.and_then(|p| p.parent().map(|d| d.join("config/admin_config.json")))
})
.unwrap_or_else(|| std::path::PathBuf::from("config/admin_config.json"))
}
const CORE_API: &str = "http://127.0.0.1:3002";
const MARKBASE_API: &str = "http://127.0.0.1:11438";
const DIST_DIR: &str = "../dist";
static FACE_THUMB_CACHE: Mutex