const { Model } = require('flitter-orm') class VaultModel extends Model { static get services() { return [...super.services, 'models'] } static get schema() { return { active: { type: Boolean, default: true }, name: String, user_id: String, } } static async for_user(user) { const existing = await this.findOne({ user_id: user.id, }) if ( existing ) return existing const vault = new this({ name: `${user.first_name} ${user.last_name}'s Vault`, user_id: user.id, }) await vault.save() await vault.grant_default(user) return vault } async grant_default(user) { const Policy = this.models.get('iam:Policy') const grants = ['view', 'read', 'update', 'delete', undefined] for ( const grant of grants ) { const policy = new Policy({ entity_type: 'user', entity_id: user.id, access_type: 'allow', target_type: 'vault', target_id: this.id, ...(grant ? { for_permission: true, permission: grant } : {}) }) await policy.save() } } async to_api() { return { id: this.id, _id: this.id, name: this.name, active: this.active, user_id: this.user_id, } } } module.exports = exports = VaultModel