67 lines
1.7 KiB
JavaScript
67 lines
1.7 KiB
JavaScript
import { InvalidRequestError } from '../errors';
|
|
|
|
const LOGGER = require('@calzoneman/jsli')('AccountDB');
|
|
|
|
class AccountDB {
|
|
constructor(db) {
|
|
this.db = db;
|
|
}
|
|
|
|
getByName(name) {
|
|
return this.db.runTransaction(async tx => {
|
|
const user = await tx.table('users').where({ name }).first();
|
|
|
|
if (!user) return null;
|
|
|
|
return this.mapUser(user);
|
|
});
|
|
}
|
|
|
|
updateByName(name, changedFields) {
|
|
return this.db.runTransaction(async tx => {
|
|
if (changedFields.profile) {
|
|
changedFields.profile = JSON.stringify(changedFields.profile);
|
|
}
|
|
|
|
const rowsUpdated = await tx.table('users')
|
|
.update(changedFields)
|
|
.where({ name });
|
|
|
|
if (rowsUpdated === 0) {
|
|
throw new InvalidRequestError(
|
|
`Cannot update: name "${name}" does not exist`
|
|
);
|
|
}
|
|
});
|
|
}
|
|
|
|
mapUser(user) {
|
|
// Backwards compatibility
|
|
// Maybe worth backfilling one day to be done with it?
|
|
try {
|
|
let profile;
|
|
|
|
if (!user.profile) {
|
|
profile = { image: '', text: '' };
|
|
} else {
|
|
profile = JSON.parse(user.profile);
|
|
}
|
|
|
|
if (!profile.image) profile.image = '';
|
|
if (!profile.text) profile.text = '';
|
|
|
|
user.profile = profile;
|
|
} catch (error) {
|
|
// TODO: backfill erroneous records and remove this check
|
|
LOGGER.warn('Invalid profile "%s": %s', user.profile, error);
|
|
user.profile = { image: '', text: '' };
|
|
}
|
|
|
|
user.time = new Date(user.time);
|
|
|
|
return user;
|
|
}
|
|
}
|
|
|
|
export { AccountDB };
|