projeto-hit/backend/src/helpers/RedisClient.ts

193 lines
3.9 KiB
TypeScript
Raw Normal View History

const Redis = require("ioredis");
const redis = new Redis(process.env.REDIS_URI);
type WhatsappData = {
whatsappId: string;
contactId: string;
identifier: string;
value?: string;
};
export async function set(key: string, value: string | object) {
if (typeof value == "object") await redis.set(key, JSON.stringify(value));
else {
await redis.set(key, value);
}
}
export async function get(key: string, value?: string) {
if (key.includes("*")) {
const keys = await redis.keys(key);
// If there are keys, delete them
if (keys.length > 0) {
for (const key of keys) {
const val = await redis.get(key);
if (value == val) return value;
}
}
return null;
} else {
const value: any = await redis.get(key);
return JSON.parse(value);
}
}
export async function del(key: string) {
await redis.del(key);
}
export async function clearAllKeys(...keys: string[]) {
for (const key of keys) {
// Retrieve all keys matching the pattern '*'
const del_keys = await redis.keys(key);
// If there are keys, delete them
if (del_keys.length > 0) {
console.log("del_keys: ", del_keys);
await redis.del(...del_keys);
}
}
}
export async function findByContain(
key: string,
keyName: string,
substring: string
) {
// const keys = await redis.keys("*" + substring + "*");
// const keys = await redis.keys("user:*");
const keys = await redis.keys(key);
const results: any[] = [];
for (const key of keys) {
const value = await redis.get(key);
if (value) {
const obj = JSON.parse(value);
if (
substring
?.trim()
?.toLowerCase()
.includes(obj[keyName]?.trim()?.toLowerCase())
) {
results.push(obj);
}
}
}
return results;
}
export async function createObject({
whatsappId,
contactId,
identifier,
value
}: WhatsappData) {
const key = `whatsappId:${whatsappId}:contactId:${contactId}:identifier:${identifier}`;
const result = await redis.hmset(
key,
"whatsappId",
whatsappId,
"contactId",
contactId,
"identifier",
identifier,
"value",
value
);
await redis.expire(key, 300);
}
export async function updateObject({
whatsappId,
contactId,
identifier,
value
}: WhatsappData) {
const key = `whatsappId:${whatsappId}:contactId:${contactId}:identifier:${identifier}`;
await redis.hset(key, "value", value);
}
export async function findObject(
whatsappId: string,
contactId: string,
identifier: string
) {
const key = `whatsappId:${whatsappId}:contactId:${contactId}:identifier:${identifier}`;
const result = await redis.hmget(
key,
"whatsappId",
"contactId",
"identifier",
"value"
);
return result;
}
export async function deleteObject(
whatsappId: string,
contactId: string,
identifier: string
) {
const key = `whatsappId:${whatsappId}:contactId:${contactId}:identifier:${identifier}`;
const deletedCount = await redis.del(key);
}
export async function deleteKeysWithPattern(
whatsappId: string,
contactId: string
) {
const pattern = `whatsappId:${whatsappId}:contactId:${contactId}:*`;
let cursor = "0";
do {
const [newCursor, keys] = await redis.scan(
cursor,
"MATCH",
pattern,
"COUNT",
"100"
);
for (const key of keys) {
await redis.del(key);
}
cursor = newCursor;
} while (cursor !== "0");
}
export async function getHashesWithPattern(
whatsappId: string,
contactId: string
) {
const pattern = `whatsappId:${whatsappId}:contactId:${contactId}:*`;
let cursor = "0";
const hashes = [];
do {
const [newCursor, keys] = await redis.scan(
cursor,
"MATCH",
pattern,
"COUNT",
"100"
);
for (const key of keys) {
const hash = await redis.hgetall(key);
hashes.push(hash);
}
cursor = newCursor;
} while (cursor !== "0");
return hashes;
}