You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
docuseal/docs/current-app-sitemap.md

19 KiB

DocuSeal + FloDoc Current Application Sitemap

Complete Architecture Analysis

Generated: 2025-01-09 Branch: feature/brownfield-prd Status: Analysis Complete


1. High-Level System Architecture

graph TB
    subgraph "External Dependencies"
        DB[(PostgreSQL/MySQL/SQLite)]
        Redis[(Redis)]
        S3[(AWS S3)]
        GCS[(Google Cloud)]
        Azure[(Azure)]
        SMTP[(SMTP Server)]
    end

    subgraph "Load Balancer / Web Server"
        Puma[Puma Web Server]
    end

    subgraph "Rails Application - DocuSeal Core + FloDoc Extensions"
        subgraph "Authentication Layer"
            Devise[Devise Auth]
            JWT[JWT Tokens]
            TwoFA[2FA/OTP]
        end

        subgraph "Routing Layer"
            Routes[config/routes.rb]
            API_V1[API v1 Namespace]
            Web_Routes[Web Interface]
        end

        subgraph "Controllers - DocuSeal Core"
            Auth_C[Authentication]
            Templates_C[Templates]
            Submissions_C[Submissions]
            Submitters_C[Submitters]
            Users_C[Users]
            Accounts_C[Accounts]
            Dashboard_C[Dashboard]
        end

        subgraph "Controllers - FloDoc Additions"
            Institutions_C[Institutions]
            CohortsAdmin_C[Cohorts/Admin]
            AdminInvitations_C[Admin/Invitations]
            SecurityEvents_C[Security Events]
        end

        subgraph "Models - DocuSeal Core"
            User[User]
            Account[Account]
            Template[Template]
            Submission[Submission]
            Submitter[Submitter]
            TemplateDoc[TemplateDocument]
            CompletedDoc[CompletedDocument]
            AccountConfig[AccountConfig]
            Webhook[WebhookEvent]
        end

        subgraph "Models - FloDoc Additions"
            Institution[Institution]
            AccountAccess[AccountAccess<br/>Extended with institution_id]
            CohortAdminInvitation[CohortAdminInvitation]
            SecurityEvent[SecurityEvent]
            UserFloDoc[UserFloDocAdditions<br/>Concern]
        end

        subgraph "Authorization"
            Cancancan[Cancancan Ability]
            Abilities[Ability.rb<br/>Extended for FloDoc]
        end

        subgraph "Business Logic - Services"
            SubmissionsLib[lib/submissions/]
            PDFUtils[lib/pdf_utils.rb]
            PDFium[lib/pdfium.rb]
            InvitationService[InvitationService]
            SecurityLog[Security Logging]
        end

        subgraph "Background Jobs - Sidekiq"
            SubmissionEmail[SubmissionEmailJob]
            Reminder[ReminderJob]
            WebhookDelivery[WebhookDeliveryJob]
            DocumentGen[DocumentGenerationJob]
            CohortInvite[CohortAdminInvitationJob]
        end

        subgraph "Frontend - Vue.js"
            AppJS[application.js]
            TemplateBuilder[Template Builder]
            SubmissionForm[Submission Form]
            Elements[Custom Elements]
        end

        subgraph "Email System"
            Mailers[Action Mailers]
            CohortMailer[CohortMailer]
            TemplatesMailer[Templates Mailers]
        end
    end

    %% External Connections
    Puma --> DB
    Puma --> Redis
    Puma --> S3
    Puma --> GCS
    Puma --> Azure
    BackgroundJobs -.-> SMTP

    %% Request Flow
    User[Browser/Mobile] --> Puma

    %% Authentication Flow
    Puma --> Devise
    Devise --> JWT
    Devise --> TwoFA

    %% Routing
    Puma --> Routes
    Routes --> API_V1
    Routes --> Web_Routes

    %% Core Controllers
    API_V1 --> Auth_C
    API_V1 --> Templates_C
    API_V1 --> Submissions_C
    API_V1 --> Submitters_C
    API_V1 --> Users_C
    API_V1 --> Accounts_C

    Web_Routes --> Dashboard_C

    %% FloDoc Controllers
    API_V1 --> Institutions_C
    API_V1 --> AdminInvitations_C
    API_V1 --> SecurityEvents_C
    Web_Routes --> CohortsAdmin_C

    %% Controllers to Models
    Auth_C --> User
    Templates_C --> Template
    Submissions_C --> Submission
    Submitters_C --> Submitter
    Users_C --> User
    Accounts_C --> Account

    Institutions_C --> Institution
    Institutions_C --> AccountAccess
    CohortsAdmin_C --> Institution
    AdminInvitations_C --> CohortAdminInvitation
    SecurityEvents_C --> SecurityEvent

    %% FloDoc Model Relationships
    User --> UserFloDoc
    UserFloDoc --> AccountAccess
    AccountAccess --> Institution

    Institution --> CohortAdminInvitation
    Institution --> SecurityEvent

    %% Authorization
    Controllers --> Cancancan
    Cancancan --> Abilities
    Abilities --> User
    Abilities --> Institution
    Abilities --> AccountAccess

    %% Services
    Submissions_C --> SubmissionsLib
    Submissions_C --> PDFUtils
    Submissions_C --> PDFium
    AdminInvitations_C --> InvitationService
    SecurityEvents_C --> SecurityLog

    %% Background Jobs
    Submissions_C --> SubmissionEmail
    Submissions_C --> Reminder
    Submissions_C --> WebhookDelivery
    Submissions_C --> DocumentGen
    AdminInvitations_C --> CohortInvite

    %% Frontend
    AppJS --> TemplateBuilder
    AppJS --> SubmissionForm
    AppJS --> Elements

    %% Email
    Mailers --> SMTP
    CohortInvite --> CohortMailer
    SubmissionEmail --> TemplatesMailer

2. Database Schema - Core Tables

erDiagram
    %% DOCUSEAL CORE TABLES
    accounts {
        bigint id PK
        string name
        string subdomain
        datetime archived_at
        datetime created_at
        datetime updated_at
    }

    users {
        bigint id PK
        bigint account_id FK
        string email
        string encrypted_password
        string role
        string first_name
        string last_name
        string uuid
        boolean otp_required_for_login
        datetime created_at
        datetime updated_at
    }

    templates {
        bigint id PK
        bigint account_id FK
        bigint author_id FK
        string name
        json fields
        json field_settings
        datetime created_at
        datetime updated_at
    }

    submissions {
        bigint id PK
        bigint account_id FK
        bigint template_id FK
        string status
        string uuid
        json metadata
        datetime created_at
        datetime updated_at
    }

    submitters {
        bigint id PK
        bigint submission_id FK
        bigint user_id FK
        string email
        string name
        string status
        string access_token
        json fields
        datetime created_at
        datetime updated_at
    }

    completed_documents {
        bigint id PK
        bigint submission_id FK
        string status
        json metadata
        binary document_data
        datetime created_at
        datetime updated_at
    }

    %% FLODOC ADDITIONS
    institutions {
        bigint id PK
        bigint account_id FK
        bigint super_admin_id FK
        string name
        string registration_number
        text address
        string contact_email
        string contact_phone
        jsonb settings
        datetime created_at
        datetime updated_at
    }

    account_accesses {
        bigint id PK
        bigint account_id FK
        bigint user_id FK
        bigint institution_id FK
        string role
        datetime created_at
        datetime updated_at
    }

    cohort_admin_invitations {
        bigint id PK
        bigint institution_id FK
        bigint created_by_id FK
        string email
        string hashed_token
        string token_preview
        string role
        datetime sent_at
        datetime expires_at
        datetime used_at
        datetime created_at
        datetime updated_at
    }

    security_events {
        bigint id PK
        bigint user_id FK
        string event_type
        string ip_address
        jsonb details
        datetime created_at
        datetime updated_at
    }

    %% RELATIONSHIPS - DOCUSEAL CORE
    accounts ||--o{ users : "has many"
    accounts ||--o{ templates : "has many"
    accounts ||--o{ submissions : "has many"

    users ||--o{ templates : "authors"
    users ||--o{ submitters : "signs as"

    templates ||--o{ submissions : "generates"

    submissions ||--o{ submitters : "has many"
    submissions ||--o{ completed_documents : "produces"

    %% RELATIONSHIPS - FLODOC ADDITIONS
    accounts ||--o{ institutions : "has one"
    users ||--o{ managed_institutions : "super admin of"
    users ||--o{ account_accesses : "has many"

    institutions ||--o{ account_accesses : "has many"
    institutions ||--o{ cohort_admin_invitations : "has many"
    institutions ||--o{ security_events : "logs"

    users ||--o{ security_events : "triggers"

    account_accesses }|--|| institutions : "grants access to"
    account_accesses }|--|| users : "grants access to"
    account_accesses }|--|| account : "belongs to"

    cohort_admin_invitations }|--|| institutions : "belongs to"
    cohort_admin_invitations }|--|| users : "created by"

3. API Endpoint Structure

graph TB
    subgraph "API v1 Base: /api/v1"
        Auth[Authentication]

        subgraph "Core DocuSeal Endpoints"
            Templates[/templates]
            Submissions[/submissions]
            Submitters[/submitters]
            Users[/users]
            Accounts[/accounts]
            Webhooks[/webhooks]
        end

        subgraph "FloDoc Institution Endpoints"
            Institutions[/institutions]
            Admin[/admin/invitations]
            Security[/security-events]
        end

        subgraph "Template Endpoints"
            T_Documents[/templates/:id/documents]
            T_Sharing[/templates/:id/sharing]
            T_Fields[/templates/:id/fields]
            T_Preview[/templates/:id/preview]
        end

        subgraph "Submission Endpoints"
            S_Start[/submissions/start]
            S_Complete[/submissions/:id/complete]
            S_Download[/submissions/:id/download]
            S_Events[/submissions/:id/events]
        end

        subgraph "Submitter Endpoints"
            Sub_Complete[/submitters/:id/complete]
            Sub_Sign[/submitters/:id/sign]
            Sub_Download[/submitters/:id/download]
            Sub_Email[/submitters/:id/send-email]
        end
    end

    %% Authentication
    Auth --> |JWT Token| Templates
    Auth --> |JWT Token| Submissions
    Auth --> |JWT Token| Institutions

    %% Core Flow
    Templates --> T_Documents
    Templates --> T_Sharing
    Templates --> T_Fields
    Templates --> T_Preview

    Submissions --> S_Start
    Submissions --> S_Complete
    Submissions --> S_Download
    Submissions --> S_Events

    Submitters --> Sub_Complete
    Submitters --> Sub_Sign
    Submitters --> Sub_Download
    Submitters --> Sub_Email

    %% FloDoc Flow
    Institutions --> Admin
    Institutions --> Security

    %% Webhooks
    Webhooks --> |POST Events| External[External Systems]

4. Data Flow - Document Signing Workflow

sequenceDiagram
    participant User as User/Admin
    participant FE as Frontend Vue
    participant C as Controller
    participant M as Models
    participant S as Services
    participant SJ as Sidekiq Jobs
    participant DB as Database
    participant PDF as PDF Engine
    participant Storage as Active Storage
    participant Email as Email System
    participant API as External API
    participant Webhook as Webhooks

    %% DOCUSEAL CORE WORKFLOW
    Note over User,Webhook: Standard DocuSeal Document Flow

    User->>FE: Upload PDF Template
    FE->>C: POST /templates
    C->>M: Create Template
    M->>DB: Save template data
    C->>FE: Template Created

    User->>FE: Configure Form Fields
    FE->>C: PUT /templates/:id/fields
    C->>M: Update Template Fields
    M->>DB: Save field configuration
    C->>FE: Fields Updated

    User->>FE: Start Submission
    FE->>C: POST /submissions/start
    C->>M: Create Submission
    C->>M: Create Submitters
    M->>DB: Save submission & submitters
    C->>SJ: SubmissionEmailJob
    SJ->>Email: Send Invitation
    Email->>User: Email with Access Link

    User->>Email: Click Link
    User->>FE: Access Submission Form
    FE->>C: GET /submissions/:id
    C->>M: Fetch Submission
    M->>DB: Query submission data
    C->>FE: Return Submission Data

    User->>FE: Fill Form & Sign
    FE->>C: POST /submitters/:id/complete
    C->>M: Update Submitter Status
    C->>S: Generate PDF
    S->>PDF: Create Signed PDF
    PDF->>Storage: Save Document
    M->>DB: Save CompletedDocument
    C->>SJ: WebhookDeliveryJob
    SJ->>Webhook: POST Event
    C->>FE: Completion Confirmation

    %% FLODOC COHORT WORKFLOW
    Note over User,Webhook: FloDoc 3-Portal Cohort Flow

    User->>FE: Create Institution (Super Admin)
    FE->>C: POST /api/v1/institutions
    C->>M: Create Institution
    C->>M: Create AccountAccess
    M->>DB: Save institution & access
    C->>FE: Institution Created

    User->>FE: Invite Cohort Admin
    FE->>C: POST /api/v1/admin/invitations
    C->>S: InvitationService
    S->>M: Create CohortAdminInvitation
    S->>SJ: CohortAdminInvitationJob
    SJ->>Email: Send Admin Invite
    Email->>Admin: Invitation Email

    Admin->>Email: Accept Invitation
    Admin->>FE: Accept Invitation Link
    FE->>C: POST /api/v1/admin/invitation_acceptance
    C->>S: Validate Token
    S->>M: Verify CohortAdminInvitation
    C->>M: Create User (if new)
    C->>M: Create AccountAccess
    M->>DB: Save user & access
    C->>FE: Access Granted

    Admin->>FE: Manage Cohort
    FE->>C: Web Interface
    C->>M: Institution.for_user
    M->>DB: Scoped Query
    C->>FE: Cohort Dashboard

    %% Security Monitoring
    User->>C: Any Action
    C->>S: SecurityLog
    S->>M: SecurityEvent.log
    M->>DB: Save Security Event

5. Authentication & Authorization Flow

graph TB
    subgraph "Authentication Layers"
        L1[Layer 1: Devise Session]
        L2[Layer 2: JWT API Token]
        L3[Layer 3: 2FA/OTP]
        L4[Layer 4: Account Access]
    end

    subgraph "Authorization Layers"
        A1[Layer 1: Database Scopes]
        A2[Layer 2: Model Relationships]
        A3[Layer 3: CanCanCan Abilities]
        A4[Layer 4: Controller Filters]
    end

    subgraph "FloDoc Security Architecture"
        F1[Institution Isolation]
        F2[Role-Based Access]
        F3[Super Admin vs Admin]
        F4[Security Event Logging]
    end

    User --> L1
    L1 --> L2
    L2 --> L3
    L3 --> L4

    L4 --> A1
    A1 --> A2
    A2 --> A3
    A3 --> A4

    A4 --> F1
    F1 --> F2
    F2 --> F3
    F3 --> F4

    %% Key Methods
    L4 --> |can_access_institution?| UserFloDoc
    A1 --> |Institution.for_user| ScopedQuery
    A3 --> |Ability.rb| RoleCheck
    F4 --> |SecurityEvent.log| AuditTrail

6. FloDoc-Specific Additions Summary

Models Added

  • Institution - Multi-tenant organization container
  • AccountAccess - Extended with institution_id and new roles
  • CohortAdminInvitation - Secure admin invitation system
  • SecurityEvent - Audit trail for security actions
  • UserFloDocAdditions - Concern for User model

Controllers Added

  • Cohorts::AdminController - Web interface for cohort management
  • Api::V1::InstitutionsController - REST API for institutions
  • Api::V1::Admin::InvitationsController - Admin invitation management
  • Api::V1::Admin::InvitationAcceptanceController - Accept invitations
  • Api::V1::Admin::SecurityEventsController - Security monitoring

Database Migrations

  • 20250103000001_add_institution_id_to_account_access.rb
  • 20250103000002_create_institutions.rb
  • 20250103000003_create_cohort_admin_invitations.rb
  • 20250103000005_backfill_institution_data.rb
  • 20250103000006_create_security_events.rb

Services & Jobs

  • InvitationService - Handles admin invitation creation and validation
  • CohortAdminInvitationJob - Async email delivery
  • SecurityAlertJob - Alert threshold monitoring

Routes Added

# API v1
namespace :admin do
  resources :invitations
  resources :invitation_acceptance
  resources :security_events
end
resources :institutions

# Web Interface
resources :cohorts, only: [] do
  resources :admin, controller: 'cohorts/admin'
end

7. Current State Assessment

Implemented (FloDoc Additions)

  1. Institution Management - CRUD operations with security
  2. Admin Invitation System - Token-based secure invitations
  3. Role-Based Access - cohort_super_admin and cohort_admin roles
  4. Security Event Logging - Audit trail for all actions
  5. 4-Layer Security Architecture - Database → Model → Controller → UI
  6. Data Isolation - Institution-scoped queries via Institution.for_user

⚠️ Partially Implemented

  1. Cohort Model - Referenced in Ability.rb but not created
  2. Sponsor Model - Referenced in Ability.rb but not created
  3. Student Portal - Not started
  4. Sponsor Portal - Not started
  5. Excel Export - Mentioned in PRD but not implemented

Not Started

  1. CohortEnrollment Model - Student enrollment tracking
  2. Document Verification Workflow - Manual verification process
  3. 3-Portal UI - Custom Vue portals for Admin/Student/Sponsor
  4. Cohort Dashboard - Analytics and status tracking
  5. Multi-signer Cohort Workflows - Integration with DocuSeal submissions
  6. Excel Export (FR23) - Cohort data export functionality

8. Key Integration Points

Where FloDoc Hooks Into DocuSeal

  1. User Model - include UserFloDocAdditions adds institution relationships
  2. AccountAccess - Extended with institution_id and new role types
  3. Ability.rb - Added FloDoc permissions alongside existing DocuSeal rules
  4. Routes - New namespaces under existing API structure
  5. Database - New tables with foreign keys to existing tables

What Remains Unchanged

  1. Core Models - Template, Submission, Submitter, CompletedDocument
  2. PDF Processing - HexaPDF and PDFium usage
  3. Authentication - Devise + JWT (unchanged)
  4. Background Jobs - Existing Sidekiq infrastructure
  5. Storage - Active Storage configuration
  6. API Patterns - RESTful conventions maintained

9. Next Steps for Complete Implementation

Based on the PRD and Architecture docs, the remaining work involves:

  1. Create Missing Models: Cohort, CohortEnrollment, Sponsor
  2. Build 3-Portal UI: Custom Vue portals with TailwindCSS (no DaisyUI)
  3. Integrate Document Workflows: Connect cohort management to DocuSeal submissions
  4. Implement Excel Export: Using rubyXL gem
  5. Add Verification Workflow: Manual document verification with audit trail
  6. Cohort Dashboard: Analytics and status tracking
  7. Student Portal: Enrollment and document submission interface
  8. Sponsor Portal: Review and signing interface
  9. Complete Testing: RSpec tests for all new functionality
  10. Documentation: API docs for new endpoints

Analysis Complete - This sitemap provides a comprehensive view of the current DocuSeal + FloDoc application state, clearly distinguishing between vanilla DocuSeal features and FloDoc additions.