Add migration to restrict users without workspaces (#5369)
- update set null ON DELETE constraint to RESTRICT - update missing updates
This commit is contained in:
@ -0,0 +1,43 @@
|
|||||||
|
import { MigrationInterface, QueryRunner } from 'typeorm';
|
||||||
|
|
||||||
|
export class UpdateInconsistentUserConstraint1715593226719
|
||||||
|
implements MigrationInterface
|
||||||
|
{
|
||||||
|
name = 'UpdateInconsistentUserConstraint1715593226719';
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "core"."user" DROP CONSTRAINT "FK_2ec910029395fa7655621c88908"`,
|
||||||
|
);
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "core"."billingSubscription" ALTER COLUMN "status" TYPE text`,
|
||||||
|
);
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "core"."billingSubscription" ALTER COLUMN "interval" TYPE text`,
|
||||||
|
);
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "core"."workspace" ALTER COLUMN "subscriptionStatus" TYPE text`,
|
||||||
|
);
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "core"."user" ADD CONSTRAINT "FK_2ec910029395fa7655621c88908" FOREIGN KEY ("defaultWorkspaceId") REFERENCES "core"."workspace"("id") ON DELETE RESTRICT ON UPDATE NO ACTION`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "core"."user" DROP CONSTRAINT "FK_2ec910029395fa7655621c88908"`,
|
||||||
|
);
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "core"."workspace" ALTER COLUMN "subscriptionStatus" TYPE character varying`,
|
||||||
|
);
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "core"."billingSubscription" ALTER COLUMN "interval" TYPE character varying`,
|
||||||
|
);
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "core"."billingSubscription" ALTER COLUMN "status" TYPE character varying`,
|
||||||
|
);
|
||||||
|
await queryRunner.query(
|
||||||
|
`ALTER TABLE "core"."user" ADD CONSTRAINT "FK_2ec910029395fa7655621c88908" FOREIGN KEY ("defaultWorkspaceId") REFERENCES "core"."workspace"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -160,6 +160,9 @@ describe('TokenService', () => {
|
|||||||
};
|
};
|
||||||
const mockUser = { id: '1', email: 'user@example.com' };
|
const mockUser = { id: '1', email: 'user@example.com' };
|
||||||
|
|
||||||
|
const mockedNewDate = new Date();
|
||||||
|
|
||||||
|
jest.spyOn(global, 'Date').mockImplementation(() => mockedNewDate);
|
||||||
jest
|
jest
|
||||||
.spyOn(appTokenRepository, 'findOne')
|
.spyOn(appTokenRepository, 'findOne')
|
||||||
.mockResolvedValue(mockToken as AppToken);
|
.mockResolvedValue(mockToken as AppToken);
|
||||||
@ -173,7 +176,7 @@ describe('TokenService', () => {
|
|||||||
where: {
|
where: {
|
||||||
value: hashedToken,
|
value: hashedToken,
|
||||||
type: AppTokenType.PasswordResetToken,
|
type: AppTokenType.PasswordResetToken,
|
||||||
expiresAt: MoreThan(new Date()),
|
expiresAt: MoreThan(mockedNewDate),
|
||||||
revokedAt: IsNull(),
|
revokedAt: IsNull(),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@ -71,7 +71,7 @@ export class User {
|
|||||||
|
|
||||||
@Field(() => Workspace, { nullable: false })
|
@Field(() => Workspace, { nullable: false })
|
||||||
@ManyToOne(() => Workspace, (workspace) => workspace.users, {
|
@ManyToOne(() => Workspace, (workspace) => workspace.users, {
|
||||||
onDelete: 'SET NULL',
|
onDelete: 'RESTRICT',
|
||||||
})
|
})
|
||||||
defaultWorkspace: Relation<Workspace>;
|
defaultWorkspace: Relation<Workspace>;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user