diff --git a/src/migration/1663177839075-deletableclient.ts b/src/migration/1663177839075-deletableclient.ts new file mode 100644 index 0000000..4961b14 --- /dev/null +++ b/src/migration/1663177839075-deletableclient.ts @@ -0,0 +1,23 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class deletableclient1663177839075 implements MigrationInterface { + name = 'deletableclient1663177839075'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE \`o_auth2_client_url\` DROP FOREIGN KEY \`FK_aca59c7bdd65987487eea98d00f\``, + ); + await queryRunner.query( + `ALTER TABLE \`o_auth2_client_url\` ADD CONSTRAINT \`FK_aca59c7bdd65987487eea98d00f\` FOREIGN KEY (\`clientId\`) REFERENCES \`o_auth2_client\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE \`o_auth2_client_url\` DROP FOREIGN KEY \`FK_aca59c7bdd65987487eea98d00f\``, + ); + await queryRunner.query( + `ALTER TABLE \`o_auth2_client_url\` ADD CONSTRAINT \`FK_aca59c7bdd65987487eea98d00f\` FOREIGN KEY (\`clientId\`) REFERENCES \`o_auth2_client\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`, + ); + } +} diff --git a/src/migration/1663178177421-cascades.ts b/src/migration/1663178177421-cascades.ts new file mode 100644 index 0000000..6ba4803 --- /dev/null +++ b/src/migration/1663178177421-cascades.ts @@ -0,0 +1,51 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class cascades1663178177421 implements MigrationInterface { + name = 'cascades1663178177421'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE \`o_auth2_token\` DROP FOREIGN KEY \`FK_3ecb760b321ef9bbab635f05b45\``, + ); + await queryRunner.query( + `ALTER TABLE \`o_auth2_token\` ADD CONSTRAINT \`FK_3ecb760b321ef9bbab635f05b45\` FOREIGN KEY (\`clientId\`) REFERENCES \`o_auth2_client\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + + await queryRunner.query( + `ALTER TABLE \`o_auth2_token\` DROP FOREIGN KEY \`FK_81ffb9b8d672cf3af1af9e789f3\``, + ); + await queryRunner.query( + `ALTER TABLE \`o_auth2_token\` ADD CONSTRAINT \`FK_81ffb9b8d672cf3af1af9e789f3\` FOREIGN KEY (\`userId\`) REFERENCES \`user\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + + await queryRunner.query( + `ALTER TABLE \`user_token\` DROP FOREIGN KEY \`FK_d37db50eecdf9b8ce4eedd2f918\``, + ); + await queryRunner.query( + `ALTER TABLE \`user_token\` ADD CONSTRAINT \`FK_d37db50eecdf9b8ce4eedd2f918\` FOREIGN KEY (\`userId\`) REFERENCES \`user\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE \`user_token\` DROP FOREIGN KEY \`FK_d37db50eecdf9b8ce4eedd2f918\``, + ); + await queryRunner.query( + `ALTER TABLE \`user_token\` ADD CONSTRAINT \`FK_d37db50eecdf9b8ce4eedd2f918\` FOREIGN KEY (\`userId\`) REFERENCES \`user\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`, + ); + + await queryRunner.query( + `ALTER TABLE \`o_auth2_token\` DROP FOREIGN KEY \`FK_3ecb760b321ef9bbab635f05b45\``, + ); + await queryRunner.query( + `ALTER TABLE \`o_auth2_token\` ADD CONSTRAINT \`FK_3ecb760b321ef9bbab635f05b45\` FOREIGN KEY (\`clientId\`) REFERENCES \`o_auth2_client\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`, + ); + + await queryRunner.query( + `ALTER TABLE \`o_auth2_token\` DROP FOREIGN KEY \`FK_81ffb9b8d672cf3af1af9e789f3\``, + ); + await queryRunner.query( + `ALTER TABLE \`o_auth2_token\` ADD CONSTRAINT \`FK_81ffb9b8d672cf3af1af9e789f3\` FOREIGN KEY (\`userId\`) REFERENCES \`user\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`, + ); + } +} diff --git a/src/modules/api/admin/oauth2-admin.controller.ts b/src/modules/api/admin/oauth2-admin.controller.ts index 451c98d..b9e956b 100644 --- a/src/modules/api/admin/oauth2-admin.controller.ts +++ b/src/modules/api/admin/oauth2-admin.controller.ts @@ -232,7 +232,7 @@ export class OAuth2AdminController { @Body() setter: Partial, @CurrentUser() user: User, ) { - const client = await this._oaClient.getById(parseInt(id, 10), []); + const client = await this._oaClient.getById(parseInt(id, 10), ['owner']); const reducedPermissions = !this._service.userHasPrivilege( user, 'admin:oauth2', @@ -301,7 +301,7 @@ export class OAuth2AdminController { @Scopes('management') @Privileges(['admin', 'admin:oauth2'], 'self:oauth2') async deleteOauth2Client(@Param('id') id: string, @CurrentUser() user: User) { - const client = await this._oaClient.getById(parseInt(id, 10), []); + const client = await this._oaClient.getById(parseInt(id, 10), ['owner']); if (!client) { throw new NotFoundException('Client not found'); } @@ -326,7 +326,7 @@ export class OAuth2AdminController { @Scopes('management') @Privileges(['admin', 'admin:oauth2'], 'self:oauth2') async createNewSecret(@Param('id') id: string, @CurrentUser() user: User) { - const client = await this._oaClient.getById(parseInt(id, 10), []); + const client = await this._oaClient.getById(parseInt(id, 10), ['owner']); if (!client) { throw new NotFoundException('Client not found'); } @@ -354,7 +354,7 @@ export class OAuth2AdminController { @Param('id') id: string, @CurrentUser() user: User, ) { - const client = await this._oaClient.getById(parseInt(id, 10), []); + const client = await this._oaClient.getById(parseInt(id, 10), ['owner']); if (!client) { throw new NotFoundException('Client not found'); } @@ -374,7 +374,10 @@ export class OAuth2AdminController { @Scopes('management') @Privileges(['admin', 'admin:oauth2'], 'self:oauth2') async oauth2ClientURLs(@Param('id') id: string, @CurrentUser() user: User) { - const client = await this._oaClient.getById(parseInt(id, 10), ['urls']); + const client = await this._oaClient.getById(parseInt(id, 10), [ + 'urls', + 'owner', + ]); if (!client) { throw new NotFoundException('Client not found'); } @@ -396,7 +399,10 @@ export class OAuth2AdminController { @Param('url') urlId: string, @CurrentUser() user: User, ) { - const client = await this._oaClient.getById(parseInt(id, 10), ['urls']); + const client = await this._oaClient.getById(parseInt(id, 10), [ + 'urls', + 'owner', + ]); const parsedURLId = parseInt(urlId, 10); if (!client) { @@ -432,7 +438,10 @@ export class OAuth2AdminController { @Body() setter: { url: string; type: string }, @CurrentUser() user: User, ) { - const client = await this._oaClient.getById(parseInt(id, 10), ['urls']); + const client = await this._oaClient.getById(parseInt(id, 10), [ + 'urls', + 'owner', + ]); const plucked = this._form.pluckObject(setter, ['url', 'type']); const parsedURLId = parseInt(urlId, 10); @@ -472,7 +481,10 @@ export class OAuth2AdminController { @Body() setter: { url: string; type: string }, @CurrentUser() user: User, ) { - const client = await this._oaClient.getById(parseInt(id, 10), ['urls']); + const client = await this._oaClient.getById(parseInt(id, 10), [ + 'urls', + 'owner', + ]); if (!client) { throw new NotFoundException('Client not found'); } @@ -506,7 +518,10 @@ export class OAuth2AdminController { @Param('id') id: string, @UploadedFile() file: Express.Multer.File, ) { - const client = await this._oaClient.getById(parseInt(id, 10), ['picture']); + const client = await this._oaClient.getById(parseInt(id, 10), [ + 'picture', + 'owner', + ]); try { if (!client) { @@ -551,7 +566,10 @@ export class OAuth2AdminController { @Param('id') id: string, @CurrentUser() user: User, ) { - const client = await this._oaClient.getById(parseInt(id, 10), ['picture']); + const client = await this._oaClient.getById(parseInt(id, 10), [ + 'picture', + 'owner', + ]); if (!client) { throw new NotFoundException('Client not found'); } diff --git a/src/modules/objects/oauth2-client/oauth2-client-url.entity.ts b/src/modules/objects/oauth2-client/oauth2-client-url.entity.ts index fee4df7..d37589c 100644 --- a/src/modules/objects/oauth2-client/oauth2-client-url.entity.ts +++ b/src/modules/objects/oauth2-client/oauth2-client-url.entity.ts @@ -39,6 +39,8 @@ export class OAuth2ClientURL { }) public updated_at: Date; - @ManyToOne(() => OAuth2Client, (client) => client.urls) + @ManyToOne(() => OAuth2Client, (client) => client.urls, { + onDelete: 'CASCADE', + }) public client: OAuth2Client; } diff --git a/src/modules/objects/oauth2-token/oauth2-token.entity.ts b/src/modules/objects/oauth2-token/oauth2-token.entity.ts index b9830ea..6a4899c 100644 --- a/src/modules/objects/oauth2-token/oauth2-token.entity.ts +++ b/src/modules/objects/oauth2-token/oauth2-token.entity.ts @@ -32,10 +32,10 @@ export class OAuth2Token { @Column({ type: 'text', nullable: true }) scope: string; - @ManyToOne(() => User, { nullable: true }) + @ManyToOne(() => User, { nullable: true, onDelete: 'CASCADE' }) user: User; - @ManyToOne(() => OAuth2Client) + @ManyToOne(() => OAuth2Client, { onDelete: 'CASCADE' }) client: OAuth2Client; @Column({ type: 'timestamp' }) diff --git a/src/modules/objects/user-token/user-token.entity.ts b/src/modules/objects/user-token/user-token.entity.ts index 25f0ee8..2fd0451 100644 --- a/src/modules/objects/user-token/user-token.entity.ts +++ b/src/modules/objects/user-token/user-token.entity.ts @@ -39,6 +39,6 @@ export class UserToken { @CreateDateColumn() public created_at: Date; - @ManyToOne(() => User) + @ManyToOne(() => User, { onDelete: 'CASCADE' }) user: User; }