Skip to main content

reinhardt_admin/types/
responses.rs

1//! Response types for admin panel API
2
3use crate::types::models::{ColumnInfo, FilterInfo, ModelInfo};
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7/// Response for dashboard endpoint
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct DashboardResponse {
10	/// Site name
11	pub site_name: String,
12	/// URL prefix
13	pub url_prefix: String,
14	/// Registered models with their metadata
15	pub models: Vec<ModelInfo>,
16	/// CSRF token for mutation requests (POST, PUT, DELETE)
17	#[serde(skip_serializing_if = "Option::is_none")]
18	pub csrf_token: Option<String>,
19}
20
21/// Response for list endpoint
22#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct ListResponse {
24	/// Model name
25	pub model_name: String,
26	/// Total count of items
27	pub count: u64,
28	/// Current page
29	pub page: u64,
30	/// Items per page
31	pub page_size: u64,
32	/// Total pages
33	pub total_pages: u64,
34	/// Items on this page
35	pub results: Vec<HashMap<String, serde_json::Value>>,
36	/// Available filters metadata (optional)
37	#[serde(skip_serializing_if = "Option::is_none")]
38	pub available_filters: Option<Vec<FilterInfo>>,
39	/// Column definitions for list display
40	#[serde(skip_serializing_if = "Option::is_none")]
41	pub columns: Option<Vec<ColumnInfo>>,
42}
43
44/// Response for detail endpoint
45#[derive(Debug, Clone, Serialize, Deserialize)]
46pub struct DetailResponse {
47	/// Model name
48	pub model_name: String,
49	/// Item data
50	pub data: HashMap<String, serde_json::Value>,
51}
52
53/// Response for create/update/delete
54#[derive(Debug, Clone, Serialize, Deserialize)]
55pub struct MutationResponse {
56	/// Success status
57	pub success: bool,
58	/// Message
59	pub message: String,
60	/// Affected rows (for update/delete)
61	#[serde(skip_serializing_if = "Option::is_none")]
62	pub affected: Option<u64>,
63	/// Created/Updated data (for create/update)
64	#[serde(skip_serializing_if = "Option::is_none")]
65	pub data: Option<HashMap<String, serde_json::Value>>,
66}
67
68/// Response for bulk delete
69#[derive(Debug, Clone, Serialize, Deserialize)]
70pub struct BulkDeleteResponse {
71	/// Success status
72	pub success: bool,
73	/// Number of deleted items
74	pub deleted: u64,
75	/// Message
76	pub message: String,
77}
78
79/// Response for import endpoint
80#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct ImportResponse {
82	/// Success status
83	pub success: bool,
84	/// Number of imported records
85	pub imported: u64,
86	/// Number of updated records
87	pub updated: u64,
88	/// Number of skipped records
89	pub skipped: u64,
90	/// Number of failed records
91	pub failed: u64,
92	/// Summary message
93	pub message: String,
94	/// Error messages (if any)
95	#[serde(skip_serializing_if = "Option::is_none")]
96	pub errors: Option<Vec<String>>,
97}
98
99/// Response for export endpoint
100#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct ExportResponse {
102	/// Exported data (binary)
103	#[serde(with = "serde_bytes")]
104	pub data: Vec<u8>,
105	/// Filename for download
106	pub filename: String,
107	/// Content type (e.g., "application/json", "text/csv")
108	pub content_type: String,
109}
110
111/// Response for fields endpoint
112#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct FieldsResponse {
114	/// Model name
115	pub model_name: String,
116	/// Field definitions for dynamic form generation
117	pub fields: Vec<crate::types::models::FieldInfo>,
118	/// Existing field values (for edit forms)
119	/// None for create forms, Some(values) for edit forms
120	#[serde(skip_serializing_if = "Option::is_none")]
121	pub values: Option<HashMap<String, serde_json::Value>>,
122}