authenzify
Version:
server to manage authentication authorization of users and more
144 lines (125 loc) • 3.52 kB
JavaScript
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
}
}