plugin-postgresql-connector
Version:
NocoBase plugin for connecting to external PostgreSQL databases
216 lines (199 loc) • 6.22 kB
text/typescript
import { Migration } from '@nocobase/server';
export default class extends Migration {
async up() {
const { db } = this.context;
// Create postgresql_connections table
await db.sequelize.getQueryInterface().createTable('postgresql_connections', {
id: {
type: 'UUID',
defaultValue: db.sequelize.literal('uuid_generate_v4()'),
primaryKey: true,
allowNull: false,
},
name: {
type: 'VARCHAR(100)',
allowNull: false,
unique: true,
},
host: {
type: 'VARCHAR(255)',
allowNull: false,
},
port: {
type: 'INTEGER',
defaultValue: 5432,
allowNull: false,
},
database: {
type: 'VARCHAR(63)',
allowNull: false,
},
username: {
type: 'VARCHAR(63)',
allowNull: false,
},
password: {
type: 'TEXT',
allowNull: false,
comment: 'Encrypted password',
},
ssl: {
type: 'BOOLEAN',
defaultValue: false,
allowNull: false,
},
isActive: {
type: 'BOOLEAN',
defaultValue: true,
allowNull: false,
},
connectionOptions: {
type: 'JSONB',
defaultValue: '{}',
allowNull: false,
},
createdAt: {
type: 'TIMESTAMPTZ',
defaultValue: db.sequelize.literal('CURRENT_TIMESTAMP'),
allowNull: false,
},
updatedAt: {
type: 'TIMESTAMPTZ',
defaultValue: db.sequelize.literal('CURRENT_TIMESTAMP'),
allowNull: false,
},
deletedAt: {
type: 'TIMESTAMPTZ',
allowNull: true,
},
});
// Create indexes for postgresql_connections
await db.sequelize.getQueryInterface().addIndex('postgresql_connections', ['name'], {
unique: true,
where: { deletedAt: null },
name: 'postgresql_connections_name_unique',
});
await db.sequelize.getQueryInterface().addIndex('postgresql_connections', ['isActive'], {
name: 'postgresql_connections_isActive_idx',
});
await db.sequelize.getQueryInterface().addIndex('postgresql_connections', ['createdAt'], {
name: 'postgresql_connections_createdAt_idx',
});
// Create postgresql_saved_queries table
await db.sequelize.getQueryInterface().createTable('postgresql_saved_queries', {
id: {
type: 'UUID',
defaultValue: db.sequelize.literal('uuid_generate_v4()'),
primaryKey: true,
allowNull: false,
},
connectionId: {
type: 'UUID',
allowNull: false,
references: {
model: 'postgresql_connections',
key: 'id',
},
onUpdate: 'CASCADE',
onDelete: 'CASCADE',
},
name: {
type: 'VARCHAR(255)',
allowNull: false,
},
query: {
type: 'TEXT',
allowNull: false,
},
queryType: {
type: 'ENUM("SELECT", "INSERT", "UPDATE", "DELETE", "PROCEDURE", "FUNCTION", "VIEW", "OTHER")',
defaultValue: 'SELECT',
allowNull: false,
},
parameters: {
type: 'JSONB',
defaultValue: '[]',
allowNull: false,
},
description: {
type: 'TEXT',
allowNull: true,
},
category: {
type: 'VARCHAR(100)',
defaultValue: 'general',
allowNull: true,
},
tags: {
type: 'JSONB',
defaultValue: '[]',
allowNull: false,
},
isPublic: {
type: 'BOOLEAN',
defaultValue: false,
allowNull: false,
},
executionCount: {
type: 'INTEGER',
defaultValue: 0,
allowNull: false,
},
lastExecutedAt: {
type: 'TIMESTAMPTZ',
allowNull: true,
},
createdBy: {
type: 'UUID',
allowNull: true,
comment: 'Future: User ID reference',
},
createdAt: {
type: 'TIMESTAMPTZ',
defaultValue: db.sequelize.literal('CURRENT_TIMESTAMP'),
allowNull: false,
},
updatedAt: {
type: 'TIMESTAMPTZ',
defaultValue: db.sequelize.literal('CURRENT_TIMESTAMP'),
allowNull: false,
},
deletedAt: {
type: 'TIMESTAMPTZ',
allowNull: true,
},
});
// Create indexes for postgresql_saved_queries
await db.sequelize.getQueryInterface().addIndex('postgresql_saved_queries', ['connectionId'], {
name: 'postgresql_saved_queries_connectionId_idx',
});
await db.sequelize.getQueryInterface().addIndex('postgresql_saved_queries', ['queryType'], {
name: 'postgresql_saved_queries_queryType_idx',
});
await db.sequelize.getQueryInterface().addIndex('postgresql_saved_queries', ['category'], {
name: 'postgresql_saved_queries_category_idx',
});
await db.sequelize.getQueryInterface().addIndex('postgresql_saved_queries', ['isPublic'], {
name: 'postgresql_saved_queries_isPublic_idx',
});
await db.sequelize.getQueryInterface().addIndex('postgresql_saved_queries', ['createdBy'], {
name: 'postgresql_saved_queries_createdBy_idx',
});
await db.sequelize.getQueryInterface().addIndex('postgresql_saved_queries', ['name', 'connectionId'], {
unique: true,
where: { deletedAt: null },
name: 'postgresql_saved_queries_name_connectionId_unique',
});
await db.sequelize.getQueryInterface().addIndex('postgresql_saved_queries', ['createdAt'], {
name: 'postgresql_saved_queries_createdAt_idx',
});
console.log('PostgreSQL Connector tables created successfully');
}
async down() {
const { db } = this.context;
// Drop tables in reverse order due to foreign key constraints
await db.sequelize.getQueryInterface().dropTable('postgresql_saved_queries');
await db.sequelize.getQueryInterface().dropTable('postgresql_connections');
console.log('PostgreSQL Connector tables dropped successfully');
}
}