PSA/server/migrations/20251224233805_add_client_portal_config.cjs
Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

74 lines
2.8 KiB
JavaScript

/**
* Add client_portal_config JSONB column to projects and project_templates tables
*/
exports.config = { transaction: false };
const DEFAULT_CLIENT_PORTAL_CONFIG = {
show_phases: false,
show_phase_completion: false,
show_tasks: false,
visible_task_fields: ['task_name', 'due_date', 'status']
};
exports.up = async function(knex) {
console.log('Adding client_portal_config column to projects and project_templates...');
// Add to projects table
await knex.schema.alterTable('projects', (table) => {
table.jsonb('client_portal_config').defaultTo(JSON.stringify(DEFAULT_CLIENT_PORTAL_CONFIG));
});
console.log(' ✓ Added client_portal_config to projects table');
// Backfill existing projects with default config
// CitusDB requires select-then-update pattern with tenant in WHERE clause
const projectsToUpdate = await knex('projects')
.select('project_id', 'tenant')
.whereNull('client_portal_config');
for (const record of projectsToUpdate) {
await knex('projects')
.where('project_id', record.project_id)
.andWhere('tenant', record.tenant)
.update({ client_portal_config: JSON.stringify(DEFAULT_CLIENT_PORTAL_CONFIG) });
}
console.log(` ✓ Updated ${projectsToUpdate.length} existing projects with default config`);
// Add to project_templates table
await knex.schema.alterTable('project_templates', (table) => {
table.jsonb('client_portal_config').defaultTo(JSON.stringify(DEFAULT_CLIENT_PORTAL_CONFIG));
});
console.log(' ✓ Added client_portal_config to project_templates table');
// Backfill existing templates with default config
// CitusDB requires select-then-update pattern with tenant in WHERE clause
const templatesToUpdate = await knex('project_templates')
.select('template_id', 'tenant')
.whereNull('client_portal_config');
for (const record of templatesToUpdate) {
await knex('project_templates')
.where('template_id', record.template_id)
.andWhere('tenant', record.tenant)
.update({ client_portal_config: JSON.stringify(DEFAULT_CLIENT_PORTAL_CONFIG) });
}
console.log(` ✓ Updated ${templatesToUpdate.length} existing templates with default config`);
console.log('Client portal config columns added successfully');
};
exports.down = async function(knex) {
console.log('Dropping client_portal_config columns...');
await knex.schema.alterTable('projects', (table) => {
table.dropColumn('client_portal_config');
});
console.log(' ✓ Dropped client_portal_config from projects table');
await knex.schema.alterTable('project_templates', (table) => {
table.dropColumn('client_portal_config');
});
console.log(' ✓ Dropped client_portal_config from project_templates table');
console.log('Client portal config columns dropped successfully');
};