69 lines
1.9 KiB
Rust
69 lines
1.9 KiB
Rust
use axum::{
|
|
extract::Path,
|
|
response::IntoResponse,
|
|
routing::{get, post},
|
|
Json, Router,
|
|
};
|
|
use serde_json::json;
|
|
use std::sync::Arc;
|
|
|
|
use crate::{
|
|
content::{
|
|
collection::CollectionRepository,
|
|
site::{CreateSiteData, SiteRepository, UpdateSiteData},
|
|
},
|
|
database::Database,
|
|
http::{error::ApiError, json::JsonBody, session::RequireUser},
|
|
state::AppState,
|
|
};
|
|
|
|
async fn get_site<Repo: SiteRepository>(
|
|
repository: Repo,
|
|
Path(name): Path<String>,
|
|
) -> Result<impl IntoResponse, ApiError<'static>> {
|
|
Ok(Json(repository.get_site_by_name(&name).await?))
|
|
}
|
|
|
|
async fn create_site<Repo: SiteRepository + CollectionRepository>(
|
|
repository: Repo,
|
|
RequireUser(user): RequireUser,
|
|
JsonBody(options): JsonBody<CreateSiteData>,
|
|
) -> Result<impl IntoResponse, ApiError<'static>> {
|
|
let id = repository.create_site(&user.id, options).await?;
|
|
|
|
// Create default content for the new site
|
|
repository.create_default_collections(&id).await?;
|
|
|
|
Ok(Json(json!({"ok": true})))
|
|
}
|
|
|
|
async fn update_site<Repo: SiteRepository>(
|
|
repository: Repo,
|
|
Path(name): Path<String>,
|
|
RequireUser(user): RequireUser,
|
|
JsonBody(options): JsonBody<UpdateSiteData>,
|
|
) -> Result<impl IntoResponse, ApiError<'static>> {
|
|
repository.update_site(&user.id, &name, options).await?;
|
|
Ok(Json(json!({"ok": true})))
|
|
}
|
|
|
|
async fn delete_site<Repo: SiteRepository>(
|
|
repository: Repo,
|
|
Path(name): Path<String>,
|
|
RequireUser(user): RequireUser,
|
|
) -> Result<impl IntoResponse, ApiError<'static>> {
|
|
repository.delete_site(&user.id, &name, true).await?;
|
|
Ok(Json(json!({"ok": true})))
|
|
}
|
|
|
|
pub fn router() -> Router<Arc<AppState>> {
|
|
Router::new()
|
|
.route("/", post(create_site::<Database>))
|
|
.route(
|
|
"/:name",
|
|
get(get_site::<Database>)
|
|
.put(update_site::<Database>)
|
|
.delete(delete_site::<Database>),
|
|
)
|
|
}
|