Skip to main content

runique/flash/
flash_manager.rs

1//! `Message` — Axum extractor to read/write flash messages in session.
2use crate::flash::flash_struct::FlashMessage;
3use crate::utils::config::TraceResult;
4use crate::utils::{aliases::Messages, constante::session_key::session::FLASH_KEY};
5use axum::extract::FromRequestParts;
6use axum::http::{StatusCode, request::Parts};
7use tower_sessions::Session;
8
9#[derive(Clone, Debug)]
10pub struct Message {
11    pub session: Session,
12}
13
14impl<S> FromRequestParts<S> for Message
15where
16    S: Send + Sync,
17{
18    type Rejection = StatusCode;
19
20    async fn from_request_parts(parts: &mut Parts, _: &S) -> Result<Self, Self::Rejection> {
21        let session = parts
22            .extensions
23            .get::<Session>()
24            .cloned()
25            .ok_or(StatusCode::INTERNAL_SERVER_ERROR)?;
26
27        Ok(Self { session })
28    }
29}
30
31impl Message {
32    async fn push(&self, msg: FlashMessage) {
33        let mut messages = self
34            .session
35            .get::<Messages>(FLASH_KEY)
36            .await
37            .ok()
38            .flatten()
39            .unwrap_or_default();
40
41        messages.push(msg);
42        self.session.insert(FLASH_KEY, messages).await.trace(
43            crate::utils::runique_log::get_log()
44                .session
45                .as_ref()
46                .and_then(|s| s.store),
47            "flash message insert into session",
48        );
49    }
50
51    pub async fn success(&self, msg: impl Into<String>) {
52        self.push(FlashMessage::success(msg)).await
53    }
54    pub async fn error(&self, msg: impl Into<String>) {
55        self.push(FlashMessage::error(msg)).await
56    }
57    pub async fn info(&self, msg: impl Into<String>) {
58        self.push(FlashMessage::info(msg)).await
59    }
60    pub async fn warning(&self, msg: impl Into<String>) {
61        self.push(FlashMessage::warning(msg)).await
62    }
63    pub async fn get_all(&self) -> Messages {
64        let messages = self
65            .session
66            .get::<Messages>(FLASH_KEY)
67            .await
68            .ok()
69            .flatten()
70            .unwrap_or_default();
71
72        // Deletes after reading for “flash” effect
73        self.session.remove::<Messages>(FLASH_KEY).await.trace(
74            crate::utils::runique_log::get_log()
75                .session
76                .as_ref()
77                .and_then(|s| s.store),
78            "flash message remove from session",
79        );
80        messages
81    }
82}