fix: add invite code generate check to avoid duplicated invite code

pull/105/head
moonrailgun 3 years ago
parent 8c1c03e91d
commit b6e978e569

@ -1399,6 +1399,9 @@ importers:
p-map: p-map:
specifier: ^4.0.0 specifier: ^4.0.0
version: 4.0.0 version: 4.0.0
promise-retry:
specifier: ^2.0.1
version: 2.0.1
qs: qs:
specifier: ^6.10.3 specifier: ^6.10.3
version: 6.11.0 version: 6.11.0
@ -1487,6 +1490,9 @@ importers:
'@types/oidc-provider': '@types/oidc-provider':
specifier: ^7.8.1 specifier: ^7.8.1
version: 7.11.1 version: 7.11.1
'@types/promise-retry':
specifier: ^1.1.3
version: 1.1.3
'@types/send': '@types/send':
specifier: ^0.17.1 specifier: ^0.17.1
version: 0.17.1 version: 0.17.1
@ -12938,6 +12944,12 @@ packages:
resolution: {integrity: sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==} resolution: {integrity: sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==}
dev: false dev: false
/@types/promise-retry@1.1.3:
resolution: {integrity: sha512-LxIlEpEX6frE3co3vCO2EUJfHIta1IOmhDlcAsR4GMMv9hev1iTI9VwberVGkePJAuLZs5rMucrV8CziCfuJMw==}
dependencies:
'@types/retry': 0.12.0
dev: true
/@types/prop-types@15.7.5: /@types/prop-types@15.7.5:
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
@ -18450,6 +18462,10 @@ packages:
resolution: {integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==} resolution: {integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==}
dev: true dev: true
/err-code@2.0.3:
resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
dev: false
/errno@0.1.8: /errno@0.1.8:
resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
hasBin: true hasBin: true
@ -28303,6 +28319,14 @@ packages:
optional: true optional: true
dev: true dev: true
/promise-retry@2.0.1:
resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==}
engines: {node: '>=10'}
dependencies:
err-code: 2.0.3
retry: 0.12.0
dev: false
/promise.allsettled@1.0.5: /promise.allsettled@1.0.5:
resolution: {integrity: sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==} resolution: {integrity: sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -31100,6 +31124,11 @@ packages:
engines: {node: '>=0.12'} engines: {node: '>=0.12'}
dev: true dev: true
/retry@0.12.0:
resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
engines: {node: '>= 4'}
dev: false
/retry@0.13.1: /retry@0.13.1:
resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
engines: {node: '>= 4'} engines: {node: '>= 4'}

@ -11,6 +11,7 @@ import type { Types } from 'mongoose';
import { nanoid } from 'nanoid'; import { nanoid } from 'nanoid';
import { User } from '../user/user'; import { User } from '../user/user';
import { Group } from './group'; import { Group } from './group';
import promiseRetry from 'promise-retry';
function generateCode() { function generateCode() {
return nanoid(8); return nanoid(8);
@ -73,9 +74,27 @@ export class GroupInvite extends TimeStamps implements Base {
expiredAt = undefined; expiredAt = undefined;
} }
const code = await promiseRetry(
async () => {
const code = generateCode();
const exists = await this.exists({ code });
if (exists) {
throw new Error('Cannot find unused invite code, please try again.');
}
return code;
},
{
minTimeout: 0,
maxTimeout: 0,
retries: 5,
}
);
const invite = await this.create({ const invite = await this.create({
groupId, groupId,
code: generateCode(), code,
creator, creator,
expiredAt, expiredAt,
}); });

@ -67,6 +67,7 @@
"nodemailer": "^6.7.2", "nodemailer": "^6.7.2",
"oidc-provider": "^7.10.6", "oidc-provider": "^7.10.6",
"p-map": "^4.0.0", "p-map": "^4.0.0",
"promise-retry": "^2.0.1",
"qs": "^6.10.3", "qs": "^6.10.3",
"redlock": "^4.2.0", "redlock": "^4.2.0",
"send": "^0.18.0", "send": "^0.18.0",
@ -98,6 +99,7 @@
"@types/node": "16.11.7", "@types/node": "16.11.7",
"@types/nodemailer": "^6.4.4", "@types/nodemailer": "^6.4.4",
"@types/oidc-provider": "^7.8.1", "@types/oidc-provider": "^7.8.1",
"@types/promise-retry": "^1.1.3",
"@types/send": "^0.17.1", "@types/send": "^0.17.1",
"@types/serve-static": "^1.15.0", "@types/serve-static": "^1.15.0",
"@types/swagger-jsdoc": "^6.0.1", "@types/swagger-jsdoc": "^6.0.1",

Loading…
Cancel
Save