1use crate::model::{id::Id, user::User};
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use thiserror::Error;
6
7#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Copy)]
8#[serde(rename_all = "camelCase")]
9pub enum LogLevel {
10 Error,
11 Warning,
12 Info,
13 Success,
14 Debug,
15}
16
17#[derive(Debug, Error, Clone)]
18#[error("invalid log level")]
19pub struct ParseLogLevelError {
20 _priv: (),
21}
22
23impl std::str::FromStr for LogLevel {
24 type Err = ParseLogLevelError;
25
26 fn from_str(s: &str) -> Result<LogLevel, Self::Err> {
27 match s {
28 "error" | "Error" => Ok(LogLevel::Error),
29 "warning" | "Warning" => Ok(LogLevel::Warning),
30 "info" | "Info" => Ok(LogLevel::Info),
31 "success" | "Success" => Ok(LogLevel::Success),
32 "debug" | "Debug" => Ok(LogLevel::Debug),
33 _ => Err(ParseLogLevelError { _priv: () }),
34 }
35 }
36}
37
38#[derive(Serialize, Deserialize, Debug, Clone)]
39#[serde(rename_all = "camelCase")]
40pub struct Log {
41 pub id: Id<Log>,
42 pub created_at: DateTime<Utc>,
43 pub domain: Vec<String>,
44 pub level: LogLevel,
45 pub worker: String,
46 pub machine: String,
47 pub message: String,
48 pub data: serde_json::Map<String, serde_json::Value>,
49}
50
51impl_entity!(Log);
52
53#[derive(Serialize, Deserialize, Debug, Clone)]
54#[serde(rename_all = "camelCase")]
55pub struct ModerationLog {
56 pub id: Id<ModerationLog>,
57 pub created_at: DateTime<Utc>,
58 pub user_id: Id<User>,
59 pub user: User,
60 #[serde(rename = "type")]
61 pub type_: String,
62 pub info: serde_json::Map<String, serde_json::Value>,
63}
64
65impl_entity!(ModerationLog);