Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: use country code for periodic rooms #795

Merged
merged 1 commit into from
Nov 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/v1/controller/room/cancel/Periodic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ export class CancelPeriodic extends AbstractController<RequestType, ResponseType
properties: {
periodicUUID: {
type: "string",
format: "uuid-v4",
},
},
},
Expand Down
1 change: 0 additions & 1 deletion src/v1/controller/room/cancel/PeriodicSubRoom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ export class CancelPeriodicSubRoom extends AbstractController<RequestType, Respo
properties: {
periodicUUID: {
type: "string",
format: "uuid-v4",
},
roomUUID: {
type: "string",
Expand Down
4 changes: 2 additions & 2 deletions src/v1/controller/room/create/Ordinary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { Controller } from "../../../../decorator/Controller";
import { ControllerError } from "../../../../error/ControllerError";
import { ServiceRoom, ServiceRoomUser } from "../../../service";
import { ServiceUserPmi } from "../../../service/user/UserPmi";
import { generateRoomInviteCode, generateOrdinaryRoomUUID } from "./Utils";
import { generateRoomInviteCode, generateRoomUUID } from "./Utils";
import { rtcQueue } from "../../../queue";
import { aliGreenText } from "../../../utils/AliGreen";
import { dataSource } from "../../../../thirdPartyService/TypeORMService";
Expand Down Expand Up @@ -68,7 +68,7 @@ export class CreateOrdinary extends AbstractController<RequestType, ResponseType
roomUser: ServiceRoomUser;
};

private readonly roomUUID: string = generateOrdinaryRoomUUID();
private readonly roomUUID: string = generateRoomUUID();

public constructor(params: ControllerClassParams) {
super(params);
Expand Down
7 changes: 3 additions & 4 deletions src/v1/controller/room/create/Periodic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { PeriodicStatus, RoomStatus, RoomType, Week } from "../../../../model/ro
import { Periodic } from "../Types";
import { Region, Status } from "../../../../constants/Project";
import { FastifySchema, Response, ResponseError } from "../../../../types/Server";
import { v4 } from "uuid";
import { differenceInCalendarDays, toDate } from "date-fns/fp";
import cryptoRandomString from "crypto-random-string";
import { whiteboardCreateRoom } from "../../../utils/request/whiteboard/WhiteboardRequest";
Expand All @@ -18,7 +17,7 @@ import { calculatePeriodicDates } from "../utils/CalculatePeriodicDates";
import { checkBeginAndEndTime } from "../utils/CheckTime";
import { AbstractController } from "../../../../abstract/controller";
import { Controller } from "../../../../decorator/Controller";
import { generateRoomInviteCode } from "./Utils";
import { generateRoomInviteCode, generateRoomUUID } from "./Utils";
import { rtcQueue } from "../../../queue";
import { aliGreenText } from "../../../utils/AliGreen";
import { ControllerError } from "../../../../error/ControllerError";
Expand Down Expand Up @@ -104,7 +103,7 @@ export class CreatePeriodic extends AbstractController<RequestType, ResponseType
},
};

private readonly periodicUUID = v4();
private readonly periodicUUID = generateRoomUUID();

public async execute(): Promise<Response<ResponseType>> {
const region = Whiteboard.region as Region;
Expand Down Expand Up @@ -140,7 +139,7 @@ export class CreatePeriodic extends AbstractController<RequestType, ResponseType
const roomData = dates.map(({ start, end }) => {
return {
periodic_uuid: this.periodicUUID,
fake_room_uuid: v4(),
fake_room_uuid: generateRoomUUID(),
room_status: RoomStatus.Idle,
begin_time: start,
end_time: end,
Expand Down
15 changes: 4 additions & 11 deletions src/v1/controller/room/create/Utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,20 @@ import { v4 } from "uuid";
import { Logger, LoggerAPI, parseError } from "../../../../logger";
import RedisService from "../../../../thirdPartyService/RedisService";
import { RedisKey } from "../../../../utils/Redis";
import {
generateInviteCodeOrdinary,
generateInviteCodePeriodic,
} from "../utils/GenerateInviteCode";
import { generateInviteCode } from "../utils/GenerateInviteCode";
import { Server } from "../../../../constants/Config";

type RoomType = "ordinary" | "periodic";
const generateInviteCode: Record<RoomType, () => Promise<string | null>> = {
ordinary: generateInviteCodeOrdinary,
periodic: generateInviteCodePeriodic,
};

export const generateRoomInviteCode = async (
type: RoomType,
_type: RoomType,
roomUUID: string,
logger: Logger<LoggerAPI>,
): Promise<string> => {
let inviteCode = "";
try {
// when invite code is used up, fallback to uuid
const code = await generateInviteCode[type]();
const code = await generateInviteCode();
inviteCode = code === null ? roomUUID : code;
} catch (error) {
logger.warn("generate invite code failed", parseError(error));
Expand Down Expand Up @@ -55,6 +48,6 @@ export const generateRoomInviteCode = async (
return inviteCode;
};

export const generateOrdinaryRoomUUID = (): string => {
export const generateRoomUUID = (): string => {
return `${Server.region}-` + v4();
};
1 change: 0 additions & 1 deletion src/v1/controller/room/info/Periodic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ export class PeriodicInfo extends AbstractController<RequestType, ResponseType>
properties: {
periodicUUID: {
type: "string",
format: "uuid-v4",
},
},
},
Expand Down
1 change: 0 additions & 1 deletion src/v1/controller/room/info/PeriodicSubRoom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ export class PeriodicSubRoomInfo extends AbstractController<RequestType, Respons
},
periodicUUID: {
type: "string",
format: "uuid-v4",
},
needOtherRoomTimeInfo: {
type: "boolean",
Expand Down
4 changes: 2 additions & 2 deletions src/v1/controller/room/list/__tests__/list.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { createList } from "./helpers/createList";
import { ErrorCode } from "../../../../../ErrorCode";
import RedisService from "../../../../../thirdPartyService/RedisService";
import { RedisKey } from "../../../../../utils/Redis";
import { generateInviteCodeOrdinary } from "../../utils/GenerateInviteCode";
import { generateInviteCode } from "../../utils/GenerateInviteCode";

const namespace = "[api][api-v1][api-v1-room][api-v1-room-list]";

Expand Down Expand Up @@ -325,7 +325,7 @@ test(`${namespace} - has inviteCode`, async ava => {
const isEven = i % 2 === 0;

if (i % 3 !== 0) {
const inviteCode = (await generateInviteCodeOrdinary())!;
const inviteCode = (await generateInviteCode())!;
await RedisService.set(RedisKey.roomInviteCode(inviteCode), roomUUIDs[i]);
await RedisService.set(RedisKey.roomInviteCodeReverse(roomUUIDs[i]), inviteCode);
}
Expand Down
5 changes: 2 additions & 3 deletions src/v1/controller/room/update/Periodic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { In } from "typeorm";
import { Periodic } from "../Types";
import { checkUpdateBeginAndEndTime } from "./Utils";
import { compareDesc, differenceInCalendarDays, toDate } from "date-fns/fp";
import { v4 } from "uuid";
import { calculatePeriodicDates } from "../utils/CalculatePeriodicDates";
import {
whiteboardBanRoom,
Expand All @@ -19,6 +18,7 @@ import { parseError } from "../../../../logger";
import { aliGreenText } from "../../../utils/AliGreen";
import { ControllerError } from "../../../../error/ControllerError";
import { dataSource } from "../../../../thirdPartyService/TypeORMService";
import { generateRoomUUID } from "../create/Utils";

@Controller<RequestType, ResponseType>({
method: "post",
Expand All @@ -33,7 +33,6 @@ export class UpdatePeriodic extends AbstractController<RequestType, ResponseType
properties: {
periodicUUID: {
type: "string",
format: "uuid-v4",
},
beginTime: {
type: "number",
Expand Down Expand Up @@ -179,7 +178,7 @@ export class UpdatePeriodic extends AbstractController<RequestType, ResponseType
const willAddRoom = dates.map(({ start, end }) => {
return {
periodic_uuid: periodicUUID,
fake_room_uuid: v4(),
fake_room_uuid: generateRoomUUID(),
room_status: RoomStatus.Idle,
begin_time: start,
end_time: end,
Expand Down
1 change: 0 additions & 1 deletion src/v1/controller/room/update/PeriodicSubRoom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ export class UpdatePeriodicSubRoom extends AbstractController<RequestType, Respo
properties: {
periodicUUID: {
type: "string",
format: "uuid-v4",
},
roomUUID: {
type: "string",
Expand Down
35 changes: 3 additions & 32 deletions src/v1/controller/room/utils/GenerateInviteCode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,46 +5,17 @@ import { RedisKey } from "../../../../utils/Redis";

const nanoID = customAlphabet("0123456789", 10);

const inviteCodeFnOrdinary = (): string => {
const inviteCodeFn = (): string => {
const value = nanoID();

// insert region code at front, this is only used for ordinary rooms.
return `${Server.regionCode}`.concat(value);
};

export const generateInviteCodeOrdinary = async (): Promise<string | null> => {
const keyList = [];

// find the unused key
for (let i = 0; i < 30; i++) {
keyList.push(RedisKey.roomInviteCode(inviteCodeFnOrdinary()));
}

const value = await RedisService.vacantKey(keyList);
if (value === null) {
return null;
}

return RedisKey.roomInviteCodeParse(value);
};

const inviteCodeFnPeriodic = (): string => {
const value = nanoID();

// make sure the invite code not start with 0
if (value[0] === "0") {
return inviteCodeFnPeriodic();
}

return value;
};

export const generateInviteCodePeriodic = async (): Promise<string | null> => {
export const generateInviteCode = async (): Promise<string | null> => {
const keyList = [];

// find the unused key
for (let i = 0; i < 30; i++) {
keyList.push(RedisKey.roomInviteCode(inviteCodeFnPeriodic()));
keyList.push(RedisKey.roomInviteCode(inviteCodeFn()));
}

const value = await RedisService.vacantKey(keyList);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import test from "ava";
import { generateInviteCodeOrdinary } from "../GenerateInviteCode";
import { generateInviteCode } from "../GenerateInviteCode";
import { Server } from "../../../../../constants/Config";

const namespace = "[utils][utils-room][utils-room-invite-code]";
Expand All @@ -8,7 +8,7 @@ test(`${namespace} - generate invite code`, async ava => {
const inviteCodeList = [];

for (let i = 0; i < 100; i++) {
inviteCodeList.push(await generateInviteCodeOrdinary());
inviteCodeList.push(await generateInviteCode());
}

const matchInviteCode = /^\d{11}$/;
Expand Down