guestbook.rs/src/routes.rs

55 lines
1.9 KiB
Rust
Raw Normal View History

use std::sync::Arc;
2023-12-23 04:06:36 +01:00
use axum::{Json, Form, Router, routing::{put, post, get}, extract::{State, Query}, response::Redirect};
use crate::{notifications::NotificationProcessor, model::{Page, PageOptions, PageInsertion}, storage::StorageStrategy, config::ConfigOverrides};
pub fn create_router_with_app_routes(state: Context) -> Router {
Router::new()
.route("/api", get(get_suggestion))
.route("/api", post(send_suggestion_form))
.route("/api", put(send_suggestion_json))
2024-01-02 03:12:29 +01:00
.with_state(Arc::new(state))
}
pub struct Context {
providers: Vec<Box<dyn NotificationProcessor<Page>>>,
storage: Box<dyn StorageStrategy<Page>>,
overrides: ConfigOverrides,
}
impl Context {
pub fn new(storage: Box<dyn StorageStrategy<Page>>, overrides: ConfigOverrides) -> Self {
2024-01-02 03:12:29 +01:00
Context { providers: Vec::new(), storage, overrides }
}
2024-01-02 03:12:29 +01:00
pub fn register(&mut self, notifier: Box<dyn NotificationProcessor<Page>>) {
self.providers.push(notifier);
}
}
2024-01-02 03:12:29 +01:00
async fn send_suggestion(payload: PageInsertion, state: Arc<Context>) -> Result<Redirect, String> {
let page = payload.convert(&state.overrides);
for p in state.providers.iter() {
p.process(&page).await;
}
match state.storage.archive(page).await {
2023-12-23 04:06:36 +01:00
Ok(()) => Ok(Redirect::to("/")),
Err(e) => Err(e.to_string()),
}
}
2024-01-02 03:12:29 +01:00
async fn send_suggestion_json(State(state): State<Arc<Context>>, Json(payload): Json<PageInsertion>) -> Result<Redirect, String> { send_suggestion(payload, state).await }
async fn send_suggestion_form(State(state): State<Arc<Context>>, Form(payload): Form<PageInsertion>) -> Result<Redirect, String> { send_suggestion(payload, state).await }
2024-01-02 03:12:29 +01:00
async fn get_suggestion(State(state): State<Arc<Context>>, Query(page): Query<PageOptions>) -> Result<Json<Vec<Page>>, String> {
let offset = page.offset.unwrap_or(0);
let limit = std::cmp::min(page.limit.unwrap_or(20), 20);
2024-01-02 03:12:29 +01:00
match state.storage.extract(offset, limit).await {
Ok(x) => Ok(Json(x)),
Err(e) => Err(e.to_string()),
}
}