"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
Object.defineProperty(exports, "PermissionService", {
    enumerable: true,
    get: function() {
        return PermissionService;
    }
});
const _models = require("../../models");
const _authorizationconstants = require("../../constants/authorization.constants");
const _runtimeexceptions = require("../../exceptions/runtime.exceptions");
class PermissionService {
    logger;
    constructor({ loggerFactory }){
        this.logger = loggerFactory(PermissionService.name);
    }
    _permissions = [];
    get permissions() {
        return this._permissions;
    }
    toDto(permission) {
        return {
            id: permission.id,
            name: permission.name
        };
    }
    authorizePermission(requiredPermission, assignedPermissions) {
        return !!assignedPermissions.find((assignedPermission)=>{
            const normalizePermission = this.normalizePermission(assignedPermission);
            if (!normalizePermission) return false;
            return normalizePermission === requiredPermission;
        });
    }
    async getPermissionByName(permissionName) {
        const permission = this.permissions.find((r)=>r.name === permissionName);
        if (!permission) throw new _runtimeexceptions.NotFoundException("Permission not found");
        return permission;
    }
    async getPermission(permissionId) {
        const permission = this.permissions.find((r)=>r.id === permissionId);
        if (!permission) throw new _runtimeexceptions.NotFoundException(`Permission by provided id not found`);
        return permission;
    }
    async syncPermissions() {
        this._permissions = [];
        const permissionDefinition = (0, _authorizationconstants.flattenPermissionDefinition)();
        for (let permission of permissionDefinition){
            const storedPermission = await _models.Permission.findOne({
                name: permission
            });
            if (!storedPermission) {
                const newPermission = await _models.Permission.create({
                    name: permission
                });
                this._permissions.push(newPermission);
            } else {
                this._permissions.push(storedPermission);
            }
        }
    }
    normalizePermission(assignedPermission) {
        const permissionInstance = this.permissions.find((r)=>r.id === assignedPermission || r.name === assignedPermission);
        if (!permissionInstance) {
            this.logger.warn("The permission by by provided id did not exist. Skipping");
            return;
        }
        return permissionInstance.name;
    }
}

//# sourceMappingURL=permission.service.js.map