@authup/server-api
Version:
This is a standalone application.
160 lines • 6.06 kB
JavaScript
;
/*
* Copyright (c) 2021-2021.
* Author Peter Placzek (tada5hi)
* For the full copyright and license information,
* view the LICENSE file that was distributed with this source code.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.UserRepository = void 0;
const typeorm_1 = require("typeorm");
const core_1 = require("@authup/core");
const server_core_1 = require("@authup/server-core");
const redis_extension_1 = require("redis-extension");
const role_1 = require("../role");
const user_role_1 = require("../user-role");
const user_permission_1 = require("../user-permission");
const entity_1 = require("./entity");
const constants_1 = require("../../database/constants");
const user_attribute_1 = require("../user-attribute");
const utils_1 = require("../utils");
class UserRepository extends typeorm_1.Repository {
constructor(instance) {
super(entity_1.UserEntity, typeorm_1.InstanceChecker.isDataSource(instance) ? instance.manager : instance);
}
async appendAttributes(entity, names) {
const attributeRepository = this.manager.getRepository(user_attribute_1.UserAttributeEntity);
const where = {
user_id: entity.id,
};
if (names) {
where.name = (0, typeorm_1.In)(names);
}
const rawAttributes = await attributeRepository.find({
where: {
user_id: entity.id,
},
cache: {
id: (0, redis_extension_1.buildKeyPath)({
prefix: constants_1.CachePrefix.USER_OWNED_ATTRIBUTES,
id: entity.id,
}),
milliseconds: 60.000,
},
});
const attributes = (0, utils_1.transformAttributesToRecord)(rawAttributes);
(0, utils_1.appendAttributes)(entity, attributes);
return entity;
}
async syncRoles(userId, roleIds) {
const userRoleRepository = this.manager.getRepository(user_role_1.UserRoleEntity);
const userRoles = await userRoleRepository.createQueryBuilder('userRole')
.where('userRole.user_id = :userId', { userId })
.getMany();
const userRoleIdsToDrop = userRoles
.filter((userRole) => roleIds.indexOf(userRole.role_id) === -1)
.map((userRole) => userRole.id);
if (userRoleIdsToDrop.length > 0) {
await userRoleRepository.delete({
id: (0, typeorm_1.In)(userRoleIdsToDrop),
});
}
const userRolesToAdd = roleIds
.filter((roleId) => userRoles.findIndex((userRole) => userRole.role_id === roleId) === -1)
.map((roleId) => userRoleRepository.create({ role_id: roleId, user_id: userId }));
if (userRolesToAdd.length > 0) {
await userRoleRepository.insert(userRolesToAdd);
}
}
// ------------------------------------------------------------------
async getOwnedPermissions(id) {
const permissions = await this.getSelfOwnedPermissions(id);
const roles = await this.manager
.getRepository(user_role_1.UserRoleEntity)
.find({
where: {
user_id: id,
},
cache: {
id: (0, redis_extension_1.buildKeyPath)({
prefix: constants_1.CachePrefix.USER_OWNED_ROLES,
id,
}),
milliseconds: 60.000,
},
});
const roleIds = roles.map((userRole) => userRole.role_id);
if (roleIds.length === 0) {
return permissions;
}
const roleRepository = new role_1.RoleRepository(this.manager);
permissions.push(...await roleRepository.getOwnedPermissionsByMany(roleIds));
return permissions;
}
async getSelfOwnedPermissions(id) {
const repository = this.manager.getRepository(user_permission_1.UserPermissionEntity);
const entities = await repository.find({
where: {
user_id: id,
},
relations: {
permission: true,
},
cache: {
id: (0, redis_extension_1.buildKeyPath)({
prefix: constants_1.CachePrefix.USER_OWNED_PERMISSIONS,
id,
}),
milliseconds: 60.000,
},
});
const result = [];
for (let i = 0; i < entities.length; i++) {
result.push((0, core_1.buildPermissionDescriptorFromRelation)(entities[i]));
}
return result;
}
// ------------------------------------------------------------------
/**
* Verify a user by name and password.
*
* @param name
* @param password
* @param realmId
*/
async verifyCredentials(name, password, realmId) {
const query = this.createQueryBuilder('user')
.leftJoinAndSelect('user.realm', 'realm')
.where('user.name LIKE :name', { name });
if (realmId) {
query.andWhere('user.realm_id = :realmId', { realmId });
}
const entities = await query
.addSelect('user.password')
.getMany();
for (let i = 0; i < entities.length; i++) {
if (!entities[i].password) {
continue;
}
const verified = await (0, server_core_1.compare)(password, entities[i].password);
if (verified) {
return entities[i];
}
}
return undefined;
}
async createWithPassword(data) {
const entity = this.create(data);
const password = entity.password || (0, core_1.createNanoID)(64);
entity.password = await this.hashPassword(password);
return {
entity,
password,
};
}
async hashPassword(password) {
return (0, server_core_1.hash)(password);
}
}
exports.UserRepository = UserRepository;
//# sourceMappingURL=repository.js.map