n8n
Version:
n8n Workflow Automation Tool
79 lines • 3.69 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var RoleCacheService_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RoleCacheService = void 0;
const backend_common_1 = require("@n8n/backend-common");
const constants_1 = require("@n8n/constants");
const db_1 = require("@n8n/db");
const di_1 = require("@n8n/di");
const permissions_1 = require("@n8n/permissions");
const cache_service_1 = require("./cache/cache.service");
let RoleCacheService = RoleCacheService_1 = class RoleCacheService {
constructor(cacheService, logger) {
this.cacheService = cacheService;
this.logger = logger;
}
async buildRoleScopeMap() {
try {
const roleRepository = di_1.Container.get(db_1.RoleRepository);
const roles = await roleRepository.findAll();
const roleScopeMap = {};
for (const role of roles) {
roleScopeMap[role.roleType] ??= {};
roleScopeMap[role.roleType][role.slug] = {
scopes: role.scopes.map((s) => s.slug),
};
}
return roleScopeMap;
}
catch (error) {
this.logger.error('Failed to build role scope from database', { error });
throw error;
}
}
async getRolesWithAllScopes(namespace, requiredScopes) {
if (requiredScopes.length === 0)
return [];
const roleScopeMap = await this.cacheService.get(RoleCacheService_1.CACHE_KEY, {
refreshFn: async () => await this.buildRoleScopeMap(),
fallbackValue: undefined,
});
if (roleScopeMap === undefined) {
this.logger.error('Role scope map is undefined, falling back to static roles');
return (0, permissions_1.staticRolesWithScope)(namespace, requiredScopes);
}
const matchingRoles = [];
for (const [roleSlug, roleInfo] of Object.entries(roleScopeMap[namespace] ?? {})) {
const hasAllScopes = requiredScopes.every((scope) => roleInfo.scopes.includes(scope));
if (hasAllScopes) {
matchingRoles.push(roleSlug);
}
}
return matchingRoles;
}
async invalidateCache() {
await this.cacheService.delete(RoleCacheService_1.CACHE_KEY);
}
async refreshCache() {
const roleScopeMap = await this.buildRoleScopeMap();
await this.cacheService.set(RoleCacheService_1.CACHE_KEY, roleScopeMap, RoleCacheService_1.CACHE_TTL);
}
};
exports.RoleCacheService = RoleCacheService;
RoleCacheService.CACHE_KEY = 'roles:scope-map';
RoleCacheService.CACHE_TTL = 5 * constants_1.Time.minutes.toMilliseconds;
exports.RoleCacheService = RoleCacheService = RoleCacheService_1 = __decorate([
(0, di_1.Service)(),
__metadata("design:paramtypes", [cache_service_1.CacheService,
backend_common_1.Logger])
], RoleCacheService);
//# sourceMappingURL=role-cache.service.js.map