tdm_server_rust/dev/
error_repo.rs1use chrono::{DateTime, Utc};
4use serde::Serialize;
5use sqlx::FromRow;
6
7#[derive(Debug, Clone, Serialize, FromRow)]
9pub struct DevErrorRow {
10 pub id: i64,
12 pub created_at: DateTime<Utc>,
14 pub kind: String,
16 pub method: Option<String>,
18 pub path: Option<String>,
20 pub status: Option<i16>,
22 pub code: Option<i32>,
24 pub msg: String,
26 pub member_id: Option<i32>,
28 pub otel_trace_id: Option<String>,
30}
31
32#[derive(Debug, Clone)]
34pub struct DevErrorInsert {
35 pub kind: &'static str,
37 pub method: Option<String>,
39 pub path: Option<String>,
41 pub status: Option<i16>,
43 pub code: Option<i32>,
45 pub msg: String,
47 pub member_id: Option<i32>,
49 pub otel_trace_id: Option<String>,
51}
52
53#[tracing::instrument(skip_all, level = "info", fields(kind = row.kind))]
55pub async fn insert(pool: &sqlx::MySqlPool, row: DevErrorInsert) -> sqlx::Result<()> {
56 sqlx::query(
57 r#"INSERT INTO dev_error_log
58 (kind, method, path, status, code, msg, member_id, otel_trace_id)
59 VALUES (?, ?, ?, ?, ?, ?, ?, ?)"#,
60 )
61 .bind(row.kind)
62 .bind(row.method)
63 .bind(row.path)
64 .bind(row.status)
65 .bind(row.code)
66 .bind(row.msg)
67 .bind(row.member_id)
68 .bind(row.otel_trace_id)
69 .execute(pool)
70 .await?;
71 Ok(())
72}
73
74#[tracing::instrument(skip_all, level = "info")]
76pub async fn list_recent(
77 pool: &sqlx::MySqlPool,
78 limit: i64,
79) -> sqlx::Result<Vec<DevErrorRow>> {
80 sqlx::query_as::<_, DevErrorRow>(
81 r#"SELECT id, created_at, kind, method, path, status, code, msg, member_id, otel_trace_id
82 FROM dev_error_log ORDER BY id DESC LIMIT ?"#,
83 )
84 .bind(limit)
85 .fetch_all(pool)
86 .await
87}
88
89#[tracing::instrument(skip_all, level = "info")]
91pub async fn find_by_id(pool: &sqlx::MySqlPool, id: i64) -> sqlx::Result<Option<DevErrorRow>> {
92 sqlx::query_as::<_, DevErrorRow>(
93 r#"SELECT id, created_at, kind, method, path, status, code, msg, member_id, otel_trace_id
94 FROM dev_error_log WHERE id = ?"#,
95 )
96 .bind(id)
97 .fetch_optional(pool)
98 .await
99}