kutt/server/queries/user.queries.js

85 lines
1.8 KiB
JavaScript
Raw Normal View History

2024-08-11 18:41:03 +03:30
const { addMinutes } = require("date-fns");
const { v4: uuid } = require("uuid");
2020-01-30 18:51:52 +03:30
2024-08-11 18:41:03 +03:30
const redis = require("../redis");
const knex = require("../knex");
2020-01-30 18:51:52 +03:30
2024-08-11 18:41:03 +03:30
async function find(match) {
2020-01-30 18:51:52 +03:30
if (match.email || match.apikey) {
const key = redis.key.user(match.email || match.apikey);
2024-08-11 18:41:03 +03:30
const cachedUser = await redis.client.get(key);
if (cachedUser) return JSON.parse(cachedUser);
2020-01-30 18:51:52 +03:30
}
2024-08-11 18:41:03 +03:30
const user = await knex("users").where(match).first();
2020-01-30 18:51:52 +03:30
if (user) {
const emailKey = redis.key.user(user.email);
2024-08-11 18:41:03 +03:30
redis.client.set(emailKey, JSON.stringify(user), "EX", 60 * 60 * 1);
2020-01-30 18:51:52 +03:30
if (user.apikey) {
const apikeyKey = redis.key.user(user.apikey);
2024-08-11 18:41:03 +03:30
redis.client.set(apikeyKey, JSON.stringify(user), "EX", 60 * 60 * 1);
2020-01-30 18:51:52 +03:30
}
}
2024-08-11 18:41:03 +03:30
2020-01-30 18:51:52 +03:30
return user;
}
2024-08-11 18:41:03 +03:30
async function add(params, user) {
2020-01-30 18:51:52 +03:30
const data = {
email: params.email,
password: params.password,
verification_token: uuid(),
verification_expires: addMinutes(new Date(), 60).toISOString()
};
2024-08-11 18:41:03 +03:30
2020-01-30 18:51:52 +03:30
if (user) {
2024-08-11 18:41:03 +03:30
await knex("users")
2020-01-30 18:51:52 +03:30
.where("id", user.id)
.update({ ...data, updated_at: new Date().toISOString() });
} else {
2024-08-11 18:41:03 +03:30
await knex("users").insert(data);
2020-01-30 18:51:52 +03:30
}
2024-08-11 18:41:03 +03:30
2020-01-30 18:51:52 +03:30
redis.remove.user(user);
2024-08-11 18:41:03 +03:30
2020-01-30 18:51:52 +03:30
return {
...user,
...data
};
2024-08-11 18:41:03 +03:30
}
2020-01-30 18:51:52 +03:30
2024-08-11 18:41:03 +03:30
async function update(match, update) {
const query = knex("users");
2020-01-30 18:51:52 +03:30
Object.entries(match).forEach(([key, value]) => {
query.andWhere(key, ...(Array.isArray(value) ? value : [value]));
});
2024-08-11 18:41:03 +03:30
2020-01-30 18:51:52 +03:30
const users = await query.update(
{ ...update, updated_at: new Date().toISOString() },
"*"
);
2024-08-11 18:41:03 +03:30
2020-01-30 18:51:52 +03:30
users.forEach(redis.remove.user);
2024-08-11 18:41:03 +03:30
2020-01-30 18:51:52 +03:30
return users;
2024-08-11 18:41:03 +03:30
}
2024-08-11 18:41:03 +03:30
async function remove(user) {
const deletedUser = await knex("users").where("id", user.id).delete();
redis.remove.user(user);
2024-08-11 18:41:03 +03:30
return !!deletedUser;
2024-08-11 18:41:03 +03:30
}
module.exports = {
add,
find,
remove,
update,
}