use async_graphql::{SimpleObject, InputObject, Enum};
use chrono::{DateTime, Utc};
use std::collections::HashMap;
use serde::{Serialize, Deserialize};
#[derive(Enum, Clone, Debug, Copy, PartialEq, Eq)]
pub enum DatabaseStatus {
Active,
Creating,
Deleting,
Maintenance,
Archived,
}
#[derive(Enum, Clone, Debug, Copy, PartialEq, Eq)]
pub enum EncryptionAlgorithm {
Aegis256,
ChaCha20Poly1305,
Aes256Gcm,
Rsa2048,
Rsa4096,
EcdsaP256,
EcdsaP384,
}
#[derive(Enum, Clone, Debug, Copy, PartialEq, Eq)]
pub enum FieldType {
Text,
Integer,
Float,
Boolean,
DateTime,
Uuid,
Json,
Binary,
Encrypted,
}
#[derive(Enum, Clone, Debug, Copy, PartialEq, Eq)]
pub enum SortOrder {
Asc,
Desc,
}
#[derive(Enum, Clone, Debug, Copy, PartialEq, Eq)]
pub enum QueryOperator {
Eq,
Ne,
Gt,
Gte,
Lt,
Lte,
Like,
In,
NotIn,
IsNull,
IsNotNull,
}
#[derive(InputObject)]
pub struct CreateDatabaseInput {
pub name: String,
pub description: Option<String>,
pub encryption_algorithm: Option<EncryptionAlgorithm>,
pub tags: Option<Vec<String>>,
}
#[derive(InputObject)]
pub struct CreateTableInput {
pub name: String,
pub database: String,
pub fields: Vec<CreateFieldInput>,
pub primary_key: Vec<String>,
pub description: Option<String>,
}
#[derive(async_graphql::InputObject, Clone, Debug)]
pub struct CreateFieldInput {
pub name: String,
pub field_type: FieldType,
pub required: bool,
pub encrypted: bool,
pub default_value: Option<String>,
pub description: Option<String>,
pub encryption_algorithm: Option<EncryptionAlgorithm>,
}
#[derive(InputObject)]
pub struct InsertDataInput {
pub database: String,
pub table: String,
pub data: async_graphql::Json<serde_json::Value>,
}
#[derive(InputObject)]
pub struct UpdateDataInput {
pub database: String,
pub table: String,
pub id: String,
pub data: async_graphql::Json<serde_json::Value>,
}
#[derive(InputObject)]
pub struct TableQueryInput {
pub database: String,
pub table: String,
pub filter: Option<Vec<FilterConditionInput>>,
pub sort: Option<Vec<SortConditionInput>>,
pub pagination: Option<PaginationInput>,
}
#[derive(InputObject)]
pub struct QueryDataInput {
pub database: String,
pub table: String,
pub filter: Option<Vec<FilterConditionInput>>,
pub sort: Option<Vec<SortConditionInput>>,
pub pagination: Option<PaginationInput>,
}
#[derive(InputObject)]
pub struct FilterConditionInput {
pub field: String,
pub operator: QueryOperator,
pub value: Option<async_graphql::Json<serde_json::Value>>,
pub values: Option<Vec<async_graphql::Json<serde_json::Value>>>,
}
#[derive(InputObject)]
pub struct SortConditionInput {
pub field: String,
pub order: SortOrder,
}
#[derive(InputObject)]
pub struct PaginationInput {
pub page: Option<i32>,
pub page_size: Option<i32>,
pub offset: Option<i32>,
pub limit: Option<i32>,
}
#[derive(InputObject)]
pub struct RotateKeysInput {
pub database: String,
pub table: String,
pub algorithm: Option<EncryptionAlgorithm>,
pub zero_downtime: Option<bool>,
}
#[derive(SimpleObject, Clone, Debug)]
pub struct Database {
pub id: String,
pub name: String,
pub description: Option<String>,
pub status: DatabaseStatus,
pub encryption_algorithm: EncryptionAlgorithm,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub tags: Vec<String>,
pub table_count: i32,
pub storage_size_bytes: i64,
}
#[derive(SimpleObject, Clone, Debug)]
pub struct Table {
pub id: String,
pub name: String,
pub database: String,
pub description: Option<String>,
pub fields: Vec<Field>,
pub primary_key: Vec<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub record_count: i32,
pub encryption_enabled: bool,
}
#[derive(SimpleObject, Clone, Debug)]
pub struct Field {
pub name: String,
pub field_type: FieldType,
pub required: bool,
pub description: Option<String>,
pub default_value: Option<String>,
pub encryption_algorithm: Option<EncryptionAlgorithm>,
pub encrypted: bool,
}
#[derive(SimpleObject, Clone, Debug, Serialize, Deserialize)]
pub struct DataRecord {
pub id: String,
pub data: async_graphql::Json<serde_json::Value>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub encryption_metadata: Option<async_graphql::Json<serde_json::Value>>,
}
#[derive(SimpleObject, Clone, Debug, Serialize, Deserialize)]
pub struct QueryResult {
pub records: Vec<DataRecord>,
pub total_count: i32,
pub has_more: bool,
pub pagination: Option<PaginationInfo>,
}
#[derive(SimpleObject, Clone, Debug, Serialize, Deserialize)]
pub struct PaginationInfo {
pub page: i32,
pub page_size: i32,
pub total_pages: i32,
pub total_records: i32,
pub has_next: bool,
pub has_previous: bool,
}
#[derive(SimpleObject, Clone, Debug)]
pub struct KeyRotationStatus {
pub id: String,
pub status: String,
pub progress_percentage: f64,
pub started_at: Option<DateTime<Utc>>,
pub completed_at: Option<DateTime<Utc>>,
pub error_message: Option<String>,
pub records_processed: i32,
pub total_records: i32,
}
#[derive(SimpleObject, Clone, Debug)]
pub struct EncryptionMetadata {
pub field_name: String,
pub algorithm: EncryptionAlgorithm,
pub key_id: String,
pub key_version: i32,
pub encrypted_at: DateTime<Utc>,
}
#[derive(SimpleObject, Clone, Debug)]
pub struct ApiResponse<T: async_graphql::OutputType + Send + Sync> {
pub success: bool,
pub data: Option<T>,
pub error_message: Option<String>,
pub error_code: Option<String>,
}
#[derive(SimpleObject, Clone, Debug)]
pub struct HealthStatus {
pub healthy: bool,
pub services: HashMap<String, ServiceHealth>,
pub last_check: DateTime<Utc>,
}
#[derive(SimpleObject, Clone, Debug, serde::Serialize)]
pub struct ServiceHealth {
pub name: String,
pub healthy: bool,
pub response_time_ms: i32,
pub details: HashMap<String, String>,
}
#[derive(Enum, Clone, Debug, Copy, PartialEq, Eq)]
pub enum DynamicDatabaseType {
Postgresql,
Mysql,
Sqlserver,
}
#[derive(SimpleObject, Clone, Debug)]
pub struct AwsCredential {
pub access_key_id: String,
pub secret_access_key: String,
pub session_token: Option<String>,
pub expires_at: DateTime<Utc>,
pub policy: serde_json::Value,
pub role: Option<String>,
pub lease_id: String,
pub ttl: u64,
}
#[derive(SimpleObject, Clone, Debug)]
pub struct DatabaseCredential {
pub username: String,
pub password: String,
pub database_type: DynamicDatabaseType,
pub database: String,
pub connection_string: String,
pub permissions: Vec<String>,
pub expires_at: DateTime<Utc>,
pub lease_id: String,
pub ttl: u64,
pub metadata: HashMap<String, String>,
}
#[derive(InputObject)]
pub struct GenerateAwsCredentialInput {
pub path: String,
pub policy: serde_json::Value,
pub role: Option<String>,
pub ttl: Option<u64>,
}
#[derive(InputObject)]
pub struct GenerateDatabaseCredentialInput {
pub path: String,
pub database_type: DynamicDatabaseType,
pub database_url: String,
pub permissions: Vec<String>,
pub ttl: Option<u64>,
}
#[derive(InputObject)]
pub struct ConfigureAwsInput {
pub access_key_id: String,
pub secret_access_key: String,
pub region: Option<String>,
pub default_role: Option<String>,
}
#[derive(InputObject)]
pub struct RenewLeaseInput {
pub lease_id: String,
pub increment: Option<u64>,
}
#[derive(SimpleObject, Clone, Debug)]
pub struct DynamicSecretsStatus {
pub name: String,
pub initialized: bool,
pub total_secrets: u64,
pub active_leases: u64,
pub aws_configured: bool,
pub supported_databases: Vec<DynamicDatabaseType>,
pub default_ttl: u64,
pub max_ttl: u64,
pub auto_cleanup: bool,
}
#[derive(SimpleObject, Clone, Debug)]
pub struct SecretData {
pub data: serde_json::Value,
pub created_at: DateTime<Utc>,
pub updated_at: Option<DateTime<Utc>>,
pub version: i32,
pub lease: Option<LeaseInfo>,
}
#[derive(SimpleObject, Clone, Debug)]
pub struct LeaseInfo {
pub lease_id: String,
pub ttl: u64,
pub created_at: DateTime<Utc>,
pub renewable: bool,
pub max_ttl: Option<u64>,
}