Use reddis to cache and fetch wordlist
parent
8b16e4de31
commit
a45b5b3260
|
@ -1,11 +1,13 @@
|
||||||
|
import { Redis } from "@upstash/redis";
|
||||||
import type { NextApiRequest, NextApiResponse } from "next";
|
import type { NextApiRequest, NextApiResponse } from "next";
|
||||||
|
|
||||||
import slugify from "@calcom/lib/slugify";
|
import slugify from "@calcom/lib/slugify";
|
||||||
import prisma from "@calcom/prisma";
|
import prisma from "@calcom/prisma";
|
||||||
|
|
||||||
import notEmpty from "../../../apps/website/lib/utils/notEmpty";
|
|
||||||
import { wordlist } from "../../../apps/website/lib/utils/wordlist/wordlist";
|
|
||||||
import { IS_CALCOM } from "../constants";
|
import { IS_CALCOM } from "../constants";
|
||||||
|
import notEmpty from "../notEmpty";
|
||||||
|
|
||||||
|
const WORDLIST_PATH = process.env.PREMIUM_WORDLIST_PATH_FROM_SERVER ?? "";
|
||||||
|
|
||||||
export type RequestWithUsernameStatus = NextApiRequest & {
|
export type RequestWithUsernameStatus = NextApiRequest & {
|
||||||
usernameStatus: {
|
usernameStatus: {
|
||||||
|
@ -32,8 +34,33 @@ type CustomNextApiHandler<T = unknown> = (
|
||||||
res: NextApiResponse<T>
|
res: NextApiResponse<T>
|
||||||
) => void | Promise<void>;
|
) => void | Promise<void>;
|
||||||
|
|
||||||
export const isPremiumUserName = (username: string): boolean =>
|
async function fetchWordlist() {
|
||||||
username.length <= 4 || Object.prototype.hasOwnProperty.call(wordlist, username);
|
const UPSATCH_ENV_FOUND = process.env.UPSTASH_REDIS_REST_URL && process.env.UPSTASH_REDIS_REST_TOKEN;
|
||||||
|
|
||||||
|
if (!WORDLIST_PATH || !UPSATCH_ENV_FOUND || !IS_CALCOM) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
const redis = Redis.fromEnv();
|
||||||
|
|
||||||
|
const cachedData = await redis.get("premium-username-word-list");
|
||||||
|
|
||||||
|
if (cachedData) {
|
||||||
|
return JSON.parse(cachedData as string);
|
||||||
|
} else {
|
||||||
|
const response = await fetch(WORDLIST_PATH);
|
||||||
|
const data = await response.json();
|
||||||
|
await redis.set("premium-username-word-list", JSON.stringify(data), {
|
||||||
|
ex: 60 * 60 * 24 * 7,
|
||||||
|
});
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const isPremiumUserName = async (username: string) => {
|
||||||
|
const wordlist = await fetchWordlist();
|
||||||
|
return username.length <= 4 || Object.prototype.hasOwnProperty.call(wordlist, username);
|
||||||
|
};
|
||||||
|
|
||||||
export const generateUsernameSuggestion = async (users: string[], username: string) => {
|
export const generateUsernameSuggestion = async (users: string[], username: string) => {
|
||||||
const limit = username.length < 2 ? 9999 : 999;
|
const limit = username.length < 2 ? 9999 : 999;
|
||||||
|
@ -111,7 +138,7 @@ const usernameCheck = async (usernameRaw: string) => {
|
||||||
response.available = false;
|
response.available = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isPremiumUserName(username)) {
|
if (await isPremiumUserName(username)) {
|
||||||
response.premium = true;
|
response.premium = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -321,6 +321,7 @@
|
||||||
"ZOHOCRM_CLIENT_ID",
|
"ZOHOCRM_CLIENT_ID",
|
||||||
"ZOHOCRM_CLIENT_SECRET",
|
"ZOHOCRM_CLIENT_SECRET",
|
||||||
"ZOOM_CLIENT_ID",
|
"ZOOM_CLIENT_ID",
|
||||||
"ZOOM_CLIENT_SECRET"
|
"ZOOM_CLIENT_SECRET",
|
||||||
|
"PREMIUM_WORDLIST_PATH_FROM_SERVER"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue