godcrm/backend/database/migrations/knex/013_create_data_sources.js
GOD CRM Release f89e074dd1
Some checks failed
CI / Lint / Typecheck / Test / Build (push) Has been cancelled
CI / PostgreSQL Integration Tests (push) Has been cancelled
GOD CRM — public scrubbed snapshot
Governed substrate for autonomous agents: scoped identity (passports),
audited actions, MCP workspace. Infra IPs and secrets redacted for public release.
2026-08-10 04:01:45 +03:00

66 lines
2.4 KiB
JavaScript

// backend/database/migrations/knex/013_create_data_sources.js
// Multi-Source Tables: Data Sources & Sync Logs
export async function up(knex) {
// User Settings
await knex.schema.createTable('user_settings', (table) => {
table.increments('id').primary();
table.integer('user_id').unsigned().notNullable()
.references('id').inTable('users').onDelete('CASCADE');
table.string('setting_key', 255).notNullable();
table.text('setting_value');
table.timestamp('created_at').defaultTo(knex.fn.now());
table.timestamp('updated_at').defaultTo(knex.fn.now());
table.unique(['user_id', 'setting_key']);
table.index('user_id');
});
// Data Sources
await knex.schema.createTable('data_sources', (table) => {
table.increments('id').primary();
table.integer('project_id').unsigned().notNullable()
.references('id').inTable('projects').onDelete('CASCADE');
table.string('name', 255).notNullable();
table.string('type', 50).notNullable(); // 'google_sheets', 'airtable', 'notion', etc.
table.text('config'); // JSON config (encrypted)
table.text('credentials'); // JSON credentials (encrypted)
table.boolean('is_active').defaultTo(true);
table.timestamp('last_sync_at');
table.string('sync_status', 50);
table.timestamp('created_at').defaultTo(knex.fn.now());
table.timestamp('updated_at').defaultTo(knex.fn.now());
table.index('project_id');
table.index('type');
table.index('is_active');
});
// Sync Logs
await knex.schema.createTable('sync_logs', (table) => {
table.increments('id').primary();
table.integer('data_source_id').unsigned().notNullable()
.references('id').inTable('data_sources').onDelete('CASCADE');
table.string('status', 50).notNullable();
table.integer('rows_synced').defaultTo(0);
table.integer('rows_created').defaultTo(0);
table.integer('rows_updated').defaultTo(0);
table.integer('rows_deleted').defaultTo(0);
table.text('error_message');
table.integer('duration_ms');
table.timestamp('started_at').defaultTo(knex.fn.now());
table.timestamp('completed_at');
table.index('data_source_id');
table.index('status');
table.index('started_at');
});
}
export async function down(knex) {
await knex.schema.dropTableIfExists('sync_logs');
await knex.schema.dropTableIfExists('data_sources');
await knex.schema.dropTableIfExists('user_settings');
}