@opengis/fcore 0.0.1-beta.16 → 0.0.1-beta.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/config.js +1 -1
  2. package/dist/context.js +1 -1
  3. package/dist/errors.js +1 -1
  4. package/dist/fastify.js +1 -1
  5. package/dist/fcore.js +1 -1
  6. package/dist/migrations/cli.js +1 -1
  7. package/dist/migrations/runner.js +1 -1
  8. package/dist/modules/auth/adduser-cli.js +1 -1
  9. package/dist/modules/auth/passwd-cli.js +1 -1
  10. package/dist/modules/auth/permission-cli.js +1 -1
  11. package/dist/modules/auth/route.js +1 -1
  12. package/dist/modules/auth/schema.js +1 -1
  13. package/dist/modules/auth/services/change-password.js +1 -1
  14. package/dist/modules/auth/services/get-current-user.js +1 -1
  15. package/dist/modules/auth/services/registration.js +1 -1
  16. package/dist/modules/auth/services/verify-two-factor.js +1 -1
  17. package/dist/modules/file/mime.js +1 -1
  18. package/dist/modules/file/route.js +1 -1
  19. package/dist/modules/file/schema.js +1 -1
  20. package/dist/modules/file/services/get-file.js +1 -1
  21. package/dist/modules/file/services/resize-file.js +1 -1
  22. package/dist/modules/file/services/upload-file.js +1 -1
  23. package/dist/modules/resource/route.js +1 -1
  24. package/dist/modules/resource/schema.js +1 -1
  25. package/dist/modules/resource/services/add-note.js +1 -1
  26. package/dist/modules/resource/services/add-resource-file.js +1 -1
  27. package/dist/modules/resource/services/create-resource-relation.js +1 -1
  28. package/dist/modules/resource/services/create-resource.js +1 -1
  29. package/dist/modules/resource/services/delete-resource-relation.js +1 -1
  30. package/dist/modules/resource/services/delete-resource.js +1 -1
  31. package/dist/modules/resource/services/export-resource.js +1 -1
  32. package/dist/modules/resource/services/get-resource.js +1 -1
  33. package/dist/modules/resource/services/list-resource-relation.js +1 -1
  34. package/dist/modules/resource/services/list-resources.js +1 -1
  35. package/dist/modules/resource/services/search-resource.js +1 -1
  36. package/dist/modules/resource/services/suggest-resource.js +1 -1
  37. package/dist/modules/resource/services/update-resource-relation.js +1 -1
  38. package/dist/modules/resource/services/update-resource.js +1 -1
  39. package/dist/modules/resource/services/upload-resource-file.js +1 -1
  40. package/dist/modules/system/route.js +1 -1
  41. package/dist/modules/system/schema.js +1 -1
  42. package/dist/modules/system/services/check-system.js +1 -1
  43. package/dist/modules/system/services/get-access.js +1 -1
  44. package/dist/modules/system/services/get-api-list.js +1 -1
  45. package/dist/modules/system/services/get-audit-log.js +1 -1
  46. package/dist/modules/system/services/get-dictionary.js +1 -1
  47. package/dist/modules/system/services/get-system-log.js +1 -1
  48. package/dist/modules/system/services/get-system-settings.js +1 -1
  49. package/dist/modules/system/services/list-dictionaries.js +1 -1
  50. package/dist/modules/system/services/set-access.js +1 -1
  51. package/dist/modules/system/services/update-dictionary.js +1 -1
  52. package/dist/modules/system/services/update-system-settings.js +1 -1
  53. package/dist/modules/utils/require-admin.js +1 -1
  54. package/dist/modules/utils/safe-user.js +1 -1
  55. package/dist/modules/utils/unsupported.js +1 -1
  56. package/dist/plugins/audit/audit.js +1 -1
  57. package/dist/plugins/audit/services/write-audit.js +1 -1
  58. package/dist/plugins/auth/get-user-permissions.js +1 -1
  59. package/dist/plugins/auth/index.js +1 -1
  60. package/dist/plugins/auth/verifyUser.js +1 -1
  61. package/dist/plugins/dictionary.js +1 -1
  62. package/dist/plugins/file.js +1 -1
  63. package/dist/plugins/jwt.js +1 -1
  64. package/dist/plugins/logger/index.js +1 -1
  65. package/dist/plugins/logger/transport.js +1 -1
  66. package/dist/plugins/pg.js +1 -1
  67. package/dist/plugins/redis.js +1 -1
  68. package/dist/plugins/resource/resource.js +1 -1
  69. package/dist/plugins/resource/resource.registry.js +1 -1
  70. package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
  71. package/dist/plugins/resource/services/add-file-token.js +1 -1
  72. package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
  73. package/dist/plugins/resource/services/create-relation.js +1 -1
  74. package/dist/plugins/resource/services/create.js +1 -1
  75. package/dist/plugins/resource/services/delete-relation.js +1 -1
  76. package/dist/plugins/resource/services/delete.js +1 -1
  77. package/dist/plugins/resource/services/find-one.js +1 -1
  78. package/dist/plugins/resource/services/find-relation.d.ts.map +1 -1
  79. package/dist/plugins/resource/services/find-relation.js +1 -1
  80. package/dist/plugins/resource/services/find.js +1 -1
  81. package/dist/plugins/resource/services/update-relation.js +1 -1
  82. package/dist/plugins/resource/services/update.js +1 -1
  83. package/dist/plugins/resource/utils/auto-index.js +1 -1
  84. package/dist/plugins/resource/utils/fields.js +1 -1
  85. package/dist/plugins/resource/utils/filters.js +1 -1
  86. package/dist/plugins/resource/utils/permissions.js +1 -1
  87. package/dist/plugins/resource/utils/sort.js +1 -1
  88. package/dist/plugins/resource/utils/sql.js +1 -1
  89. package/dist/shared/getIP.js +1 -1
  90. package/package.json +1 -1
@@ -1 +1 @@
1
- function F(){const a=['user','fcore','/api/dictionary/:name','Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','dictionaryItems','params','/api/access/:type/:id','Get\x20access\x20rules','post','admin','system','Returns\x20system\x20settings\x20as\x20nested\x20JSON.','/api/system/settings','system:settings','body','system:logs','send','query','/api/system/list'];F=function(){return a;};return F();}const D=S;import{getSystemSettings}from'./services/get-system-settings.js';import{updateSystemSettings}from'./services/update-system-settings.js';import{getAuditLog}from'./services/get-audit-log.js';import{checkSystem}from'./services/check-system.js';function S(c,N){c=c-0x1d2;const H=F();let d=H[c];return d;}import{getApiList}from'./services/get-api-list.js';import{getSystemLog}from'./services/get-system-log.js';import{getDictionary}from'./services/get-dictionary.js';import{updateDictionary}from'./services/update-dictionary.js';import{getAccess}from'./services/get-access.js';import{setAccess}from'./services/set-access.js';import{systemSchemas}from'./schema.js';const u=c=>c[D(0x1d2)];export function systemRoutes(c,N=new Map()){return async H=>{const W=S;H['get']('/api/dictionary/:name',{'schema':{'tags':[W(0x1d3),'system'],'summary':'Get\x20platform\x20dictionary','description':'Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','access':W(0x1d2),'permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName']}},async U=>({'items':await getDictionary({...U['params'],'user':u(U)},c)})),H['post'](W(0x1d4),{'schema':{'tags':['fcore','system'],'summary':'Update\x20platform\x20dictionary','description':W(0x1d5),'access':W(0x1d2),'permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName'],'body':systemSchemas[W(0x1d6)]}},async U=>updateDictionary({...U[W(0x1d7)],...U['body'],'user':u(U)},c));const d=async U=>getAccess({...U[W(0x1d7)],'user':u(U)},c);H['get'](W(0x1d8),{'schema':{'tags':['fcore','system'],'summary':W(0x1d9),'description':'Returns\x20direct\x20and\x20role-based\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':['system:access'],'params':systemSchemas['accessTarget']}},d),H[W(0x1da)]('/api/access/:type/:id',{'schema':{'tags':['fcore','system'],'summary':'Set\x20access\x20rules','description':'Replaces\x20direct\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':W(0x1db),'permissions':['system:access'],'params':systemSchemas['accessTarget'],'body':systemSchemas['access']}},async U=>setAccess({...U['params'],...U['body'],'user':u(U)},c)),H['get']('/api/system/settings',{'schema':{'tags':['fcore',W(0x1dc)],'summary':'Get\x20system\x20settings','description':W(0x1dd),'access':'admin','permissions':['system:settings']}},async U=>getSystemSettings({...U['params'],'user':u(U)},c)),H[W(0x1da)](W(0x1de),{'schema':{'tags':['fcore','system'],'summary':'Update\x20system\x20settings','description':'Updates\x20system\x20settings\x20using\x20flat\x20dot-notation\x20keys.','access':'admin','permissions':[W(0x1df)],'body':systemSchemas['settings']}},async U=>updateSystemSettings({...U[W(0x1d7)],'patch':U[W(0x1e0)],'user':u(U)},c)),H['get']('/api/system/logger',{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20log','description':'Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','access':'user','permissions':[W(0x1e1)],'querystring':systemSchemas['logger']}},async(U,e)=>{const p=W,{contentType:K,body:m}=await getSystemLog({...U['query'],'user':u(U)},c);return e['type'](K)[p(0x1e2)](m);}),H['get']('/api/system/audit',{'schema':{'tags':[W(0x1d3),'system'],'summary':'Get\x20audit\x20log','description':'Returns\x20the\x20system\x20audit\x20log\x20entries.','access':W(0x1d2),'permissions':['system:audit']}},async U=>getAuditLog({...U[W(0x1e3)],'user':u(U)},c)),H['get']('/api/system/check',{'schema':{'tags':['fcore','system'],'summary':'Check\x20system\x20health','description':'Checks\x20the\x20availability\x20of\x20system\x20dependencies.','access':W(0x1d2),'permissions':['system:check']}},async U=>checkSystem({'user':u(U)},c)),H['get'](W(0x1e4),{'schema':{'tags':['fcore',W(0x1dc)],'summary':'List\x20APIs','description':'Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','access':'admin','permissions':[],'querystring':systemSchemas['apiListQuery']}},async U=>getApiList({'user':u(U),'apiRoutes':N,...U[W(0x1e3)]},c));};}
1
+ import{getSystemSettings}from'./services/get-system-settings.js';import{updateSystemSettings}from'./services/update-system-settings.js';import{getAuditLog}from'./services/get-audit-log.js';import{checkSystem}from'./services/check-system.js';function D(){const d=['/api/dictionary/:name','user','fcore','system','post','admin','access','body','system:settings','Update\x20system\x20settings','Updates\x20system\x20settings\x20using\x20flat\x20dot-notation\x20keys.','get','/api/system/logger','Get\x20system\x20log','system:logs','query','send','system:check'];D=function(){return d;};return D();}import{getApiList}from'./services/get-api-list.js';import{getSystemLog}from'./services/get-system-log.js';import{getDictionary}from'./services/get-dictionary.js';import{updateDictionary}from'./services/update-dictionary.js';import{getAccess}from'./services/get-access.js';import{setAccess}from'./services/set-access.js';import{systemSchemas}from'./schema.js';function i(u,n){u=u-0x198;const U=D();let O=U[u];return O;}const u=n=>n['user'];export function systemRoutes(n,U=new Map()){return async O=>{const g=i;O['get'](g(0x198),{'schema':{'tags':['fcore','system'],'summary':'Get\x20platform\x20dictionary','description':'Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','access':g(0x199),'permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName']}},async I=>({'items':await getDictionary({...I['params'],'user':u(I)},n)})),O['post']('/api/dictionary/:name',{'schema':{'tags':['fcore','system'],'summary':'Update\x20platform\x20dictionary','description':'Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','access':'user','permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName'],'body':systemSchemas['dictionaryItems']}},async I=>updateDictionary({...I['params'],...I['body'],'user':u(I)},n));const o=async I=>getAccess({...I['params'],'user':u(I)},n);O['get']('/api/access/:type/:id',{'schema':{'tags':[g(0x19a),g(0x19b)],'summary':'Get\x20access\x20rules','description':'Returns\x20direct\x20and\x20role-based\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':['system:access'],'params':systemSchemas['accessTarget']}},o),O[g(0x19c)]('/api/access/:type/:id',{'schema':{'tags':['fcore','system'],'summary':'Set\x20access\x20rules','description':'Replaces\x20direct\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':g(0x19d),'permissions':['system:access'],'params':systemSchemas['accessTarget'],'body':systemSchemas[g(0x19e)]}},async I=>setAccess({...I['params'],...I[g(0x19f)],'user':u(I)},n)),O['get']('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20settings','description':'Returns\x20system\x20settings\x20as\x20nested\x20JSON.','access':g(0x19d),'permissions':[g(0x1a0)]}},async I=>getSystemSettings({...I['params'],'user':u(I)},n)),O['post']('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':g(0x1a1),'description':g(0x1a2),'access':'admin','permissions':['system:settings'],'body':systemSchemas['settings']}},async I=>updateSystemSettings({...I['params'],'patch':I[g(0x19f)],'user':u(I)},n)),O[g(0x1a3)](g(0x1a4),{'schema':{'tags':['fcore',g(0x19b)],'summary':g(0x1a5),'description':'Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','access':'user','permissions':[g(0x1a6)],'querystring':systemSchemas['logger']}},async(I,X)=>{const k=g,{contentType:T,body:R}=await getSystemLog({...I[k(0x1a7)],'user':u(I)},n);return X['type'](T)[k(0x1a8)](R);}),O['get']('/api/system/audit',{'schema':{'tags':[g(0x19a),g(0x19b)],'summary':'Get\x20audit\x20log','description':'Returns\x20the\x20system\x20audit\x20log\x20entries.','access':'user','permissions':['system:audit']}},async I=>getAuditLog({...I['query'],'user':u(I)},n)),O['get']('/api/system/check',{'schema':{'tags':['fcore','system'],'summary':'Check\x20system\x20health','description':'Checks\x20the\x20availability\x20of\x20system\x20dependencies.','access':'user','permissions':[g(0x1a9)]}},async I=>checkSystem({'user':u(I)},n)),O['get']('/api/system/list',{'schema':{'tags':['fcore',g(0x19b)],'summary':'List\x20APIs','description':'Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','access':'admin','permissions':[],'querystring':systemSchemas['apiListQuery']}},async I=>getApiList({'user':u(I),'apiRoutes':U,...I['query']},n));};}
@@ -1 +1 @@
1
- const c=S;import{Type}from'@sinclair/typebox';function S(c,N){c=c-0x1d8;const H=F();let d=H[c];return d;}export const identifier=Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':'^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$'});function F(){const N=['Union','String','Number','Object','Array','Literal','Unknown'];F=function(){return N;};return F();}export const systemSchemas={'dictionaryName':Type['Object']({'name':identifier}),'dictionaryItems':Type['Object']({'items':Type['Array'](Type['Object']({'id':Type['Optional'](Type[c(0x1d8)]([Type[c(0x1d9)](),Type['Number']()])),'code':Type[c(0x1d9)]({'minLength':0x1}),'name':Type['String']({'minLength':0x1}),'parentId':Type['Optional'](Type['Union']([Type['String'](),Type[c(0x1da)](),Type['Null']()]))},{'additionalProperties':!![]}))}),'accessTarget':Type['Object']({'type':Type['Union']([Type['Literal']('user'),Type['Literal']('role')]),'id':identifier}),'access':Type['Object']({'access':Type['Array'](Type[c(0x1db)]({'resource':Type['String']({'minLength':0x1,'maxLength':0x80}),'actions':Type[c(0x1dc)](Type['String']({'minLength':0x1,'maxLength':0x80}),{'minItems':0x1})}))}),'apiListQuery':Type[c(0x1db)]({'format':Type['Optional'](Type['Union']([Type[c(0x1dd)]('short'),Type['Literal']('extended')]))}),'settingsEntity':Type['Object']({'entity':Type['Optional'](identifier)}),'settings':Type['Record'](Type['String']({'minLength':0x1}),Type[c(0x1de)]()),'logger':Type['Object']({'path':Type['Optional'](Type['String']({'maxLength':0x100,'pattern':'^[A-Za-z0-9_.\x5c-/]*$'}))})};
1
+ function D(){const n=['Object','Optional','Union','Number','Literal','Array','^[A-Za-z0-9_.\x5c-/]*$'];D=function(){return n;};return D();}function u(i,n){i=i-0xaa;const U=D();let O=U[i];return O;}const i=u;import{Type}from'@sinclair/typebox';export const identifier=Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':'^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$'});export const systemSchemas={'dictionaryName':Type[i(0xaa)]({'name':identifier}),'dictionaryItems':Type['Object']({'items':Type['Array'](Type['Object']({'id':Type[i(0xab)](Type[i(0xac)]([Type['String'](),Type[i(0xad)]()])),'code':Type['String']({'minLength':0x1}),'name':Type['String']({'minLength':0x1}),'parentId':Type[i(0xab)](Type[i(0xac)]([Type['String'](),Type['Number'](),Type['Null']()]))},{'additionalProperties':!![]}))}),'accessTarget':Type['Object']({'type':Type['Union']([Type['Literal']('user'),Type[i(0xae)]('role')]),'id':identifier}),'access':Type['Object']({'access':Type[i(0xaf)](Type['Object']({'resource':Type['String']({'minLength':0x1,'maxLength':0x80}),'actions':Type['Array'](Type['String']({'minLength':0x1,'maxLength':0x80}),{'minItems':0x1})}))}),'apiListQuery':Type['Object']({'format':Type['Optional'](Type[i(0xac)]([Type['Literal']('short'),Type['Literal']('extended')]))}),'settingsEntity':Type[i(0xaa)]({'entity':Type['Optional'](identifier)}),'settings':Type['Record'](Type['String']({'minLength':0x1}),Type['Unknown']()),'logger':Type[i(0xaa)]({'path':Type[i(0xab)](Type['String']({'maxLength':0x100,'pattern':i(0xb0)}))})};
@@ -1 +1 @@
1
- function S(c,N){c=c-0x13a;const H=F();let d=H[c];return d;}function F(){const e=['SELECT\x201','redis','ping','status','fulfilled'];F=function(){return e;};return F();}export async function checkSystem(c,N){const U=S,[H,d]=await Promise['allSettled']([N['pg']['query'](U(0x13a)),N[U(0x13b)][U(0x13c)]()]);return{'status':H[U(0x13d)]===U(0x13e)&&d['status']==='fulfilled'?'ok':'degraded','pg':H['status'],'redis':d['status']};}
1
+ function D(){const I=['redis','ping'];D=function(){return I;};return D();}function u(i,n){i=i-0x1aa;const U=D();let O=U[i];return O;}export async function checkSystem(i,n){const o=u,[U,O]=await Promise['allSettled']([n['pg']['query']('SELECT\x201'),n[o(0x1aa)][o(0x1ab)]()]);return{'status':U['status']==='fulfilled'&&O['status']==='fulfilled'?'ok':'degraded','pg':U['status'],'redis':O['status']};}
@@ -1 +1 @@
1
- export async function getAccess(c,N){const U=S,H=c['type']==='user'?'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20ur.role_id\x20=\x20ra.role_id\x20AND\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20':U(0xda),d=await N['pg'][U(0xdb)](H,[c['id']]);return{'access':d['rows']};}function S(c,N){c=c-0xda;const H=F();let d=H[c];return d;}function F(){const e=['\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.role_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20','query'];F=function(){return e;};return F();}
1
+ function u(i,n){i=i-0x109;const U=D();let O=U[i];return O;}function D(){const I=['user'];D=function(){return I;};return D();}export async function getAccess(i,n){const o=u,U=i['type']===o(0x109)?'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20ur.role_id\x20=\x20ra.role_id\x20AND\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20':'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.role_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20',O=await n['pg']['query'](U,[i['id']]);return{'access':O['rows']};}
@@ -1 +1 @@
1
- function F(){const D=['method','endpoint'];F=function(){return D;};return F();}function S(c,N){c=c-0x1b7;const H=F();let d=H[c];return d;}export async function getApiList(c,N){const m=S,H=[...c['apiRoutes']['values']()]['sort']((d,U)=>(d['endpoint']+'\x20'+d[m(0x1b7)])['localeCompare'](U[m(0x1b8)]+'\x20'+U['method']));if(c['format']!=='short')return H;return H['map'](({method:d,endpoint:U,access:e,permissions:K})=>d+'\x20'+U);}
1
+ function D(){const R=['sort','method','localeCompare','endpoint','short','map'];D=function(){return R;};return D();}function u(i,n){i=i-0xd2;const U=D();let O=U[i];return O;}export async function getApiList(i,n){const T=u,U=[...i['apiRoutes']['values']()][T(0xd2)]((O,o)=>(O['endpoint']+'\x20'+O[T(0xd3)])[T(0xd4)](o[T(0xd5)]+'\x20'+o['method']));if(i['format']!==T(0xd6))return U;return U[T(0xd7)](({method:O,endpoint:o,access:I,permissions:X})=>O+'\x20'+o);}
@@ -1 +1 @@
1
- function S(c,N){c=c-0x126;const H=F();let d=H[c];return d;}export async function getAuditLog(c,N){const e=S,H=Math[e(0x126)](Math['max'](c['limit']??0x32,0x1),0xc8),d=Math[e(0x127)]((c['page']??0x1)-0x1,0x0)*H,U=await N['pg']['query']('SELECT\x20*\x20FROM\x20admin.audit_log\x20ORDER\x20BY\x20id\x20DESC\x20LIMIT\x20$1\x20OFFSET\x20$2',[H,d]);return{'rows':U['rows'],'page':c[e(0x128)]??0x1,'limit':H};}function F(){const K=['min','max','page'];F=function(){return K;};return F();}
1
+ function u(i,n){i=i-0x12f;const U=D();let O=U[i];return O;}function D(){const X=['min','query','rows'];D=function(){return X;};return D();}export async function getAuditLog(i,n){const I=u,U=Math[I(0x12f)](Math['max'](i['limit']??0x32,0x1),0xc8),O=Math['max']((i['page']??0x1)-0x1,0x0)*U,o=await n['pg'][I(0x130)]('SELECT\x20*\x20FROM\x20admin.audit_log\x20ORDER\x20BY\x20id\x20DESC\x20LIMIT\x20$1\x20OFFSET\x20$2',[U,O]);return{'rows':o[I(0x131)],'page':i['page']??0x1,'limit':U};}
@@ -1 +1 @@
1
- function F(){var d=['dictionary','name'];F=function(){return d;};return F();}function S(c,N){c=c-0x1aa;var H=F();var d=H[c];return d;}export async function getDictionary(c,N){var H=S;return N[H(0x1aa)]['get'](c[H(0x1ab)]);}
1
+ function D(){var O=['dictionary'];D=function(){return O;};return D();}function u(i,n){i=i-0x159;var U=D();var O=U[i];return O;}export async function getDictionary(i,n){var U=u;return n[U(0x159)]['get'](i['name']);}
@@ -1 +1 @@
1
- import c from'node:fs/promises';import N from'node:path';import{NotFoundError,ValidationError}from'../../../errors.js';const LOGS_ROOT=N['resolve'](process['cwd'](),'logs'),TAIL_LINES=0x64;export async function getSystemLog(H,d){const w=S,U=normalizePath(H['path']),e=N['resolve'](LOGS_ROOT,U);if(e!==LOGS_ROOT&&!e[w(0x146)](LOGS_ROOT+N['sep']))throw new ValidationError(w(0x147));const K=await c['stat'](e)['catch'](()=>null);if(!K)throw new NotFoundError('Log\x20path\x20not\x20found');if(K[w(0x148)]()){const D=await c['readdir'](e,{'withFileTypes':!![]}),W=await Promise['all'](D['map'](async p=>{const x=w,a=await c['stat'](N[x(0x149)](e,p['name']));return{'name':p[x(0x14a)],'path':U?U+'/'+p['name']:p['name'],'type':p['isDirectory']()?'directory':x(0x14b),'size':p[x(0x148)]()?undefined:a[x(0x14c)],'modified':a['mtime']['toISOString']()};}));W['sort']((p,I)=>p[w(0x14a)]['localeCompare'](I['name']));if(U){const p=U['split']('/')[w(0x14d)](0x0,-0x1)['join']('/');W['unshift']({'name':'..','path':p,'type':'directory'});}return{'contentType':'text/html;\x20charset=utf-8','body':renderDirectory(U,W)};}const m=await tailFile(e,TAIL_LINES);return{'contentType':'text/plain;\x20charset=utf-8','body':m['join']('\x0a')};}function renderDirectory(H,d){const T=S,U=d['map'](K=>{const V=S,m=V(0x14e)+encodeURIComponent(K['path']),D=K['type']===V(0x14f)?K[V(0x14a)]+'/':K['name'];return'<li><a\x20href=\x22'+m+'\x22>'+escapeHtml(D)+V(0x150);})[T(0x149)]('\x0a'),e=escapeHtml('logs/'+H);return T(0x151)+e+'</title></head>\x0a<body>\x0a<h1>'+e+'</h1>\x0a<ul>\x0a'+U+'\x0a</ul>\x0a</body>\x0a</html>';}function escapeHtml(H){const M=S;return H[M(0x152)](/&/g,'&amp;')['replace'](/</g,'&lt;')['replace'](/>/g,'&gt;')[M(0x152)](/"/g,M(0x153));}function normalizePath(H){const q=S,d=(H??'')['replace'](/\\/g,'/')[q(0x152)](/^\/+|\/+$/g,'');if(d['split']('/')['some'](U=>U==='..'))throw new ValidationError('Invalid\x20log\x20path');return d;}async function tailFile(H,d){const Y=S,U=await c['open'](H,'r');try{const {size:e}=await U['stat'](),K=0x40*0x400;let m=e,D=Buffer['alloc'](0x0),W=0x0;while(m>0x0&&W<=d){const a=Math['min'](K,m);m-=a;const I=Buffer[Y(0x154)](a);await U['read'](I,0x0,a,m),D=Buffer['concat']([I,D]),W+=countNewlines(I);}const p=D['toString']('utf8')[Y(0x155)]('\x0a')['filter'](r=>r[Y(0x156)]>0x0);return p[Y(0x14d)](-d)[Y(0x157)]();}finally{await U[Y(0x158)]();}}function F(){const G=['startsWith','Invalid\x20log\x20path','isDirectory','join','name','file','size','slice','?path=','directory','</a></li>','<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>','replace','&quot;','alloc','split','length','reverse','close'];F=function(){return G;};return F();}function S(c,N){c=c-0x146;const H=F();let d=H[c];return d;}function countNewlines(H){let d=0x0;for(const U of H){if(U===0xa)d++;}return d;}
1
+ function u(i,n){i=i-0x15a;const U=D();let O=U[i];return O;}const q=u;import i from'node:fs/promises';import n from'node:path';import{NotFoundError,ValidationError}from'../../../errors.js';function D(){const l=['resolve','cwd','map','name','directory','size','split','unshift','text/html;\x20charset=utf-8','join','logs/','</title></head>\x0a<body>\x0a<h1>','replace','&amp;','&lt;','open','close'];D=function(){return l;};return D();}const LOGS_ROOT=n[q(0x15a)](process[q(0x15b)](),'logs'),TAIL_LINES=0x64;export async function getSystemLog(U,O){const M=q,o=normalizePath(U['path']),I=n['resolve'](LOGS_ROOT,o);if(I!==LOGS_ROOT&&!I['startsWith'](LOGS_ROOT+n['sep']))throw new ValidationError('Invalid\x20log\x20path');const X=await i['stat'](I)['catch'](()=>null);if(!X)throw new NotFoundError('Log\x20path\x20not\x20found');if(X['isDirectory']()){const R=await i['readdir'](I,{'withFileTypes':!![]}),g=await Promise['all'](R[M(0x15c)](async k=>{const y=M,d=await i['stat'](n['join'](I,k[y(0x15d)]));return{'name':k['name'],'path':o?o+'/'+k['name']:k[y(0x15d)],'type':k['isDirectory']()?y(0x15e):'file','size':k['isDirectory']()?undefined:d[y(0x15f)],'modified':d['mtime']['toISOString']()};}));g['sort']((k,d)=>k['name']['localeCompare'](d['name']));if(o){const k=o[M(0x160)]('/')['slice'](0x0,-0x1)['join']('/');g[M(0x161)]({'name':'..','path':k,'type':'directory'});}return{'contentType':M(0x162),'body':renderDirectory(o,g)};}const T=await tailFile(I,TAIL_LINES);return{'contentType':'text/plain;\x20charset=utf-8','body':T['join']('\x0a')};}function renderDirectory(U,O){const b=q,o=O['map'](X=>{const Z=u,T='?path='+encodeURIComponent(X['path']),R=X['type']===Z(0x15e)?X[Z(0x15d)]+'/':X[Z(0x15d)];return'<li><a\x20href=\x22'+T+'\x22>'+escapeHtml(R)+'</a></li>';})[b(0x163)]('\x0a'),I=escapeHtml(b(0x164)+U);return'<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>'+I+b(0x165)+I+'</h1>\x0a<ul>\x0a'+o+'\x0a</ul>\x0a</body>\x0a</html>';}function escapeHtml(U){const c=q;return U[c(0x166)](/&/g,c(0x167))[c(0x166)](/</g,c(0x168))['replace'](/>/g,'&gt;')['replace'](/"/g,'&quot;');}function normalizePath(U){const A=q,O=(U??'')[A(0x166)](/\\/g,'/')['replace'](/^\/+|\/+$/g,'');if(O[A(0x160)]('/')['some'](o=>o==='..'))throw new ValidationError('Invalid\x20log\x20path');return O;}async function tailFile(U,O){const K=q,o=await i[K(0x169)](U,'r');try{const {size:I}=await o['stat'](),X=0x40*0x400;let T=I,R=Buffer['alloc'](0x0),g=0x0;while(T>0x0&&g<=O){const d=Math['min'](X,T);T-=d;const L=Buffer['alloc'](d);await o['read'](L,0x0,d,T),R=Buffer['concat']([L,R]),g+=countNewlines(L);}const k=R['toString']('utf8')[K(0x160)]('\x0a')['filter'](h=>h['length']>0x0);return k['slice'](-O)['reverse']();}finally{await o[K(0x16a)]();}}function countNewlines(U){let O=0x0;for(const o of U){if(o===0xa)O++;}return O;}
@@ -1 +1 @@
1
- export async function getSystemSettings(c,N){const D=S,H=await N['pg'][D(0x1ec)]('\x0a\x20\x20\x20\x20\x20\x20SELECT\x20key,\x20value\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.settings\x0a\x20\x20\x20\x20\x20\x20WHERE\x20resource\x20=\x20\x27system\x27\x20AND\x20resource_id\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20key\x0a\x20\x20\x20\x20');return H['rows'][D(0x1ed)]((d,U)=>{const W=D,e=String(U['key'])[W(0x1ee)]('.');let K=d;for(const m of e['slice'](0x0,-0x1)){K[m]??={},K=K[m];}return K[e['at'](-0x1)]=U[W(0x1ef)],d;},{});}function S(c,N){c=c-0x1ec;const H=F();let d=H[c];return d;}function F(){const p=['query','reduce','split','value'];F=function(){return p;};return F();}
1
+ export async function getSystemSettings(i,n){const U=await n['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20SELECT\x20key,\x20value\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.settings\x0a\x20\x20\x20\x20\x20\x20WHERE\x20resource\x20=\x20\x27system\x27\x20AND\x20resource_id\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20key\x0a\x20\x20\x20\x20');return U['rows']['reduce']((O,o)=>{const I=String(o['key'])['split']('.');let X=O;for(const T of I['slice'](0x0,-0x1)){X[T]??={},X=X[T];}return X[I['at'](-0x1)]=o['value'],O;},{});}
@@ -1 +1 @@
1
- export async function listDictionaries(c,N){var H=S;return N['dictionary'][H(0xaf)]();}function S(c,N){c=c-0xaf;var H=F();var d=H[c];return d;}function F(){var d=['list'];F=function(){return d;};return F();}
1
+ function D(){var O=['dictionary','list'];D=function(){return O;};return D();}function u(i,n){i=i-0x17c;var U=D();var O=U[i];return O;}export async function listDictionaries(i,n){var U=u;return n[U(0x17c)][U(0x17d)]();}
@@ -1 +1 @@
1
- import{getAccess}from'./get-access.js';function S(c,N){c=c-0x17c;const H=F();let d=H[c];return d;}function F(){const K=['connect','user','DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL','INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20role_id,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)','query','ROLLBACK'];F=function(){return K;};return F();}export async function setAccess(c,N){const e=S,H=await N['pg'][e(0x17c)]();try{await H['query']('BEGIN');c['type']===e(0x17d)?await H['query'](e(0x17e),[c['id']]):await H['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL',[c['id']]);for(const d of c['access']){c['type']==='user'?await H['query']('INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20user_uid,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)',[d['resource'],d['actions'],c['id'],c[e(0x17d)]['id'],c['user']['id']]):await H['query'](e(0x17f),[d['resource'],d['actions'],c['id'],c['user']['id'],c[e(0x17d)]['id']]);}await H['query']('COMMIT');}catch(U){await H[e(0x180)](e(0x181));throw U;}finally{H['release']();}return getAccess(c,N);}
1
+ function D(){const X=['user','access','INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20user_uid,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)','query','actions'];D=function(){return X;};return D();}function u(i,n){i=i-0xbb;const U=D();let O=U[i];return O;}import{getAccess}from'./get-access.js';export async function setAccess(i,n){const I=u,U=await n['pg']['connect']();try{await U['query']('BEGIN');i['type']===I(0xbb)?await U['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL',[i['id']]):await U['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL',[i['id']]);for(const O of i[I(0xbc)]){i['type']===I(0xbb)?await U['query'](I(0xbd),[O['resource'],O['actions'],i['id'],i[I(0xbb)]['id'],i['user']['id']]):await U[I(0xbe)]('INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20role_id,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)',[O['resource'],O[I(0xbf)],i['id'],i[I(0xbb)]['id'],i['user']['id']]);}await U['query']('COMMIT');}catch(o){await U['query']('ROLLBACK');throw o;}finally{U['release']();}return getAccess(i,n);}
@@ -1 +1 @@
1
- export async function updateDictionary(c,N){var H=S;return await N['dictionary'][H(0x140)](c['name'],c[H(0x141)]),{'success':!![]};}function S(c,N){c=c-0x140;var H=F();var d=H[c];return d;}function F(){var d=['put','items'];F=function(){return d;};return F();}
1
+ function u(i,n){i=i-0x93;var U=D();var O=U[i];return O;}export async function updateDictionary(i,n){var U=u;return await n['dictionary'][U(0x93)](i['name'],i[U(0x94)]),{'success':!![]};}function D(){var O=['put','items'];D=function(){return O;};return D();}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';function S(c,N){c=c-0x1ef;const H=F();let d=H[c];return d;}function F(){const e=['patch','Settings\x20patch\x20is\x20empty','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.settings\x20(resource,\x20resource_id,\x20key,\x20value,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20(\x27system\x27,\x20NULL,\x20$1,\x20$2::jsonb,\x20$3)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(resource,\x20resource_id,\x20key)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20DO\x20UPDATE\x20SET\x20value\x20=\x20EXCLUDED.value,\x20updated_by\x20=\x20EXCLUDED.updated_by,\x20updated_at\x20=\x20now()\x0a\x20\x20\x20\x20\x20\x20\x20\x20','stringify','user'];F=function(){return e;};return F();}export async function updateSystemSettings(c,N){const U=S;if(!Object['keys'](c[U(0x1ef)])['length'])throw new ValidationError(U(0x1f0));for(const [H,d]of Object['entries'](c['patch'])){if(!H['trim']()||H['includes']('..'))throw new ValidationError('Invalid\x20setting\x20key:\x20'+H);await N['pg']['query'](U(0x1f1),[H,JSON[U(0x1f2)](d),c[U(0x1f3)]['id']]);}return{'success':!![]};}
1
+ function D(){const I=['patch','query'];D=function(){return I;};return D();}import{ValidationError}from'../../../errors.js';function u(i,n){i=i-0xcd;const U=D();let O=U[i];return O;}export async function updateSystemSettings(i,n){const o=u;if(!Object['keys'](i['patch'])['length'])throw new ValidationError('Settings\x20patch\x20is\x20empty');for(const [U,O]of Object['entries'](i[o(0xcd)])){if(!U['trim']()||U['includes']('..'))throw new ValidationError('Invalid\x20setting\x20key:\x20'+U);await n['pg'][o(0xce)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.settings\x20(resource,\x20resource_id,\x20key,\x20value,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20(\x27system\x27,\x20NULL,\x20$1,\x20$2::jsonb,\x20$3)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(resource,\x20resource_id,\x20key)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20DO\x20UPDATE\x20SET\x20value\x20=\x20EXCLUDED.value,\x20updated_by\x20=\x20EXCLUDED.updated_by,\x20updated_at\x20=\x20now()\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[U,JSON['stringify'](O),i['user']['id']]);}return{'success':!![]};}
@@ -1 +1 @@
1
- import{ForbiddenError}from'../../errors.js';export function requireAdmin(c,N){if(!c)throw new ForbiddenError('User\x20required');if(c['type']!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(c['type']!=='admin'&&N&&!c['permissions']?.['includes'](N))throw new ForbiddenError('Missing\x20permission:\x20'+N);}
1
+ function D(){var O=['User\x20required','Admin\x20access\x20required'];D=function(){return O;};return D();}import{ForbiddenError}from'../../errors.js';function u(i,n){i=i-0xf0;var U=D();var O=U[i];return O;}export function requireAdmin(i,n){var U=u;if(!i)throw new ForbiddenError(U(0xf0));if(i['type']!=='admin')throw new ForbiddenError(U(0xf1));if(i['type']!=='admin'&&n&&!i['permissions']?.['includes'](n))throw new ForbiddenError('Missing\x20permission:\x20'+n);}
@@ -1 +1 @@
1
- function S(c,N){c=c-0x1ed;const H=F();let d=H[c];return d;}export const safeUser=c=>{const U=S,N=['password',U(0x1ed),'secret',U(0x1ee)];return Object['fromEntries'](Object['entries'](c)[U(0x1ef)](([H])=>!N['some'](d=>H['toLowerCase']()['includes'](d))));};function F(){const e=['salt','credentials','filter'];F=function(){return e;};return F();}
1
+ function u(i,n){i=i-0x1c1;const U=D();let O=U[i];return O;}function D(){const I=['password','salt','entries'];D=function(){return I;};return D();}export const safeUser=i=>{const o=u,n=[o(0x1c1),o(0x1c2),'secret','credentials'];return Object['fromEntries'](Object[o(0x1c3)](i)['filter'](([U])=>!n['some'](O=>U['toLowerCase']()['includes'](O))));};
@@ -1 +1 @@
1
- import{UnsupportedError}from'../../errors.js';function S(c,N){c=c-0x146;var H=F();var d=H[c];return d;}export function unsupported(c){var N=S;throw new UnsupportedError(c+N(0x146));}function F(){var H=['\x20requires\x20a\x20project/provider\x20implementation'];F=function(){return H;};return F();}
1
+ import{UnsupportedError}from'../../errors.js';export function unsupported(i){throw new UnsupportedError(i+'\x20requires\x20a\x20project/provider\x20implementation');}
@@ -1 +1 @@
1
- import{writeAudit}from'./services/write-audit.js';export function createAudit(c){const N=writeAudit(c);return{'write':N};}
1
+ import{writeAudit}from'./services/write-audit.js';export function createAudit(i){const n=writeAudit(i);return{'write':n};}
@@ -1 +1 @@
1
- function F(){const r=['object','entries','then','has','logger','query','\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20user_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20module,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resource,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resource_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fields,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20action,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20request_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ip_address,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20metadata\x0a\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5,\x20$6,\x20$7,\x20$8,\x20$9)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20id\x0a\x20\x20\x20\x20\x20\x20','module','action','requestId','ipAddress','metadata','oldValue'];F=function(){return r;};return F();}const secretPattern=/password|token|secret|credential|salt/i;function clean(c){const W=S;if(Array['isArray'](c))return c['map'](clean);if(c&&typeof c===W(0x1af))return Object['fromEntries'](Object[W(0x1b0)](c)['map'](([N,H])=>[N,secretPattern['test'](N)?'[REDACTED]':clean(H)]));return c;}function S(c,N){c=c-0x1af;const H=F();let d=H[c];return d;}export function writeAudit(c){let N,H;async function d(){const p=S;if(!c['pg'])return![];if(N!==undefined)return N;return H??=c['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20IN\x20(\x27audit_log\x27,\x20\x27audit_log_data\x27)\x0a\x20\x20\x20\x20\x20\x20\x20\x20')[p(0x1b1)](U=>{const a=p,e=new Set(U['rows']['map'](K=>K['table_name']));return N=e[a(0x1b2)]('audit_log')&&e['has']('audit_log_data'),!N&&c[a(0x1b3)]['warn']({'expectedTables':['admin.audit_log','admin.audit_log_data'],'foundTables':[...e]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),N;})['catch'](U=>{return N=![],c['logger']['warn']({'err':U},'Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled'),![];}),H;}return async function U(e){const I=S;if(!await d())return c['logger']['info']({'auditFallback':!![],'event':clean({...e,'changes':e['changes']?.['map'](D=>({...D,'oldValue':clean(D['oldValue']),'newValue':clean(D['newValue'])}))})},'audit'),0x0;if(!c['pg'])throw new Error('empty\x20pg');const K=await c['pg'][I(0x1b4)](I(0x1b5),[e['userId']??null,e[I(0x1b6)],e['resource'],e['resourceId']==null?null:String(e['resourceId']),e['fields']??null,e[I(0x1b7)],e[I(0x1b8)]??null,e[I(0x1b9)]??null,clean(e[I(0x1ba)]??{})]),m=K['rows'][0x0]['id'];for(const D of e['changes']??[]){if(secretPattern['test'](D['field']))continue;await c['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log_data\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20audit_log_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20field,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20old_value,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20new_value\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[m,D['field'],JSON['stringify'](clean(D[I(0x1bb)])),JSON['stringify'](clean(D['newValue']))]);}return m;};}
1
+ const secretPattern=/password|token|secret|credential|salt/i;function u(i,n){i=i-0x152;const U=D();let O=U[i];return O;}function clean(i){const g=u;if(Array['isArray'](i))return i[g(0x152)](clean);if(i&&typeof i==='object')return Object['fromEntries'](Object['entries'](i)['map'](([n,U])=>[n,secretPattern[g(0x153)](n)?'[REDACTED]':clean(U)]));return i;}function D(){const L=['map','test','Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled','info','empty\x20pg','resourceId','query','field','oldValue'];D=function(){return L;};return D();}export function writeAudit(i){let n,U;async function O(){if(!i['pg'])return![];if(n!==undefined)return n;return U??=i['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20IN\x20(\x27audit_log\x27,\x20\x27audit_log_data\x27)\x0a\x20\x20\x20\x20\x20\x20\x20\x20')['then'](o=>{const k=u,I=new Set(o['rows']['map'](X=>X['table_name']));return n=I['has']('audit_log')&&I['has']('audit_log_data'),!n&&i['logger']['warn']({'expectedTables':['admin.audit_log','admin.audit_log_data'],'foundTables':[...I]},k(0x154)),n;})['catch'](o=>{return n=![],i['logger']['warn']({'err':o},'Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled'),![];}),U;}return async function o(I){const d=u;if(!await O())return i['logger'][d(0x155)]({'auditFallback':!![],'event':clean({...I,'changes':I['changes']?.['map'](R=>({...R,'oldValue':clean(R['oldValue']),'newValue':clean(R['newValue'])}))})},'audit'),0x0;if(!i['pg'])throw new Error(d(0x156));const X=await i['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20user_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20module,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resource,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resource_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fields,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20action,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20request_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ip_address,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20metadata\x0a\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5,\x20$6,\x20$7,\x20$8,\x20$9)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20id\x0a\x20\x20\x20\x20\x20\x20',[I['userId']??null,I['module'],I['resource'],I['resourceId']==null?null:String(I[d(0x157)]),I['fields']??null,I['action'],I['requestId']??null,I['ipAddress']??null,clean(I['metadata']??{})]),T=X['rows'][0x0]['id'];for(const R of I['changes']??[]){if(secretPattern['test'](R['field']))continue;await i['pg'][d(0x158)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log_data\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20audit_log_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20field,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20old_value,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20new_value\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[T,R[d(0x159)],JSON['stringify'](clean(R[d(0x15a)])),JSON['stringify'](clean(R['newValue']))]);}return T;};}
@@ -1 +1 @@
1
- function S(c,N){c=c-0xd3;const H=F();let d=H[c];return d;}export async function getUserPermissions(c,N){const U=S,H=await N['pg'][U(0xd3)]('\x0a\x20\x20\x20\x20\x20\x20SELECT\x20DISTINCT\x20ra.resource\x20||\x20\x27:\x27\x20||\x20action\x20AS\x20permission\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x20ON\x20ur.role_id\x20=\x20ra.role_id\x0a\x20\x20\x20\x20\x20\x20CROSS\x20JOIN\x20LATERAL\x20unnest(COALESCE(ra.actions,\x20\x27{}\x27::text[]))\x20AS\x20action\x0a\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20',[c]);return H['rows'][U(0xd4)](d=>d[U(0xd5)]);}function F(){const e=['query','map','permission'];F=function(){return e;};return F();}
1
+ function u(i,n){i=i-0x168;const U=D();let O=U[i];return O;}export async function getUserPermissions(i,n){const o=u,U=await n['pg']['query'](o(0x168),[i]);return U['rows']['map'](O=>O[o(0x169)]);}function D(){const I=['\x0a\x20\x20\x20\x20\x20\x20SELECT\x20DISTINCT\x20ra.resource\x20||\x20\x27:\x27\x20||\x20action\x20AS\x20permission\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x20ON\x20ur.role_id\x20=\x20ra.role_id\x0a\x20\x20\x20\x20\x20\x20CROSS\x20JOIN\x20LATERAL\x20unnest(COALESCE(ra.actions,\x20\x27{}\x27::text[]))\x20AS\x20action\x0a\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20','permission'];D=function(){return I;};return D();}
@@ -1 +1 @@
1
- export*from'./auth.types.js';function S(c,N){c=c-0x147;const H=F();let d=H[c];return d;}import{randomBytes,scrypt as c,timingSafeEqual}from'node:crypto';import{promisify}from'node:util';function F(){const V=['scrypt$','hex','from','length','Missing\x20config\x20or\x20redis\x20-\x20skipping\x20session\x20store\x20creation','auth','secret','cookieName','database','register','user','permissions'];F=function(){return V;};return F();}const scrypt=promisify(c);import N from'@fastify/cookie';import H from'@fastify/session';import{Authenticator}from'@fastify/passport';import d from'fastify-session-redis-store';import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(U){const I=S,e=randomBytes(0x10),K=await scrypt(U,e,0x40);return I(0x147)+e['toString']('hex')+'$'+K['toString']('hex');}export async function verifyPassword(U,e){const r=S,[K,m,D]=e?.['split']('$')||[];if(K!=='scrypt'||!m||!D)return![];const W=Buffer['from'](m,r(0x148)),p=Buffer[r(0x149)](D,r(0x148)),a=await scrypt(U,W,p[r(0x14a)]);return timingSafeEqual(a,p);}export async function createSessionStore(U,e){const w=S,{config:K,redis:m}=e;if(!K||!m){console['warn'](w(0x14b));return;}if(process.env.NODE_ENV==='test'||process.env.VITEST)return;await U['register'](N,{'parseOptions':K[w(0x14c)]['cookieOptions']}),await U['register'](H,{'secret':K[w(0x14c)][w(0x14d)],'cookieName':K['auth'][w(0x14e)],'cookie':K['auth']['cookieOptions'],'store':new d({'prefix':K[w(0x14c)][w(0x14e)]+':'+(K['pg']?.[w(0x14f)]||'db')+':','client':m})}),await U[w(0x150)](fastifyPassport['initialize']()),await U[w(0x150)](fastifyPassport['secureSession']()),fastifyPassport['registerUserSerializer'](async D=>({'user':D})),fastifyPassport['registerUserDeserializer'](async D=>{const x=w,W=D?.[x(0x151)]||D;return W?.['id']&&(W[x(0x152)]=await getUserPermissions(W['id'],e)),W;});}
1
+ function u(i,n){i=i-0x1b5;const U=D();let O=U[i];return O;}export*from'./auth.types.js';import{randomBytes,scrypt as i,timingSafeEqual}from'node:crypto';import{promisify}from'node:util';const scrypt=promisify(i);import n from'@fastify/cookie';import U from'@fastify/session';import{Authenticator}from'@fastify/passport';import O from'fastify-session-redis-store';import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();function D(){const y=['scrypt$','toString','split','from','length','warn','Missing\x20config\x20or\x20redis\x20-\x20skipping\x20session\x20store\x20creation','register','auth','cookieName','user'];D=function(){return y;};return D();}export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(o){const L=u,I=randomBytes(0x10),X=await scrypt(o,I,0x40);return L(0x1b5)+I[L(0x1b6)]('hex')+'$'+X['toString']('hex');}export async function verifyPassword(o,I){const h=u,[X,T,R]=I?.[h(0x1b7)]('$')||[];if(X!=='scrypt'||!T||!R)return![];const g=Buffer['from'](T,'hex'),k=Buffer[h(0x1b8)](R,'hex'),d=await scrypt(o,g,k[h(0x1b9)]);return timingSafeEqual(d,k);}export async function createSessionStore(o,I){const q=u,{config:X,redis:T}=I;if(!X||!T){console[q(0x1ba)](q(0x1bb));return;}if(process.env.NODE_ENV==='test'||process.env.VITEST)return;await o['register'](n,{'parseOptions':X['auth']['cookieOptions']}),await o[q(0x1bc)](U,{'secret':X['auth']['secret'],'cookieName':X['auth']['cookieName'],'cookie':X[q(0x1bd)]['cookieOptions'],'store':new O({'prefix':X['auth'][q(0x1be)]+':'+(X['pg']?.['database']||'db')+':','client':T})}),await o['register'](fastifyPassport['initialize']()),await o['register'](fastifyPassport['secureSession']()),fastifyPassport['registerUserSerializer'](async R=>({'user':R})),fastifyPassport['registerUserDeserializer'](async R=>{const M=q,g=R?.[M(0x1bf)]||R;return g?.['id']&&(g['permissions']=await getUserPermissions(g['id'],I)),g;});}
@@ -1 +1 @@
1
- function F(){const a=['not\x20enough\x20params:\x20user','user.login','then','info','auth/warn','password_hash'];F=function(){return a;};return F();}import{BadRequestError}from'../../errors.js';function S(c,N){c=c-0xe0;const H=F();let d=H[c];return d;}import{verifyPassword}from'./index.js';export async function verifyUser({user:c,password:N,ip:H},{pg:d,logger:U}){const p=S;if(!c||c==='')throw new BadRequestError(p(0xe0));if(!N||N==='')throw new BadRequestError('not\x20enough\x20params:\x20password');U['metrics'](p(0xe1));const e='select\x20uid\x20as\x20id,\x20user_type\x20as\x20type,\x20password_hash,\x20twofa\x20from\x20admin.users\x20where\x20$1\x20in\x20(login,email,phone)\x20and\x20enabled\x20limit\x201',K=await d['query'](e,[c])[p(0xe2)](D=>D['rows']?.[0x0]);if(!K){const D='user\x20not\x20found';U[p(0xe3)]({'file':p(0xe4),'error':D,'user':c,'ip':H});throw new BadRequestError(D);}const m=await verifyPassword(N,K[p(0xe5)]);if(!m){const W='Wrong\x20password';U['info']({'file':'auth/warn','error':W,'user':c,'ip':H});throw new BadRequestError(W);}return delete K['password_hash'],K;}
1
+ import{BadRequestError}from'../../errors.js';import{verifyPassword}from'./index.js';function D(){const d=['not\x20enough\x20params:\x20password','query','info','password_hash'];D=function(){return d;};return D();}function u(i,n){i=i-0x100;const U=D();let O=U[i];return O;}export async function verifyUser({user:i,password:n,ip:U},{pg:O,logger:o}){const k=u;if(!i||i==='')throw new BadRequestError('not\x20enough\x20params:\x20user');if(!n||n==='')throw new BadRequestError(k(0x100));o['metrics']('user.login');const I='select\x20uid\x20as\x20id,\x20user_type\x20as\x20type,\x20password_hash,\x20twofa\x20from\x20admin.users\x20where\x20$1\x20in\x20(login,email,phone)\x20and\x20enabled\x20limit\x201',X=await O[k(0x101)](I,[i])['then'](R=>R['rows']?.[0x0]);if(!X){const R='user\x20not\x20found';o['info']({'file':'auth/warn','error':R,'user':i,'ip':U});throw new BadRequestError(R);}const T=await verifyPassword(n,X['password_hash']);if(!T){const g='Wrong\x20password';o[k(0x102)]({'file':'auth/warn','error':g,'user':i,'ip':U});throw new BadRequestError(g);}return delete X[k(0x103)],X;}
@@ -1 +1 @@
1
- function S(c,N){c=c-0xd8;const H=F();let d=H[c];return d;}function F(){const X=['\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20=\x20\x27dictionaries\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20','then','Invalid\x20dictionary\x20name:\x20','code','has','get','checked','query','items','Dictionary\x20not\x20found:\x20','Dictionary\x20items\x20must\x20be\x20an\x20array','Dictionary\x20table\x20not\x20found','empty\x20pg','connect','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.dictionaries\x20(code,\x20name,\x20module,\x20source,\x20editable)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(code)\x20DO\x20UPDATE\x20SET\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20name\x20=\x20EXCLUDED.name,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20module\x20=\x20EXCLUDED.module,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20source\x20=\x20EXCLUDED.source,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20editable\x20=\x20EXCLUDED.editable,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20updated_at\x20=\x20now()\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','rows','parentId','COMMIT','map'];F=function(){return X;};return F();}import{ConflictError,NotFoundError,ValidationError}from'../errors.js';const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;export function createDictionary({pg:c,dictionaries:dictionaries=[]}){const N=new Map(),H=new Map();let d,U;async function e(){const P=S;if(d!==undefined)return d;if(!c)throw new Error('empty\x20pg');return U??=c['query'](P(0xd8))[P(0xd9)](w=>{const x=w['rows'][0x0]?.['table_name'];d=x==='dictionaries'?x:null;}),await U,d;}function K(w){const B=S;if(!dictionaryName['test'](w))throw new ValidationError(B(0xda)+w);}function m(w){const v=S;for(const x of Array['isArray'](w)?w:[w]){K(x[v(0xdb)]);if(!Array['isArray'](x['items']))throw new ValidationError('Invalid\x20dictionary\x20items:\x20'+x['code']);if(N['has'](x['code']))throw new ConflictError('Dictionary\x20already\x20registered:\x20'+x['code']);N['set'](x[v(0xdb)],{...x,'source':'static'});}}function D(w){const f=S;return N[f(0xdc)](w);}async function W(w){const R=S;K(w);const x=N[R(0xdd)](w);if(x&&x[R(0xde)])return x['items'];const V=await e();if(!V)throw new NotFoundError('Dictionary\x20table\x20not\x20found');const T=await c?.[R(0xdf)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20di.code,\x20di.name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.dictionary_items\x20di\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20JOIN\x20admin.dictionaries\x20d\x20ON\x20d.id\x20=\x20di.dictionary_id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20d.code\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20di.name\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[w]);if(T?.['rows']?.['length']){const M=T?.['rows'];return N['set'](w,{'code':w,'name':w,'items':M,'source':'database','checked':!![]}),M;}if(!x?.[R(0xe0)])throw new NotFoundError(R(0xe1)+w);return x['checked']=!![],x['items'];}async function p(w,x){const O=S;K(w);if(!Array['isArray'](x))throw new ValidationError(O(0xe2));const V=await e();if(!V)throw new NotFoundError(O(0xe3));if(!c)throw new Error(O(0xe4));const T=await c[O(0xe5)]();try{await T['query']('BEGIN');const M=await T['query'](O(0xe6),[w,w,'fcore','custom',!![]]),q=M[O(0xe7)][0x0]['id'];await T[O(0xdf)]('DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1',[q]);for(const Y of x){await T['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.dictionary_items\x20(dictionary_id,\x20code,\x20name,\x20parent_id)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20',[q,Y['code'],Y['name'],Y[O(0xe8)]??null]);}await T[O(0xdf)](O(0xe9));}catch(G){await T['query']('ROLLBACK');throw G;}finally{T['release']();}N['set'](w,{'items':x,'code':w,'source':'static','checked':!![]}),H['set'](w,(H['get'](w)??0x0)+0x1);}function a(w){return K(w),H['set'](w,(H['get'](w)??0x0)+0x1),N['delete'](w);}function I(w){return H['get'](w)??0x0;}async function r(){const i=S,w=[...N['values']()][i(0xea)](({code:T,name:M,source:q})=>({'code':T,'name':M??T,'source':q})),x=await e();if(!x)return w;if(!c)throw new Error('empty\x20pg');const V=await c['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20code,\x20name,\x20\x27database\x27\x20AS\x20source\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.dictionaries\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20name\x0a\x20\x20\x20\x20\x20\x20\x20\x20');for(const T of V[i(0xe7)]){!N[i(0xdc)](T['code'])&&w['push'](T);}return w;}return m(dictionaries),{'register':m,'get':W,'put':p,'clear':a,'revision':I,'list':r,'has':D};}
1
+ function u(i,n){i=i-0x16d;const U=D();let O=U[i];return O;}import{ConflictError,NotFoundError,ValidationError}from'../errors.js';function D(){const F=['table_name','Invalid\x20dictionary\x20name:\x20','code','has','Dictionary\x20already\x20registered:\x20','set','checked','query','Dictionary\x20not\x20found:\x20','BEGIN','DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1','name','parentId','delete','get','values','map'];D=function(){return F;};return D();}const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;export function createDictionary({pg:i,dictionaries:dictionaries=[]}){const n=new Map(),U=new Map();let O,o;async function I(){if(O!==undefined)return O;if(!i)throw new Error('empty\x20pg');return o??=i['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20=\x20\x27dictionaries\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20')['then'](q=>{const l=u,M=q['rows'][0x0]?.[l(0x16d)];O=M==='dictionaries'?M:null;}),await o,O;}function X(q){const x=u;if(!dictionaryName['test'](q))throw new ValidationError(x(0x16e)+q);}function T(q){const V=u;for(const M of Array['isArray'](q)?q:[q]){X(M['code']);if(!Array['isArray'](M['items']))throw new ValidationError('Invalid\x20dictionary\x20items:\x20'+M[V(0x16f)]);if(n[V(0x170)](M[V(0x16f)]))throw new ConflictError(V(0x171)+M[V(0x16f)]);n[V(0x172)](M[V(0x16f)],{...M,'source':'static'});}}function R(q){const f=u;return n[f(0x170)](q);}async function g(q){const s=u;X(q);const M=n['get'](q);if(M&&M[s(0x173)])return M['items'];const y=await I();if(!y)throw new NotFoundError('Dictionary\x20table\x20not\x20found');const Z=await i?.[s(0x174)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20di.code,\x20di.name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.dictionary_items\x20di\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20JOIN\x20admin.dictionaries\x20d\x20ON\x20d.id\x20=\x20di.dictionary_id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20d.code\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20di.name\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[q]);if(Z?.['rows']?.['length']){const b=Z?.['rows'];return n['set'](q,{'code':q,'name':q,'items':b,'source':'database','checked':!![]}),b;}if(!M?.['items'])throw new NotFoundError(s(0x175)+q);return M['checked']=!![],M['items'];}async function k(q,M){const t=u;X(q);if(!Array['isArray'](M))throw new ValidationError('Dictionary\x20items\x20must\x20be\x20an\x20array');const y=await I();if(!y)throw new NotFoundError('Dictionary\x20table\x20not\x20found');if(!i)throw new Error('empty\x20pg');const Z=await i['connect']();try{await Z['query'](t(0x176));const b=await Z['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.dictionaries\x20(code,\x20name,\x20module,\x20source,\x20editable)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(code)\x20DO\x20UPDATE\x20SET\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20name\x20=\x20EXCLUDED.name,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20module\x20=\x20EXCLUDED.module,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20source\x20=\x20EXCLUDED.source,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20editable\x20=\x20EXCLUDED.editable,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20updated_at\x20=\x20now()\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20',[q,q,'fcore','custom',!![]]),c=b['rows'][0x0]['id'];await Z['query'](t(0x177),[c]);for(const A of M){await Z['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.dictionary_items\x20(dictionary_id,\x20code,\x20name,\x20parent_id)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20',[c,A['code'],A[t(0x178)],A[t(0x179)]??null]);}await Z['query']('COMMIT');}catch(K){await Z['query']('ROLLBACK');throw K;}finally{Z['release']();}n['set'](q,{'items':M,'code':q,'source':'static','checked':!![]}),U['set'](q,(U['get'](q)??0x0)+0x1);}function d(q){const v=u;return X(q),U['set'](q,(U['get'](q)??0x0)+0x1),n[v(0x17a)](q);}function L(q){const C=u;return U[C(0x17b)](q)??0x0;}async function h(){const a=u,q=[...n[a(0x17c)]()][a(0x17d)](({code:Z,name:b,source:c})=>({'code':Z,'name':b??Z,'source':c})),M=await I();if(!M)return q;if(!i)throw new Error('empty\x20pg');const y=await i['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20code,\x20name,\x20\x27database\x27\x20AS\x20source\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.dictionaries\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20name\x0a\x20\x20\x20\x20\x20\x20\x20\x20');for(const Z of y['rows']){!n[a(0x170)](Z[a(0x16f)])&&q['push'](Z);}return q;}return T(dictionaries),{'register':T,'get':g,'put':k,'clear':d,'revision':L,'list':h,'has':R};}
@@ -1 +1 @@
1
- function F(){const M=['includes','replace','from','toString','endpoint','forcePathStyle','accessKey','folder','send','bucket','$metadata','httpStatusCode','name','split','sha256','update','digest'];F=function(){return M;};return F();}import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';import c from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function keyFor(N,H){const a=S;if(!H||H['startsWith']('/')||H[a(0x85)]('..'))throw new ValidationError('Invalid\x20file\x20path');const d=H[a(0x86)](/\\/g,'/')[a(0x86)](/^\/+/,''),U=(N??'')['replace'](/^\/+|\/+$/g,'');return U?U+'/'+d:d;}async function bodyToBuffer(N){const I=S;if(!N)return Buffer['alloc'](0x0);const H=N;if(typeof H['transformToByteArray']==='function')return Buffer[I(0x87)](await H['transformToByteArray']());const d=[];for await(const U of N){d['push'](Buffer['from'](U));}return Buffer['concat'](d);}function S(c,N){c=c-0x85;const H=F();let d=H[c];return d;}export function createFileS3(N){const r=S,H=N['tokenSecret']??process.env.FILE_TOKEN_SECRET??c['randomBytes'](0x20)[r(0x88)]('hex'),d=new S3Client({'endpoint':N[r(0x89)],'region':N['region']??'us-east-1','forcePathStyle':N[r(0x8a)]??!![],'credentials':N['accessKeyId']||N['accessKey']?{'accessKeyId':N['accessKeyId']??N[r(0x8b)],'secretAccessKey':N['secretAccessKey']??N['secretKey']}:undefined}),U=e=>keyFor(N[r(0x8c)],e);return{async 'put'(e,K){const w=r;await d[w(0x8d)](new PutObjectCommand({'Bucket':N['bucket'],'Key':U(e),'Body':K}));},async 'get'(e){const x=r,K=await d['send'](new GetObjectCommand({'Bucket':N[x(0x8e)],'Key':U(e)}));return bodyToBuffer(K['Body']);},async 'exists'(e){const V=r;try{return await d['send'](new HeadObjectCommand({'Bucket':N['bucket'],'Key':U(e)})),!![];}catch(K){const m=K;if(m[V(0x8f)]?.[V(0x90)]===0x194||m[V(0x91)]==='NotFound')return![];throw K;}},async 'delete'(e){await d['send'](new DeleteObjectCommand({'Bucket':N['bucket'],'Key':U(e)}));},'create'(e,K=N['tokenTtl']??0xe10){const m=Buffer['from'](e)['toString']('base64url'),D=c['createHmac']('sha256',H)['update'](m)['digest']('base64url');return m+'.'+D;},'verify'(e){const T=r,[K,m]=e[T(0x92)]('.');if(!K||!m)throw new UnauthorizedError('Invalid\x20file\x20token');const D=c['createHmac'](T(0x93),H)[T(0x94)](K)[T(0x95)](),W=Buffer['from'](m,'base64url');if(D['length']!==W['length']||!c['timingSafeEqual'](D,W))throw new UnauthorizedError('Invalid\x20file\x20token');const p=Buffer[T(0x87)](K,'base64url')['toString']('utf8');return p;}};}
1
+ import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';function u(i,n){i=i-0x1cf;const U=D();let O=U[i];return O;}import i from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function keyFor(n,U){const d=u;if(!U||U['startsWith']('/')||U[d(0x1cf)]('..'))throw new ValidationError('Invalid\x20file\x20path');const O=U['replace'](/\\/g,'/')['replace'](/^\/+/,''),o=(n??'')['replace'](/^\/+|\/+$/g,'');return o?o+'/'+O:O;}function D(){const c=['includes','alloc','push','hex','accessKey','secretKey','send','Body','bucket','$metadata','toString','sha256','update','Invalid\x20file\x20token','digest','length','utf8'];D=function(){return c;};return D();}async function bodyToBuffer(n){const L=u;if(!n)return Buffer[L(0x1d0)](0x0);const U=n;if(typeof U['transformToByteArray']==='function')return Buffer['from'](await U['transformToByteArray']());const O=[];for await(const o of n){O[L(0x1d1)](Buffer['from'](o));}return Buffer['concat'](O);}export function createFileS3(n){const h=u,U=n['tokenSecret']??process.env.FILE_TOKEN_SECRET??i['randomBytes'](0x20)['toString'](h(0x1d2)),O=new S3Client({'endpoint':n['endpoint'],'region':n['region']??'us-east-1','forcePathStyle':n['forcePathStyle']??!![],'credentials':n['accessKeyId']||n[h(0x1d3)]?{'accessKeyId':n['accessKeyId']??n['accessKey'],'secretAccessKey':n['secretAccessKey']??n[h(0x1d4)]}:undefined}),o=I=>keyFor(n['folder'],I);return{async 'put'(I,X){const q=h;await O[q(0x1d5)](new PutObjectCommand({'Bucket':n['bucket'],'Key':o(I),'Body':X}));},async 'get'(I){const M=h,X=await O[M(0x1d5)](new GetObjectCommand({'Bucket':n['bucket'],'Key':o(I)}));return bodyToBuffer(X[M(0x1d6)]);},async 'exists'(I){const y=h;try{return await O['send'](new HeadObjectCommand({'Bucket':n[y(0x1d7)],'Key':o(I)})),!![];}catch(X){const T=X;if(T[y(0x1d8)]?.['httpStatusCode']===0x194||T['name']==='NotFound')return![];throw X;}},async 'delete'(I){await O['send'](new DeleteObjectCommand({'Bucket':n['bucket'],'Key':o(I)}));},'create'(I,X=n['tokenTtl']??0xe10){const Z=h,T=Buffer['from'](I)[Z(0x1d9)]('base64url'),R=i['createHmac'](Z(0x1da),U)[Z(0x1db)](T)['digest']('base64url');return T+'.'+R;},'verify'(I){const b=h,[X,T]=I['split']('.');if(!X||!T)throw new UnauthorizedError(b(0x1dc));const R=i['createHmac']('sha256',U)['update'](X)[b(0x1dd)](),g=Buffer['from'](T,'base64url');if(R[b(0x1de)]!==g['length']||!i['timingSafeEqual'](R,g))throw new UnauthorizedError('Invalid\x20file\x20token');const k=Buffer['from'](X,'base64url')['toString'](b(0x1df));return k;}};}
@@ -1 +1 @@
1
- import{SignJWT,jwtVerify}from'jose';function S(c,N){c=c-0x189;const H=F();let d=H[c];return d;}const secret=new TextEncoder()['encode'](process.env.AUTH_JWT_SECRET);export async function jwtSignToken(c){if(!process.env.AUTH_JWT_SECRET)return;const {id:N,type:H,permissions:d}=c,U=await new SignJWT({'id':N,'type':H,'permissions':d})['setProtectedHeader']({'alg':'HS256'})['setIssuedAt']()['setExpirationTime']('1h')['sign'](secret);return U;}export async function jwtVerifyToken(c){const e=S,N=await jwtVerify(c,secret,{'algorithms':['HS256']})[e(0x189)](H=>{const K=e;console[K(0x18a)](H['message']);});return N?.[e(0x18b)];}function F(){const m=['catch','log','payload'];F=function(){return m;};return F();}
1
+ import{SignJWT,jwtVerify}from'jose';const secret=new TextEncoder()['encode'](process.env.AUTH_JWT_SECRET);function u(i,n){i=i-0x1a5;const U=D();let O=U[i];return O;}export async function jwtSignToken(i){const I=u;if(!process.env.AUTH_JWT_SECRET)return;const {id:n,type:U,permissions:O}=i,o=await new SignJWT({'id':n,'type':U,'permissions':O})['setProtectedHeader']({'alg':'HS256'})[I(0x1a5)]()['setExpirationTime']('1h')['sign'](secret);return o;}function D(){const R=['setIssuedAt','message','payload'];D=function(){return R;};return D();}export async function jwtVerifyToken(i){const T=u,n=await jwtVerify(i,secret,{'algorithms':['HS256']})['catch'](U=>{const X=u;console['log'](U[X(0x1a6)]);});return n?.[T(0x1a7)];}
@@ -1 +1 @@
1
- function S(c,N){c=c-0x182;const H=F();let d=H[c];return d;}import c from'pino';export function createLogger(){const m=S,N=c['transport']({'target':m(0x182)}),H=c({'level':'info','timestamp':c['stdTimeFunctions']['isoTime'],'base':{'service':'app'},'redact':{'paths':['req.headers.authorization',m(0x183),m(0x184),m(0x185),'refreshToken'],'censor':'[REDACTED]'}},N),d={};function U(e,K){if(e===undefined)return{...d};d[e]=(d[e]??0x0)+(K??0x1);}return Object['assign'](H,{'close':async()=>N['end'](),'metrics':U,'file':()=>H['info']['bind'](H)});}function F(){const D=['./transport.js','password','token','accessToken'];F=function(){return D;};return F();}
1
+ function u(i,n){i=i-0x90;const U=D();let O=U[i];return O;}import i from'pino';function D(){const R=['./transport.js','password','end','info'];D=function(){return R;};return D();}export function createLogger(){const T=u,n=i['transport']({'target':T(0x90)}),U=i({'level':'info','timestamp':i['stdTimeFunctions']['isoTime'],'base':{'service':'app'},'redact':{'paths':['req.headers.authorization',T(0x91),'token','accessToken','refreshToken'],'censor':'[REDACTED]'}},n),O={};function o(I,X){if(I===undefined)return{...O};O[I]=(O[I]??0x0)+(X??0x1);}return Object['assign'](U,{'close':async()=>n[T(0x92)](),'metrics':o,'file':()=>U[T(0x93)]['bind'](U)});}
@@ -1 +1 @@
1
- import c from'node:fs';import N from'node:path';import H from'pino-abstract-transport';function S(c,N){c=c-0x1e6;const H=F();let d=H[c];return d;}function F(){const p=['resolve','logs','mkdirSync','join','get','file','write','stringify'];F=function(){return p;};return F();}const LEVELS={0x1e:'info',0x28:'warn',0x32:'error',0x3c:'error'},streams=new Map();function getDate(){return new Date()['toISOString']()['slice'](0x0,0xa);}function createStream(d,U){const m=S,e=N[m(0x1e6)](m(0x1e7),d);return c[m(0x1e8)](e,{'recursive':!![]}),c['createWriteStream'](N[m(0x1e9)](e,U+'.log'),{'flags':'a'});}function getStream(d){const D=S,U=getDate(),e=streams[D(0x1ea)](d);if(e&&e['date']===U)return e['stream'];e?.['stream']['end']();const K=createStream(d,U);return streams['set'](d,{'date':U,'stream':K}),K;}function closeStreams(){for(const {stream:d}of streams['values']()){d['end']();}streams['clear']();}export default async function loggerTransport(){return H(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(d){const W=S;for await(const U of d){const e=LEVELS[U['level']];if(!e)continue;const K=getStream(U['file']||e);delete U[W(0x1eb)],K[W(0x1ec)](JSON[W(0x1ed)](U)+'\x0a');}}
1
+ const T=u;import i from'node:fs';import n from'node:path';function u(i,n){i=i-0x184;const U=D();let O=U[i];return O;}function D(){const d=['error','createWriteStream','date','end','set','level','write','stringify'];D=function(){return d;};return D();}import U from'pino-abstract-transport';const LEVELS={0x1e:'info',0x28:'warn',0x32:T(0x184),0x3c:T(0x184)},streams=new Map();function getDate(){return new Date()['toISOString']()['slice'](0x0,0xa);}function createStream(O,o){const R=T,I=n['resolve']('logs',O);return i['mkdirSync'](I,{'recursive':!![]}),i[R(0x185)](n['join'](I,o+'.log'),{'flags':'a'});}function getStream(O){const g=T,o=getDate(),I=streams['get'](O);if(I&&I[g(0x186)]===o)return I['stream'];I?.['stream'][g(0x187)]();const X=createStream(O,o);return streams[g(0x188)](O,{'date':o,'stream':X}),X;}function closeStreams(){for(const {stream:O}of streams['values']()){O['end']();}streams['clear']();}export default async function loggerTransport(){return U(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(O){const k=T;for await(const o of O){const I=LEVELS[o[k(0x189)]];if(!I)continue;const X=getStream(o['file']||I);delete o['file'],X[k(0x18a)](JSON[k(0x18b)](o)+'\x0a');}}
@@ -1 +1 @@
1
- import c from'pg';function F(){const w=['captureStackTrace','query','transaction','connect','stack'];F=function(){return w;};return F();}function S(c,N){c=c-0x9e;const H=F();let d=H[c];return d;}const {Pool}=c;export function createDatabase(N){const I=S,H=new Pool(N),d=H['query']['bind'](H);function U(e,K){const a=S,m=new Error();return Error[a(0x9e)]?.(m,U),d(e,K)['catch'](D=>{const W=D;W['sql']=e,W['callerStack']=m['stack'];throw W;});}return H[I(0x9f)]=U,H['transaction']=async function(e){const r=I,K=new Error();Error[r(0x9e)]?.(K,H[r(0xa0)]);const m=await H[r(0xa1)]();try{await m[r(0x9f)]('BEGIN');const D=await e(m);return await m['query']('COMMIT'),D;}catch(W){await m['query']('ROLLBACK');const p=W;p['callerStack']=K[r(0xa2)];throw p;}finally{m['release']();}},H;}
1
+ import i from'pg';function u(i,n){i=i-0x1f4;const U=D();let O=U[i];return O;}const {Pool}=i;function D(){const h=['sql','query','ROLLBACK'];D=function(){return h;};return D();}export function createDatabase(n){const U=new Pool(n),O=U['query']['bind'](U);function o(I,X){const T=new Error();return Error['captureStackTrace']?.(T,o),O(I,X)['catch'](R=>{const d=u,g=R;g[d(0x1f4)]=I,g['callerStack']=T['stack'];throw g;});}return U['query']=o,U['transaction']=async function(I){const L=u,X=new Error();Error['captureStackTrace']?.(X,U['transaction']);const T=await U['connect']();try{await T[L(0x1f5)]('BEGIN');const R=await I(T);return await T['query']('COMMIT'),R;}catch(g){await T[L(0x1f5)](L(0x1f6));const k=g;k['callerStack']=X['stack'];throw k;}finally{T['release']();}},U;}
@@ -1 +1 @@
1
- function S(c,N){c=c-0xbe;const H=F();let d=H[c];return d;}function F(){const D=['get','number','quit'];F=function(){return D;};return F();}import{Redis}from'ioredis';export function createRedis(c){const K=S,N=new Redis(c);return{'get':H=>N[K(0xbe)](H),'set':(H,d,U,e)=>{const m=K;if(e)return N['set'](H,d,'EX',e);if(typeof U===m(0xbf))return N['set'](H,d,'EX',U);return N['set'](H,d);},'del':H=>N['del'](H),'delete':H=>N['del'](H),'close':()=>N[K(0xc0)](),'ping':()=>N['ping'](),'hincrby':(H,d,U)=>N['hincrby'](H,d,U),'incrby':(H,d)=>N['incrby'](H,d)};}
1
+ function u(i,n){i=i-0x147;const U=D();let O=U[i];return O;}import{Redis}from'ioredis';function D(){const R=['set','del','ping','hincrby'];D=function(){return R;};return D();}export function createRedis(i){const T=u,n=new Redis(i);return{'get':U=>n['get'](U),'set':(U,O,o,I)=>{const X=u;if(I)return n[X(0x147)](U,O,'EX',I);if(typeof o==='number')return n['set'](U,O,'EX',o);return n['set'](U,O);},'del':U=>n[T(0x148)](U),'delete':U=>n['del'](U),'close':()=>n['quit'](),'ping':()=>n[T(0x149)](),'hincrby':(U,O,o)=>n[T(0x14a)](U,O,o),'incrby':(U,O)=>n['incrby'](U,O)};}
@@ -1 +1 @@
1
- import{ResourceRegistry}from'./resource.registry.js';import{createFind}from'./services/find.js';import{createFindOne}from'./services/find-one.js';import{createCreate}from'./services/create.js';import{createUpdate}from'./services/update.js';import{createRemove}from'./services/delete.js';import{createFindRelation}from'./services/find-relation.js';import{createCreateRelation}from'./services/create-relation.js';import{createDeleteRelation}from'./services/delete-relation.js';function F(){const I=['has','list'];F=function(){return I;};return F();}import{createUpdateRelation}from'./services/update-relation.js';function S(c,N){c=c-0x130;const H=F();let d=H[c];return d;}export function createResource(c){const a=S,N=new ResourceRegistry(),H=createFind(c,N),d=createFindOne(c,N),U=createCreate(c,N),e=createUpdate(c,N),K=createRemove(c,N),m=createFindRelation(c,N),D=createCreateRelation(c,N),W=createUpdateRelation(c,N),p=createDeleteRelation(c,N);return{'register':N['register']['bind'](N),'has':N[a(0x130)]['bind'](N),'get':N['get']['bind'](N),'list':N[a(0x131)]['bind'](N),'find':H,'findOne':d,'create':U,'update':e,'delete':K,'findRelation':m,'createRelation':D,'updateRelation':W,'deleteRelation':p};}
1
+ import{ResourceRegistry}from'./resource.registry.js';function u(i,n){i=i-0xf6;const U=D();let O=U[i];return O;}import{createFind}from'./services/find.js';import{createFindOne}from'./services/find-one.js';import{createCreate}from'./services/create.js';import{createUpdate}from'./services/update.js';import{createRemove}from'./services/delete.js';import{createFindRelation}from'./services/find-relation.js';import{createCreateRelation}from'./services/create-relation.js';function D(){const L=['register','bind','get','list'];D=function(){return L;};return D();}import{createDeleteRelation}from'./services/delete-relation.js';import{createUpdateRelation}from'./services/update-relation.js';export function createResource(i){const d=u,n=new ResourceRegistry(),U=createFind(i,n),O=createFindOne(i,n),o=createCreate(i,n),I=createUpdate(i,n),X=createRemove(i,n),T=createFindRelation(i,n),R=createCreateRelation(i,n),g=createUpdateRelation(i,n),k=createDeleteRelation(i,n);return{'register':n[d(0xf6)][d(0xf7)](n),'has':n['has'][d(0xf7)](n),'get':n[d(0xf8)][d(0xf7)](n),'list':n[d(0xf9)][d(0xf7)](n),'find':U,'findOne':O,'create':o,'update':I,'delete':X,'findRelation':T,'createRelation':R,'updateRelation':g,'deleteRelation':k};}
@@ -1 +1 @@
1
- const d=S;import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';const ident=/^[a-zA-Z0-9_-]*$/;function validQualified(c){return c['split']('.')['length']<=0x2&&c['split']('.')['every'](N=>ident['test'](N));}function F(){const D=['resources','register','has','name','get','list','version','test','Invalid\x20resource\x20field:\x20'];F=function(){return D;};return F();}function S(c,N){c=c-0xc2;const H=F();let d=H[c];return d;}export class ResourceRegistry{[d(0xc2)]=new Map();[d(0xc3)](c){const U=d;for(const N of Array['isArray'](c)?c:[c]){this['validate'](N);if(this[U(0xc2)][U(0xc4)](N['name']))throw new ConflictError('Resource\x20already\x20registered:\x20'+N['name']);this['resources']['set'](N[U(0xc5)],N);}}['has'](c){return this['resources']['has'](c);}[d(0xc6)](c){const e=d,N=this[e(0xc2)]['get'](c);if(!N)throw new NotFoundError('Resource\x20not\x20registered:\x20'+c);return N;}[d(0xc7)](){const K=d;return[...this[K(0xc2)]['values']()];}['validate'](c){const m=d;if(c[m(0xc8)]!==0x1||!ident['test'](c['name'])||!validQualified(c['table'])||!ident[m(0xc9)](c['key']))throw new ValidationError('Invalid\x20resource\x20contract:\x20'+c['name']);for(const [N,H]of Object['entries'](c['fields'])){if(!ident[m(0xc9)](N)||!ident['test'](H['column']??N))throw new ValidationError(m(0xca)+N);}}}
1
+ function D(){const R=['test','register','validate','has','name','resources','get','table','Invalid\x20resource\x20field:\x20'];D=function(){return R;};return D();}const o=u;function u(i,n){i=i-0x1ec;const U=D();let O=U[i];return O;}import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';const ident=/^[a-zA-Z0-9_-]*$/;function validQualified(i){const O=u;return i['split']('.')['length']<=0x2&&i['split']('.')['every'](n=>ident[O(0x1ec)](n));}export class ResourceRegistry{['resources']=new Map();[o(0x1ed)](i){const I=o;for(const n of Array['isArray'](i)?i:[i]){this[I(0x1ee)](n);if(this['resources'][I(0x1ef)](n['name']))throw new ConflictError('Resource\x20already\x20registered:\x20'+n[I(0x1f0)]);this[I(0x1f1)]['set'](n['name'],n);}}['has'](i){return this['resources']['has'](i);}[o(0x1f2)](i){const X=o,n=this[X(0x1f1)]['get'](i);if(!n)throw new NotFoundError('Resource\x20not\x20registered:\x20'+i);return n;}['list'](){return[...this['resources']['values']()];}['validate'](i){const T=o;if(i['version']!==0x1||!ident['test'](i['name'])||!validQualified(i[T(0x1f3)])||!ident[T(0x1ec)](i['key']))throw new ValidationError('Invalid\x20resource\x20contract:\x20'+i['name']);for(const [n,U]of Object['entries'](i['fields'])){if(!ident['test'](n)||!ident[T(0x1ec)](U['column']??n))throw new ValidationError(T(0x1f4)+n);}}}
@@ -1 +1 @@
1
- const dictionaryIndexesCache=new WeakMap(),dictionaryRevisionsCache=new WeakMap();function S(c,N){c=c-0x180;const H=F();let d=H[c];return d;}async function getDictionaryIndexes(c,N){const a=S,H=dictionaryIndexesCache['get'](N)??new Map(),d=dictionaryRevisionsCache['get'](N)??new Map();dictionaryIndexesCache['set'](N,H),dictionaryRevisionsCache[a(0x180)](N,d);const U=c['filter'](K=>d['get'](K)!==N['revision'](K));if(U['length']===0x0)return H;const e=await Promise['all'](U[a(0x181)](async K=>{if(!N['has'](K))return[K,new Map()];const m=await N['get'](K),D=new Map();for(const W of m){const p=W['code']??W['id'];if(p==null)continue;D['set'](String(p),{'id':p,'text':W['name']??W['text'],...W['color']!==undefined?{'color':W['color']}:{},...W['icon']!==undefined?{'icon':W['icon']}:{}});}return[K,D];}));for(const [K,m]of e){H['set'](K,m),d['set'](K,N['revision'](K));}return H;}export async function addDictionaryLookupData(c,N,H){const I=S;if(!H||c[I(0x182)]===0x0)return c;const d=Object[I(0x183)](N)['flatMap'](([e,K])=>{const m=K['dictionary'];return m?[{'field':e,'dictionaryName':m}]:[];});if(d[I(0x182)]===0x0)return c;const U=await getDictionaryIndexes([...new Set(d['map'](({dictionaryName:e})=>e))],H);for(const e of c){for(const {field:K,dictionaryName:m}of d){const D=e[K];e[K+'_data']=D==null?null:U['get'](m)?.['get'](String(D))??null;}}return c;}function F(){const r=['set','map','length','entries'];F=function(){return r;};return F();}
1
+ function u(i,n){i=i-0x14d;const U=D();let O=U[i];return O;}function D(){const q=['set','get','icon','_data'];D=function(){return q;};return D();}const dictionaryIndexesCache=new WeakMap(),dictionaryRevisionsCache=new WeakMap();async function getDictionaryIndexes(i,n){const d=u,U=dictionaryIndexesCache['get'](n)??new Map(),O=dictionaryRevisionsCache['get'](n)??new Map();dictionaryIndexesCache[d(0x14d)](n,U),dictionaryRevisionsCache[d(0x14d)](n,O);const o=i['filter'](X=>O[d(0x14e)](X)!==n['revision'](X));if(o['length']===0x0)return U;const I=await Promise['all'](o['map'](async X=>{const L=d;if(!n['has'](X))return[X,new Map()];const T=await n['get'](X),R=new Map();for(const g of T){const k=g['code']??g['id'];if(k==null)continue;R['set'](String(k),{'id':k,'text':g['name']??g['text'],...g['color']!==undefined?{'color':g['color']}:{},...g[L(0x14f)]!==undefined?{'icon':g['icon']}:{}});}return[X,R];}));for(const [X,T]of I){U['set'](X,T),O['set'](X,n['revision'](X));}return U;}export async function addDictionaryLookupData(i,n,U){const h=u;if(!U||i['length']===0x0)return i;const O=Object['entries'](n)['flatMap'](([I,X])=>{const T=X['dictionary'];return T?[{'field':I,'dictionaryName':T}]:[];});if(O['length']===0x0)return i;const o=await getDictionaryIndexes([...new Set(O['map'](({dictionaryName:I})=>I))],U);for(const I of i){for(const {field:X,dictionaryName:T}of O){const R=I[X];I[X+h(0x150)]=R==null?null:o['get'](T)?.['get'](String(R))??null;}}return i;}
@@ -1 +1 @@
1
- function S(c,N){c=c-0x14d;const H=F();let d=H[c];return d;}function F(){const D=['length','filter','type','file'];F=function(){return D;};return F();}export function addFileToken(c,N,H){const m=S;if(!H||c[m(0x14d)]===0x0)return c;const d=Object['entries'](N)[m(0x14e)](([,U])=>U[m(0x14f)]===m(0x150))['map'](([U])=>U);for(const U of c){for(const e of d){const K=U[e];typeof K==='string'&&K[m(0x14d)]>0x0&&(U[e]=H['create'](K));}}return c;}
1
+ function u(i,n){i=i-0x19a;const U=D();let O=U[i];return O;}export function addFileToken(i,n,U){const T=u;if(!U||i['length']===0x0)return i;const O=Object['entries'](n)[T(0x19a)](([,o])=>o['type']==='file')['map'](([o])=>o);for(const o of i){for(const I of O){const X=o[I];typeof X===T(0x19b)&&X['length']>0x0&&(o[I]=U['create'](X));}}return i;}function D(){const R=['filter','string'];D=function(){return R;};return D();}
@@ -1 +1 @@
1
- function S(c,N){c=c-0x1c1;const H=F();let d=H[c];return d;}import{qi,qt}from'../utils/sql.js';const tableLookupCache=new WeakMap();export function clearTableLookupCache(c,N){const T=S,H=tableLookupCache[T(0x1c1)](N);if(!H)return;for(const d of H[T(0x1c2)]()){d['startsWith'](c+':')&&H['delete'](d);}}export async function addTableLookupData(c,N,H){const M=S;if(!H||c['length']===0x0)return c;const d=tableLookupCache['get'](H)??new Map();tableLookupCache['set'](H,d);const U=Object['entries'](N)['flatMap'](([e,K])=>{const {table:m,value:value='id',text:text='name'}=K['lookup']??{};return m?[{'field':e,'table':m,'value':value,'text':text}]:[];});for(const e of U){const K=new Map();for(const p of c){const a=p[e[M(0x1c3)]];(typeof a===M(0x1c4)||typeof a==='number')&&K['set'](String(a),a);}const m=e['table']+':'+e['value']+':'+e['text'],D=d[M(0x1c1)](m)??new Map();d['set'](m,D);const W=[...K['entries']()]['filter'](([I])=>!D[M(0x1c5)](I))['map'](([,I])=>I);if(W['length']>0x0){const I=await H[M(0x1c6)]('SELECT\x20'+qi(e[M(0x1c7)])+'\x20AS\x20id,\x20'+qi(e['text'])+'\x20AS\x20text\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20'+qt(e['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(e[M(0x1c7)])+M(0x1c8),[W]);for(const r of I['rows']){D[M(0x1c9)](String(r['id']),r);}for(const w of W){!D['has'](String(w))&&D[M(0x1c9)](String(w),null);}}for(const x of c){const V=x[e['field']];x[e['field']+'_data']=V==null?null:D['get'](String(V))??null;}}return c;}function F(){const q=['get','keys','field','string','has','query','value','\x20=\x20ANY($1)','set'];F=function(){return q;};return F();}
1
+ function u(i,n){i=i-0xe2;const U=D();let O=U[i];return O;}import{qi,qt}from'../utils/sql.js';const tableLookupCache=new WeakMap();export function clearTableLookupCache(i,n){const Z=u,U=tableLookupCache[Z(0xe2)](n);if(!U)return;for(const O of U[Z(0xe3)]()){O['startsWith'](i+':')&&U['delete'](O);}}export async function addTableLookupData(i,n,U){const b=u;if(!U||i['length']===0x0)return i;const O=tableLookupCache['get'](U)??new Map();tableLookupCache['set'](U,O);const o=Object[b(0xe4)](n)['flatMap'](([I,X])=>{const c=b,{table:T,value:value='id',text:text=c(0xe5)}=X['lookup']??{};return T?[{'field':I,'table':T,'value':value,'text':text}]:[];});for(const I of o){const X=new Map();for(const k of i){const d=k[I[b(0xe6)]];(typeof d==='string'||typeof d==='number')&&X['set'](String(d),d);}const T=I['table']+':'+I['value']+':'+I[b(0xe7)],R=O['get'](T)??new Map();O['set'](T,R);const g=[...X['entries']()]['filter'](([L])=>!R['has'](L))['map'](([,L])=>L);if(g['length']>0x0){const L=await U['query'](b(0xe8)+qi(I['value'])+'\x20AS\x20id,\x20'+qi(I[b(0xe7)])+'\x20AS\x20text\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20'+qt(I['table'])+b(0xe9)+qi(I['value'])+b(0xea),[g]);for(const h of L['rows']){R['set'](String(h['id']),h);}for(const q of g){!R['has'](String(q))&&R['set'](String(q),null);}}for(const M of i){const y=M[I['field']];M[I['field']+'_data']=y==null?null:R['get'](String(y))??null;}}return i;}function D(){const A=['get','keys','entries','name','field','text','SELECT\x20','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20','\x20=\x20ANY($1)'];D=function(){return A;};return D();}
@@ -1 +1 @@
1
- import{UnsupportedError}from'../../../errors.js';function F(){const T=['notes','files','includes','query','relations','foreignKey','table','resource'];F=function(){return T;};return F();}function S(c,N){c=c-0x129;const H=F();let d=H[c];return d;}import{createCreate}from'./create.js';export function createCreateRelation(c,N){const H=createCreate(c,N);return async function d({name:U,id:e,relation:K,data:m,user:D},W){const V=S,p=W?.['pg']??c['pg'],a=N['get'](U);if([V(0x129),V(0x12a)]['includes'](K)&&!a['capabilities']?.[V(0x12b)](K))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+K+'\x22\x20requires\x20a\x20capabilities\x20\x22'+K+'\x22');if(K==='notes'){const w=await p['query']('INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*',[U,String(e),m?.['body']]);return w['rows'][0x0];}if(K===V(0x12a)){const x=await p[V(0x12c)]('INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*',[U,String(e),m?.['filePath'],m?.['size']??null]);return x['rows'][0x0];}const I=a[V(0x12d)]?.[K];if(!I?.[V(0x12e)]||!I['resource']&&!I[V(0x12f)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+K+'\x22\x20requires\x20a\x20project/provider\x20implementation');if(!m)throw new UnsupportedError('No\x20data\x20provided\x20for\x20relation:\x20'+m);if(!I[V(0x130)])throw new UnsupportedError('Relation\x20update\x20is\x20not\x20configured:\x20'+K);m[I['foreignKey']]=e;const r=await H({'name':I['resource'],'data':m??{},'user':D});return r;};}
1
+ import{UnsupportedError}from'../../../errors.js';function u(i,n){i=i-0x10e;const U=D();let O=U[i];return O;}import{createCreate}from'./create.js';export function createCreateRelation(i,n){const U=createCreate(i,n);return async function O({name:o,id:I,relation:X,data:T,user:R},g){const y=u,k=g?.['pg']??i['pg'],d=n[y(0x10e)](o);if(['notes','files']['includes'](X)&&!d['capabilities']?.['includes'](X))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+X+y(0x10f)+X+'\x22');if(X==='notes'){const q=await k[y(0x110)]('INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*',[o,String(I),T?.['body']]);return q['rows'][0x0];}if(X==='files'){const M=await k['query']('INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*',[o,String(I),T?.[y(0x111)],T?.['size']??null]);return M['rows'][0x0];}const L=d['relations']?.[X];if(!L?.['foreignKey']||!L[y(0x112)]&&!L['table'])throw new UnsupportedError(y(0x113)+X+'\x22\x20requires\x20a\x20project/provider\x20implementation');if(!T)throw new UnsupportedError('No\x20data\x20provided\x20for\x20relation:\x20'+T);if(!L[y(0x112)])throw new UnsupportedError('Relation\x20update\x20is\x20not\x20configured:\x20'+X);T[L['foreignKey']]=I;const h=await U({'name':L[y(0x112)],'data':T??{},'user':R});return h;};}function D(){const Z=['get','\x22\x20requires\x20a\x20capabilities\x20\x22','query','filePath','resource','Generic\x20Resource\x20relation\x20\x22'];D=function(){return Z;};return D();}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,writableData}from'../utils/sql.js';import{validateInputData}from'../utils/fields.js';function F(){const M=['push','No\x20writable\x20fields','map','join','RETURNING\x20*','rows','name'];F=function(){return M;};return F();}import{clearTableLookupCache}from'./add-table-lookup-data.js';function S(c,N){c=c-0x143;const H=F();let d=H[c];return d;}export function createCreate(c,N){return async function H({name:d,data:U,user:e},K){const T=S,m=N['get'](d);assertOperation(m,'create',e),validateInputData({'resource':m,'data':U});const D=writableData(m,U);m['fields']['created_at']&&D['push'](['created_at',new Date()]);m['fields']['created_by']&&D[T(0x143)](['created_by',e?.['id']]);if(!D['length'])throw new ValidationError(T(0x144));const W=D[T(0x145)](([x])=>qi(x)),p=D['map']((x,V)=>'$'+(V+0x1)),a=D['map'](([,x])=>x),I=K?.['pg']??c['pg'],r=await I['query']('INSERT\x20INTO\x20'+qt(m['table'])+'\x20('+W[T(0x146)](',\x20')+')\x20'+('VALUES\x20('+p['join'](',\x20')+')\x20')+T(0x147),a),w=r[T(0x148)][0x0];return clearTableLookupCache(m['table'],I),await(K?.['audit']??c['audit'])?.['write']({'userId':e?.['id'],'module':m['module'],'resource':m[T(0x149)],'resourceId':w[m['key']],'action':'create','fields':Object['keys'](U)}),w;};}
1
+ import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,writableData}from'../utils/sql.js';function D(){const b=['get','push','created_at','length','map','table','join','RETURNING\x20*','rows','audit','module','name','create'];D=function(){return b;};return D();}function u(i,n){i=i-0xa0;const U=D();let O=U[i];return O;}import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createCreate(i,n){return async function U({name:O,data:o,user:I},X){const Z=u,T=n[Z(0xa0)](O);assertOperation(T,'create',I),validateInputData({'resource':T,'data':o});const R=writableData(T,o);T['fields']['created_at']&&R[Z(0xa1)]([Z(0xa2),new Date()]);T['fields']['created_by']&&R['push'](['created_by',I?.['id']]);if(!R[Z(0xa3)])throw new ValidationError('No\x20writable\x20fields');const g=R['map'](([M])=>qi(M)),k=R[Z(0xa4)]((M,y)=>'$'+(y+0x1)),d=R['map'](([,M])=>M),L=X?.['pg']??i['pg'],h=await L['query']('INSERT\x20INTO\x20'+qt(T[Z(0xa5)])+'\x20('+g[Z(0xa6)](',\x20')+')\x20'+('VALUES\x20('+k['join'](',\x20')+')\x20')+Z(0xa7),d),q=h[Z(0xa8)][0x0];return clearTableLookupCache(T['table'],L),await(X?.[Z(0xa9)]??i['audit'])?.['write']({'userId':I?.['id'],'module':T[Z(0xaa)],'resource':T[Z(0xab)],'resourceId':q[T['key']],'action':Z(0xac),'fields':Object['keys'](o)}),q;};}
@@ -1 +1 @@
1
- import{UnsupportedError}from'../../../errors.js';import{createRemove}from'./delete.js';function F(){const x=['capabilities','Generic\x20Resource\x20relation\x20\x22','\x22\x20requires\x20a\x20capabilities\x20\x22','resource','foreignKey','\x22\x20requires\x20a\x20project/provider\x20implementation'];F=function(){return x;};return F();}function S(c,N){c=c-0x1d2;const H=F();let d=H[c];return d;}export function createDeleteRelation(c,N){const H=createRemove(c,N);return async function d({name:U,id:e,relation:K,relationId:m,user:D},W){const w=S,p=W?.['pg']??c['pg'],a=N['get'](U);if(['notes','files']['includes'](K)&&!a[w(0x1d2)]?.['includes'](K))throw new UnsupportedError(w(0x1d3)+K+w(0x1d4)+K+'\x22');if(K==='notes')return await p['query']('DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[m,U,String(e)]),{'success':!![]};if(K==='files')return await p['query']('DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[m,U,String(e)]),{'success':!![]};const I=a['relations']?.[K];if(!I?.[w(0x1d5)]||!I[w(0x1d6)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+K+w(0x1d7));const r=await H({'name':I['resource'],'id':m,'user':D,'where':{'column':I['foreignKey'],'value':e}},W);return{'success':r};};}
1
+ import{UnsupportedError}from'../../../errors.js';import{createRemove}from'./delete.js';function u(i,n){i=i-0x7d;const U=D();let O=U[i];return O;}function D(){const M=['get','files','\x22\x20requires\x20a\x20capabilities\x20\x22','notes','query','foreignKey'];D=function(){return M;};return D();}export function createDeleteRelation(i,n){const U=createRemove(i,n);return async function O({name:o,id:I,relation:X,relationId:T,user:R},g){const q=u,k=g?.['pg']??i['pg'],d=n[q(0x7d)](o);if(['notes',q(0x7e)]['includes'](X)&&!d['capabilities']?.['includes'](X))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+X+q(0x7f)+X+'\x22');if(X===q(0x80))return await k[q(0x81)]('DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[T,o,String(I)]),{'success':!![]};if(X===q(0x7e))return await k['query']('DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[T,o,String(I)]),{'success':!![]};const L=d['relations']?.[X];if(!L?.['resource']||!L[q(0x82)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+X+'\x22\x20requires\x20a\x20project/provider\x20implementation');const h=await U({'name':L['resource'],'id':T,'user':R,'where':{'column':L['foreignKey'],'value':I}},g);return{'success':h};};}
@@ -1 +1 @@
1
- import{assertOperation}from'../utils/permissions.js';function S(c,N){c=c-0x96;const H=F();let d=H[c];return d;}import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function F(){const w=['WHERE\x20','key','push','value','query','module','rowCount'];F=function(){return w;};return F();}export function createRemove(c,N){return async function H({name:d,id:U,user:e,where:K},m){const r=S,D=N['get'](d);assertOperation(D,'delete',e);const W=m?.['pg']??c['pg'],p=[U];let a=r(0x96)+qi(D[r(0x97)])+'\x20=\x20$1';K&&(p[r(0x98)](K[r(0x99)]),a+='\x20AND\x20'+qi(K['column'])+'\x20=\x20$'+p['length']);const I=await W[r(0x9a)]('DELETE\x20FROM\x20'+qt(D['table'])+'\x20'+a,p);if((I['rowCount']??0x0)>0x0)clearTableLookupCache(D['table'],W);if((I['rowCount']??0x0)>0x0)await(m?.['audit']??c['audit'])?.['write']({'module':D[r(0x9b)],'resource':D['name'],'resourceId':U,'action':'delete'});return(I[r(0x9c)]??0x0)>0x0;};}
1
+ import{assertOperation}from'../utils/permissions.js';function D(){const q=['push','rowCount','audit','write'];D=function(){return q;};return D();}import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function u(i,n){i=i-0x137;const U=D();let O=U[i];return O;}export function createRemove(i,n){return async function U({name:O,id:o,user:I,where:X},T){const h=u,R=n['get'](O);assertOperation(R,'delete',I);const g=T?.['pg']??i['pg'],k=[o];let d='WHERE\x20'+qi(R['key'])+'\x20=\x20$1';X&&(k[h(0x137)](X['value']),d+='\x20AND\x20'+qi(X['column'])+'\x20=\x20$'+k['length']);const L=await g['query']('DELETE\x20FROM\x20'+qt(R['table'])+'\x20'+d,k);if((L['rowCount']??0x0)>0x0)clearTableLookupCache(R['table'],g);if((L[h(0x138)]??0x0)>0x0)await(T?.[h(0x139)]??i[h(0x139)])?.[h(0x13a)]({'module':R['module'],'resource':R['name'],'resourceId':o,'action':'delete'});return(L['rowCount']??0x0)>0x0;};}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';function F(){const G=['get','fields','integer','joins','sql','query','SELECT\x20','join','\x20WHERE\x20','=$1\x20LIMIT\x201','file','include','relations','foreignKey','resource','key','\x20FROM\x20','\x20=\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20','table','dictionary','time','now'];F=function(){return G;};return F();}function S(c,N){c=c-0x89;const H=F();let d=H[c];return d;}import{qt,qi,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';export function createFindOne(c,N){return async function H({name:d,id:U,query:query={},user:e}){const Y=S,K=Date['now'](),m=N[Y(0x89)](d);assertOperation(m,'read',e);if(m[Y(0x8a)][m['key']]?.['type']===Y(0x8b)&&!Number['isInteger'](Number(U)))throw new ValidationError('Invalid\x20id:\x20'+U+'\x20name:'+d);const D=m[Y(0x8c)]?.['map'](I=>I[Y(0x8d)]+'\x20')['join']('\x20')||'',W=await c['pg'][Y(0x8e)](Y(0x8f)+readableFields(m)[Y(0x90)](',\x20')+'\x20FROM\x20'+qt(m['table'])+'\x20t\x20'+D+Y(0x91)+qi(m['key'])+Y(0x92),[U]),p=W['rows'][0x0];if(!p)return null;await addDictionaryLookupData([p],m['fields'],c['dictionary']),await addTableLookupData([p],m['fields'],c['pg']),addFileToken([p],m[Y(0x8a)],c[Y(0x93)]);const a=Array['isArray'](query[Y(0x94)])?query['include']:query['include']?.['split'](',')??[];for(const I of a){const r=m[Y(0x95)]?.[I];if(!r?.[Y(0x96)]||!r['resource']&&!r['table'])throw new ValidationError('Unknown\x20relation:\x20'+I);const w=r['resource']?N['get'](r[Y(0x97)]):undefined,x=r['table']??w['table'],V=w?.[Y(0x98)]??'id',T=w?readableFields(w)[Y(0x90)](',\x20'):'*',M='SELECT\x20'+T+Y(0x99)+qt(x)+Y(0x91)+qi(V)+Y(0x9a)+qi(r['foreignKey'])+'\x20FROM\x20'+qt(m[Y(0x9b)])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(m[Y(0x98)])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)',q=(await c['pg'][Y(0x8e)](M,[U]))['rows'];w&&(await addDictionaryLookupData(q,w[Y(0x8a)],c[Y(0x9c)]),await addTableLookupData(q,w['fields'],c['pg']),addFileToken(q,w['fields'],c['file'])),p[I]=q;}return p[Y(0x9d)]=Date[Y(0x9e)]()-K,p;};}
1
+ import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qt,qi,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';function u(i,n){i=i-0x18f;const U=D();let O=U[i];return O;}import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';function D(){const K=['read','key','integer','joins','sql','join','query','\x20WHERE\x20','fields','split','relations','resource','get','table','\x20FROM\x20','time'];D=function(){return K;};return D();}export function createFindOne(i,n){return async function U({name:O,id:o,query:query={},user:I}){const A=u,X=Date['now'](),T=n['get'](O);assertOperation(T,A(0x18f),I);if(T['fields'][T[A(0x190)]]?.['type']===A(0x191)&&!Number['isInteger'](Number(o)))throw new ValidationError('Invalid\x20id:\x20'+o+'\x20name:'+O);const R=T[A(0x192)]?.['map'](L=>L[A(0x193)]+'\x20')[A(0x194)]('\x20')||'',g=await i['pg'][A(0x195)]('SELECT\x20'+readableFields(T)['join'](',\x20')+'\x20FROM\x20'+qt(T['table'])+'\x20t\x20'+R+A(0x196)+qi(T['key'])+'=$1\x20LIMIT\x201',[o]),k=g['rows'][0x0];if(!k)return null;await addDictionaryLookupData([k],T['fields'],i['dictionary']),await addTableLookupData([k],T[A(0x197)],i['pg']),addFileToken([k],T['fields'],i['file']);const d=Array['isArray'](query['include'])?query['include']:query['include']?.[A(0x198)](',')??[];for(const L of d){const h=T[A(0x199)]?.[L];if(!h?.['foreignKey']||!h[A(0x19a)]&&!h['table'])throw new ValidationError('Unknown\x20relation:\x20'+L);const q=h[A(0x19a)]?n[A(0x19b)](h['resource']):undefined,M=h[A(0x19c)]??q['table'],y=q?.['key']??'id',Z=q?readableFields(q)[A(0x194)](',\x20'):'*',b='SELECT\x20'+Z+A(0x19d)+qt(M)+A(0x196)+qi(y)+'\x20=\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20'+qi(h['foreignKey'])+'\x20FROM\x20'+qt(T['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(T['key'])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)',c=(await i['pg']['query'](b,[o]))['rows'];q&&(await addDictionaryLookupData(c,q['fields'],i['dictionary']),await addTableLookupData(c,q['fields'],i['pg']),addFileToken(c,q['fields'],i['file'])),k[L]=c;}return k[A(0x19e)]=Date['now']()-X,k;};}