Skip to content

Commit fde09d8

Browse files
authored
Merge pull request #320 from PretendoNetwork/feat/grace-period
2 parents d99d02c + 0a0cf13 commit fde09d8

23 files changed

+113
-29
lines changed

package-lock.json

Lines changed: 33 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
"colors": "^1.4.0",
3535
"cors": "^2.8.5",
3636
"crc": "^4.3.2",
37+
"cron": "^4.4.0",
3738
"dicer": "^0.2.5",
3839
"dotenv": "^16.0.3",
3940
"ejs": "^3.1.10",

src/database.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,3 +339,17 @@ export async function removePNIDConnectionDiscord(pnid: HydratedPNIDDocument): P
339339
status: 200
340340
};
341341
}
342+
343+
export async function checkMarkedDeletions(): Promise<void> {
344+
const pnids = await PNID.find({
345+
marked_for_deletion: true,
346+
deleted: false,
347+
hard_delete_time: {
348+
$lte: new Date()
349+
}
350+
});
351+
352+
for (const pnid of pnids) {
353+
await pnid.scrub();
354+
}
355+
}

src/middleware/pnid.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ async function PNIDMiddleware(request: express.Request, response: express.Respon
5353
return;
5454
}
5555

56-
if (pnid.deleted) {
56+
if (pnid.deleted || pnid.marked_for_deletion) {
5757
response.status(400).send(xmlbuilder.create({
5858
errors: {
5959
error: {

src/models/pnid.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ const PNIDSchema = new Schema<IPNID, PNIDModel, IPNIDMethods>({
3333
type: Boolean,
3434
default: false
3535
},
36+
marked_for_deletion: {
37+
type: Boolean,
38+
default: false
39+
},
40+
hard_delete_time: Date,
3641
permissions: {
3742
type: BigInt,
3843
default: 0n
@@ -225,6 +230,11 @@ PNIDSchema.method('generateMiiImages', async function generateMiiImages(): Promi
225230
await uploadCDNAsset(config.s3.bucket, `${userMiiKey}/body.png`, miiStudioBodyImageData, 'public-read');
226231
});
227232

233+
PNIDSchema.method('markForDeletion', function markForDeletion() {
234+
this.marked_for_deletion = true;
235+
this.hard_delete_time = new Date(Date.now() + (7 * 24 * 3600 * 1000)); // * 7 day grace period
236+
});
237+
228238
PNIDSchema.method('scrub', async function scrub() {
229239
// * Remove all personal info from a PNID
230240
// * Username and PID remain so thye do not get assigned again
@@ -287,7 +297,10 @@ PNIDSchema.method('scrub', async function scrub() {
287297
});
288298

289299
this.deleted = true;
290-
this.access_level = 0;
300+
this.marked_for_deletion = false;
301+
if (this.access_level > 0) {
302+
this.access_level = 0;
303+
}
291304
this.server_access_level = 'prod';
292305
this.creation_date = '';
293306
this.birthdate = '';

src/server.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import morgan from 'morgan';
33
import xmlbuilder from 'xmlbuilder';
44
import xmlparser from '@/middleware/xml-parser';
55
import { connect as connectCache } from '@/cache';
6-
import { connect as connectDatabase } from '@/database';
6+
import { checkMarkedDeletions, connect as connectDatabase } from '@/database';
77
import { startGRPCServer } from '@/services/grpc/server';
8-
import { fullUrl, getValueFromHeaders } from '@/util';
8+
import { fullUrl, getValueFromHeaders, setupScheduledTasks } from '@/util';
99
import { LOG_INFO, LOG_SUCCESS, LOG_WARN } from '@/logger';
1010
import conntest from '@/services/conntest';
1111
import cbvc from '@/services/cbvc';
@@ -116,6 +116,10 @@ async function main(): Promise<void> {
116116

117117
startProvisioner();
118118

119+
await checkMarkedDeletions();
120+
121+
setupScheduledTasks();
122+
119123
app.listen(config.http.port, () => {
120124
LOG_SUCCESS(`HTTP server started on port ${config.http.port}`);
121125
});

src/services/api/routes/v1/login.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ router.post('/', async (request: express.Request, response: express.Response): P
102102
}
103103
}
104104

105-
if (pnid.deleted) {
105+
if (pnid.deleted || pnid.marked_for_deletion) {
106106
response.status(400).json({
107107
app: 'api',
108108
status: 400,

src/services/grpc/account/v1/exchange-token-for-user-data.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export async function exchangeTokenForUserData(request: ExchangeTokenForUserData
1717
}
1818

1919
return {
20-
deleted: pnid.deleted,
20+
deleted: pnid.deleted || pnid.marked_for_deletion,
2121
pid: pnid.pid,
2222
username: pnid.username,
2323
accessLevel: pnid.access_level,

src/services/grpc/account/v1/get-user-data.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export async function getUserData(request: GetUserDataRequest): Promise<GetUserD
1515
}
1616

1717
return {
18-
deleted: pnid.deleted,
18+
deleted: pnid.deleted || pnid.marked_for_deletion,
1919
pid: pnid.pid,
2020
username: pnid.username,
2121
accessLevel: pnid.access_level,

src/services/grpc/account/v2/delete-account.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export async function deleteAccount(request: DeleteAccountRequest): Promise<Dele
1717
try {
1818
const email = pnid.email.address;
1919

20-
await pnid.scrub();
20+
pnid.markForDeletion();
2121
await pnid.save();
2222

2323
await sendPNIDDeletedEmail(email, pnid.username);
@@ -26,6 +26,6 @@ export async function deleteAccount(request: DeleteAccountRequest): Promise<Dele
2626
}
2727

2828
return {
29-
hasDeleted: pnid.deleted
29+
hasDeleted: pnid.deleted || pnid.marked_for_deletion
3030
};
3131
}

0 commit comments

Comments
 (0)