exclaim-recovery-database
Version:
Shared database schemas for Exclaim Recovery platform
173 lines (153 loc) • 5.43 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("dotenv/config");
const path_1 = require("path");
const promises_1 = require("fs/promises");
async function main() {
// Get connection string from environment
const connectionString = process.env.VERCEL_POSTGRES_URL;
if (!connectionString) {
console.error('No VERCEL_POSTGRES_URL found in environment');
process.exit(1);
}
// Define the migrations folder path
const migrationsFolder = (0, path_1.resolve)(__dirname, './migrations');
try {
// Ensure the migrations folder exists
await (0, promises_1.mkdir)(migrationsFolder, { recursive: true });
// Generate a timestamp for the migration
const timestamp = new Date().toISOString().replace(/[-:.TZ]/g, '');
const filename = `${timestamp}_create_vector_tables.sql`;
const filepath = (0, path_1.resolve)(migrationsFolder, filename);
// Create migration SQL content
const migrationContent = `
-- Create pgvector extension
CREATE EXTENSION IF NOT EXISTS vector;
-- Create SMARTRecoveryDocument table
CREATE TABLE IF NOT EXISTS "SMARTRecoveryDocument" (
"id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
"content" TEXT NOT NULL,
"metadata" JSONB,
"createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"vector" vector(1536)
);
-- Create ScientificStudyDocument table
CREATE TABLE IF NOT EXISTS "ScientificStudyDocument" (
"id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
"title" TEXT,
"abstract" TEXT,
"content" TEXT NOT NULL,
"authors" TEXT[],
"publicationYear" TEXT,
"journal" TEXT,
"doi" TEXT,
"metadata" JSONB,
"createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"vector" vector(1536)
);
-- Create Document table
CREATE TABLE IF NOT EXISTS "Document" (
"id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
"content" TEXT NOT NULL,
"metadata" JSONB,
"createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"vector" vector(1536)
);
-- Create UserDocument table
CREATE TABLE IF NOT EXISTS "UserDocument" (
"id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
"userId" TEXT NOT NULL,
"documentId" TEXT NOT NULL,
"metadata" JSONB,
"createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"vector" vector(1536)
);
-- Create GAStepDocument table
CREATE TABLE IF NOT EXISTS "GAStepDocument" (
"id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
"stepNumber" INTEGER NOT NULL,
"title" TEXT NOT NULL,
"description" TEXT NOT NULL,
"detailedContent" TEXT NOT NULL,
"reflectionPrompts" TEXT[],
"commonChallenges" TEXT[],
"milestoneNames" TEXT[],
"metadata" JSONB,
"createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"vector" vector(1536)
);
-- Create GAResourceDocument table
CREATE TABLE IF NOT EXISTS "GAResourceDocument" (
"id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
"stepNumber" INTEGER,
"title" TEXT NOT NULL,
"type" TEXT NOT NULL,
"url" TEXT,
"content" TEXT,
"metadata" JSONB,
"createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"vector" vector(1536)
);
-- Create GAReflectionDocument table
CREATE TABLE IF NOT EXISTS "GAReflectionDocument" (
"id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
"userId" TEXT NOT NULL,
"stepNumber" INTEGER NOT NULL,
"content" TEXT NOT NULL,
"isPrivate" BOOLEAN DEFAULT FALSE,
"tags" TEXT[],
"createdAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"vector" vector(1536)
);
-- Create vector indexes
CREATE INDEX IF NOT EXISTS "smart_recovery_vector_idx"
ON "SMARTRecoveryDocument"
USING hnsw ("vector" vector_cosine_ops);
CREATE INDEX IF NOT EXISTS "scientific_study_vector_idx"
ON "ScientificStudyDocument"
USING hnsw ("vector" vector_cosine_ops);
CREATE INDEX IF NOT EXISTS "document_vector_idx"
ON "Document"
USING hnsw ("vector" vector_cosine_ops);
CREATE INDEX IF NOT EXISTS "user_document_vector_idx"
ON "UserDocument"
USING hnsw ("vector" vector_cosine_ops);
CREATE INDEX IF NOT EXISTS "ga_step_vector_idx"
ON "GAStepDocument"
USING hnsw ("vector" vector_cosine_ops);
CREATE INDEX IF NOT EXISTS "ga_resource_vector_idx"
ON "GAResourceDocument"
USING hnsw ("vector" vector_cosine_ops);
CREATE INDEX IF NOT EXISTS "ga_reflection_vector_idx"
ON "GAReflectionDocument"
USING hnsw ("vector" vector_cosine_ops);
-- Create additional indexes for faster filtering
CREATE INDEX IF NOT EXISTS "ga_step_number_idx"
ON "GAStepDocument" ("stepNumber");
CREATE INDEX IF NOT EXISTS "ga_resource_step_idx"
ON "GAResourceDocument" ("stepNumber");
CREATE INDEX IF NOT EXISTS "ga_resource_type_idx"
ON "GAResourceDocument" ("type");
CREATE INDEX IF NOT EXISTS "ga_reflection_user_idx"
ON "GAReflectionDocument" ("userId");
CREATE INDEX IF NOT EXISTS "ga_reflection_step_idx"
ON "GAReflectionDocument" ("stepNumber");
CREATE INDEX IF NOT EXISTS "user_document_userId_idx"
ON "UserDocument" ("userId");
`;
// Write the migration file
await (0, promises_1.writeFile)(filepath, migrationContent);
console.log(`Generated migration file: ${filepath}`);
console.log('To apply this migration, run: npm run migrate');
}
catch (error) {
console.error('Error generating migration:', error);
}
}
main().catch(err => {
console.error('Error in generate-migrations script:', err);
process.exit(1);
});
//# sourceMappingURL=generate-migrations.js.map