mirror of https://github.com/docusealco/docuseal
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.
697 lines
19 KiB
697 lines
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
|
|
|
|
```mermaid
|
|
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
|
|
|
|
```mermaid
|
|
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
|
|
|
|
```mermaid
|
|
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
|
|
|
|
```mermaid
|
|
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
|
|
|
|
```mermaid
|
|
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
|
|
```ruby
|
|
# 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. |