runique/flash/
flash_manager.rs1use 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 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}