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	/// Header text shown in admin navigation bar
13	pub site_header: String,
14	/// URL prefix
15	pub url_prefix: String,
16	/// Login page URL for authentication redirects
17	pub login_url: String,
18	/// Logout page URL for sign-out redirects
19	pub logout_url: String,
20	/// Registered models with their metadata
21	pub models: Vec<ModelInfo>,
22	/// CSRF token for mutation requests (POST, PUT, DELETE)
23	#[serde(skip_serializing_if = "Option::is_none")]
24	pub csrf_token: Option<String>,
25}
26
27/// Response for list endpoint
28#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct ListResponse {
30	/// Model name
31	pub model_name: String,
32	/// Total count of items
33	pub count: u64,
34	/// Current page
35	pub page: u64,
36	/// Items per page
37	pub page_size: u64,
38	/// Total pages
39	pub total_pages: u64,
40	/// Items on this page
41	pub results: Vec<HashMap<String, serde_json::Value>>,
42	/// Available filters metadata (optional)
43	#[serde(skip_serializing_if = "Option::is_none")]
44	pub available_filters: Option<Vec<FilterInfo>>,
45	/// Column definitions for list display
46	#[serde(skip_serializing_if = "Option::is_none")]
47	pub columns: Option<Vec<ColumnInfo>>,
48}
49
50/// Response for detail endpoint
51#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct DetailResponse {
53	/// Model name
54	pub model_name: String,
55	/// Item data
56	pub data: HashMap<String, serde_json::Value>,
57}
58
59/// Response for create/update/delete
60#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct MutationResponse {
62	/// Success status
63	pub success: bool,
64	/// Message
65	pub message: String,
66	/// Affected rows (for update/delete)
67	#[serde(skip_serializing_if = "Option::is_none")]
68	pub affected: Option<u64>,
69	/// Created/Updated data (for create/update)
70	#[serde(skip_serializing_if = "Option::is_none")]
71	pub data: Option<HashMap<String, serde_json::Value>>,
72}
73
74/// Response for bulk delete
75#[derive(Debug, Clone, Serialize, Deserialize)]
76pub struct BulkDeleteResponse {
77	/// Success status
78	pub success: bool,
79	/// Number of deleted items
80	pub deleted: u64,
81	/// Message
82	pub message: String,
83}
84
85/// Response for import endpoint
86#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct ImportResponse {
88	/// Success status
89	pub success: bool,
90	/// Number of imported records
91	pub imported: u64,
92	/// Number of updated records
93	pub updated: u64,
94	/// Number of skipped records
95	pub skipped: u64,
96	/// Number of failed records
97	pub failed: u64,
98	/// Summary message
99	pub message: String,
100	/// Error messages (if any)
101	#[serde(skip_serializing_if = "Option::is_none")]
102	pub errors: Option<Vec<String>>,
103}
104
105/// Response for export endpoint
106#[derive(Debug, Clone, Serialize, Deserialize)]
107#[non_exhaustive]
108pub struct ExportResponse {
109	/// Exported data (binary)
110	#[serde(with = "serde_bytes")]
111	pub data: Vec<u8>,
112	/// Filename for download
113	pub filename: String,
114	/// Content type (e.g., "application/json", "text/csv")
115	pub content_type: String,
116	/// Whether the export was truncated due to exceeding the maximum record limit
117	pub truncated: bool,
118	/// Total number of records in the table (before truncation)
119	#[serde(skip_serializing_if = "Option::is_none")]
120	pub total_count: Option<u64>,
121}
122
123/// Response for admin login endpoint
124#[derive(Debug, Clone, Serialize, Deserialize)]
125pub struct LoginResponse {
126	/// JWT token for subsequent authenticated requests
127	pub token: String,
128	/// Authenticated username
129	pub username: String,
130	/// User's primary key as string
131	pub user_id: String,
132	/// Whether the user is staff
133	pub is_staff: bool,
134	/// Whether the user is a superuser
135	pub is_superuser: bool,
136}
137
138/// Response for fields endpoint
139#[derive(Debug, Clone, Serialize, Deserialize)]
140pub struct FieldsResponse {
141	/// Model name
142	pub model_name: String,
143	/// Field definitions for dynamic form generation
144	pub fields: Vec<crate::types::models::FieldInfo>,
145	/// Existing field values (for edit forms)
146	/// None for create forms, Some(values) for edit forms
147	#[serde(skip_serializing_if = "Option::is_none")]
148	pub values: Option<HashMap<String, serde_json::Value>>,
149}