CodeDocs Vault

Data Model

Database Configuration

Entity Relationship Diagram

erDiagram
    User ||--o{ Member : "has memberships"
    User ||--o{ Session : "has sessions"
    User ||--o{ Account : "has OAuth accounts"
    
    Organization ||--o{ Member : "has members"
    Organization ||--o{ Policy : "has policies"
    Organization ||--o{ Control : "has controls"
    Organization ||--o{ Risk : "has risks"
    Organization ||--o{ Vendor : "has vendors"
    Organization ||--o{ Task : "has tasks"
    Organization ||--o{ Framework : "has frameworks"
    Organization ||--o{ Integration : "has integrations"
    Organization ||--o{ AuditLog : "has audit logs"
    Organization ||--o{ ApiKey : "has API keys"
    Organization ||--o{ Trust : "has trust portal"
    Organization ||--o{ Questionnaire : "has questionnaires"
    Organization ||--o{ OrganizationRole : "has custom roles"
    Organization ||--o{ Finding : "has findings"
    Organization ||--o{ EvidenceSubmission : "has evidence"
    
    Member ||--o{ Policy : "assigned/approves"
    Member ||--o{ Task : "assigned/approves"
    Member ||--o{ Risk : "assigned"
    Member ||--o{ Vendor : "assigned"
    Member ||--o{ Comment : "authors"
    Member ||--o{ Finding : "creates"
    
    Control }o--o{ Task : "many-to-many"
    Control }o--o{ Policy : "many-to-many"
    Control ||--o{ ControlDocumentType : "requires evidence types"
    
    Task ||--o{ EvidenceAutomation : "has automations"
    Task ||--o{ BrowserAutomation : "has browser tasks"
    Task }o--o{ Vendor : "many-to-many"
    Task }o--o{ Risk : "many-to-many"
    
    Framework }|--|| FrameworkEditorFramework : "references template"
    FrameworkEditorFramework ||--o{ FrameworkEditorRequirement : "has requirements"
    FrameworkEditorRequirement }o--o{ FrameworkEditorControlTemplate : "maps to controls"
    FrameworkEditorControlTemplate ||--o{ FrameworkEditorPolicyTemplate : "has policy templates"
    FrameworkEditorControlTemplate ||--o{ FrameworkEditorTaskTemplate : "has task templates"
    
    Trust ||--o{ TrustResource : "has resources"
    Trust ||--o{ TrustAccessRequest : "has access requests"
    TrustAccessRequest ||--o| TrustAccessGrant : "may grant"
    TrustAccessGrant ||--o{ TrustNDAAgreement : "requires NDA"
    
    Questionnaire ||--o{ QuestionnaireQuestionAnswer : "has Q&A pairs"

Core Entities

Authentication & Organization

User

Session

Organization

Member

OrganizationRole

GRC Core

Policy (prefix: pol)

Control (prefix: ctl)

Risk (prefix: rsk)

Task (prefix: tsk)

Vendor (prefix: vnd)

Framework

Audit & Evidence

AuditLog (prefix: aud)

Finding (prefix: fnd)

EvidenceSubmission (prefix: evs)

AI & Knowledge

Questionnaire (prefix: qst)

QuestionnaireQuestionAnswer

SecurityQuestionnaireManualAnswer

Trust Portal

Trust

TrustAccessRequest (prefix: tar)

TrustAccessGrant (prefix: tag)

TrustNDAAgreement (prefix: tna)

Integrations & Automation

Integration

EvidenceAutomation

BrowserAutomation

Supporting Entities

Entity Prefix Purpose
Comment cmt Polymorphic comments on tasks, vendors, risks, policies
TaskItem tski Sub-tasks within vendors or risks
Attachment att File attachments on any entity
ApiKey apk Scoped API keys with hash/prefix indexing
Device Fleet-managed endpoint devices
Context Organization context data (onboarding answers, etc.)
Secret Encrypted org secrets (for automations)
SOADocument Statement of Applicability documents
SOAAnswer Individual SOA question answers

Enums Reference

// Roles
enum Role { owner, admin, auditor, employee, contractor }
 
// Departments
enum Departments { none, admin, gov, hr, it, itsm, qms }
 
// Risk Assessment
enum Likelihood { very_unlikely, unlikely, possible, likely, very_likely }
enum Impact { insignificant, minor, moderate, major, severe }
enum RiskStatus { open, pending, closed, archived }
enum RiskCategory { customer, fraud, governance, operations, other, 
                    people, regulatory, reporting, resilience, technology,
                    vendor_management }
enum RiskTreatmentType { accept, avoid, mitigate, transfer }
 
// Tasks
enum TaskStatus { todo, in_progress, in_review, done, not_relevant, failed }
enum TaskFrequency { daily, weekly, monthly, quarterly, yearly }
enum Frequency { monthly, quarterly, yearly }
 
// Policies
enum PolicyStatus { draft, published, needs_review }
 
// Vendors
enum VendorStatus { not_assessed, in_progress, assessed }
enum VendorCategory { cloud, infrastructure, SaaS, finance, marketing,
                      sales, hr, other }
 
// Findings
enum FindingType { soc2, iso27001 }
enum FindingStatus { open, ready_for_review, needs_revision, closed }
 
// Questionnaires
enum QuestionnaireStatus { parsing, completed, failed }
enum AnswerStatus { untouched, generated, manual }
 
// Evidence Forms
enum EvidenceFormType { board_meeting, it_leadership_meeting, 
     risk_committee_meeting, meeting, access_request, whistleblower_report,
     penetration_test, rbac_matrix, infrastructure_inventory, 
     employee_performance_evaluation, network_diagram, tabletop_exercise }
 
// Polymorphic Types
enum CommentEntityType { task, vendor, risk, policy }
enum AttachmentEntityType { task, vendor, risk, comment, trust_nda, task_item }
enum AuditLogEntityType { organization, framework, requirement, control,
     policy, task, people, risk, vendor, tests, integration, trust, finding }

Multi-Tenancy Implementation

Every query is scoped by organizationId:

// Service pattern (every service follows this)
async findAll(organizationId: string) {
  return this.db.policy.findMany({
    where: { organizationId },  // ALWAYS present
    // ...
  });
}

The organizationId comes from the authenticated request, resolved by HybridAuthGuard, and injected via @OrganizationId() decorator.

Schema Organization

packages/db/prisma/schema/
├── schema.prisma          # Datasource + generator config
├── auth.prisma            # User, Session, Account, Member, Organization, Role
├── policy.prisma          # Policy, PolicyVersion
├── control.prisma         # Control, ControlDocumentType
├── risk.prisma            # Risk
├── vendor.prisma          # Vendor, VendorContact, VendorRiskAssessment
├── task.prisma            # Task
├── task-item.prisma       # TaskItem (sub-tasks)
├── framework.prisma       # Framework (org instances)
├── framework-editor.prisma # Framework templates, requirements, control/policy/task templates
├── finding.prisma         # Finding, FindingTemplate
├── evidence-submission.prisma # EvidenceSubmission
├── automation.prisma      # EvidenceAutomation, BrowserAutomation
├── integration.prisma     # Integration, IntegrationResult
├── questionnaire.prisma   # Questionnaire, Q&A, ManualAnswer
├── trust.prisma           # Trust, Resources, Access, NDA
├── soa.prisma             # SOA config, documents, answers
├── comment.prisma         # Comment
├── attachments.prisma     # Attachment
├── device.prisma          # Device
├── shared.prisma          # AuditLog, ApiKey, enums
└── ... (45 files total)