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-10-07 09:08:40 +03:30
|
|
|
const utils = require("../utils");
|
2024-08-11 18:41:03 +03:30
|
|
|
const redis = require("../redis");
|
|
|
|
const knex = require("../knex");
|
2024-10-21 14:59:55 +03:30
|
|
|
const env = require("../env");
|
2020-01-30 18:51:52 +03:30
|
|
|
|
2024-08-11 18:41:03 +03:30
|
|
|
async function find(match) {
|
2024-10-21 14:59:55 +03:30
|
|
|
if ((match.email || match.apikey) && env.REDIS_ENABLED) {
|
2020-01-30 18:51:52 +03:30
|
|
|
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-09-25 15:44:55 +03:30
|
|
|
|
|
|
|
const query = knex("users");
|
|
|
|
Object.entries(match).forEach(([key, value]) => {
|
|
|
|
query.andWhere(key, ...(Array.isArray(value) ? value : [value]));
|
|
|
|
});
|
|
|
|
|
|
|
|
const user = await query.first();
|
2024-08-11 18:41:03 +03:30
|
|
|
|
2024-10-21 14:59:55 +03:30
|
|
|
if (user && env.REDIS_ENABLED) {
|
2020-01-30 18:51:52 +03:30
|
|
|
const emailKey = redis.key.user(user.email);
|
2024-10-21 14:59:55 +03:30
|
|
|
redis.client.set(emailKey, JSON.stringify(user), "EX", 60 * 15);
|
2024-08-11 18:41:03 +03:30
|
|
|
|
2020-01-30 18:51:52 +03:30
|
|
|
if (user.apikey) {
|
|
|
|
const apikeyKey = redis.key.user(user.apikey);
|
2024-10-21 14:59:55 +03:30
|
|
|
redis.client.set(apikeyKey, JSON.stringify(user), "EX", 60 * 15);
|
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(),
|
2024-10-07 09:08:40 +03:30
|
|
|
verification_expires: utils.dateToUTC(addMinutes(new Date(), 60))
|
2020-01-30 18:51:52 +03:30
|
|
|
};
|
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)
|
2024-10-07 09:08:40 +03:30
|
|
|
.update({ ...data, updated_at: utils.dateToUTC(new Date()) });
|
2020-01-30 18:51:52 +03:30
|
|
|
} 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
|
|
|
|
2024-10-21 14:59:55 +03:30
|
|
|
if (env.REDIS_ENABLED) {
|
|
|
|
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-09-24 17:25:06 +03:30
|
|
|
async function update(match, update, methods) {
|
2024-08-11 18:41:03 +03:30
|
|
|
const query = knex("users");
|
2024-09-14 00:17:21 +02:00
|
|
|
|
2020-01-30 18:51:52 +03:30
|
|
|
Object.entries(match).forEach(([key, value]) => {
|
|
|
|
query.andWhere(key, ...(Array.isArray(value) ? value : [value]));
|
|
|
|
});
|
2024-09-12 00:18:03 +02:00
|
|
|
|
2024-09-24 17:25:06 +03:30
|
|
|
const updateQuery = query.clone();
|
|
|
|
if (methods?.increments) {
|
|
|
|
methods.increments.forEach(columnName => {
|
|
|
|
updateQuery.increment(columnName);
|
|
|
|
});
|
|
|
|
}
|
2024-08-11 18:41:03 +03:30
|
|
|
|
2024-10-07 09:08:40 +03:30
|
|
|
await updateQuery.update({ ...update, updated_at: utils.dateToUTC(new Date()) });
|
2024-09-14 00:17:21 +02:00
|
|
|
|
2024-09-24 17:25:06 +03:30
|
|
|
const users = await query.select("*");
|
2024-09-12 00:18:03 +02:00
|
|
|
|
2024-10-21 14:59:55 +03:30
|
|
|
if (env.REDIS_ENABLED) {
|
|
|
|
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
|
|
|
}
|
2020-02-15 16:56:06 +03:30
|
|
|
|
2024-08-11 18:41:03 +03:30
|
|
|
async function remove(user) {
|
|
|
|
const deletedUser = await knex("users").where("id", user.id).delete();
|
|
|
|
|
2024-10-21 14:59:55 +03:30
|
|
|
if (env.REDIS_ENABLED) {
|
|
|
|
redis.remove.user(user);
|
|
|
|
}
|
2024-08-11 18:41:03 +03:30
|
|
|
|
2020-02-15 16:56:06 +03:30
|
|
|
return !!deletedUser;
|
2024-08-11 18:41:03 +03:30
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
add,
|
|
|
|
find,
|
|
|
|
remove,
|
|
|
|
update,
|
|
|
|
}
|