UNPKG

authenzify

Version:

server to manage authentication authorization of users and more

144 lines (125 loc) 3.52 kB
import { verifyExistence } from '../../../util/util.js' import { generateUserId } from '../../../util/record-id-prefixes.js' const usFnList = ['find', 'findOne', 'insertOne', 'updateOne'] const vrfFnList = ['findOne', 'updateOne'] export class MongoUsersService { #modelsCollections constructor(modelsCollections) { verifyExistence(modelsCollections.Users, usFnList) verifyExistence(modelsCollections.Verifications, vrfFnList) this.#modelsCollections = modelsCollections } async innerCreate(user) { const id = generateUserId() const now = new Date() const { permissions, permissionsGroups } = user const created = await this.#modelsCollections.Users.insertOne({ id, _id: id, createdAt: now, updatedAt: now, isDeleted: false, permissions: permissions || [], permissionsGroups: permissionsGroups || [], ...user, }) const userRead = await await this.#modelsCollections.Users.findOne({ id: created?.insertedId, }) return userRead } async createGoogleUser(user) { return this.innerCreate(user) } async setLastLogin({ id }, { lastLogin, signedInVia }) { const userUpdatedRes = await this.#modelsCollections.Users.updateOne( { _id: id }, { $set: { lastLogin, signedInVia, updatedAt: new Date() } }, ) return userUpdatedRes } async updateUser({ id }, userDetails) { const userUpdatedRes = await this.#modelsCollections.Users.updateOne( { _id: id }, { $set: { ...userDetails, updatedAt: new Date() } }, ) return userUpdatedRes } async updateUserPermissions({ id }, userDetails, permissions) { const userUpdatedRes = await this.#modelsCollections.Users.updateOne( { _id: id }, { $set: { ...userDetails, updatedAt: new Date() }, $push: permissions, }, ) return userUpdatedRes } async verifyUser(user, verification) { try { this.#modelsCollections.withTransaction(async ({ session }) => { await this.#modelsCollections.Users.updateOne( { _id: user.id }, { $set: { isValid: true } }, { session }, ) await this.#modelsCollections.Verifications.updateOne( { _id: verification.id }, { $set: { isDeleted: true } }, { session }, ) const userUpdated = await this.#modelsCollections.Users.findOne({ id: user.id, }) const verificationUpdated = await this.#modelsCollections.Verifications.findOne({ id: verification.id, }) return { userUpdated, verificationUpdated } }) } catch (error) { throw error } } async find(filter) { return this.#modelsCollections.Users.find(filter).toArray() } async findOne(filter) { const user = await this.#modelsCollections.Users.findOne(filter) return user } map(user) { const { id, email, phone, isValid, profile, username, isDeleted, permissions, permissionsGroups, } = user return { id, email, phone, isValid, profile, username, isDeleted, permissions, permissionsGroups, } } async create(user) { const userRead = await this.innerCreate(user) return this.map(userRead) } async findByPhone({ phone }) { const user = await this.#modelsCollections.Users.findOne({ phone, }) return user } }