Skip to content

Commit 28e03dd

Browse files
fix: make surveyCode uniqueness checks async (#94)
* fix: async helper functions * chore: referral code -> survey code
1 parent dcfe97b commit 28e03dd

File tree

2 files changed

+12
-12
lines changed

2 files changed

+12
-12
lines changed

server/src/database/survey/survey.controller.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ export async function getParentSurveyCode(
2020
* @returns Array<string> - The generated child survey codes
2121
* @throws {Error} - Throws SURVEY_CODE_GENERATION_ERROR if unable to generate unique codes after 3 retries
2222
*/
23-
export function generateUniqueChildSurveyCodes(): Array<string> {
23+
export async function generateUniqueChildSurveyCodes(): Promise<Array<string>> {
2424
for (let retries = 0; retries < 3; retries++) {
25-
const codes = Array.from({ length: 3 }, () =>
26-
generateUniqueReferralCode()
27-
);
25+
const codes = await Promise.all(Array.from({ length: 3 }, () =>
26+
generateUniqueSurveyCode()
27+
));
2828
// Enforce uniqueness within the array
2929
if (isUniqueSurveyCodeArray(codes)) {
3030
return codes;
@@ -51,11 +51,11 @@ function isUniqueSurveyCodeArray(codes: Array<string>): boolean {
5151
* @returns string - A unique 6-character alphanumeric code in uppercase
5252
* @throws {Error} - Throws SURVEY_CODE_GENERATION_ERROR if unable to generate unique code after 3 retries
5353
*/
54-
export function generateUniqueReferralCode(): string {
54+
export async function generateUniqueSurveyCode(): Promise<string> {
5555
for (let retries = 0; retries < 3; retries++) {
5656
const code = Math.random().toString(36).substring(2, 8).toUpperCase();
5757
// Enforce individual code uniqueness
58-
if (isUniqueSurveyCode(code)) {
58+
if (await isUniqueSurveyCode(code)) {
5959
return code;
6060
}
6161
}
@@ -69,9 +69,9 @@ export function generateUniqueReferralCode(): string {
6969
* @param code - The survey code to check for uniqueness
7070
* @returns boolean - true if the code is unique, false if it already exists
7171
*/
72-
function isUniqueSurveyCode(code: string): boolean {
72+
async function isUniqueSurveyCode(code: string): Promise<boolean> {
7373
return (
74-
Survey.findOne({ surveyCode: code }) === null &&
75-
Survey.findOne({ childSurveyCodes: { $in: [code] } }) === null
74+
await Survey.findOne({ surveyCode: code }) === null &&
75+
await Survey.findOne({ childSurveyCodes: { $in: [code] } }) === null
7676
);
7777
}

server/src/routes/v2/surveys.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import express, { NextFunction, Response } from 'express';
55
import Survey, { ISurvey } from '@/database/survey/mongoose/survey.model';
66
import {
77
generateUniqueChildSurveyCodes,
8-
generateUniqueReferralCode,
8+
generateUniqueSurveyCode,
99
getParentSurveyCode
1010
} from '@/database/survey/survey.controller';
1111
import {
@@ -209,7 +209,7 @@ router.post(
209209
const surveyData: ISurvey = req.body;
210210

211211
// Generate unique child survey codes for the new survey
212-
surveyData.childSurveyCodes = generateUniqueChildSurveyCodes();
212+
surveyData.childSurveyCodes = await generateUniqueChildSurveyCodes();
213213

214214
// Resolve parent survey code
215215
if (surveyData.surveyCode) {
@@ -230,7 +230,7 @@ router.post(
230230
} else if (req.query.new === 'true') {
231231
// If `new` query parameter is true, generate new survey code and set parent to seed
232232
surveyData.parentSurveyCode = SYSTEM_SURVEY_CODE;
233-
surveyData.surveyCode = generateUniqueReferralCode();
233+
surveyData.surveyCode = await generateUniqueSurveyCode();
234234
} else {
235235
const err = errors.NO_SURVEY_CODE_PROVIDED;
236236
return res.status(err.status).json({

0 commit comments

Comments
 (0)