use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::PathBuf;
use std::time::{Duration, SystemTime};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkflowConfig {
pub enable_task_delegation: bool,
pub enable_report_generation: bool,
pub enable_data_export: bool,
pub enable_notifications: bool,
pub enable_approval_workflows: bool,
pub enable_audit_trails: bool,
pub export_directory: PathBuf,
pub report_directory: PathBuf,
pub audit_directory: PathBuf,
pub max_concurrent_tasks: usize,
pub task_timeout: Duration,
}
impl Default for WorkflowConfig {
fn default() -> Self {
Self {
enable_task_delegation: true,
enable_report_generation: true,
enable_data_export: true,
enable_notifications: true,
enable_approval_workflows: true,
enable_audit_trails: true,
export_directory: PathBuf::from("./exports"),
report_directory: PathBuf::from("./reports"),
audit_directory: PathBuf::from("./audit"),
max_concurrent_tasks: 10,
task_timeout: Duration::from_secs(300),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskRequest {
pub title: String,
pub description: String,
pub task_type: TaskType,
pub assignee: String,
pub deadline: Option<SystemTime>,
pub priority: TaskPriority,
pub dependencies: Vec<String>,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Task {
pub id: TaskId,
pub request: TaskRequest,
pub status: TaskStatus,
pub created_at: SystemTime,
pub updated_at: SystemTime,
pub assigned_to: String,
pub deadline: Option<SystemTime>,
pub priority: TaskPriority,
pub dependencies: Vec<String>,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskId(pub String);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TaskType {
DataAnalysis,
ReportGeneration,
DataValidation,
QueryOptimization,
KnowledgeUpdate,
UserSupport,
SystemMaintenance,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TaskStatus {
Pending,
InProgress,
Completed,
Failed,
Cancelled,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TaskPriority {
Low,
Medium,
High,
Critical,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReportRequest {
pub title: String,
pub report_type: ReportType,
pub format: ReportFormat,
pub time_range: TimeRange,
pub filters: HashMap<String, String>,
pub include_charts: bool,
pub include_raw_data: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReportResult {
pub title: String,
pub format: ReportFormat,
pub file_path: PathBuf,
pub generated_at: SystemTime,
pub size_bytes: u64,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ReportType {
ConversationSummary,
PerformanceMetrics,
UsageAnalytics,
ErrorReport,
UserSatisfaction,
QueryAnalysis,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ReportFormat {
PDF,
HTML,
CSV,
JSON,
Excel,
Markdown,
}
impl std::fmt::Display for ReportFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ReportFormat::PDF => write!(f, "PDF"),
ReportFormat::HTML => write!(f, "HTML"),
ReportFormat::CSV => write!(f, "CSV"),
ReportFormat::JSON => write!(f, "JSON"),
ReportFormat::Excel => write!(f, "Excel"),
ReportFormat::Markdown => write!(f, "Markdown"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExportRequest {
pub data_type: DataType,
pub format: ExportFormat,
pub time_range: TimeRange,
pub filters: HashMap<String, String>,
pub compression: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExportResult {
pub filename: String,
pub format: ExportFormat,
pub file_path: PathBuf,
pub exported_at: SystemTime,
pub record_count: usize,
pub size_bytes: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DataType {
Messages,
Sessions,
Analytics,
AuditLogs,
UserProfiles,
QueryHistory,
All,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ExportFormat {
JSON,
CSV,
Parquet,
Avro,
XML,
}
impl std::fmt::Display for ExportFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ExportFormat::JSON => write!(f, "JSON"),
ExportFormat::CSV => write!(f, "CSV"),
ExportFormat::Parquet => write!(f, "Parquet"),
ExportFormat::Avro => write!(f, "Avro"),
ExportFormat::XML => write!(f, "XML"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApprovalRequest {
pub id: Option<ApprovalId>,
pub title: String,
pub description: String,
pub request_type: ApprovalType,
pub requester: String,
pub approvers: Vec<String>,
pub required_approvals: usize,
pub status: ApprovalStatus,
pub submitted_at: Option<SystemTime>,
pub processed_at: Option<SystemTime>,
pub decision: Option<ApprovalDecision>,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ApprovalId(pub String);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApprovalDecision {
pub approved: bool,
pub approver: String,
pub comments: String,
pub decided_at: SystemTime,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ApprovalType {
DataAccess,
FeatureActivation,
ConfigurationChange,
UserPermission,
DataExport,
SystemUpgrade,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ApprovalStatus {
Pending,
Approved,
Rejected,
Expired,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Notification {
pub recipient: String,
pub notification_type: NotificationType,
pub title: String,
pub message: String,
pub priority: NotificationPriority,
pub channel: NotificationChannel,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum NotificationType {
TaskAssignment,
TaskCompletion,
ApprovalRequest,
ApprovalDecision,
SystemAlert,
UserMessage,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum NotificationPriority {
Low,
Medium,
High,
Urgent,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum NotificationChannel {
Email,
SMS,
InApp,
Webhook,
Slack,
Teams,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimeRange {
pub start: SystemTime,
pub end: SystemTime,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuditEntry {
pub id: String,
pub entity_id: String,
pub action: AuditAction,
pub actor: String,
pub timestamp: SystemTime,
pub details: HashMap<String, String>,
pub ip_address: Option<String>,
pub user_agent: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AuditAction {
TaskCreated,
TaskUpdated,
TaskCompleted,
ReportGenerated,
DataExported,
ApprovalRequested,
ApprovalDecided,
ConfigurationChanged,
UserAction(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CollaborativeWorkspace {
pub id: WorkspaceId,
pub name: String,
pub description: Option<String>,
pub owner: String,
pub members: Vec<WorkspaceMember>,
pub permissions: WorkspacePermissions,
pub shared_documents: Vec<SharedDocument>,
pub active_collaborations: Vec<ActiveCollaboration>,
pub settings: WorkspaceSettings,
pub created_at: SystemTime,
pub updated_at: SystemTime,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkspaceId(pub String);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionToken(pub String);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageId(pub String);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DecisionId(pub String);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkspaceMember {
pub user_id: String,
pub role: WorkspaceRole,
pub permissions: UserPermissions,
pub joined_at: SystemTime,
pub last_active: SystemTime,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum WorkspaceRole {
Owner,
Admin,
Editor,
Viewer,
Guest,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserPermissions {
pub can_edit_documents: bool,
pub can_create_documents: bool,
pub can_delete_documents: bool,
pub can_invite_users: bool,
pub can_manage_permissions: bool,
pub can_start_decisions: bool,
pub can_vote: bool,
pub can_moderate: bool,
}
impl Default for UserPermissions {
fn default() -> Self {
Self {
can_edit_documents: true,
can_create_documents: true,
can_delete_documents: false,
can_invite_users: false,
can_manage_permissions: false,
can_start_decisions: true,
can_vote: true,
can_moderate: false,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkspacePermissions {
pub public_readable: bool,
pub allow_anonymous_access: bool,
pub require_approval_for_members: bool,
pub default_member_permissions: UserPermissions,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkspaceSettings {
pub enable_real_time_editing: bool,
pub enable_presence_awareness: bool,
pub enable_chat: bool,
pub enable_video_calls: bool,
pub enable_decision_voting: bool,
pub auto_save_interval: std::time::Duration,
pub max_concurrent_editors: usize,
pub session_timeout: std::time::Duration,
}
impl Default for WorkspaceSettings {
fn default() -> Self {
Self {
enable_real_time_editing: true,
enable_presence_awareness: true,
enable_chat: true,
enable_video_calls: false,
enable_decision_voting: true,
auto_save_interval: std::time::Duration::from_secs(10),
max_concurrent_editors: 50,
session_timeout: std::time::Duration::from_secs(8 * 3600),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateWorkspaceRequest {
pub name: String,
pub description: Option<String>,
pub owner: String,
pub initial_members: Vec<WorkspaceMember>,
pub permissions: WorkspacePermissions,
pub settings: Option<WorkspaceSettings>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserInfo {
pub name: String,
pub email: String,
pub avatar_url: Option<String>,
pub timezone: String,
pub preferences: UserPreferences,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserPreferences {
pub enable_notifications: bool,
pub notification_types: Vec<NotificationType>,
pub presence_status: PresenceStatus,
pub auto_join_calls: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum PresenceStatus {
Online,
Away,
Busy,
DoNotDisturb,
Offline,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CollaborativeSession {
pub token: SessionToken,
pub workspace_id: WorkspaceId,
pub user_id: String,
pub user_info: UserInfo,
pub joined_at: SystemTime,
pub last_activity: SystemTime,
pub active_documents: Vec<String>,
pub permissions: UserPermissions,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserPresence {
pub user_id: String,
pub status: PresenceStatus,
pub last_seen: SystemTime,
pub current_activity: Option<String>,
pub cursor_position: Option<CursorPosition>,
pub viewing_document: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CursorPosition {
pub document_id: String,
pub line: u32,
pub column: u32,
pub selection_start: Option<(u32, u32)>,
pub selection_end: Option<(u32, u32)>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CollaborativeMessage {
pub id: Option<MessageId>,
pub sender_id: String,
pub message_type: MessageType,
pub content: String,
pub thread_id: Option<String>,
pub reply_to: Option<MessageId>,
pub mentions: Vec<String>,
pub attachments: Vec<MessageAttachment>,
pub reactions: Vec<MessageReaction>,
pub timestamp: Option<SystemTime>,
pub edited_at: Option<SystemTime>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MessageType {
Text,
System,
Notification,
DocumentUpdate,
VideoCall,
Decision,
Poll,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageAttachment {
pub file_id: String,
pub filename: String,
pub file_type: String,
pub size_bytes: u64,
pub url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageReaction {
pub emoji: String,
pub user_id: String,
pub timestamp: SystemTime,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SharedDocument {
pub id: String,
pub name: String,
pub document_type: DocumentType,
pub content: String,
pub version: u64,
pub created_by: String,
pub created_at: SystemTime,
pub last_modified_by: String,
pub last_modified_at: SystemTime,
pub collaborators: Vec<String>,
pub permissions: DocumentPermissions,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DocumentType {
SparqlQuery,
MarkdownDocument,
JsonDocument,
CodeFile { language: String },
Whiteboard,
Spreadsheet,
Presentation,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DocumentPermissions {
pub public_readable: bool,
pub editors: Vec<String>,
pub viewers: Vec<String>,
pub allow_comments: bool,
pub allow_suggestions: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CollaborativeEditingSession {
pub session_id: String,
pub workspace_id: WorkspaceId,
pub document_id: String,
pub user_id: String,
pub document_type: DocumentType,
pub started_at: SystemTime,
pub last_edit: SystemTime,
pub cursor_position: Option<CursorPosition>,
pub pending_operations: Vec<EditOperation>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EditOperation {
pub operation_id: String,
pub operation_type: OperationType,
pub position: TextPosition,
pub content: String,
pub timestamp: SystemTime,
pub user_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum OperationType {
Insert,
Delete,
Replace,
FormatApply,
Comment,
Suggestion,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextPosition {
pub line: u32,
pub column: u32,
pub offset: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ActiveCollaboration {
pub collaboration_id: String,
pub collaboration_type: CollaborationType,
pub participants: Vec<String>,
pub started_by: String,
pub started_at: SystemTime,
pub status: CollaborationStatus,
pub context: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CollaborationType {
DocumentEditing,
VideoCall,
ScreenShare,
Brainstorming,
DecisionMaking,
ReviewSession,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CollaborationStatus {
Active,
Paused,
Completed,
Cancelled,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DecisionRequest {
pub title: String,
pub description: String,
pub decision_type: DecisionType,
pub options: Vec<DecisionOption>,
pub eligible_voters: Vec<String>,
pub deadline: Option<SystemTime>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DecisionProcess {
pub id: DecisionId,
pub workspace_id: WorkspaceId,
pub initiator_id: String,
pub title: String,
pub description: String,
pub decision_type: DecisionType,
pub options: Vec<DecisionOption>,
pub eligible_voters: Vec<String>,
pub votes: HashMap<String, Vote>,
pub comments: Vec<DecisionComment>,
pub deadline: Option<SystemTime>,
pub status: DecisionStatus,
pub created_at: SystemTime,
pub updated_at: SystemTime,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DecisionType {
SingleChoice,
MultipleChoice,
Ranking,
YesNo,
Consensus,
Budget,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DecisionOption {
pub id: String,
pub title: String,
pub description: Option<String>,
pub proposed_by: String,
pub vote_count: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Vote {
pub voter_id: String,
pub option_ids: Vec<String>,
pub ranking: Option<Vec<String>>,
pub comment: Option<String>,
pub timestamp: SystemTime,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DecisionComment {
pub id: String,
pub author_id: String,
pub content: String,
pub timestamp: SystemTime,
pub replies: Vec<DecisionComment>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DecisionStatus {
Open,
Closed,
Cancelled,
Implemented,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ActivityEvent {
pub id: String,
pub workspace_id: WorkspaceId,
pub event_type: ActivityEventType,
pub actor_id: String,
pub target_id: Option<String>,
pub description: String,
pub timestamp: SystemTime,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ActivityEventType {
UserJoined,
UserLeft,
DocumentCreated,
DocumentEdited,
DocumentShared,
MessageSent,
DecisionStarted,
DecisionVoted,
CollaborationStarted,
CollaborationEnded,
}
pub struct WorkflowManager {
pub(crate) config: WorkflowConfig,
pub(crate) active_tasks: HashMap<String, Task>,
pub(crate) approval_queue: Vec<ApprovalRequest>,
pub(crate) audit_logger: AuditLogger,
pub(crate) notification_service: NotificationService,
pub(crate) report_generator: ReportGenerator,
pub(crate) data_exporter: DataExporter,
}
pub(crate) struct AuditLogger {
pub(crate) config: WorkflowConfig,
}
pub(crate) struct NotificationService {
#[allow(dead_code)]
pub(crate) config: WorkflowConfig,
}
pub(crate) struct ReportGenerator {
pub(crate) config: WorkflowConfig,
}
pub(crate) struct DataExporter {
pub(crate) config: WorkflowConfig,
}
pub struct CollaborativeWorkspaceManager {
pub(crate) workspaces: HashMap<String, CollaborativeWorkspace>,
pub(crate) active_sessions: HashMap<String, CollaborativeSession>,
pub(crate) presence_tracker: PresenceTracker,
pub(crate) message_bus: CollaborativeMessageBus,
pub(crate) shared_document_manager: SharedDocumentManager,
pub(crate) decision_tracker: CollaborativeDecisionTracker,
}
pub struct PresenceTracker {
pub(crate) workspace_presence: HashMap<String, Vec<UserPresence>>,
}
pub struct CollaborativeMessageBus {
pub(crate) message_history: HashMap<String, Vec<CollaborativeMessage>>,
pub(crate) _subscribers: HashMap<String, Vec<String>>,
}
pub struct SharedDocumentManager {
pub(crate) _documents: HashMap<String, SharedDocument>,
pub(crate) editing_sessions: HashMap<String, Vec<CollaborativeEditingSession>>,
}
pub struct CollaborativeDecisionTracker {
pub(crate) active_decisions: HashMap<String, DecisionProcess>,
}