{"_id":"@avisenaalwi/express-permission","_rev":"6-6a837d63ef3a8165d937f75140713322","name":"@avisenaalwi/express-permission","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.1":{"name":"@avisenaalwi/express-permission","version":"1.0.1","keywords":["express","permission","oracle","role","rbac","middleware","authorization"],"author":{"url":"avisena.abdillah98@gmail.com","name":"Avisena Alwi"},"license":"MIT","_id":"@avisenaalwi/express-permission@1.0.1","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"bin":{"permission":"dist/bin/cli.js"},"dist":{"shasum":"b188601707415fc258f62b28579ab626eff1fc3a","tarball":"https://registry.npmjs.org/@avisenaalwi/express-permission/-/express-permission-1.0.1.tgz","fileCount":8,"integrity":"sha512-JORA37MGrSWJN9UWfO4Rh3vcIILA/p6/DaoCYUtNrES+D7QEjfXl8FdpadN4GbtOLUXmo1+z1tqtBaRm2SlXnw==","signatures":[{"sig":"MEUCIQDg5HFB4fA0L9eCQhSLY8JsXzYepcCQ0qxNoTVqXgGyLwIgbXAYxiQJtzxJWxjObUjFK1GZExmB7PWT0H9sps+H9dQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56411},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"}},"private":false,"scripts":{"build":"tsup"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"_npmVersion":"10.9.0","description":"A lightweight and customizable role and permission management library for Express.js with OracleDB support, inspired by Spatie Laravel Permission.","directories":{},"_nodeVersion":"20.18.0","dependencies":{"dotenv":"^16.6.1","express":"^5.1.0","oracledb":"^6.9.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","typescript":"^5.0.0","@types/oracledb":"^6.9.0"},"_npmOperationalInternal":{"tmp":"tmp/express-permission_1.0.1_1754466609492_0.63321401466749","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@avisenaalwi/express-permission","version":"1.0.2","keywords":["express","permission","oracle","role","rbac","middleware","authorization"],"author":{"url":"avisena.abdillah98@gmail.com","name":"Avisena Alwi"},"license":"MIT","_id":"@avisenaalwi/express-permission@1.0.2","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"bin":{"permission":"dist/bin/cli.js"},"dist":{"shasum":"99d9ab0244860d815d88d1c971a4628a861a800d","tarball":"https://registry.npmjs.org/@avisenaalwi/express-permission/-/express-permission-1.0.2.tgz","fileCount":8,"integrity":"sha512-T8yf0qHnX0cd45YFgNWtiB9ebub4ZvjuTaJx633L9uU28/w3EFnG1XrDcS8Nn1928D2QPxH+aVote26ainS8Ng==","signatures":[{"sig":"MEQCICU+lGA3/eZChmuFPq3ayUx9ImmHWEFjLFNUcVjfPS95AiAPKS5ChgMYGKbDduX7bnMnY7pXX/JZodv/oixxtFnZmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56277},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"}},"private":false,"scripts":{"build":"tsup"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"_npmVersion":"10.9.0","description":"A lightweight and customizable role and permission management library for Express.js with OracleDB support, inspired by Spatie Laravel Permission.","directories":{},"_nodeVersion":"20.18.0","dependencies":{"dotenv":"^16.6.1","express":"^5.1.0","oracledb":"^6.9.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","typescript":"^5.0.0","@types/oracledb":"^6.9.0"},"_npmOperationalInternal":{"tmp":"tmp/express-permission_1.0.2_1754467021106_0.8257710451392506","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@avisenaalwi/express-permission","version":"1.0.3","description":"A lightweight and customizable role and permission management library for Express.js with OracleDB support, inspired by Spatie Laravel Permission.","main":"./dist/index.cjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","require":"./dist/index.cjs","import":"./dist/index.mjs","default":"./dist/index.cjs"}},"scripts":{"build":"tsup"},"type":"module","bin":{"permission":"dist/bin/cli.js"},"keywords":["express","permission","oracle","role","rbac","middleware","authorization"],"author":{"name":"Avisena Alwi","url":"avisena.abdillah98@gmail.com"},"license":"MIT","private":false,"repository":{"type":"git","url":"git+https://github.com/AvisenaAlwi/express-permission.git"},"bugs":{"url":"https://github.com/AvisenaAlwi/express-permission/issues"},"homepage":"https://github.com/AvisenaAlwi/express-permission#readme","dependencies":{"express":"^5.1.0","oracledb":"^6.9.0"},"devDependencies":{"@types/oracledb":"^6.9.0","tsup":"^8.5.0","typescript":"^5.0.0"},"_id":"@avisenaalwi/express-permission@1.0.3","gitHead":"022b6cd9e26bac93cf34c8c295e0e1fe8ca8a8a8","_nodeVersion":"20.18.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-3gqlG+U8OHj4j2sUWiFKBzpk0kM0E1uA31/oI+Ic1VPpDEP16q+GLhI/BvliJDL6uJ0Gb294EoYU01Lf3Aw38g==","shasum":"788a4e447ac17f29b7b9d39bf354df3066174174","tarball":"https://registry.npmjs.org/@avisenaalwi/express-permission/-/express-permission-1.0.3.tgz","fileCount":8,"unpackedSize":56522,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAee41tAzDEVeHgxxvMGfZQIYmfqy4GrqezHaahF3la+AiEA3CsVMPe+5uqL8/btyBCAdfBHxLHJF5aE9829uHvOiXU="}]},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"directories":{},"maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/express-permission_1.0.3_1754468886676_0.5366355110352987"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-06T07:50:09.382Z","modified":"2025-08-06T08:28:07.353Z","1.0.0":"2025-08-01T02:37:48.455Z","1.0.1":"2025-08-06T07:50:09.665Z","1.0.2":"2025-08-06T07:57:01.278Z","1.0.3":"2025-08-06T08:28:06.864Z"},"author":{"name":"Avisena Alwi","url":"avisena.abdillah98@gmail.com"},"license":"MIT","keywords":["express","permission","oracle","role","rbac","middleware","authorization"],"description":"A lightweight and customizable role and permission management library for Express.js with OracleDB support, inspired by Spatie Laravel Permission.","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"readme":"# express-permission\r\n\r\nOracleDB Role and Permission Service for Express.js, inspired by Spatie Laravel Permission.\r\nAllows flexible and scoped role-permission management directly in your service layer.\r\n\r\n- ✅ Framework-agnostic – suitable for Express or any Node.js app\r\n- ✅ OracleDB native – no abstraction, no ORM\r\n- ✅ Scoped permissions – supports multi-tenancy (e.g. organization, team)\r\n- ✅ Simple API – check with `hasPermission()` or `hasRole()`\r\n\r\n---\r\n\r\n## 📦 Installation\r\n\r\n```bash\r\nnpm install @avisenaalwi/express-permission oracledb\r\n```\r\n\r\n---\r\n\r\n## ⚙️ Configuration\r\n\r\nCreate a `permission.config.ts` in your project root:\r\n\r\n```ts\r\nimport { PermissionConfig } from '@avisenaalwi/express-permission';\r\n\r\nconst config: PermissionConfig = {\r\n  userTable: 'USERS',\r\n  userPrimaryKey: 'ID',\r\n\r\n  roleTable: 'ROLES',\r\n  rolePrimaryKey: 'ID',\r\n  roleNameColumn: 'NAME',\r\n\r\n  permissionTable: 'PERMISSIONS',\r\n  permissionPrimaryKey: 'ID',\r\n  permissionNameColumn: 'NAME',\r\n\r\n  userRolesTable: 'USER_ROLE',\r\n  userRolesUserId: 'USER_ID',\r\n  userRolesRoleId: 'ROLE_ID',\r\n  userRolesScopeParams: [\r\n    { name: 'orgId', column: 'ORG_ID' }\r\n  ],\r\n\r\n  rolePermissionsTable: 'ROLE_PERMISSION',\r\n  rolePermissionsRoleId: 'ROLE_ID',\r\n  rolePermissionsPermissionId: 'PERMISSION_ID',\r\n  rolePermissionsScopeParams: []\r\n};\r\n\r\nexport default config;\r\n```\r\n\r\n---\r\n\r\n## 🛠 Usage\r\n\r\n### 1. Setup Oracle pool\r\n\r\n```ts\r\nimport oracledb from 'oracledb';\r\nimport { PermissionService } from '@avisenaalwi/express-permission';\r\n\r\nconst pool = await oracledb.createPool({\r\n  user: 'your_user',\r\n  password: 'your_password',\r\n  connectString: 'your_connect_string'\r\n});\r\n\r\nconst permissionService = new PermissionService(pool);\r\n```\r\n\r\n---\r\n\r\n### 2. Check Permission or Role\r\n\r\n```ts\r\nconst userId = 42;\r\n\r\nconst hasEdit = await permissionService.hasPermission(userId, 'edit-post');\r\nif (!hasEdit) {\r\n  return res.status(403).json({ message: 'Forbidden' });\r\n}\r\n\r\nconst isAdmin = await permissionService.hasRole(userId, 'admin');\r\n```\r\n\r\nWith scope:\r\n\r\n```ts\r\nawait permissionService.hasPermission(userId, 'edit-post', { orgId: 1001 });\r\n```\r\n\r\n---\r\n\r\n### 3. Get all permissions or roles\r\n\r\n```ts\r\nconst permissions = await permissionService.getPermissions(userId);\r\nconst roles = await permissionService.getRoles(userId);\r\n```\r\n\r\n---\r\n\r\n## ✅ Table Requirements\r\n\r\nYou must provide:\r\n\r\n- `users` table with `id`\r\n- `roles` and `permissions` tables\r\n- `user_roles` relation table\r\n- `role_permissions` relation table\r\n\r\nThe names and columns can be fully customized via `permission.config.ts`.\r\n\r\n---\r\n\r\n## 📌 Optional Features\r\n\r\n- Multi-tenancy: Use scoped permission by adding columns like `ORG_ID` and declaring them in config.\r\n- You can extend `PermissionService` with caching (e.g. Redis) or override methods as needed.\r\n\r\n---\r\n\r\n## 🧪 Testing\r\n\r\n```ts\r\n// Example test\r\nexpect(await permissionService.hasPermission(1, 'read-dashboard')).toBe(true);\r\n```\r\n\r\n---\r\n\r\n## 📤 Planned Features\r\n\r\n- CLI for migration and schema check\r\n- Middleware helpers for Express\r\n- Caching support (Redis)\r\n- Role/Permission sync like Spatie\r\n\r\n---\r\n\r\n## 📄 License\r\n\r\nMIT © 2025 [Avisena Alwi](https://github.com/avisenaalwi)","readmeFilename":"README.md","homepage":"https://github.com/AvisenaAlwi/express-permission#readme","repository":{"type":"git","url":"git+https://github.com/AvisenaAlwi/express-permission.git"},"bugs":{"url":"https://github.com/AvisenaAlwi/express-permission/issues"}}