mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
6b24d496db
Summary: Adds preferences to orgs. There are a few flavors: * `userOrgPrefs`: these are specific to a certain user and a certain org. * `orgPrefs`: these are specific to a certain org, and apply to all users. * `userPrefs`: these are specific to a certain user, and apply to all orgs. The three flavors of prefs are reported by `GET` for an org, and can be modified by `PATCH` for an org. The user needs to have UPDATE rights to change `orgPrefs`, but can change `userOrgPrefs` and `userPrefs` without that right since the settings only affect themselves. Test Plan: added tests Reviewers: dsagal Reviewed By: dsagal Differential Revision: https://phab.getgrist.com/D2572
63 lines
1.8 KiB
TypeScript
63 lines
1.8 KiB
TypeScript
import {nativeValues} from 'app/gen-server/lib/values';
|
|
import {MigrationInterface, QueryRunner, Table} from 'typeorm';
|
|
|
|
export class Prefs1596456522124 implements MigrationInterface {
|
|
|
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
|
await queryRunner.createTable(new Table({
|
|
name: 'prefs',
|
|
columns: [
|
|
{
|
|
name: 'org_id',
|
|
type: 'integer',
|
|
isNullable: true,
|
|
},
|
|
{
|
|
name: 'user_id',
|
|
type: 'integer',
|
|
isNullable: true,
|
|
},
|
|
{
|
|
name: 'prefs',
|
|
type: nativeValues.jsonType
|
|
}
|
|
],
|
|
foreignKeys: [
|
|
{
|
|
columnNames: ['org_id'],
|
|
referencedColumnNames: ['id'],
|
|
referencedTableName: 'orgs',
|
|
onDelete: 'CASCADE' // delete pref if linked to org that is deleted
|
|
},
|
|
{
|
|
columnNames: ['user_id'],
|
|
referencedColumnNames: ['id'],
|
|
referencedTableName: 'users',
|
|
onDelete: 'CASCADE' // delete pref if linked to user that is deleted
|
|
},
|
|
],
|
|
indices: [
|
|
{ columnNames: ['org_id', 'user_id'] },
|
|
{ columnNames: ['user_id'] },
|
|
],
|
|
checks: [
|
|
// Make sure pref refers to something, either a user or an org or both
|
|
{
|
|
columnNames: ['user_id', 'org_id'],
|
|
expression: 'COALESCE(user_id, org_id) IS NOT NULL'
|
|
},
|
|
]
|
|
}));
|
|
// Having trouble convincing TypeORM to create an index on expressions.
|
|
// Luckily, the SQL is identical for Sqlite and Postgres:
|
|
await queryRunner.manager.query(
|
|
'CREATE UNIQUE INDEX "prefs__user_id__org_id" ON "prefs" ' +
|
|
'(COALESCE(user_id,0), COALESCE(org_id,0))'
|
|
);
|
|
}
|
|
|
|
public async down(queryRunner: QueryRunner): Promise<any> {
|
|
await queryRunner.dropTable('prefs');
|
|
}
|
|
}
|