traxxx-web/src/users.js

53 lines
1.4 KiB
JavaScript
Raw Normal View History

2024-02-29 04:08:54 +00:00
import knex from './knex.js';
// import { curateStash } from './stashes.js';
export function curateUser(user) {
if (!user) {
return null;
}
const ability = [...(user.role_abilities || []), ...(user.abilities || [])];
const curatedUser = {
id: user.id,
username: user.username,
email: user.email,
emailVerified: user.email_verified,
identityVerified: user.identity_verified,
ability,
avatar: `/media/avatars/${user.id}_${user.username}.png`,
createdAt: user.created_at,
// stashes: user.stashes?.filter(Boolean).map((stash) => curateStash(stash)) || [],
};
return curatedUser;
}
2024-02-29 05:00:12 +00:00
export async function fetchUser(userId, options = {}) {
2024-02-29 04:08:54 +00:00
const user = await knex('users')
.select(knex.raw('users.*, users_roles.abilities as role_abilities, COALESCE(json_agg(stashes ORDER BY stashes.created_at) FILTER (WHERE stashes.id IS NOT NULL), \'[]\') as stashes'))
.modify((builder) => {
if (typeof userId === 'number') {
builder.where('users.id', userId);
}
if (typeof userId === 'string') {
2024-02-29 05:00:12 +00:00
builder.where(knex.raw('lower(users.username)'), userId.toLowerCase());
if (options.email) {
builder.orWhere(knex.raw('lower(users.email)'), userId.toLowerCase());
}
2024-02-29 04:08:54 +00:00
}
})
.leftJoin('users_roles', 'users_roles.role', 'users.role')
.leftJoin('stashes', 'stashes.user_id', 'users.id')
.groupBy('users.id', 'users_roles.role')
.first();
2024-02-29 05:00:12 +00:00
if (options.raw) {
2024-02-29 04:08:54 +00:00
return user;
}
return curateUser(user);
}