Skip to content

Commit 8e5ee4b

Browse files
committed
refactor: use trigger for soft delete
1 parent 89a8ac9 commit 8e5ee4b

File tree

4 files changed

+43
-23
lines changed

4 files changed

+43
-23
lines changed

__tests__/users.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ import {
126126
UserTransactionProcessor,
127127
UserTransactionStatus,
128128
} from '../src/entity/user/UserTransaction';
129+
import { DeletedUser } from '../src/entity/user/DeletedUser';
129130

130131
let con: DataSource;
131132
let app: FastifyInstance;
@@ -4195,6 +4196,21 @@ describe('mutation deleteUser', () => {
41954196
.senderId,
41964197
).toEqual(ghostUser.id);
41974198
});
4199+
4200+
it('should soft delete user', async () => {
4201+
loggedUser = '1';
4202+
4203+
const user = await con.getRepository(User).findOneBy({ id: '1' });
4204+
4205+
expect(user).not.toBeNull();
4206+
4207+
await client.mutate(MUTATION);
4208+
4209+
const deletedUser = await con
4210+
.getRepository(DeletedUser)
4211+
.findOneBy({ id: '1' });
4212+
expect(deletedUser).not.toBeNull();
4213+
});
41984214
});
41994215

42004216
describe('POST /v1/users/logout', () => {

src/common/user.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import { ForbiddenError } from 'apollo-server-errors';
2424
import { logger } from '../logger';
2525
import { CoresRole } from '../types';
2626
import { remoteConfig } from '../remoteConfig';
27-
import { DeletedUser } from '../entity/user/DeletedUser';
2827
import { UserTransaction } from '../entity/user/UserTransaction';
2928

3029
export const deleteUser = async (
@@ -106,9 +105,6 @@ export const deleteUser = async (
106105
},
107106
);
108107
await entityManager.getRepository(User).delete(userId);
109-
await entityManager.getRepository(DeletedUser).insert({
110-
id: userId,
111-
});
112108
});
113109
logger.info(
114110
{

src/cron/cleanZombieUsers.ts

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { Cron } from './cron';
22
import { User } from '../entity';
33
import { LessThan } from 'typeorm';
44
import { subHours } from 'date-fns';
5-
import { DeletedUser } from '../entity/user/DeletedUser';
65

76
const cron: Cron = {
87
name: 'clean-zombie-users',
@@ -23,25 +22,9 @@ const cron: Cron = {
2322
])
2423
.andWhere({
2524
createdAt: LessThan(timeThreshold),
26-
})
27-
.returning(['id']);
25+
});
2826

29-
const { affected, raw } = await query.execute();
30-
31-
if (Array.isArray(raw) && raw.length > 0) {
32-
await con
33-
.createQueryBuilder()
34-
.insert()
35-
.into(DeletedUser)
36-
.values(
37-
raw.map((item: { id: string }) => {
38-
return con.getRepository(DeletedUser).create({
39-
id: item.id,
40-
});
41-
}),
42-
)
43-
.execute();
44-
}
27+
const { affected } = await query.execute();
4528

4629
logger.info({ count: affected }, 'zombies users cleaned! 🧟');
4730
},

src/migration/1744965354822-DeletedUser.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,34 @@ export class DeletedUser1744965354822 implements MigrationInterface {
77
await queryRunner.query(
88
`CREATE TABLE "deleted_user" ("id" character varying(36) NOT NULL, "userDeletedAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_e85dad6b83f0681a83fd04fe691" PRIMARY KEY ("id"))`,
99
);
10+
11+
await queryRunner.query(`
12+
CREATE OR REPLACE FUNCTION soft_delete_user()
13+
RETURNS TRIGGER AS $$
14+
BEGIN
15+
INSERT INTO deleted_user (id) VALUES (OLD.id);
16+
RETURN NULL;
17+
END;
18+
$$ LANGUAGE plpgsql;
19+
`);
20+
21+
await queryRunner.query(`
22+
CREATE OR REPLACE TRIGGER soft_delete_user_trigger
23+
AFTER DELETE ON public.user
24+
FOR EACH ROW
25+
EXECUTE FUNCTION soft_delete_user();
26+
`);
1027
}
1128

1229
public async down(queryRunner: QueryRunner): Promise<void> {
30+
await queryRunner.query(`
31+
DROP TRIGGER IF EXISTS soft_delete_user_trigger ON public."user";
32+
`);
33+
34+
await queryRunner.query(`
35+
DROP FUNCTION IF EXISTS soft_delete_user();
36+
`);
37+
1338
await queryRunner.query(`DROP TABLE "deleted_user"`);
1439
}
1540
}

0 commit comments

Comments
 (0)