✨ Adds gotify notifications
This commit is contained in:
+58
-14
@@ -1,9 +1,10 @@
|
||||
use crate::models::AppState;
|
||||
use crate::models::alert::Alert;
|
||||
use crate::models::hit::Hit;
|
||||
use crate::models::tracker::Tracker;
|
||||
use crate::schema::{hits, trackers};
|
||||
use chrono::Utc;
|
||||
use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl};
|
||||
use diesel::{ExpressionMethods, QueryDsl, QueryResult, RunQueryDsl};
|
||||
use rocket::fs::NamedFile;
|
||||
use rocket::http::Status;
|
||||
use rocket::request::{FromRequest, Outcome};
|
||||
@@ -51,33 +52,76 @@ pub async fn get(id: &str, meta: ReqMeta, state: &State<AppState>) -> Result<Nam
|
||||
None => return Err(Status::BadRequest),
|
||||
};
|
||||
|
||||
let mut tracker: Option<Tracker> = None;
|
||||
let mut result: Option<QueryResult<usize>> = None;
|
||||
let now = Utc::now().naive_utc();
|
||||
|
||||
{
|
||||
let mut db = state.db.lock().unwrap();
|
||||
|
||||
let result = trackers::dsl::trackers
|
||||
let tresult = trackers::dsl::trackers
|
||||
.filter(trackers::id.eq(id))
|
||||
.first::<Tracker>(&mut *db)
|
||||
.ok();
|
||||
|
||||
if result.is_none() {
|
||||
if tresult.is_none() {
|
||||
return Err(Status::NotFound);
|
||||
}
|
||||
tracker = Some(tresult.unwrap());
|
||||
|
||||
let result = diesel::insert_into(hits::table)
|
||||
.values(&Hit {
|
||||
id: Uuid::new_v4(),
|
||||
tracker_id: id,
|
||||
ip: meta.ip,
|
||||
agent: meta.agent,
|
||||
language: meta.language,
|
||||
created_at: Utc::now().naive_utc(),
|
||||
})
|
||||
.execute(&mut *db);
|
||||
if result.is_err() {
|
||||
result = Some(
|
||||
diesel::insert_into(hits::table)
|
||||
.values(&Hit {
|
||||
id: Uuid::new_v4(),
|
||||
tracker_id: id,
|
||||
ip: meta.ip.clone(),
|
||||
agent: meta.agent.clone(),
|
||||
language: meta.language.clone(),
|
||||
created_at: now,
|
||||
})
|
||||
.execute(&mut *db),
|
||||
);
|
||||
if result.as_ref().unwrap().is_err() {
|
||||
error!("Failed to insert hit: {:?}", result);
|
||||
}
|
||||
}
|
||||
|
||||
let url = state.gotify.url.clone();
|
||||
let token = state.gotify.token.clone();
|
||||
|
||||
let tracker = tracker.unwrap();
|
||||
let tracker_name = tracker.name.clone().unwrap_or("unknown".to_string());
|
||||
let tracker_id = tracker.id.clone();
|
||||
|
||||
if state.gotify.enabled {
|
||||
let alert = Alert {
|
||||
title: format!("Tracker '{tracker_name}' ({tracker_id}) has been hit"),
|
||||
message: format!(
|
||||
"IP: {}\nAgent: {}\nLanguage: {}\nCreated at: {}\nError: {}",
|
||||
meta.ip,
|
||||
meta.agent.unwrap_or("unknown".to_string()),
|
||||
meta.language.unwrap_or("unknown".to_string()),
|
||||
now.to_string(),
|
||||
result
|
||||
.unwrap()
|
||||
.err()
|
||||
.map(|e| e.to_string())
|
||||
.unwrap_or_else(|| "none".to_string()),
|
||||
),
|
||||
priority: 5,
|
||||
};
|
||||
|
||||
let client = reqwest::Client::new();
|
||||
let result = client
|
||||
.post(format!("{url}/message?token={token}"))
|
||||
.json(&alert)
|
||||
.send()
|
||||
.await;
|
||||
if result.is_err() {
|
||||
error!("Failed to send a alert to {url}: {result:?}");
|
||||
}
|
||||
}
|
||||
|
||||
NamedFile::open(Path::new(state.static_dir.as_str()).join("image.png"))
|
||||
.await
|
||||
.map_err(|_| Status::InternalServerError)
|
||||
|
||||
Reference in New Issue
Block a user