gbserver/gb-api/src/router.rs
2025-02-21 12:17:52 -03:00

342 lines
No EOL
16 KiB
Rust

use axum::{
routing::{get, post},
Router,
extract::{
ws::WebSocket,
Path, State, WebSocketUpgrade,
},
response::IntoResponse,
Json,
};
use gb_core::{Result, Error, models::*};
use gb_messaging::{MessageProcessor, models::MessageEnvelope};
use std::{sync::Arc, collections::HashMap};
use tokio::sync::Mutex;
use tracing::{instrument, error};
use uuid::Uuid;
use futures_util::StreamExt;
pub struct ApiState {
pub message_processor: Mutex<MessageProcessor>,
}
pub fn create_router(message_processor: MessageProcessor) -> Router {
let state = Arc::new(ApiState {
message_processor: Mutex::new(message_processor),
});
Router::new()
// File & Document Management
.route("/files/upload", post(upload_file))
.route("/files/download", post(download))
.route("/files/copy", post(copy_file))
.route("/files/move", post(move_file))
.route("/files/delete", post(delete_file))
.route("/files/getContents", post(get_file_contents))
.route("/files/save", post(save_file))
.route("/files/createFolder", post(create_folder))
.route("/files/shareFolder", post(share_folder))
.route("/files/dirFolder", post(dir_folder))
.route("/files/list", post(get_files))
.route("/files/search", post(search_files))
.route("/files/recent", post(get_recent_files))
.route("/files/favorite", post(toggle_favorite))
.route("/files/versions", post(get_file_versions))
.route("/files/restore", post(restore_file_version))
.route("/files/permissions", post(set_file_permissions))
.route("/files/quota", get(get_storage_quota))
.route("/files/shared", get(get_shared_files))
.route("/files/sync/status", get(get_sync_status))
.route("/files/sync/start", post(start_sync))
.route("/files/sync/stop", post(stop_sync))
// Document Processing
.route("/docs/merge", post(merge_documents))
.route("/docs/convert", post(convert_document))
.route("/docs/fill", post(fill_document))
.route("/docs/export", post(export_document))
.route("/docs/import", post(import_document))
// Groups & Organizations
.route("/groups/create", post(create_group))
.route("/groups/update", put(update_group))
.route("/groups/delete", delete(delete_group))
.route("/groups/list", get(get_groups))
.route("/groups/search", post(search_groups))
.route("/groups/members", get(get_group_members))
.route("/groups/members/add", post(add_group_member))
.route("/groups/members/remove", post(remove_group_member))
.route("/groups/permissions", post(set_group_permissions))
.route("/groups/settings", post(update_group_settings))
.route("/groups/analytics", get(get_group_analytics))
.route("/groups/join/request", post(request_group_join))
.route("/groups/join/approve", post(approve_join_request))
.route("/groups/join/reject", post(reject_join_request))
.route("/groups/invites/send", post(send_group_invite))
.route("/groups/invites/list", get(list_group_invites))
// Teams & Projects
.route("/teams/create", post(create_team))
.route("/teams/update", put(update_team))
.route("/teams/delete", delete(delete_team))
.route("/teams/list", get(get_teams))
.route("/teams/search", post(search_teams))
.route("/teams/members", get(get_team_members))
.route("/teams/members/add", post(add_team_member))
.route("/teams/members/remove", post(remove_team_member))
.route("/teams/roles", post(set_team_roles))
.route("/teams/permissions", post(set_team_permissions))
.route("/teams/settings", post(update_team_settings))
.route("/teams/analytics", get(get_team_analytics))
.route("/teams/projects/create", post(create_project))
.route("/teams/projects/list", get(get_projects))
.route("/teams/projects/update", put(update_project))
.route("/teams/projects/delete", delete(delete_project))
.route("/teams/reports/generate", post(generate_team_report))
.route("/teams/activity", get(get_team_activity))
// Conversations & Real-time Communication
.route("/conversations/create", post(create_conversation))
.route("/conversations/join", post(join_conversation))
.route("/conversations/leave", post(leave_conversation))
.route("/conversations/members", get(get_conversation_members))
.route("/conversations/messages", get(get_messages))
.route("/conversations/messages/send", post(send_message))
.route("/conversations/messages/edit", put(edit_message))
.route("/conversations/messages/delete", delete(delete_message))
.route("/conversations/messages/react", post(react_to_message))
.route("/conversations/messages/pin", post(pin_message))
.route("/conversations/messages/search", post(search_messages))
.route("/conversations/calls/start", post(start_call))
.route("/conversations/calls/join", post(join_call))
.route("/conversations/calls/leave", post(leave_call))
.route("/conversations/calls/mute", post(mute_participant))
.route("/conversations/calls/unmute", post(unmute_participant))
.route("/conversations/screen/share", post(share_screen))
.route("/conversations/screen/stop", post(stop_screen_share))
.route("/conversations/recording/start", post(start_recording))
.route("/conversations/recording/stop", post(stop_recording))
.route("/conversations/whiteboard/create", post(create_whiteboard))
.route("/conversations/whiteboard/collaborate", post(collaborate_whiteboard))
// Communication Services
.route("/comm/email/send", post(send_email))
.route("/comm/email/template", post(send_template_email))
.route("/comm/email/schedule", post(schedule_email))
.route("/comm/email/cancel", post(cancel_scheduled_email))
.route("/comm/sms/send", post(send_sms))
.route("/comm/sms/bulk", post(send_bulk_sms))
.route("/comm/notifications/send", post(send_notification))
.route("/comm/notifications/preferences", post(set_notification_preferences))
.route("/comm/broadcast/send", post(send_broadcast))
.route("/comm/contacts/import", post(import_contacts))
.route("/comm/contacts/export", post(export_contacts))
.route("/comm/contacts/sync", post(sync_contacts))
.route("/comm/contacts/groups", post(manage_contact_groups))
// User Management & Authentication
.route("/users/create", post(create_user))
.route("/users/update", put(update_user))
.route("/users/delete", delete(delete_user))
.route("/users/list", get(get_users))
.route("/users/search", post(search_users))
.route("/users/profile", get(get_user_profile))
.route("/users/profile/update", put(update_profile))
.route("/users/settings", post(update_user_settings))
.route("/users/permissions", post(set_user_permissions))
.route("/users/roles", post(manage_user_roles))
.route("/users/status", post(update_user_status))
.route("/users/presence", get(get_user_presence))
.route("/users/activity", get(get_user_activity))
.route("/users/security/2fa/enable", post(enable_2fa))
.route("/users/security/2fa/disable", post(disable_2fa))
.route("/users/security/devices", get(get_registered_devices))
.route("/users/security/sessions", get(get_active_sessions))
.route("/users/notifications/settings", post(update_notification_settings))
// Calendar & Task Management
.route("/calendar/events/create", post(create_event))
.route("/calendar/events/update", put(update_event))
.route("/calendar/events/delete", delete(delete_event))
.route("/calendar/events/list", get(get_calendar_events))
.route("/calendar/events/search", post(search_events))
.route("/calendar/availability/check", post(check_availability))
.route("/calendar/schedule/meeting", post(schedule_meeting))
.route("/calendar/reminders/set", post(set_reminder))
.route("/tasks/create", post(create_task))
.route("/tasks/update", put(update_task))
.route("/tasks/delete", delete(delete_task))
.route("/tasks/list", get(get_tasks))
.route("/tasks/assign", post(assign_task))
.route("/tasks/status/update", put(update_task_status))
.route("/tasks/priority/set", post(set_task_priority))
.route("/tasks/dependencies/set", post(set_task_dependencies))
// Storage & Data Management
.route("/storage/save", post(save_to_storage))
.route("/storage/batch", post(save_batch_to_storage))
.route("/storage/json", post(save_json_to_storage))
.route("/storage/delete", delete(delete_from_storage))
.route("/storage/quota/check", get(check_storage_quota))
.route("/storage/cleanup", post(cleanup_storage))
.route("/storage/backup/create", post(create_backup))
.route("/storage/backup/restore", post(restore_backup))
.route("/storage/archive", post(archive_data))
.route("/storage/metrics", get(get_storage_metrics))
// Automation & Workflows
.route("/automation/workflow/create", post(create_workflow))
.route("/automation/workflow/update", put(update_workflow))
.route("/automation/workflow/delete", delete(delete_workflow))
.route("/automation/workflow/execute", post(execute_workflow))
.route("/automation/workflow/status", get(get_workflow_status))
.route("/automation/triggers/create", post(create_trigger))
.route("/automation/triggers/list", get(list_triggers))
.route("/automation/schedule/create", post(create_schedule))
.route("/automation/schedule/update", put(update_schedule))
.route("/automation/actions/create", post(create_action))
.route("/automation/actions/execute", post(execute_action))
.route("/automation/rules/create", post(create_rule))
.route("/automation/rules/evaluate", post(evaluate_rules))
// Analytics & Reporting
.route("/analytics/dashboard", get(get_dashboard_data))
.route("/analytics/reports/generate", post(generate_report))
.route("/analytics/reports/schedule", post(schedule_report))
.route("/analytics/metrics/collect", post(collect_metrics))
.route("/analytics/insights/generate", post(generate_insights))
.route("/analytics/trends/analyze", post(analyze_trends))
.route("/analytics/export", post(export_analytics))
// System & Administration
.route("/admin/system/status", get(get_system_status))
.route("/admin/system/metrics", get(get_system_metrics))
.route("/admin/logs/view", get(view_logs))
.route("/admin/logs/export", post(export_logs))
.route("/admin/config/update", post(update_config))
.route("/admin/maintenance/schedule", post(schedule_maintenance))
.route("/admin/backup/create", post(create_system_backup))
.route("/admin/backup/restore", post(restore_system_backup))
.route("/admin/users/manage", post(manage_system_users))
.route("/admin/roles/manage", post(manage_system_roles))
.route("/admin/quotas/manage", post(manage_quotas))
.route("/admin/licenses/manage", post(manage_licenses))
// Integration & External Services
.route("/integrations/list", get(list_integrations))
.route("/integrations/install", post(install_integration))
.route("/integrations/configure", post(configure_integration))
.route("/integrations/uninstall", post(uninstall_integration))
.route("/integrations/status", get(get_integration_status))
.route("/integrations/sync", post(sync_integration_data))
.route("/integrations/webhook/create", post(create_webhook))
.route("/integrations/webhook/manage", post(manage_webhooks))
// AI & Machine Learning
.route("/ai/analyze/text", post(analyze_text))
.route("/ai/analyze/image", post(analyze_image))
.route("/ai/generate/text", post(generate_text))
.route("/ai/generate/image", post(generate_image))
.route("/ai/translate", post(translate_content))
.route("/ai/summarize", post(summarize_content))
.route("/ai/recommend", post(get_recommendations))
.route("/ai/train/model", post(train_custom_model))
.route("/ai/predict", post(make_prediction))
// Security & Compliance
.route("/security/audit/logs", get(get_audit_logs))
.route("/security/compliance/check", post(check_compliance))
.route("/security/threats/scan", post(scan_for_threats))
.route("/security/access/review", post(review_access))
.route("/security/encryption/manage", post(manage_encryption))
.route("/security/certificates/manage", post(manage_certificates))
// Health & Monitoring
.route("/health", get(health_check))
.route("/health/detailed", get(detailed_health_check))
.route("/monitoring/status", get(get_monitoring_status))
.route("/monitoring/alerts", get(get_active_alerts))
.route("/monitoring/metrics", get(get_monitoring_metrics))
.with_state(state)
}
async fn handle_ws_connection(
ws: WebSocket,
state: Arc<ApiState>,
) -> Result<()> {
let (_sender, mut receiver) = ws.split();
while let Some(Ok(msg)) = receiver.next().await {
if let Ok(text) = msg.to_text() {
if let Ok(_envelope) = serde_json::from_str::<MessageEnvelope>(text) {
let mut processor = state.message_processor.lock().await;
if let Err(e) = processor.process_messages().await {
error!("Failed to process message: {}", e);
}
}
}
}
Ok(())
}
#[instrument(skip_all)]
async fn websocket_handler(
State(state): State<Arc<ApiState>>,
ws: WebSocketUpgrade,
) -> impl IntoResponse {
ws.on_upgrade(move |socket| async move {
let _ = handle_ws_connection(socket, state).await;
})
}
#[instrument(skip_all)]
async fn send_message(
State(state): State<Arc<ApiState>>,
Json(message): Json<Message>,
) -> Result<Json<MessageId>> {
// Clone the message before using it in envelope
let envelope = MessageEnvelope {
id: Uuid::new_v4(),
message: message.clone(), // Clone here
metadata: HashMap::new(),
};
let mut processor = state.message_processor.lock().await;
processor.add_message(message) // Use original message here
.await
.map_err(|e| Error::internal(format!("Failed to add message: {}", e)))?;
Ok(Json(MessageId(envelope.id)))
}
#[instrument(skip_all)]
async fn get_message(
State(_state): State<Arc<ApiState>>,
Path(_id): Path<Uuid>,
) -> Result<Json<Message>> {
todo!()
}
#[instrument(skip_all)]
async fn create_room(
State(_state): State<Arc<ApiState>>,
Json(_config): Json<RoomConfig>,
) -> Result<Json<Room>> {
todo!()
}
#[instrument(skip_all)]
async fn get_room(
State(_state): State<Arc<ApiState>>,
Path(_id): Path<Uuid>,
) -> Result<Json<Room>> {
todo!()
}
#[instrument(skip_all)]
async fn join_room(
State(_state): State<Arc<ApiState>>,
Path(_id): Path<Uuid>,
Json(_user_id): Json<Uuid>,
) -> Result<Json<Connection>> {
todo!()
}