const { Model } = require('flitter-orm') const LDAP = require('ldapjs') // For organizational purposes only. class GroupModel extends Model { static get services() { return [...super.services, 'models', 'ldap_server', 'configs'] } static get schema() { return { name: String, user_ids: [String], active: { type: Boolean, default: true }, ldap_visible: { type: Boolean, default: true }, } } identifier() { return this.name.toLowerCase().replace(/\s/g, '_') } get dn() { return LDAP.parseDN(`cn=${this.name},${this.ldap_server.group_dn().format(this.configs.get('ldap:server.format'))}`) } async users() { const User = this.models.get('auth:User') return await User.find({ _id: { $in: this.user_ids.map(x => this.constructor.to_object_id(x)) } }) } async to_ldap() { const users = await this.users() return { cn: this.name, dn: this.dn.format(this.configs.get('ldap:server.format')), objectClass: 'groupOfNames', member: users.map(x => x.dn.format(this.configs.get('ldap:server.format'))), } } static async ldap_directory() { return this.find({ ldap_visible: true, active: true }) } async to_api() { return { id: this.id, name: this.name, user_ids: this.user_ids, ldap_visible: this.ldap_visible, } } } module.exports = exports = GroupModel