use crate::api::models::pagination::Pagination;
use crate::api::models::users::UserResponse;
use crate::types::UserId;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_with::rust::double_option;
use utoipa::{IntoParams, ToSchema};
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct OrganizationCreate {
#[schema(example = "acme.com")]
pub name: String,
#[schema(example = "admin@acme.com")]
pub email: String,
#[schema(example = "Acme Corporation")]
pub display_name: Option<String>,
#[schema(value_type = Option<String>, format = "uuid")]
pub owner_id: Option<UserId>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct OrganizationUpdate {
pub display_name: Option<String>,
pub email: Option<String>,
pub batch_notifications_enabled: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none", with = "double_option")]
pub low_balance_threshold: Option<Option<f32>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct OrganizationResponse {
#[serde(flatten)]
pub user: UserResponse,
#[serde(skip_serializing_if = "Option::is_none")]
pub member_count: Option<i64>,
}
impl OrganizationResponse {
pub fn from_user(user: UserResponse) -> Self {
Self { user, member_count: None }
}
pub fn with_member_count(mut self, count: i64) -> Self {
self.member_count = Some(count);
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct OrganizationMemberResponse {
#[schema(value_type = String, format = "uuid")]
pub id: uuid::Uuid,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<UserResponse>,
pub role: String,
pub status: String,
pub created_at: DateTime<Utc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invite_email: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct InviteMemberRequest {
#[schema(example = "newuser@example.com")]
pub email: String,
pub role: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct InviteMemberResponse {
#[schema(value_type = String, format = "uuid")]
pub id: uuid::Uuid,
pub email: String,
pub role: String,
pub status: String,
pub created_at: DateTime<Utc>,
pub expires_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct InviteDetailsResponse {
pub org_name: String,
pub role: String,
pub inviter_name: Option<String>,
pub expires_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct AddMemberRequest {
#[schema(value_type = String, format = "uuid")]
pub user_id: UserId,
pub role: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct UpdateMemberRoleRequest {
pub role: String,
}
#[derive(Debug, Deserialize, IntoParams, ToSchema)]
pub struct ListOrganizationsQuery {
#[serde(flatten)]
#[param(inline)]
pub pagination: Pagination,
pub search: Option<String>,
pub include: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct SetActiveOrganizationRequest {
#[schema(value_type = Option<String>, format = "uuid")]
pub organization_id: Option<UserId>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct SetActiveOrganizationResponse {
#[schema(value_type = Option<String>, format = "uuid")]
pub active_organization_id: Option<UserId>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct OrganizationSummary {
#[schema(value_type = String, format = "uuid")]
pub id: UserId,
pub name: String,
pub role: String,
}