Skip to content

Commit 98297da

Browse files
committed
Refactor PersonalTableSettingsController and entity to handle nullable ordering fields
1 parent 9dc8d84 commit 98297da

4 files changed

Lines changed: 125 additions & 48 deletions

File tree

backend/src/entities/table-settings/personal-table-settings/personal-table-settings.controller.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ export class PersonalTableSettingsController {
116116
columns_view: personalSettingsData.columns_view || null,
117117
list_fields: personalSettingsData.list_fields || null,
118118
list_per_page: personalSettingsData.list_per_page || null,
119-
ordering: personalSettingsData.ordering || null,
120-
ordering_field: personalSettingsData.ordering_field || null,
119+
ordering: personalSettingsData.ordering,
120+
ordering_field: personalSettingsData.ordering_field,
121121
original_names: personalSettingsData.original_names || null,
122122
},
123123
};

backend/src/entities/table-settings/personal-table-settings/personal-table-settings.entity.ts

Lines changed: 53 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -5,49 +5,57 @@ import { UserEntity } from '../../user/user.entity.js';
55

66
@Entity('personal_table_settings')
77
export class PersonalTableSettingsEntity {
8-
@PrimaryGeneratedColumn('uuid')
9-
id: string;
10-
11-
@Column({ default: null })
12-
table_name: string;
13-
14-
@Column('enum', {
15-
nullable: false,
16-
enum: QueryOrderingEnum,
17-
default: QueryOrderingEnum.ASC,
18-
})
19-
ordering!: QueryOrderingEnum;
20-
21-
@Column('varchar', { default: null })
22-
ordering_field: string;
23-
24-
@Column('int', { default: null })
25-
list_per_page: number;
26-
27-
@Column('varchar', { array: true, default: {} })
28-
list_fields: string[];
29-
30-
@Column({ type: 'varchar', array: true, default: {} })
31-
columns_view: Array<string>;
32-
33-
@Column('boolean', { default: false })
34-
original_names: boolean;
35-
36-
@ManyToOne((_) => ConnectionEntity, (connection) => connection.personal_table_settings, {
37-
onDelete: 'CASCADE',
38-
})
39-
@JoinColumn({ name: 'connection_id' })
40-
connection: Relation<ConnectionEntity>;
41-
42-
@Column()
43-
connection_id: string;
44-
45-
@ManyToOne((_) => UserEntity, (user) => user.personal_table_settings, {
46-
onDelete: 'CASCADE',
47-
})
48-
@JoinColumn({ name: 'user_id' })
49-
user: Relation<UserEntity>;
50-
51-
@Column()
52-
user_id: string;
8+
@PrimaryGeneratedColumn('uuid')
9+
id: string;
10+
11+
@Column({ default: null })
12+
table_name: string;
13+
14+
@Column('enum', {
15+
nullable: true,
16+
enum: QueryOrderingEnum,
17+
default: null,
18+
})
19+
ordering!: QueryOrderingEnum;
20+
21+
@Column('varchar', { default: null })
22+
ordering_field: string;
23+
24+
@Column('int', { default: null })
25+
list_per_page: number;
26+
27+
@Column('varchar', { array: true, default: {} })
28+
list_fields: string[];
29+
30+
@Column({ type: 'varchar', array: true, default: {} })
31+
columns_view: Array<string>;
32+
33+
@Column('boolean', { default: false })
34+
original_names: boolean;
35+
36+
@ManyToOne(
37+
(_) => ConnectionEntity,
38+
(connection) => connection.personal_table_settings,
39+
{
40+
onDelete: 'CASCADE',
41+
},
42+
)
43+
@JoinColumn({ name: 'connection_id' })
44+
connection: Relation<ConnectionEntity>;
45+
46+
@Column()
47+
connection_id: string;
48+
49+
@ManyToOne(
50+
(_) => UserEntity,
51+
(user) => user.personal_table_settings,
52+
{
53+
onDelete: 'CASCADE',
54+
},
55+
)
56+
@JoinColumn({ name: 'user_id' })
57+
user: Relation<UserEntity>;
58+
59+
@Column()
60+
user_id: string;
5361
}

backend/src/entities/table-settings/personal-table-settings/utils/build-new-personal-table-settings-entity.util.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { PersonalTableSettingsData } from '../data-structures/create-personal-table-settings.ds.js';
22
import { PersonalTableSettingsEntity } from '../personal-table-settings.entity.js';
33

4+
const NULLABLE_FIELDS = ['ordering', 'ordering_field'];
5+
46
export function buildNewPersonalTableSettingsEntity(
57
personalSettingsData: PersonalTableSettingsData,
68
): PersonalTableSettingsEntity {
79
const newEntity = new PersonalTableSettingsEntity();
810
Object.assign(newEntity, personalSettingsData);
911
Object.keys(personalSettingsData).forEach((key) => {
10-
if (personalSettingsData[key as keyof PersonalTableSettingsData] === undefined) {
12+
if (personalSettingsData[key as keyof PersonalTableSettingsData] === null && !NULLABLE_FIELDS.includes(key)) {
1113
// eslint-disable-next-line security/detect-object-injection
1214
delete (newEntity as any)[key];
1315
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { MigrationInterface, QueryRunner } from 'typeorm';
2+
3+
export class MakeOrderingFieldInPersonalTableSettingsEntityNullable1768915268048 implements MigrationInterface {
4+
name = 'MakeOrderingFieldInPersonalTableSettingsEntityNullable1768915268048';
5+
6+
public async up(queryRunner: QueryRunner): Promise<void> {
7+
await queryRunner.query(`ALTER TABLE "secret_access_logs" DROP CONSTRAINT "FK_secret_access_logs_secretId"`);
8+
await queryRunner.query(`ALTER TABLE "secret_access_logs" DROP CONSTRAINT "FK_secret_access_logs_userId"`);
9+
await queryRunner.query(`ALTER TABLE "user_secrets" DROP CONSTRAINT "FK_user_secrets_companyId"`);
10+
await queryRunner.query(`DROP INDEX "public"."IDX_secret_access_logs_secretId"`);
11+
await queryRunner.query(`DROP INDEX "public"."IDX_secret_access_logs_userId"`);
12+
await queryRunner.query(`DROP INDEX "public"."IDX_secret_access_logs_accessedAt"`);
13+
await queryRunner.query(`DROP INDEX "public"."IDX_user_secrets_companyId"`);
14+
await queryRunner.query(`DROP INDEX "public"."IDX_user_secrets_createdAt"`);
15+
await queryRunner.query(`DROP INDEX "public"."IDX_user_secrets_expiresAt"`);
16+
await queryRunner.query(`DROP INDEX "public"."IDX_user_secrets_company_slug"`);
17+
await queryRunner.query(`ALTER TABLE "personal_table_settings" ALTER COLUMN "ordering" DROP NOT NULL`);
18+
await queryRunner.query(`ALTER TABLE "personal_table_settings" ALTER COLUMN "ordering" DROP DEFAULT`);
19+
await queryRunner.query(`CREATE INDEX "IDX_69aeac5d0c61c697346fa2a0f8" ON "secret_access_logs" ("secretId") `);
20+
await queryRunner.query(`CREATE INDEX "IDX_1d02f2dca9278e9a3925f9e797" ON "secret_access_logs" ("userId") `);
21+
await queryRunner.query(`CREATE INDEX "IDX_ab33b550d45b31f76ac35a8c67" ON "secret_access_logs" ("accessedAt") `);
22+
await queryRunner.query(`CREATE INDEX "IDX_8798678e66032251ff48185e96" ON "user_secrets" ("companyId") `);
23+
await queryRunner.query(
24+
`CREATE UNIQUE INDEX "IDX_f39a47aac503fe096b0c77f2b3" ON "user_secrets" ("companyId", "slug") `,
25+
);
26+
await queryRunner.query(
27+
`ALTER TABLE "secret_access_logs" ADD CONSTRAINT "FK_69aeac5d0c61c697346fa2a0f83" FOREIGN KEY ("secretId") REFERENCES "user_secrets"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
28+
);
29+
await queryRunner.query(
30+
`ALTER TABLE "secret_access_logs" ADD CONSTRAINT "FK_1d02f2dca9278e9a3925f9e797f" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
31+
);
32+
await queryRunner.query(
33+
`ALTER TABLE "user_secrets" ADD CONSTRAINT "FK_8798678e66032251ff48185e962" FOREIGN KEY ("companyId") REFERENCES "company_info"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
34+
);
35+
}
36+
37+
public async down(queryRunner: QueryRunner): Promise<void> {
38+
await queryRunner.query(`ALTER TABLE "user_secrets" DROP CONSTRAINT "FK_8798678e66032251ff48185e962"`);
39+
await queryRunner.query(`ALTER TABLE "secret_access_logs" DROP CONSTRAINT "FK_1d02f2dca9278e9a3925f9e797f"`);
40+
await queryRunner.query(`ALTER TABLE "secret_access_logs" DROP CONSTRAINT "FK_69aeac5d0c61c697346fa2a0f83"`);
41+
await queryRunner.query(`DROP INDEX "public"."IDX_f39a47aac503fe096b0c77f2b3"`);
42+
await queryRunner.query(`DROP INDEX "public"."IDX_8798678e66032251ff48185e96"`);
43+
await queryRunner.query(`DROP INDEX "public"."IDX_ab33b550d45b31f76ac35a8c67"`);
44+
await queryRunner.query(`DROP INDEX "public"."IDX_1d02f2dca9278e9a3925f9e797"`);
45+
await queryRunner.query(`DROP INDEX "public"."IDX_69aeac5d0c61c697346fa2a0f8"`);
46+
await queryRunner.query(`ALTER TABLE "personal_table_settings" ALTER COLUMN "ordering" SET DEFAULT 'ASC'`);
47+
await queryRunner.query(`ALTER TABLE "personal_table_settings" ALTER COLUMN "ordering" SET NOT NULL`);
48+
await queryRunner.query(
49+
`CREATE UNIQUE INDEX "IDX_user_secrets_company_slug" ON "user_secrets" ("companyId", "slug") `,
50+
);
51+
await queryRunner.query(`CREATE INDEX "IDX_user_secrets_expiresAt" ON "user_secrets" ("expiresAt") `);
52+
await queryRunner.query(`CREATE INDEX "IDX_user_secrets_createdAt" ON "user_secrets" ("createdAt") `);
53+
await queryRunner.query(`CREATE INDEX "IDX_user_secrets_companyId" ON "user_secrets" ("companyId") `);
54+
await queryRunner.query(`CREATE INDEX "IDX_secret_access_logs_accessedAt" ON "secret_access_logs" ("accessedAt") `);
55+
await queryRunner.query(`CREATE INDEX "IDX_secret_access_logs_userId" ON "secret_access_logs" ("userId") `);
56+
await queryRunner.query(`CREATE INDEX "IDX_secret_access_logs_secretId" ON "secret_access_logs" ("secretId") `);
57+
await queryRunner.query(
58+
`ALTER TABLE "user_secrets" ADD CONSTRAINT "FK_user_secrets_companyId" FOREIGN KEY ("companyId") REFERENCES "company_info"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
59+
);
60+
await queryRunner.query(
61+
`ALTER TABLE "secret_access_logs" ADD CONSTRAINT "FK_secret_access_logs_userId" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
62+
);
63+
await queryRunner.query(
64+
`ALTER TABLE "secret_access_logs" ADD CONSTRAINT "FK_secret_access_logs_secretId" FOREIGN KEY ("secretId") REFERENCES "user_secrets"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
65+
);
66+
}
67+
}

0 commit comments

Comments
 (0)