fix(rust): match main's drizzle-style camelCase response shape
Frontend reads main's drizzle-generated camelCase fields (siteId,
accessToken, oauthProvider, etc.) and a nested `site: {...}` on each
account row. Rust models were serializing snake_case with no nested
site, so PUT /api/sites/undefined/disabled-models 404s, account.site?.id
is undefined everywhere, and similar shape mismatches break Accounts,
Sites, Tokens, and Dashboard pages.
- Add #[serde(rename_all = "camelCase")] to every model struct in
src/db/models/* (Account, AccountToken, Site, User, Event,
TokenRoute, RouteChannel, BackgroundTask, DownstreamApiKey,
Organization/Member/Invitation, SiteAnnouncement)
- list_accounts now nests `site: {...}` per row, matching main's
`{...account, site: {...}}` shape from accountsOverviewService
- admin user-detail endpoint emits camelCase keys (totalRequests,
totalCost, last7DaysCost, recentLogs, promptTokens, completionTokens,
totalTokens, createdAt) to match the frontend
- routes refresh endpoint now emits both affected_routes and
affectedRoutes for forward compat
Co-Authored-By: Kiro <noreply@kiro.dev>
This commit is contained in:
@@ -3,6 +3,7 @@ use sqlx::FromRow;
|
||||
|
||||
/// Represents an account bound to a site.
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct Account {
|
||||
pub id: i64,
|
||||
pub site_id: i64,
|
||||
@@ -30,6 +31,7 @@ pub struct Account {
|
||||
|
||||
/// Represents an account token (from account_tokens table).
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct AccountToken {
|
||||
pub id: i64,
|
||||
pub account_id: i64,
|
||||
|
||||
@@ -3,6 +3,7 @@ use sqlx::FromRow;
|
||||
|
||||
/// Background task for tracking async operations (deployments, syncs, etc.)
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct BackgroundTask {
|
||||
pub id: String,
|
||||
pub task_type: String,
|
||||
|
||||
@@ -3,6 +3,7 @@ use sqlx::FromRow;
|
||||
|
||||
/// Represents a downstream API key for external consumers.
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct DownstreamApiKey {
|
||||
pub id: i64,
|
||||
pub name: String,
|
||||
|
||||
@@ -3,6 +3,7 @@ use sqlx::FromRow;
|
||||
|
||||
/// System event for admin notifications.
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct Event {
|
||||
pub id: i64,
|
||||
#[sqlx(rename = "type")]
|
||||
|
||||
@@ -3,6 +3,7 @@ use sqlx::FromRow;
|
||||
|
||||
/// Organization for multi-tenant setup.
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct Organization {
|
||||
pub id: i64,
|
||||
pub name: String,
|
||||
@@ -15,6 +16,7 @@ pub struct Organization {
|
||||
|
||||
/// Member of an organization.
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct OrganizationMember {
|
||||
pub id: i64,
|
||||
pub org_id: i64,
|
||||
@@ -26,6 +28,7 @@ pub struct OrganizationMember {
|
||||
|
||||
/// Invitation to join an organization.
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct Invitation {
|
||||
pub id: i64,
|
||||
pub org_id: i64,
|
||||
|
||||
@@ -3,6 +3,7 @@ use sqlx::FromRow;
|
||||
|
||||
/// Represents a route channel linking routes, accounts, and tokens.
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct RouteChannel {
|
||||
pub id: i64,
|
||||
pub route_id: i64,
|
||||
|
||||
@@ -3,6 +3,7 @@ use sqlx::FromRow;
|
||||
|
||||
/// Represents a site (AI provider endpoint).
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct Site {
|
||||
pub id: i64,
|
||||
pub name: String,
|
||||
|
||||
@@ -3,6 +3,7 @@ use sqlx::FromRow;
|
||||
|
||||
/// Site-level announcements (notifications from upstream providers).
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct SiteAnnouncement {
|
||||
pub id: i64,
|
||||
pub site_id: i64,
|
||||
|
||||
@@ -3,6 +3,7 @@ use sqlx::FromRow;
|
||||
|
||||
/// Represents a token route (model routing rule).
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct TokenRoute {
|
||||
pub id: i64,
|
||||
pub model_pattern: String,
|
||||
|
||||
@@ -3,6 +3,7 @@ use sqlx::FromRow;
|
||||
|
||||
/// A platform user (admin or regular).
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct User {
|
||||
pub id: i64,
|
||||
pub username: String,
|
||||
|
||||
Reference in New Issue
Block a user