@opengis/fcore 0.0.27 → 0.0.29

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 (108) hide show
  1. package/LICENSE +3 -3
  2. package/README.md +71 -71
  3. package/dist/config.js +1 -1
  4. package/dist/context.js +1 -1
  5. package/dist/errors.js +1 -1
  6. package/dist/fastify.js +1 -1
  7. package/dist/fcore.js +1 -1
  8. package/dist/migrations/cli.js +1 -1
  9. package/dist/migrations/runner.js +1 -1
  10. package/dist/modules/auth/adduser-cli.js +1 -1
  11. package/dist/modules/auth/passwd-cli.js +1 -1
  12. package/dist/modules/auth/permission-cli.js +1 -1
  13. package/dist/modules/auth/route.js +1 -1
  14. package/dist/modules/auth/schema.js +1 -1
  15. package/dist/modules/auth/services/change-password.js +1 -1
  16. package/dist/modules/auth/services/get-current-user.js +1 -1
  17. package/dist/modules/auth/services/registration.js +1 -1
  18. package/dist/modules/auth/services/verify-two-factor.js +1 -1
  19. package/dist/modules/file/mime.js +1 -1
  20. package/dist/modules/file/route.js +1 -1
  21. package/dist/modules/file/schema.js +1 -1
  22. package/dist/modules/file/services/get-file.js +1 -1
  23. package/dist/modules/file/services/resize-file.js +1 -1
  24. package/dist/modules/file/services/upload-file.js +1 -1
  25. package/dist/modules/resource/route.js +1 -1
  26. package/dist/modules/resource/schema.js +1 -1
  27. package/dist/modules/resource/services/add-note.js +1 -1
  28. package/dist/modules/resource/services/add-resource-file.js +1 -1
  29. package/dist/modules/resource/services/create-resource-relation.js +1 -1
  30. package/dist/modules/resource/services/create-resource.js +1 -1
  31. package/dist/modules/resource/services/delete-resource-relation.js +1 -1
  32. package/dist/modules/resource/services/delete-resource.js +1 -1
  33. package/dist/modules/resource/services/export-resource.js +1 -1
  34. package/dist/modules/resource/services/generate-resource-code.js +1 -1
  35. package/dist/modules/resource/services/get-resource-schema.js +1 -1
  36. package/dist/modules/resource/services/get-resource.js +1 -1
  37. package/dist/modules/resource/services/list-resource-as-user.js +1 -1
  38. package/dist/modules/resource/services/list-resource-list.js +1 -1
  39. package/dist/modules/resource/services/list-resource-relation.js +1 -1
  40. package/dist/modules/resource/services/list-resources.js +1 -1
  41. package/dist/modules/resource/services/search-resource.js +1 -1
  42. package/dist/modules/resource/services/suggest-resource.js +1 -1
  43. package/dist/modules/resource/services/update-resource-relation.js +1 -1
  44. package/dist/modules/resource/services/update-resource.js +1 -1
  45. package/dist/modules/resource/services/upload-resource-file.js +1 -1
  46. package/dist/modules/system/route.js +1 -1
  47. package/dist/modules/system/schema.js +1 -1
  48. package/dist/modules/system/services/check-system.js +1 -1
  49. package/dist/modules/system/services/get-access.js +1 -1
  50. package/dist/modules/system/services/get-api-list.js +1 -1
  51. package/dist/modules/system/services/get-audit-log.js +1 -1
  52. package/dist/modules/system/services/get-dictionary.js +1 -1
  53. package/dist/modules/system/services/get-resource-access.js +1 -1
  54. package/dist/modules/system/services/get-resource-scopes.js +1 -1
  55. package/dist/modules/system/services/get-system-log.js +1 -1
  56. package/dist/modules/system/services/get-system-settings.js +1 -1
  57. package/dist/modules/system/services/list-dictionaries.js +1 -1
  58. package/dist/modules/system/services/set-access.js +1 -1
  59. package/dist/modules/system/services/set-resource-access.js +1 -1
  60. package/dist/modules/system/services/set-resource-scopes.js +1 -1
  61. package/dist/modules/system/services/update-dictionary.js +1 -1
  62. package/dist/modules/system/services/update-system-settings.js +1 -1
  63. package/dist/modules/utils/require-admin.js +1 -1
  64. package/dist/modules/utils/safe-user.js +1 -1
  65. package/dist/modules/utils/unsupported.js +1 -1
  66. package/dist/plugins/audit/audit.js +1 -1
  67. package/dist/plugins/audit/services/write-audit.js +1 -1
  68. package/dist/plugins/auth/get-user-permissions.js +1 -1
  69. package/dist/plugins/auth/index.js +1 -1
  70. package/dist/plugins/auth/verifyUser.js +1 -1
  71. package/dist/plugins/dictionary.js +1 -1
  72. package/dist/plugins/file.js +1 -1
  73. package/dist/plugins/jwt.js +1 -1
  74. package/dist/plugins/logger/index.js +1 -1
  75. package/dist/plugins/logger/transport.js +1 -1
  76. package/dist/plugins/pg.js +1 -1
  77. package/dist/plugins/redis.js +1 -1
  78. package/dist/plugins/resource/resource.js +1 -1
  79. package/dist/plugins/resource/resource.registry.js +1 -1
  80. package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
  81. package/dist/plugins/resource/services/add-file-token.js +1 -1
  82. package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
  83. package/dist/plugins/resource/services/create-relation.d.ts.map +1 -1
  84. package/dist/plugins/resource/services/create-relation.js +1 -1
  85. package/dist/plugins/resource/services/create.js +1 -1
  86. package/dist/plugins/resource/services/delete-relation.d.ts.map +1 -1
  87. package/dist/plugins/resource/services/delete-relation.js +1 -1
  88. package/dist/plugins/resource/services/delete.js +1 -1
  89. package/dist/plugins/resource/services/find-one.js +1 -1
  90. package/dist/plugins/resource/services/find-relation.js +1 -1
  91. package/dist/plugins/resource/services/find.js +1 -1
  92. package/dist/plugins/resource/services/get-table-columns.js +1 -1
  93. package/dist/plugins/resource/services/update-relation.js +1 -1
  94. package/dist/plugins/resource/services/update.js +1 -1
  95. package/dist/plugins/resource/utils/auto-index.js +1 -1
  96. package/dist/plugins/resource/utils/fields.js +1 -1
  97. package/dist/plugins/resource/utils/filters.js +1 -1
  98. package/dist/plugins/resource/utils/permissions.js +1 -1
  99. package/dist/plugins/resource/utils/scope.js +1 -1
  100. package/dist/plugins/resource/utils/sort.js +1 -1
  101. package/dist/plugins/resource/utils/sql.js +1 -1
  102. package/dist/plugins/resource/utils/summary.js +1 -1
  103. package/dist/shared/getIP.js +1 -1
  104. package/migrations/20260903130000_move_notes_files_to_admin.sql +17 -17
  105. package/migrations/20260903140000_settings_nulls_not_distinct.sql +18 -18
  106. package/migrations/20260905120000_add_user_foreign_keys.sql +15 -0
  107. package/migrations/20260929120000_allow_user_only_role_scopes.sql +1 -1
  108. package/package.json +92 -92
@@ -1 +1 @@
1
- function C(P,G){P=P-0x11c;const j=m();let Z=j[P];return Z;}function m(){const E=['add','has','role_id','connect','query','users','length','INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(resource,\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$4)','resource','roles','INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(resource,\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$4)','release'];m=function(){return E;};return m();}import{ValidationError}from'../../../errors.js';import{getResourceAccess}from'./get-resource-access.js';export async function setResourceAccess(P,G){const b=C;if(P['users']===undefined&&P['roles']===undefined)throw new ValidationError('At\x20least\x20one\x20of\x20users\x20or\x20roles\x20must\x20be\x20provided');const j=new Set();for(const p of P['users']??[]){if(j['has'](p['uid']))throw new ValidationError('Duplicate\x20user\x20in\x20access\x20list:\x20'+p['uid']);j[b(0x11c)](p['uid']);}const Z=new Set();for(const X of P['roles']??[]){if(Z[b(0x11d)](X[b(0x11e)]))throw new ValidationError('Duplicate\x20role\x20in\x20access\x20list:\x20'+X['role_id']);Z[b(0x11c)](X['role_id']);}const q=await G['pg'][b(0x11f)]();try{await q['query']('BEGIN');if(P['users']!==undefined){await q[b(0x120)]('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20resource\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NOT\x20NULL\x20AND\x20role_id\x20IS\x20NULL',[P['resource']]);for(const F of P[b(0x121)]){if(F['actions'][b(0x122)]===0x0)continue;await q['query'](b(0x123),[P[b(0x124)],F['actions'],F['uid'],P['user']['id']]);}}if(P[b(0x125)]!==undefined){await q['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20resource\x20=\x20$1\x20AND\x20role_id\x20IS\x20NOT\x20NULL\x20AND\x20user_uid\x20IS\x20NULL',[P['resource']]);for(const A of P[b(0x125)]){if(A['actions'][b(0x122)]===0x0)continue;await q[b(0x120)](b(0x126),[P['resource'],A['actions'],A[b(0x11e)],P['user']['id']]);}}await q['query']('COMMIT');}catch(H){await q['query']('ROLLBACK');throw H;}finally{q[b(0x127)]();}return getResourceAccess({'resource':P['resource']},G);}
1
+ import{ValidationError}from'../../../errors.js';function c(S,Z){S=S-0xb2;const h=O();let U=h[S];return U;}import{getResourceAccess}from'./get-resource-access.js';function O(){const o=['users','roles','At\x20least\x20one\x20of\x20users\x20or\x20roles\x20must\x20be\x20provided','Duplicate\x20user\x20in\x20access\x20list:\x20','role_id','query','resource','length','uid','user','COMMIT'];O=function(){return o;};return O();}export async function setResourceAccess(S,Z){const N=c;if(S[N(0xb2)]===undefined&&S[N(0xb3)]===undefined)throw new ValidationError(N(0xb4));const h=new Set();for(const u of S['users']??[]){if(h['has'](u['uid']))throw new ValidationError(N(0xb5)+u['uid']);h['add'](u['uid']);}const U=new Set();for(const e of S['roles']??[]){if(U['has'](e[N(0xb6)]))throw new ValidationError('Duplicate\x20role\x20in\x20access\x20list:\x20'+e[N(0xb6)]);U['add'](e['role_id']);}const D=await Z['pg']['connect']();try{await D[N(0xb7)]('BEGIN');if(S['users']!==undefined){await D['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20resource\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NOT\x20NULL\x20AND\x20role_id\x20IS\x20NULL',[S[N(0xb8)]]);for(const q of S['users']){if(q['actions'][N(0xb9)]===0x0)continue;await D[N(0xb7)]('INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(resource,\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$4)',[S[N(0xb8)],q['actions'],q[N(0xba)],S[N(0xbb)]['id']]);}}if(S['roles']!==undefined){await D[N(0xb7)]('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20resource\x20=\x20$1\x20AND\x20role_id\x20IS\x20NOT\x20NULL\x20AND\x20user_uid\x20IS\x20NULL',[S[N(0xb8)]]);for(const x of S['roles']){if(x['actions'][N(0xb9)]===0x0)continue;await D[N(0xb7)]('INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(resource,\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$4)',[S['resource'],x['actions'],x['role_id'],S['user']['id']]);}}await D[N(0xb7)](N(0xbc));}catch(n){await D['query']('ROLLBACK');throw n;}finally{D['release']();}return getResourceAccess({'resource':S['resource']},Z);}
@@ -1 +1 @@
1
- function m(){const F=['At\x20least\x20one\x20scope\x20must\x20be\x20provided','query','resource','role_id','entries','scopes','user_id','release'];m=function(){return F;};return m();}function C(P,G){P=P-0xd1;const j=m();let Z=j[P];return Z;}import{ValidationError}from'../../../errors.js';import{clearResourceScopeCache}from'../../../plugins/resource/utils/scope.js';import{getResourceScopes}from'./get-resource-scopes.js';export async function setResourceScopes(P,G){const X=C;if(Boolean(P['user_id'])===Boolean(P['role_id']))throw new ValidationError('Provide\x20exactly\x20one\x20of\x20user_id\x20or\x20role_id');if(Object['keys'](P['scopes'])['length']===0x0)throw new ValidationError(X(0xd1));const j=await G['pg']['connect']();try{await j[X(0xd2)]('BEGIN'),await j[X(0xd2)]('DELETE\x20FROM\x20admin.role_access_scope\x0a\x20\x20\x20\x20\x20\x20\x20WHERE\x20resource\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20role_id\x20IS\x20NOT\x20DISTINCT\x20FROM\x20$2\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20user_id\x20IS\x20NOT\x20DISTINCT\x20FROM\x20$3',[P[X(0xd3)],P[X(0xd4)]??null,P['user_id']??null]);for(const [Z,q]of Object[X(0xd5)](P[X(0xd6)])){await j[X(0xd2)]('INSERT\x20INTO\x20admin.role_access_scope\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(resource,\x20role_id,\x20user_id,\x20scope,\x20value,\x20enabled,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5::jsonb,\x20TRUE,\x20$6,\x20$6)',[P[X(0xd3)],P['role_id']??null,P[X(0xd7)]??null,Z,JSON['stringify'](q),P['user']['id']]);}await j['query']('COMMIT');}catch(p){await j['query']('ROLLBACK');throw p;}finally{j[X(0xd8)]();}return clearResourceScopeCache(),getResourceScopes({'resource':P['resource']},G);}
1
+ function O(){const q=['user_id','Provide\x20exactly\x20one\x20of\x20user_id\x20or\x20role_id','keys','scopes','At\x20least\x20one\x20scope\x20must\x20be\x20provided','query','DELETE\x20FROM\x20admin.role_access_scope\x0a\x20\x20\x20\x20\x20\x20\x20WHERE\x20resource\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20role_id\x20IS\x20NOT\x20DISTINCT\x20FROM\x20$2\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20user_id\x20IS\x20NOT\x20DISTINCT\x20FROM\x20$3','entries','INSERT\x20INTO\x20admin.role_access_scope\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(resource,\x20role_id,\x20user_id,\x20scope,\x20value,\x20enabled,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5::jsonb,\x20TRUE,\x20$6,\x20$6)','user','release'];O=function(){return q;};return O();}import{ValidationError}from'../../../errors.js';import{clearResourceScopeCache}from'../../../plugins/resource/utils/scope.js';import{getResourceScopes}from'./get-resource-scopes.js';function c(S,Z){S=S-0x18e;const h=O();let U=h[S];return U;}export async function setResourceScopes(S,Z){const e=c;if(Boolean(S[e(0x18e)])===Boolean(S['role_id']))throw new ValidationError(e(0x18f));if(Object[e(0x190)](S[e(0x191)])['length']===0x0)throw new ValidationError(e(0x192));const h=await Z['pg']['connect']();try{await h[e(0x193)]('BEGIN'),await h[e(0x193)](e(0x194),[S['resource'],S['role_id']??null,S['user_id']??null]);for(const [U,D]of Object[e(0x195)](S['scopes'])){await h['query'](e(0x196),[S['resource'],S['role_id']??null,S['user_id']??null,U,JSON['stringify'](D),S[e(0x197)]['id']]);}await h['query']('COMMIT');}catch(u){await h['query']('ROLLBACK');throw u;}finally{h[e(0x198)]();}return clearResourceScopeCache(),getResourceScopes({'resource':S['resource']},Z);}
@@ -1 +1 @@
1
- export async function updateDictionary(P,G){return await G['dictionary']['put'](P['name'],P['items']),{'success':!![]};}
1
+ function c(S,Z){S=S-0x1df;var h=O();var U=h[S];return U;}function O(){var U=['put','items'];O=function(){return U;};return O();}export async function updateDictionary(S,Z){var h=c;return await Z['dictionary'][h(0x1df)](S['name'],S[h(0x1e0)]),{'success':!![]};}
@@ -1 +1 @@
1
- function C(P,G){P=P-0x1d4;const j=m();let Z=j[P];return Z;}import{ValidationError}from'../../../errors.js';function m(){const p=['keys','entries','patch','Invalid\x20setting\x20key:\x20','stringify','user'];m=function(){return p;};return m();}export async function updateSystemSettings(P,G){const q=C;if(!Object[q(0x1d4)](P['patch'])['length'])throw new ValidationError('Settings\x20patch\x20is\x20empty');for(const [j,Z]of Object[q(0x1d5)](P[q(0x1d6)])){if(!j['trim']()||j['includes']('..'))throw new ValidationError(q(0x1d7)+j);await G['pg']['query']('\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',[j,JSON[q(0x1d8)](Z),P[q(0x1d9)]['id']]);}return{'success':!![]};}
1
+ function c(S,Z){S=S-0x8a;const h=O();let U=h[S];return U;}import{ValidationError}from'../../../errors.js';export async function updateSystemSettings(S,Z){const D=c;if(!Object['keys'](S['patch'])['length'])throw new ValidationError('Settings\x20patch\x20is\x20empty');for(const [h,U]of Object[D(0x8a)](S['patch'])){if(!h[D(0x8b)]()||h[D(0x8c)]('..'))throw new ValidationError(D(0x8d)+h);await Z['pg'][D(0x8e)]('\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',[h,JSON[D(0x8f)](U),S['user']['id']]);}return{'success':!![]};}function O(){const u=['entries','trim','includes','Invalid\x20setting\x20key:\x20','query','stringify'];O=function(){return u;};return O();}
@@ -1 +1 @@
1
- function m(){var Z=['User\x20required','Admin\x20access\x20required','includes'];m=function(){return Z;};return m();}import{ForbiddenError}from'../../errors.js';function C(P,G){P=P-0x1a6;var j=m();var Z=j[P];return Z;}export function requireAdmin(P,G){var j=C;if(!P)throw new ForbiddenError(j(0x1a6));if(P['type']!=='admin')throw new ForbiddenError(j(0x1a7));if(P['type']!=='admin'&&G&&!P['permissions']?.[j(0x1a8)](G))throw new ForbiddenError('Missing\x20permission:\x20'+G);}
1
+ import{ForbiddenError}from'../../errors.js';function O(){var U=['type','includes','Missing\x20permission:\x20'];O=function(){return U;};return O();}function c(S,Z){S=S-0xc6;var h=O();var U=h[S];return U;}export function requireAdmin(S,Z){var h=c;if(!S)throw new ForbiddenError('User\x20required');if(S['type']!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(S[h(0xc6)]!=='admin'&&Z&&!S['permissions']?.[h(0xc7)](Z))throw new ForbiddenError(h(0xc8)+Z);}
@@ -1 +1 @@
1
- function m(){const p=['entries','filter'];m=function(){return p;};return m();}function C(P,G){P=P-0x96;const j=m();let Z=j[P];return Z;}export const safeUser=P=>{const q=C,G=['password','salt','secret','credentials'];return Object['fromEntries'](Object[q(0x96)](P)[q(0x97)](([j])=>!G['some'](Z=>j['toLowerCase']()['includes'](Z))));};
1
+ function c(S,Z){S=S-0x19c;const h=O();let U=h[S];return U;}function O(){const u=['salt','some','includes'];O=function(){return u;};return O();}export const safeUser=S=>{const D=c,Z=['password',D(0x19c),'secret','credentials'];return Object['fromEntries'](Object['entries'](S)['filter'](([h])=>!Z[D(0x19d)](U=>h['toLowerCase']()[D(0x19e)](U))));};
@@ -1 +1 @@
1
- import{UnsupportedError}from'../../errors.js';export function unsupported(P){throw new UnsupportedError(P+'\x20requires\x20a\x20project/provider\x20implementation');}
1
+ import{UnsupportedError}from'../../errors.js';export function unsupported(S){throw new UnsupportedError(S+'\x20requires\x20a\x20project/provider\x20implementation');}
@@ -1 +1 @@
1
- import{writeAudit}from'./services/write-audit.js';export function createAudit(P){const G=writeAudit(P);return{'write':G};}
1
+ import{writeAudit}from'./services/write-audit.js';export function createAudit(S){const Z=writeAudit(S);return{'write':Z};}
@@ -1 +1 @@
1
- const secretPattern=/password|token|secret|credential|salt/i;function clean(P){const H=C;if(Array['isArray'](P))return P['map'](clean);if(P&&typeof P===H(0xc2))return Object[H(0xc3)](Object['entries'](P)['map'](([G,j])=>[G,secretPattern[H(0xc4)](G)?H(0xc5):clean(j)]));return P;}export function writeAudit(P){let G,j;async function Z(){const b=C;if(!P['pg'])return![];if(G!==undefined)return G;return j??=P['pg'][b(0xc6)]('\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'](q=>{const E=b,p=new Set(q['rows']['map'](X=>X[E(0xc7)]));return G=p[E(0xc8)]('audit_log')&&p['has']('audit_log_data'),!G&&P['logger']['warn']({'expectedTables':[E(0xc9),'admin.audit_log_data'],'foundTables':[...p]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),G;})['catch'](q=>{const z=b;return G=![],P['logger'][z(0xca)]({'err':q},z(0xcb)),![];}),j;}return async function q(p){const x=C;if(!await Z())return P[x(0xcc)]['info']({'auditFallback':!![],'event':clean({...p,'changes':p[x(0xcd)]?.['map'](A=>({...A,'oldValue':clean(A['oldValue']),'newValue':clean(A['newValue'])}))})},'audit'),0x0;if(!P['pg'])throw new Error('empty\x20pg');const X=await P['pg'][x(0xc6)]('\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',[p[x(0xce)]??null,p['module'],p['resource'],p['resourceId']==null?null:String(p[x(0xcf)]),p[x(0xd0)]??null,p[x(0xd1)],p['requestId']??null,p['ipAddress']??null,clean(p['metadata']??{})]),F=X['rows'][0x0]['id'];for(const A of p['changes']??[]){if(secretPattern[x(0xc4)](A['field']))continue;await P['pg'][x(0xc6)]('\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',[F,A['field'],JSON['stringify'](clean(A['oldValue'])),JSON['stringify'](clean(A['newValue']))]);}return F;};}function C(P,G){P=P-0xc2;const j=m();let Z=j[P];return Z;}function m(){const o=['object','fromEntries','test','[REDACTED]','query','table_name','has','admin.audit_log','warn','Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled','logger','changes','userId','resourceId','fields','action'];m=function(){return o;};return m();}
1
+ function c(S,Z){S=S-0x131;const h=O();let U=h[S];return U;}const secretPattern=/password|token|secret|credential|salt/i;function clean(S){const n=c;if(Array['isArray'](S))return S[n(0x131)](clean);if(S&&typeof S==='object')return Object['fromEntries'](Object['entries'](S)[n(0x131)](([Z,h])=>[Z,secretPattern['test'](Z)?n(0x132):clean(h)]));return S;}function O(){const i=['map','[REDACTED]','query','then','audit_log_data','admin.audit_log','admin.audit_log_data','warn','Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled','info','changes','\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','userId','module','resource','action','requestId','rows','\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','stringify'];O=function(){return i;};return O();}export function writeAudit(S){let Z,h;async function U(){const N=c;if(!S['pg'])return![];if(Z!==undefined)return Z;return h??=S['pg'][N(0x133)]('\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')[N(0x134)](D=>{const o=N,u=new Set(D['rows']['map'](e=>e['table_name']));return Z=u['has']('audit_log')&&u['has'](o(0x135)),!Z&&S['logger']['warn']({'expectedTables':[o(0x136),o(0x137)],'foundTables':[...u]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),Z;})['catch'](D=>{const j=N;return Z=![],S['logger'][j(0x138)]({'err':D},j(0x139)),![];}),h;}return async function D(u){const X=c;if(!await U())return S['logger'][X(0x13a)]({'auditFallback':!![],'event':clean({...u,'changes':u[X(0x13b)]?.['map'](x=>({...x,'oldValue':clean(x['oldValue']),'newValue':clean(x['newValue'])}))})},'audit'),0x0;if(!S['pg'])throw new Error('empty\x20pg');const e=await S['pg']['query'](X(0x13c),[u[X(0x13d)]??null,u[X(0x13e)],u[X(0x13f)],u['resourceId']==null?null:String(u['resourceId']),u['fields']??null,u[X(0x140)],u[X(0x141)]??null,u['ipAddress']??null,clean(u['metadata']??{})]),q=e[X(0x142)][0x0]['id'];for(const x of u['changes']??[]){if(secretPattern['test'](x['field']))continue;await S['pg'][X(0x133)](X(0x143),[q,x['field'],JSON['stringify'](clean(x['oldValue'])),JSON[X(0x144)](clean(x['newValue']))]);}return q;};}
@@ -1 +1 @@
1
- export async function getUserPermissions(P,G){const q=C,j=await G['pg']['query']('\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',[P]);return j[q(0x1a7)]['map'](Z=>Z['permission']);}function C(P,G){P=P-0x1a7;const j=m();let Z=j[P];return Z;}function m(){const p=['rows'];m=function(){return p;};return m();}
1
+ export async function getUserPermissions(S,Z){const D=c,h=await Z['pg']['query'](D(0x161),[S]);return h[D(0x162)]['map'](U=>U['permission']);}function c(S,Z){S=S-0x161;const h=O();let U=h[S];return U;}function O(){const u=['\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','rows'];O=function(){return u;};return O();}
@@ -1 +1 @@
1
- export*from'./auth.types.js';import{randomBytes,scrypt as P,timingSafeEqual}from'node:crypto';function m(){const L=['path','.json','fileFor','parse','code','utf8','catch','hex','test','cookieName','storagePath','register','secret','initialize','permissions'];m=function(){return L;};return m();}import{mkdir,readFile,unlink,writeFile}from'node:fs/promises';import{join,resolve}from'node:path';import{promisify}from'node:util';const scrypt=promisify(P);import G from'@fastify/cookie';import j from'@fastify/session';import{Authenticator}from'@fastify/passport';import Z from'fastify-session-redis-store';import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();class FileSessionStore{['path'];constructor(q){const z=C;this['path']=q,void mkdir(this[z(0x146)],{'recursive':!![]});}['fileFor'](q){const x=C;return join(this['path'],q+x(0x147));}async['get'](q,p){const o=C;try{const X=await readFile(this[o(0x148)](q),'utf8');p(null,JSON[o(0x149)](X));}catch(F){const A=F;if(A[o(0x14a)]==='ENOENT'){p(null,undefined);return;}p(A,undefined);}}async['set'](q,p,X){const i=C;try{await mkdir(this[i(0x146)],{'recursive':!![]}),await writeFile(this['fileFor'](q),JSON['stringify'](p),i(0x14b)),X();}catch(F){X(F);}}async['destroy'](q,p){const y=C;try{await unlink(this[y(0x148)](q))[y(0x14c)](X=>{if(X['code']!=='ENOENT')throw X;}),p();}catch(X){p(X);}}}function C(P,G){P=P-0x146;const j=m();let Z=j[P];return Z;}export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(q){const T=C,p=randomBytes(0x10),X=await scrypt(q,p,0x40);return'scrypt$'+p['toString']('hex')+'$'+X['toString'](T(0x14d));}export async function verifyPassword(q,p){const [X,F,A]=p?.['split']('$')||[];if(X!=='scrypt'||!F||!A)return![];const H=Buffer['from'](F,'hex'),b=Buffer['from'](A,'hex'),E=await scrypt(q,H,b['length']);return timingSafeEqual(E,b);}export async function createSessionStore(q,p){const D=C,{config:X,redis:F}=p;if(!X){console['warn']('Missing\x20config\x20-\x20skipping\x20session\x20store\x20creation');return;}if(process.env.NODE_ENV===D(0x14e)||process.env.VITEST)return;await q['register'](G,{'parseOptions':X['auth']['cookieOptions']});const A=X['redis']['host']?new Z({'prefix':X['auth'][D(0x14f)]+':'+(X['pg']?.['database']||'db')+':','client':F}):new FileSessionStore(resolve(X[D(0x150)]??'./storage','sessions'));await q[D(0x151)](j,{'secret':X['auth'][D(0x152)],'cookieName':X['auth']['cookieName'],'cookie':X['auth']['cookieOptions'],'store':A}),await q[D(0x151)](fastifyPassport[D(0x153)]()),await q[D(0x151)](fastifyPassport['secureSession']()),fastifyPassport['registerUserSerializer'](async H=>({'user':H})),fastifyPassport['registerUserDeserializer'](async H=>{const h=D,b=H?.['user']||H;return b?.['id']&&(b[h(0x154)]=await getUserPermissions(b['id'],p)),b;});}
1
+ function O(){const E=['path','get','fileFor','destroy','code','toString','split','from','register','storagePath','auth','cookieName','cookieOptions','registerUserDeserializer'];O=function(){return E;};return O();}function c(S,Z){S=S-0x185;const h=O();let U=h[S];return U;}const X=c;export*from'./auth.types.js';import{randomBytes,scrypt as S,timingSafeEqual}from'node:crypto';import{mkdir,readFile,unlink,writeFile}from'node:fs/promises';import{join,resolve}from'node:path';import{promisify}from'node:util';const scrypt=promisify(S);import Z from'@fastify/cookie';import h from'@fastify/session';import{Authenticator}from'@fastify/passport';import U from'fastify-session-redis-store';import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();class FileSessionStore{['path'];constructor(D){const j=c;this['path']=D,void mkdir(this[j(0x185)],{'recursive':!![]});}['fileFor'](D){return join(this['path'],D+'.json');}async[X(0x186)](D,u){try{const e=await readFile(this['fileFor'](D),'utf8');u(null,JSON['parse'](e));}catch(q){const x=q;if(x['code']==='ENOENT'){u(null,undefined);return;}u(x,undefined);}}async['set'](D,u,e){const i=X;try{await mkdir(this['path'],{'recursive':!![]}),await writeFile(this[i(0x187)](D),JSON['stringify'](u),'utf8'),e();}catch(q){e(q);}}async[X(0x188)](D,u){try{await unlink(this['fileFor'](D))['catch'](e=>{const l=c;if(e[l(0x189)]!=='ENOENT')throw e;}),u();}catch(e){u(e);}}}export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(D){const b=X,u=randomBytes(0x10),e=await scrypt(D,u,0x40);return'scrypt$'+u[b(0x18a)]('hex')+'$'+e['toString']('hex');}export async function verifyPassword(D,u){const Y=X,[e,q,x]=u?.[Y(0x18b)]('$')||[];if(e!=='scrypt'||!q||!x)return![];const n=Buffer[Y(0x18c)](q,'hex'),N=Buffer[Y(0x18c)](x,'hex'),o=await scrypt(D,n,N['length']);return timingSafeEqual(o,N);}export async function createSessionStore(D,u){const r=X,{config:e,redis:q}=u;if(!e){console['warn']('Missing\x20config\x20-\x20skipping\x20session\x20store\x20creation');return;}if(process.env.NODE_ENV==='test'||process.env.VITEST)return;await D[r(0x18d)](Z,{'parseOptions':e['auth']['cookieOptions']});const x=e['redis']['host']?new U({'prefix':e['auth']['cookieName']+':'+(e['pg']?.['database']||'db')+':','client':q}):new FileSessionStore(resolve(e[r(0x18e)]??'./storage','sessions'));await D['register'](h,{'secret':e[r(0x18f)]['secret'],'cookieName':e[r(0x18f)][r(0x190)],'cookie':e['auth'][r(0x191)],'store':x}),await D['register'](fastifyPassport['initialize']()),await D['register'](fastifyPassport['secureSession']()),fastifyPassport['registerUserSerializer'](async n=>({'user':n})),fastifyPassport[r(0x192)](async n=>{const N=n?.['user']||n;return N?.['id']&&(N['permissions']=await getUserPermissions(N['id'],u)),N;});}
@@ -1 +1 @@
1
- import{BadRequestError}from'../../errors.js';function C(P,G){P=P-0x144;const j=m();let Z=j[P];return Z;}import{verifyPassword}from'./index.js';export async function verifyUser({user:P,password:G,ip:j},{pg:Z,logger:q}){const b=C;if(!P||P==='')throw new BadRequestError('not\x20enough\x20params:\x20user');if(!G||G==='')throw new BadRequestError('not\x20enough\x20params:\x20password');q[b(0x144)](b(0x145));const p='select\x20uid\x20as\x20id,\x20user_type\x20as\x20type,\x20password_hash,\x20twofa,\x20first_name,\x20middle_name,last_name,email,phone,avatar,last_activity_date\x20from\x20admin.users\x20where\x20$1\x20in\x20(login,email,phone)\x20and\x20enabled\x20limit\x201',X=await Z['query'](p,[P])['then'](A=>A['rows']?.[0x0]);if(!X){const A='user\x20not\x20found';q['info']({'file':'auth/warn','error':A,'user':P,'ip':j});throw new BadRequestError(A);}const F=await verifyPassword(G,X['password_hash']);if(!F){const H=b(0x146);q['info']({'file':b(0x147),'error':H,'user':P,'ip':j});throw new BadRequestError(H);}return Z['query']('update\x20admin.users\x20set\x20last_activity_date\x20=\x20now()\x20where\x20uid\x20=\x20$1',[X['id']]),delete X['password_hash'],X;}function m(){const E=['metrics','user.login','Wrong\x20password','auth/warn'];m=function(){return E;};return m();}
1
+ import{BadRequestError}from'../../errors.js';function O(){const o=['rows','user\x20not\x20found','info','query'];O=function(){return o;};return O();}function c(S,Z){S=S-0x10e;const h=O();let U=h[S];return U;}import{verifyPassword}from'./index.js';export async function verifyUser({user:S,password:Z,ip:h},{pg:U,logger:D}){const N=c;if(!S||S==='')throw new BadRequestError('not\x20enough\x20params:\x20user');if(!Z||Z==='')throw new BadRequestError('not\x20enough\x20params:\x20password');D['metrics']('user.login');const u='select\x20uid\x20as\x20id,\x20user_type\x20as\x20type,\x20password_hash,\x20twofa,\x20first_name,\x20middle_name,last_name,email,phone,avatar,last_activity_date\x20from\x20admin.users\x20where\x20$1\x20in\x20(login,email,phone)\x20and\x20enabled\x20limit\x201',e=await U['query'](u,[S])['then'](x=>x[N(0x10e)]?.[0x0]);if(!e){const x=N(0x10f);D[N(0x110)]({'file':'auth/warn','error':x,'user':S,'ip':h});throw new BadRequestError(x);}const q=await verifyPassword(Z,e['password_hash']);if(!q){const n='Wrong\x20password';D['info']({'file':'auth/warn','error':n,'user':S,'ip':h});throw new BadRequestError(n);}return U[N(0x111)]('update\x20admin.users\x20set\x20last_activity_date\x20=\x20now()\x20where\x20uid\x20=\x20$1',[e['id']]),delete e['password_hash'],e;}
@@ -1 +1 @@
1
- function C(P,G){P=P-0x1ee;const j=m();let Z=j[P];return Z;}import{ConflictError,NotFoundError,ValidationError}from'../errors.js';const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;function m(){const Q=['empty\x20pg','dictionaries','Invalid\x20dictionary\x20name:\x20','Invalid\x20dictionary\x20items:\x20','query','rows','set','items','Dictionary\x20items\x20must\x20be\x20an\x20array','Dictionary\x20table\x20not\x20found','\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','fcore','custom','DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1','\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','code','parentId','COMMIT','ROLLBACK','static','get','\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','push'];m=function(){return Q;};return m();}export function createDictionary({pg:P,dictionaries:dictionaries=[]}){const G=new Map(),j=new Map();let Z,q;async function p(){const N=C;if(Z!==undefined)return Z;if(!P)throw new Error(N(0x1ee));return q??=P['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'](o=>{const a=N,i=o['rows'][0x0]?.['table_name'];Z=i===a(0x1ef)?i:null;}),await q,Z;}function X(o){const n=C;if(!dictionaryName['test'](o))throw new ValidationError(n(0x1f0)+o);}function F(o){const f=C;for(const i of Array['isArray'](o)?o:[o]){X(i['code']);if(!Array['isArray'](i['items']))throw new ValidationError(f(0x1f1)+i['code']);if(G['has'](i['code']))throw new ConflictError('Dictionary\x20already\x20registered:\x20'+i['code']);G['set'](i['code'],{...i,'source':'static'});}}function A(o){return G['has'](o);}async function H(o){const I=C;X(o);const i=G['get'](o);if(i&&i['checked'])return i['items'];const y=await p();if(!y)throw new NotFoundError('Dictionary\x20table\x20not\x20found');const T=await P?.[I(0x1f2)]('\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',[o]);if(T?.['rows']?.['length']){const D=T?.[I(0x1f3)];return G[I(0x1f4)](o,{'code':o,'name':o,'items':D,'source':'database','checked':!![]}),D;}if(!i?.[I(0x1f5)])throw new NotFoundError('Dictionary\x20not\x20found:\x20'+o);return i['checked']=!![],i['items'];}async function b(o,i){const k=C;X(o);if(!Array['isArray'](i))throw new ValidationError(k(0x1f6));const y=await p();if(!y)throw new NotFoundError(k(0x1f7));if(!P)throw new Error('empty\x20pg');const T=await P['connect']();try{await T['query']('BEGIN');const D=await T['query'](k(0x1f8),[o,o,k(0x1f9),k(0x1fa),!![]]),h=D[k(0x1f3)][0x0]['id'];await T['query'](k(0x1fb),[h]);for(const L of i){await T[k(0x1f2)](k(0x1fc),[h,L[k(0x1fd)],L['name'],L[k(0x1fe)]??null]);}await T[k(0x1f2)](k(0x1ff));}catch(O){await T['query'](k(0x200));throw O;}finally{T['release']();}G[k(0x1f4)](o,{'items':i,'code':o,'source':k(0x201),'checked':!![]}),j[k(0x1f4)](o,(j['get'](o)??0x0)+0x1);}function E(o){return X(o),j['set'](o,(j['get'](o)??0x0)+0x1),G['delete'](o);}function z(o){const M=C;return j[M(0x202)](o)??0x0;}async function x(){const l=C,o=[...G['values']()]['map'](({code:T,name:D,source:h})=>({'code':T,'name':D??T,'source':h})),i=await p();if(!i)return o;if(!P)throw new Error('empty\x20pg');const y=await P['query'](l(0x203));for(const T of y['rows']){!G['has'](T[l(0x1fd)])&&o[l(0x204)](T);}return o;}return F(dictionaries),{'register':F,'get':H,'put':b,'clear':E,'revision':z,'list':x,'has':A};}
1
+ function O(){const F=['test','has','Dictionary\x20already\x20registered:\x20','code','set','Dictionary\x20table\x20not\x20found','\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','database','checked','isArray','Dictionary\x20items\x20must\x20be\x20an\x20array','empty\x20pg','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','DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1','name','static','get','delete','values','map'];O=function(){return F;};return O();}import{ConflictError,NotFoundError,ValidationError}from'../errors.js';function c(S,Z){S=S-0x113;const h=O();let U=h[S];return U;}const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;export function createDictionary({pg:S,dictionaries:dictionaries=[]}){const Z=new Map(),h=new Map();let U,D;async function u(){if(U!==undefined)return U;if(!S)throw new Error('empty\x20pg');return D??=S['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'](i=>{const l=i['rows'][0x0]?.['table_name'];U=l==='dictionaries'?l:null;}),await D,U;}function e(i){const k=c;if(!dictionaryName[k(0x113)](i))throw new ValidationError('Invalid\x20dictionary\x20name:\x20'+i);}function q(i){const I=c;for(const l of Array['isArray'](i)?i:[i]){e(l['code']);if(!Array['isArray'](l['items']))throw new ValidationError('Invalid\x20dictionary\x20items:\x20'+l['code']);if(Z[I(0x114)](l['code']))throw new ConflictError(I(0x115)+l[I(0x116)]);Z[I(0x117)](l['code'],{...l,'source':'static'});}}function x(i){const B=c;return Z[B(0x114)](i);}async function n(i){const M=c;e(i);const l=Z['get'](i);if(l&&l['checked'])return l['items'];const b=await u();if(!b)throw new NotFoundError(M(0x118));const Y=await S?.['query'](M(0x119),[i]);if(Y?.['rows']?.['length']){const r=Y?.['rows'];return Z[M(0x117)](i,{'code':i,'name':i,'items':r,'source':M(0x11a),'checked':!![]}),r;}if(!l?.['items'])throw new NotFoundError('Dictionary\x20not\x20found:\x20'+i);return l[M(0x11b)]=!![],l['items'];}async function N(i,l){const g=c;e(i);if(!Array[g(0x11c)](l))throw new ValidationError(g(0x11d));const b=await u();if(!b)throw new NotFoundError('Dictionary\x20table\x20not\x20found');if(!S)throw new Error(g(0x11e));const Y=await S['connect']();try{await Y[g(0x11f)]('BEGIN');const r=await Y[g(0x11f)](g(0x120),[i,i,'fcore','custom',!![]]),E=r['rows'][0x0]['id'];await Y['query'](g(0x121),[E]);for(const L of l){await Y[g(0x11f)]('\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',[E,L['code'],L[g(0x122)],L['parentId']??null]);}await Y[g(0x11f)]('COMMIT');}catch(V){await Y['query']('ROLLBACK');throw V;}finally{Y['release']();}Z[g(0x117)](i,{'items':l,'code':i,'source':g(0x123),'checked':!![]}),h[g(0x117)](i,(h[g(0x124)](i)??0x0)+0x1);}function o(i){const d=c;return e(i),h[d(0x117)](i,(h['get'](i)??0x0)+0x1),Z[d(0x125)](i);}function j(i){return h['get'](i)??0x0;}async function X(){const J=c,i=[...Z[J(0x126)]()][J(0x127)](({code:Y,name:r,source:E})=>({'code':Y,'name':r??Y,'source':E})),l=await u();if(!l)return i;if(!S)throw new Error(J(0x11e));const b=await S['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 Y of b['rows']){!Z['has'](Y['code'])&&i['push'](Y);}return i;}return q(dictionaries),{'register':q,'get':n,'put':N,'clear':o,'revision':j,'list':X,'has':x};}
@@ -1 +1 @@
1
- function C(P,G){P=P-0xf5;const j=m();let Z=j[P];return Z;}import P from'node:fs/promises';import G from'node:path';import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';import j from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function normalizeRelativePath(Z){const y=C;if(!Z||Z[y(0xf5)]('/')||Z['includes']('..'))throw new ValidationError('Invalid\x20file\x20path');return Z['replace'](/\\/g,'/')[y(0xf6)](/^\/+/,'');}function keyFor(Z,q){const T=C;return''+((Z??'')['replace'](/^\/+|\/+$/g,'')?(Z??'')[T(0xf6)](/^\/+|\/+$/g,'')+'/':'')+normalizeRelativePath(q);}async function bodyToBuffer(Z){const D=C;if(!Z)return Buffer[D(0xf7)](0x0);const q=Z;if(typeof q['transformToByteArray']===D(0xf8))return Buffer['from'](await q['transformToByteArray']());const p=[];for await(const X of Z){p['push'](Buffer['from'](X));}return Buffer['concat'](p);}function m(){const R=['startsWith','replace','alloc','function','storagePath','randomBytes','toString','files','join','resolve','mkdir','writeFile','rename','ENOENT','split','sha256','update','from','timingSafeEqual','base64url','region','send','bucket','name','tokenTtl','digest','Invalid\x20file\x20token','createHmac','length','utf8'];m=function(){return R;};return m();}export function createFileLocal(Z){const h=C,q=G['resolve'](Z[h(0xf9)]||'./storage'),p=G['join'](q,'removed'),X=Z['tokenSecret']??process.env.FILE_TOKEN_SECRET??j[h(0xfa)](0x20)[h(0xfb)]('hex'),F=b=>{const L=h,E=normalizeRelativePath(b),z=(Z['folder']??L(0xfc))[L(0xf6)](/^\/+|\/+$/g,'');return z?G[L(0xfd)](z,E):E;},A=b=>{const E=F(b),z=G['resolve'](q,E),x=G['relative'](q,z);if(x['startsWith']('..')||G['isAbsolute'](x))throw new ValidationError('Invalid\x20file\x20path');return z;},H=b=>{const O=h,E=F(b),z=G[O(0xfe)](p,E),x=G['relative'](p,z);if(x['startsWith']('..')||G['isAbsolute'](x))throw new ValidationError('Invalid\x20file\x20path');return z;};return{async 'put'(b,E){const N=h,z=A(b);await P[N(0xff)](G['dirname'](z),{'recursive':!![]}),await P[N(0x100)](z,E instanceof Buffer?E:await bodyToBuffer(E));},async 'get'(b){return P['readFile'](A(b));},async 'exists'(b){try{return await P['access'](A(b)),!![];}catch{return![];}},async 'delete'(b){const a=h,E=A(b),z=H(b);try{await P['mkdir'](G['dirname'](z),{'recursive':!![]}),await P[a(0x101)](E,z);}catch(x){const o=x;if(o['code']!==a(0x102))throw x;}},'create'(b,E=Z['tokenTtl']??0xe10){const z=Buffer['from'](b)['toString']('base64url'),x=j['createHmac']('sha256',X)['update'](z)['digest']('base64url');return z+'.'+x;},'verify'(b){const n=h,[E,z]=b[n(0x103)]('.');if(!E||!z)throw new UnauthorizedError('Invalid\x20file\x20token');const x=j['createHmac'](n(0x104),X)[n(0x105)](E)['digest'](),o=Buffer[n(0x106)](z,'base64url');if(x['length']!==o['length']||!j[n(0x107)](x,o))throw new UnauthorizedError('Invalid\x20file\x20token');const i=Buffer['from'](E,n(0x108))['toString']('utf8');return i;}};}export function createFileS3(Z){const f=C,q=Z['tokenSecret']??process.env.FILE_TOKEN_SECRET??j['randomBytes'](0x20)[f(0xfb)]('hex'),p=new S3Client({'endpoint':Z['endpoint'],'region':Z[f(0x109)]??'us-east-1','forcePathStyle':Z['forcePathStyle']??!![],'credentials':Z['accessKeyId']||Z['accessKey']?{'accessKeyId':Z['accessKeyId']??Z['accessKey'],'secretAccessKey':Z['secretAccessKey']??Z['secretKey']}:undefined}),X=F=>keyFor(Z['folder'],F);return{async 'put'(F,A){const I=f;await p[I(0x10a)](new PutObjectCommand({'Bucket':Z[I(0x10b)],'Key':X(F),'Body':A}));},async 'get'(F){const A=await p['send'](new GetObjectCommand({'Bucket':Z['bucket'],'Key':X(F)}));return bodyToBuffer(A['Body']);},async 'exists'(F){const k=f;try{return await p['send'](new HeadObjectCommand({'Bucket':Z['bucket'],'Key':X(F)})),!![];}catch(A){const H=A;if(H['$metadata']?.['httpStatusCode']===0x194||H[k(0x10c)]==='NotFound')return![];throw A;}},async 'delete'(F){const M=f;await p[M(0x10a)](new DeleteObjectCommand({'Bucket':Z[M(0x10b)],'Key':X(F)}));},'create'(F,A=Z[f(0x10d)]??0xe10){const l=f,H=Buffer['from'](F)['toString'](l(0x108)),b=j['createHmac']('sha256',q)[l(0x105)](H)[l(0x10e)]('base64url');return H+'.'+b;},'verify'(F){const Q=f,[A,H]=F['split']('.');if(!A||!H)throw new UnauthorizedError(Q(0x10f));const b=j[Q(0x110)]('sha256',q)['update'](A)['digest'](),E=Buffer['from'](H,Q(0x108));if(b[Q(0x111)]!==E[Q(0x111)]||!j[Q(0x107)](b,E))throw new UnauthorizedError('Invalid\x20file\x20token');const z=Buffer['from'](A,'base64url')['toString'](Q(0x112));return z;}};}
1
+ import S from'node:fs/promises';function O(){const T=['replace','alloc','from','randomBytes','relative','Invalid\x20file\x20path','readFile','dirname','rename','code','tokenTtl','toString','base64url','createHmac','split','update','digest','length','timingSafeEqual','region','accessKey','accessKeyId','send','bucket','sha256'];O=function(){return T;};return O();}import Z from'node:path';import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';import h from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function normalizeRelativePath(U){const b=c;if(!U||U['startsWith']('/')||U['includes']('..'))throw new ValidationError('Invalid\x20file\x20path');return U[b(0x1a5)](/\\/g,'/')['replace'](/^\/+/,'');}function keyFor(U,D){const Y=c;return''+((U??'')[Y(0x1a5)](/^\/+|\/+$/g,'')?(U??'')[Y(0x1a5)](/^\/+|\/+$/g,'')+'/':'')+normalizeRelativePath(D);}async function bodyToBuffer(U){const r=c;if(!U)return Buffer[r(0x1a6)](0x0);const D=U;if(typeof D['transformToByteArray']==='function')return Buffer[r(0x1a7)](await D['transformToByteArray']());const u=[];for await(const e of U){u['push'](Buffer['from'](e));}return Buffer['concat'](u);}function c(S,Z){S=S-0x1a5;const h=O();let U=h[S];return U;}export function createFileLocal(U){const E=c,D=Z['resolve'](U['storagePath']||'./storage'),u=Z['join'](D,'removed'),e=U['tokenSecret']??process.env.FILE_TOKEN_SECRET??h[E(0x1a8)](0x20)['toString']('hex'),q=N=>{const L=E,o=normalizeRelativePath(N),j=(U['folder']??'files')[L(0x1a5)](/^\/+|\/+$/g,'');return j?Z['join'](j,o):o;},x=N=>{const V=E,o=q(N),j=Z['resolve'](D,o),X=Z[V(0x1a9)](D,j);if(X['startsWith']('..')||Z['isAbsolute'](X))throw new ValidationError(V(0x1aa));return j;},n=N=>{const o=q(N),j=Z['resolve'](u,o),X=Z['relative'](u,j);if(X['startsWith']('..')||Z['isAbsolute'](X))throw new ValidationError('Invalid\x20file\x20path');return j;};return{async 'put'(N,o){const j=x(N);await S['mkdir'](Z['dirname'](j),{'recursive':!![]}),await S['writeFile'](j,o instanceof Buffer?o:await bodyToBuffer(o));},async 'get'(N){const k=E;return S[k(0x1ab)](x(N));},async 'exists'(N){try{return await S['access'](x(N)),!![];}catch{return![];}},async 'delete'(N){const I=E,o=x(N),j=n(N);try{await S['mkdir'](Z[I(0x1ac)](j),{'recursive':!![]}),await S[I(0x1ad)](o,j);}catch(X){const i=X;if(i[I(0x1ae)]!=='ENOENT')throw X;}},'create'(N,o=U[E(0x1af)]??0xe10){const B=E,j=Buffer['from'](N)[B(0x1b0)](B(0x1b1)),X=h[B(0x1b2)]('sha256',e)['update'](j)['digest']('base64url');return j+'.'+X;},'verify'(N){const M=E,[o,j]=N[M(0x1b3)]('.');if(!o||!j)throw new UnauthorizedError('Invalid\x20file\x20token');const X=h['createHmac']('sha256',e)[M(0x1b4)](o)[M(0x1b5)](),i=Buffer['from'](j,'base64url');if(X[M(0x1b6)]!==i['length']||!h[M(0x1b7)](X,i))throw new UnauthorizedError('Invalid\x20file\x20token');const l=Buffer['from'](o,M(0x1b1))['toString']('utf8');return l;}};}export function createFileS3(U){const g=c,D=U['tokenSecret']??process.env.FILE_TOKEN_SECRET??h[g(0x1a8)](0x20)['toString']('hex'),u=new S3Client({'endpoint':U['endpoint'],'region':U[g(0x1b8)]??'us-east-1','forcePathStyle':U['forcePathStyle']??!![],'credentials':U['accessKeyId']||U[g(0x1b9)]?{'accessKeyId':U[g(0x1ba)]??U['accessKey'],'secretAccessKey':U['secretAccessKey']??U['secretKey']}:undefined}),e=q=>keyFor(U['folder'],q);return{async 'put'(q,x){const d=g;await u[d(0x1bb)](new PutObjectCommand({'Bucket':U[d(0x1bc)],'Key':e(q),'Body':x}));},async 'get'(q){const J=g,x=await u['send'](new GetObjectCommand({'Bucket':U[J(0x1bc)],'Key':e(q)}));return bodyToBuffer(x['Body']);},async 'exists'(q){try{return await u['send'](new HeadObjectCommand({'Bucket':U['bucket'],'Key':e(q)})),!![];}catch(x){const n=x;if(n['$metadata']?.['httpStatusCode']===0x194||n['name']==='NotFound')return![];throw x;}},async 'delete'(q){await u['send'](new DeleteObjectCommand({'Bucket':U['bucket'],'Key':e(q)}));},'create'(q,x=U[g(0x1af)]??0xe10){const F=g,n=Buffer['from'](q)['toString']('base64url'),N=h['createHmac'](F(0x1bd),D)['update'](n)[F(0x1b5)]('base64url');return n+'.'+N;},'verify'(q){const G=g,[x,n]=q['split']('.');if(!x||!n)throw new UnauthorizedError('Invalid\x20file\x20token');const N=h['createHmac']('sha256',D)['update'](x)[G(0x1b5)](),o=Buffer['from'](n,'base64url');if(N['length']!==o['length']||!h['timingSafeEqual'](N,o))throw new UnauthorizedError('Invalid\x20file\x20token');const j=Buffer[G(0x1a7)](x,'base64url')['toString']('utf8');return j;}};}
@@ -1 +1 @@
1
- const p=C;import{SignJWT,jwtVerify}from'jose';const secret=new TextEncoder()[p(0x1f4)](process.env.AUTH_JWT_SECRET);function m(){const H=['encode','HS256','message'];m=function(){return H;};return m();}export async function jwtSignToken(P){const X=p;if(!process.env.AUTH_JWT_SECRET)return;const {id:G,type:j,permissions:Z}=P,q=await new SignJWT({'id':G,'type':j,'permissions':Z})['setProtectedHeader']({'alg':X(0x1f5)})['setIssuedAt']()['setExpirationTime']('1h')['sign'](secret);return q;}function C(P,G){P=P-0x1f4;const j=m();let Z=j[P];return Z;}export async function jwtVerifyToken(P){const F=p,G=await jwtVerify(P,secret,{'algorithms':[F(0x1f5)]})['catch'](j=>{const A=F;console['log'](j[A(0x1f6)]);});return G?.['payload'];}
1
+ function c(S,Z){S=S-0x7d;const h=O();let U=h[S];return U;}import{SignJWT,jwtVerify}from'jose';const secret=new TextEncoder()['encode'](process.env.AUTH_JWT_SECRET);export async function jwtSignToken(S){const u=c;if(!process.env.AUTH_JWT_SECRET)return;const {id:Z,type:h,permissions:U}=S,D=await new SignJWT({'id':Z,'type':h,'permissions':U})['setProtectedHeader']({'alg':'HS256'})[u(0x7d)]()['setExpirationTime']('1h')[u(0x7e)](secret);return D;}function O(){const x=['setIssuedAt','sign','catch','log','message'];O=function(){return x;};return O();}export async function jwtVerifyToken(S){const e=c,Z=await jwtVerify(S,secret,{'algorithms':['HS256']})[e(0x7f)](h=>{const q=e;console[q(0x80)](h[q(0x81)]);});return Z?.['payload'];}
@@ -1 +1 @@
1
- function m(){const A=['./transport.js','info','token','[REDACTED]'];m=function(){return A;};return m();}import P from'pino';function C(P,G){P=P-0x1d2;const j=m();let Z=j[P];return Z;}export function createLogger(){const F=C,G=P['transport']({'target':F(0x1d2)}),j=P({'level':F(0x1d3),'timestamp':P['stdTimeFunctions']['isoTime'],'base':{'service':'app'},'redact':{'paths':['req.headers.authorization','password',F(0x1d4),'accessToken','refreshToken'],'censor':F(0x1d5)}},G),Z={};function q(p,X){if(p===undefined)return{...Z};Z[p]=(Z[p]??0x0)+(X??0x1);}return Object['assign'](j,{'close':async()=>G['end'](),'metrics':q,'file':()=>j['info']['bind'](j)});}
1
+ import S from'pino';function O(){const x=['req.headers.authorization','password','refreshToken'];O=function(){return x;};return O();}function c(S,Z){S=S-0x163;const h=O();let U=h[S];return U;}export function createLogger(){const q=c,Z=S['transport']({'target':'./transport.js'}),h=S({'level':'info','timestamp':S['stdTimeFunctions']['isoTime'],'base':{'service':'app'},'redact':{'paths':[q(0x163),q(0x164),'token','accessToken',q(0x165)],'censor':'[REDACTED]'}},Z),U={};function D(u,e){if(u===undefined)return{...U};U[u]=(U[u]??0x0)+(e??0x1);}return Object['assign'](h,{'close':async()=>Z['end'](),'metrics':D,'file':()=>h['info']['bind'](h)});}
@@ -1 +1 @@
1
- const F=C;import P from'node:fs';function m(){const E=['warn','error','toISOString','createWriteStream','get'];m=function(){return E;};return m();}import G from'node:path';import j from'pino-abstract-transport';const LEVELS={0x1e:'info',0x28:F(0x162),0x32:F(0x163),0x3c:'error'},streams=new Map();function getDate(){const A=F;return new Date()[A(0x164)]()['slice'](0x0,0xa);}function createStream(Z,q){const H=F,p=G['resolve']('logs',Z);return P['mkdirSync'](p,{'recursive':!![]}),P[H(0x165)](G['join'](p,q+'.log'),{'flags':'a'});}function getStream(Z){const b=F,q=getDate(),p=streams[b(0x166)](Z);if(p&&p['date']===q)return p['stream'];p?.['stream']['end']();const X=createStream(Z,q);return streams['set'](Z,{'date':q,'stream':X}),X;}function closeStreams(){for(const {stream:Z}of streams['values']()){Z['end']();}streams['clear']();}export default async function loggerTransport(){return j(writeLogs,{'close':async()=>{closeStreams();}});}function C(P,G){P=P-0x162;const j=m();let Z=j[P];return Z;}async function writeLogs(Z){for await(const q of Z){const p=LEVELS[q['level']];if(!p)continue;const X=getStream(q['file']||p);delete q['file'],X['write'](JSON['stringify'](q)+'\x0a');}}
1
+ const q=c;import S from'node:fs';import Z from'node:path';import h from'pino-abstract-transport';const LEVELS={0x1e:'info',0x28:'warn',0x32:q(0x82),0x3c:'error'},streams=new Map();function c(S,Z){S=S-0x82;const h=O();let U=h[S];return U;}function getDate(){return new Date()['toISOString']()['slice'](0x0,0xa);}function createStream(U,D){const x=q,u=Z['resolve']('logs',U);return S[x(0x83)](u,{'recursive':!![]}),S['createWriteStream'](Z[x(0x84)](u,D+x(0x85)),{'flags':'a'});}function O(){const j=['error','mkdirSync','join','.log','stream','set','values','file'];O=function(){return j;};return O();}function getStream(U){const n=q,D=getDate(),u=streams['get'](U);if(u&&u['date']===D)return u[n(0x86)];u?.['stream']['end']();const e=createStream(U,D);return streams[n(0x87)](U,{'date':D,'stream':e}),e;}function closeStreams(){const N=q;for(const {stream:U}of streams[N(0x88)]()){U['end']();}streams['clear']();}export default async function loggerTransport(){return h(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(U){const o=q;for await(const D of U){const u=LEVELS[D['level']];if(!u)continue;const e=getStream(D['file']||u);delete D[o(0x89)],e['write'](JSON['stringify'](D)+'\x0a');}}
@@ -1 +1 @@
1
- import P from'pg';function m(){const i=['bind','captureStackTrace','catch','callerStack','query','COMMIT'];m=function(){return i;};return m();}const {Pool}=P;function C(P,G){P=P-0x18a;const j=m();let Z=j[P];return Z;}export function createDatabase(G){const E=C,j=new Pool(G),Z=j['query'][E(0x18a)](j);function q(p,X){const z=E,F=new Error();return Error[z(0x18b)]?.(F,q),Z(p,X)[z(0x18c)](A=>{const x=z,H=A;H['sql']=p,H[x(0x18d)]=F['stack'];throw H;});}return j[E(0x18e)]=q,j['transaction']=async function(p){const o=E,X=new Error();Error['captureStackTrace']?.(X,j['transaction']);const F=await j['connect']();try{await F[o(0x18e)]('BEGIN');const A=await p(F);return await F['query'](o(0x18f)),A;}catch(H){await F[o(0x18e)]('ROLLBACK');const b=H;b['callerStack']=X['stack'];throw b;}finally{F['release']();}},j;}
1
+ import S from'pg';function O(){const i=['catch','stack','BEGIN','COMMIT','query','ROLLBACK'];O=function(){return i;};return O();}const {Pool}=S;function c(S,Z){S=S-0x176;const h=O();let U=h[S];return U;}export function createDatabase(Z){const h=new Pool(Z),U=h['query']['bind'](h);function D(u,e){const o=c,q=new Error();return Error['captureStackTrace']?.(q,D),U(u,e)[o(0x176)](x=>{const j=o,n=x;n['sql']=u,n['callerStack']=q[j(0x177)];throw n;});}return h['query']=D,h['transaction']=async function(u){const X=c,e=new Error();Error['captureStackTrace']?.(e,h['transaction']);const q=await h['connect']();try{await q['query'](X(0x178));const x=await u(q);return await q['query'](X(0x179)),x;}catch(n){await q[X(0x17a)](X(0x17b));const N=n;N['callerStack']=e[X(0x177)];throw N;}finally{q['release']();}},h;}
@@ -1 +1 @@
1
- function m(){const F=['log','Creating\x20Redis\x20client\x20with\x20config:','del','quit','hincrby'];m=function(){return F;};return m();}function C(P,G){P=P-0xc4;const j=m();let Z=j[P];return Z;}import{Redis}from'ioredis';export function createRedis(P){const X=C;console[X(0xc4)](X(0xc5),P);const G=new Redis(P);return{'get':j=>G['get'](j),'set':(j,Z,q,p)=>{if(p)return G['set'](j,Z,'EX',p);if(typeof q==='number')return G['set'](j,Z,'EX',q);return G['set'](j,Z);},'del':j=>G[X(0xc6)](j),'delete':j=>G['del'](j),'close':()=>G[X(0xc7)](),'ping':()=>G['ping'](),'hincrby':(j,Z,q)=>G[X(0xc8)](j,Z,q),'incrby':(j,Z)=>G['incrby'](j,Z)};}
1
+ import{Redis}from'ioredis';function O(){const q=['set'];O=function(){return q;};return O();}function c(S,Z){S=S-0x1a1;const h=O();let U=h[S];return U;}export function createRedis(S){console['log']('Creating\x20Redis\x20client\x20with\x20config:',S);const Z=new Redis(S);return{'get':h=>Z['get'](h),'set':(h,U,D,u)=>{const e=c;if(u)return Z['set'](h,U,'EX',u);if(typeof D==='number')return Z[e(0x1a1)](h,U,'EX',D);return Z[e(0x1a1)](h,U);},'del':h=>Z['del'](h),'delete':h=>Z['del'](h),'close':()=>Z['quit'](),'ping':()=>Z['ping'](),'hincrby':(h,U,D)=>Z['hincrby'](h,U,D),'incrby':(h,U)=>Z['incrby'](h,U)};}
@@ -1 +1 @@
1
- import{ResourceRegistry}from'./resource.registry.js';function C(P,G){P=P-0x1a3;const j=m();let Z=j[P];return Z;}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 m(){const z=['bind'];m=function(){return z;};return m();}import{createDeleteRelation}from'./services/delete-relation.js';import{createUpdateRelation}from'./services/update-relation.js';export function createResource(P){const E=C,G=new ResourceRegistry(),j=createFind(P,G),Z=createFindOne(P,G),q=createCreate(P,G),p=createUpdate(P,G),X=createRemove(P,G),F=createFindRelation(P,G),A=createCreateRelation(P,G),H=createUpdateRelation(P,G),b=createDeleteRelation(P,G);return{'register':G['register']['bind'](G),'unregister':G['unregister']['bind'](G),'has':G['has']['bind'](G),'get':G['get']['bind'](G),'list':G['list'][E(0x1a3)](G),'find':j,'findOne':Z,'create':q,'update':p,'delete':X,'findRelation':F,'createRelation':A,'updateRelation':H,'deleteRelation':b};}
1
+ import{ResourceRegistry}from'./resource.registry.js';function c(S,Z){S=S-0x16e;const h=O();let U=h[S];return U;}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';function O(){const j=['register','bind'];O=function(){return j;};return O();}import{createFindRelation}from'./services/find-relation.js';import{createCreateRelation}from'./services/create-relation.js';import{createDeleteRelation}from'./services/delete-relation.js';import{createUpdateRelation}from'./services/update-relation.js';export function createResource(S){const o=c,Z=new ResourceRegistry(),h=createFind(S,Z),U=createFindOne(S,Z),D=createCreate(S,Z),u=createUpdate(S,Z),e=createRemove(S,Z),q=createFindRelation(S,Z),x=createCreateRelation(S,Z),n=createUpdateRelation(S,Z),N=createDeleteRelation(S,Z);return{'register':Z[o(0x16e)]['bind'](Z),'unregister':Z['unregister']['bind'](Z),'has':Z['has']['bind'](Z),'get':Z['get'][o(0x16f)](Z),'list':Z['list'][o(0x16f)](Z),'find':h,'findOne':U,'create':D,'update':u,'delete':e,'findRelation':q,'createRelation':x,'updateRelation':n,'deleteRelation':N};}
@@ -1 +1 @@
1
- import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';const ident=/^[a-zA-Z0-9_-]*$/;function C(P,G){P=P-0x10f;const j=m();let Z=j[P];return Z;}function validQualified(P){const Z=C;return P[Z(0x10f)]('.')['length']<=0x2&&P['split']('.')['every'](G=>ident['test'](G));}export class ResourceRegistry{['resources']=new Map();['unregister'](P){const q=C;this[q(0x110)]['delete'](P);}['register'](P,G=![]){const p=C;for(const j of Array['isArray'](P)?P:[P]){this[p(0x111)](j);if(this['resources'][p(0x112)](j['name'])&&!G)throw new ConflictError('Resource\x20already\x20registered:\x20'+j[p(0x113)]);this['resources'][p(0x114)](j[p(0x113)],j);}}['has'](P){return this['resources']['has'](P);}['get'](P){const G=this['resources']['get'](P);if(!G)throw new NotFoundError('Resource\x20not\x20registered:\x20'+P);return G;}['list'](){return[...this['resources']['values']()];}['validate'](P){const X=C;if(P['version']!==0x1||!ident[X(0x115)](P[X(0x113)])||!validQualified(P['table'])||!ident['test'](P[X(0x116)]))throw new ValidationError('Invalid\x20resource\x20contract:\x20'+P[X(0x113)]);for(const [G,j]of Object[X(0x117)](P[X(0x118)])){if(!ident['test'](G)||!ident['test'](j['column']??G))throw new ValidationError(X(0x119)+G);}}}function m(){const F=['split','resources','validate','has','name','set','test','key','entries','fields','Invalid\x20resource\x20field:\x20'];m=function(){return F;};return m();}
1
+ import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';function c(S,Z){S=S-0x95;const h=O();let U=h[S];return U;}const ident=/^[a-zA-Z0-9_-]*$/;function validQualified(S){const U=c;return S['split']('.')[U(0x95)]<=0x2&&S['split']('.')['every'](Z=>ident['test'](Z));}function O(){const n=['length','resources','delete','Resource\x20already\x20registered:\x20','name','get','version','Invalid\x20resource\x20contract:\x20','test'];O=function(){return n;};return O();}export class ResourceRegistry{['resources']=new Map();['unregister'](S){const D=c;this[D(0x96)][D(0x97)](S);}['register'](S,Z=![]){const u=c;for(const h of Array['isArray'](S)?S:[S]){this['validate'](h);if(this['resources']['has'](h['name'])&&!Z)throw new ConflictError(u(0x98)+h[u(0x99)]);this[u(0x96)]['set'](h['name'],h);}}['has'](S){const e=c;return this[e(0x96)]['has'](S);}['get'](S){const q=c,Z=this['resources'][q(0x9a)](S);if(!Z)throw new NotFoundError('Resource\x20not\x20registered:\x20'+S);return Z;}['list'](){return[...this['resources']['values']()];}['validate'](S){const x=c;if(S[x(0x9b)]!==0x1||!ident['test'](S['name'])||!validQualified(S['table'])||!ident['test'](S['key']))throw new ValidationError(x(0x9c)+S['name']);for(const [Z,h]of Object['entries'](S['fields'])){if(!ident[x(0x9d)](Z)||!ident['test'](h['column']??Z))throw new ValidationError('Invalid\x20resource\x20field:\x20'+Z);}}}
@@ -1 +1 @@
1
- function m(){const i=['filter','get','revision','set','text','color','icon','length','flatMap','dictionary','map'];m=function(){return i;};return m();}const dictionaryIndexesCache=new WeakMap(),dictionaryRevisionsCache=new WeakMap();async function getDictionaryIndexes(P,G){const E=C,j=dictionaryIndexesCache['get'](G)??new Map(),Z=dictionaryRevisionsCache['get'](G)??new Map();dictionaryIndexesCache['set'](G,j),dictionaryRevisionsCache['set'](G,Z);const q=P[E(0x1f3)](X=>Z[E(0x1f4)](X)!==G[E(0x1f5)](X));if(q['length']===0x0)return j;const p=await Promise['all'](q['map'](async X=>{const z=E;if(!G['has'](X))return[X,new Map()];const F=await G['get'](X),A=new Map();for(const H of F){const b=H['code']??H['id'];if(b==null)continue;A[z(0x1f6)](String(b),{'id':b,'text':H['name']??H[z(0x1f7)],...H['color']!==undefined?{'color':H[z(0x1f8)]}:{},...H[z(0x1f9)]!==undefined?{'icon':H['icon']}:{}});}return[X,A];}));for(const [X,F]of p){j['set'](X,F),Z[E(0x1f6)](X,G['revision'](X));}return j;}function C(P,G){P=P-0x1f3;const j=m();let Z=j[P];return Z;}export async function addDictionaryLookupData(P,G,j){const x=C;if(!j||P[x(0x1fa)]===0x0)return P;const Z=Object['entries'](G)[x(0x1fb)](([p,X])=>{const o=x,F=X[o(0x1fc)];return F?[{'field':p,'dictionaryName':F}]:[];});if(Z['length']===0x0)return P;const q=await getDictionaryIndexes([...new Set(Z[x(0x1fd)](({dictionaryName:p})=>p))],j);for(const p of P){for(const {field:X,dictionaryName:F}of Z){const A=p[X];p[X+'_data']=A==null?null:q['get'](F)?.[x(0x1f4)](String(A))??null;}}return P;}
1
+ const dictionaryIndexesCache=new WeakMap(),dictionaryRevisionsCache=new WeakMap();async function getDictionaryIndexes(S,Z){const o=c,h=dictionaryIndexesCache['get'](Z)??new Map(),U=dictionaryRevisionsCache['get'](Z)??new Map();dictionaryIndexesCache[o(0x7d)](Z,h),dictionaryRevisionsCache[o(0x7d)](Z,U);const D=S['filter'](e=>U['get'](e)!==Z[o(0x7e)](e));if(D[o(0x7f)]===0x0)return h;const u=await Promise[o(0x80)](D['map'](async e=>{const j=o;if(!Z['has'](e))return[e,new Map()];const q=await Z[j(0x81)](e),x=new Map();for(const n of q){const N=n[j(0x82)]??n['id'];if(N==null)continue;x['set'](String(N),{'id':N,'text':n['name']??n['text'],...n['color']!==undefined?{'color':n[j(0x83)]}:{},...n['icon']!==undefined?{'icon':n['icon']}:{}});}return[e,x];}));for(const [e,q]of u){h['set'](e,q),U['set'](e,Z['revision'](e));}return h;}export async function addDictionaryLookupData(S,Z,h){const i=c;if(!h||S['length']===0x0)return S;const U=Object['entries'](Z)['flatMap'](([u,e])=>{const X=c,q=e[X(0x84)];return q?[{'field':u,'dictionaryName':q}]:[];});if(U['length']===0x0)return S;const D=await getDictionaryIndexes([...new Set(U['map'](({dictionaryName:u})=>u))],h);for(const u of S){for(const {field:e,dictionaryName:q}of U){const x=u[e];u[e+'_data']=x==null?null:D['get'](q)?.[i(0x81)](String(x))??null;}}return S;}function c(S,Z){S=S-0x7d;const h=O();let U=h[S];return U;}function O(){const l=['set','revision','length','all','get','code','color','dictionary'];O=function(){return l;};return O();}
@@ -1 +1 @@
1
- function m(){const A=['file','string'];m=function(){return A;};return m();}function C(P,G){P=P-0x155;const j=m();let Z=j[P];return Z;}export function addFileToken(P,G,j){const F=C;if(!j||P['length']===0x0)return P;const Z=Object['entries'](G)['filter'](([,q])=>q['type']===F(0x155))['map'](([q])=>q);for(const q of P){for(const p of Z){const X=q[p];typeof X===F(0x156)&&X['length']>0x0&&(q[p]=j['create'](X));}}return P;}
1
+ function O(){const x=['length'];O=function(){return x;};return O();}function c(S,Z){S=S-0x1b4;const h=O();let U=h[S];return U;}export function addFileToken(S,Z,h){const q=c;if(!h||S[q(0x1b4)]===0x0)return S;const U=Object['entries'](Z)['filter'](([,D])=>D['type']==='file')['map'](([D])=>D);for(const D of S){for(const u of U){const e=D[u];typeof e==='string'&&e['length']>0x0&&(D[u]=h['create'](e));}}return S;}
@@ -1 +1 @@
1
- import{qi,qt}from'../utils/sql.js';const tableLookupCache=new WeakMap();function C(P,G){P=P-0xd7;const j=m();let Z=j[P];return Z;}export function clearTableLookupCache(P,G){const T=C,j=tableLookupCache['get'](G);if(!j)return;for(const Z of j['keys']()){Z[T(0xd7)](P+':')&&j['delete'](Z);}}export async function addTableLookupData(P,G,j){const D=C;if(!j||P['length']===0x0)return P;const Z=tableLookupCache[D(0xd8)](j)??new Map();tableLookupCache[D(0xd9)](j,Z);const q=Object['entries'](G)['flatMap'](([p,X])=>{const h=D,{table:F,value:value='id',text:text=h(0xda)}=X[h(0xdb)]??{};return F?[{'field':p,'table':F,'value':value,'text':text}]:[];});for(const p of q){const X=new Map();for(const b of P){const E=b[p['field']];(typeof E===D(0xdc)||typeof E==='number')&&X[D(0xd9)](String(E),E);}const F=p['table']+':'+p['value']+':'+p[D(0xdd)],A=Z[D(0xd8)](F)??new Map();Z[D(0xd9)](F,A);const H=[...X[D(0xde)]()]['filter'](([z])=>!A['has'](z))['map'](([,z])=>z);if(H['length']>0x0){const z=await j['query']('SELECT\x20'+qi(p[D(0xdf)])+'\x20AS\x20id,\x20'+qi(p['text'])+'\x20AS\x20text\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20'+qt(p[D(0xe0)])+D(0xe1)+qi(p['value'])+D(0xe2),[H]);for(const x of z['rows']){A[D(0xd9)](String(x['id']),x);}for(const o of H){!A['has'](String(o))&&A[D(0xd9)](String(o),null);}}for(const i of P){const y=i[p['field']];i[p['field']+D(0xe3)]=y==null?null:A['get'](String(y))??null;}}return P;}function m(){const L=['startsWith','get','set','name','lookup','string','text','entries','value','table','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20','\x20=\x20ANY($1)','_data'];m=function(){return L;};return m();}
1
+ import{qi,qt}from'../utils/sql.js';const tableLookupCache=new WeakMap();function c(S,Z){S=S-0xda;const h=O();let U=h[S];return U;}function O(){const E=['get','startsWith','string','number','table','set','\x20AS\x20id,\x20','value','has','field','_data'];O=function(){return E;};return O();}export function clearTableLookupCache(S,Z){const Y=c,h=tableLookupCache[Y(0xda)](Z);if(!h)return;for(const U of h['keys']()){U[Y(0xdb)](S+':')&&h['delete'](U);}}export async function addTableLookupData(S,Z,h){const r=c;if(!h||S['length']===0x0)return S;const U=tableLookupCache[r(0xda)](h)??new Map();tableLookupCache['set'](h,U);const D=Object['entries'](Z)['flatMap'](([u,e])=>{const {table:q,value:value='id',text:text='name'}=e['lookup']??{};return q?[{'field':u,'table':q,'value':value,'text':text}]:[];});for(const u of D){const e=new Map();for(const N of S){const o=N[u['field']];(typeof o===r(0xdc)||typeof o===r(0xdd))&&e['set'](String(o),o);}const q=u[r(0xde)]+':'+u['value']+':'+u['text'],x=U[r(0xda)](q)??new Map();U[r(0xdf)](q,x);const n=[...e['entries']()]['filter'](([j])=>!x['has'](j))['map'](([,j])=>j);if(n['length']>0x0){const j=await h['query']('SELECT\x20'+qi(u['value'])+r(0xe0)+qi(u['text'])+'\x20AS\x20text\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20'+qt(u['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(u[r(0xe1)])+'\x20=\x20ANY($1)',[n]);for(const X of j['rows']){x['set'](String(X['id']),X);}for(const i of n){!x[r(0xe2)](String(i))&&x['set'](String(i),null);}}for(const l of S){const b=l[u[r(0xe3)]];l[u[r(0xe3)]+r(0xe4)]=b==null?null:x['get'](String(b))??null;}}return S;}
@@ -1 +1 @@
1
- {"version":3,"file":"create-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/create-relation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,wCAKY,oBAAoB,QAClD,UAAU,KACf,OAAO,CAAC,GAAG,CAAC,CAyFhB"}
1
+ {"version":3,"file":"create-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/create-relation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,wCAKY,oBAAoB,QAClD,UAAU,KACf,OAAO,CAAC,GAAG,CAAC,CAyEhB"}
@@ -1 +1 @@
1
- function m(){const D=['files','includes','\x22\x20requires\x20a\x20capabilities\x20\x22','query','INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*','filePath','rows','Generic\x20Resource\x20relation\x20\x22','\x22\x20requires\x20a\x20project/provider\x20implementation','Relation\x20update\x20is\x20not\x20configured:\x20','resource'];m=function(){return D;};return m();}import{UnsupportedError}from'../../../errors.js';function C(P,G){P=P-0xf5;const j=m();let Z=j[P];return Z;}import{createCreate}from'./create.js';export function createCreateRelation(P,G){const j=createCreate(P,G);return async function Z({name:q,id:p,relation:X,data:F,user:A},H){const T=C,b=H?.['pg']??P['pg'],E=G['get'](q);if(['notes',T(0xf5),'gallery']['includes'](X)&&!E['capabilities']?.[T(0xf6)](X))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+X+T(0xf7)+X+'\x22');if(X==='notes'){const o=await b[T(0xf8)](T(0xf9),[q,String(p),F?.['body']]);return o['rows'][0x0];}if(X==='files'){const i=await b['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*',[q,String(p),F?.[T(0xfa)],F?.['size']??null]);return i['rows'][0x0];}if(X==='gallery'){const y=await b[T(0xf8)]('INSERT\x20INTO\x20admin.gallery\x20(resource,\x20resource_id,\x20file_path,\x20size,\x20mime_type)\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*',[q,String(p),F?.['filePath'],F?.['size']??null,F?.['mimeType']??'image/jpeg']);return y[T(0xfb)][0x0];}const z=E['relations']?.[X];if(!z?.['foreignKey']||!z['resource']&&!z['table'])throw new UnsupportedError(T(0xfc)+X+T(0xfd));if(!F)throw new UnsupportedError('No\x20data\x20provided\x20for\x20relation:\x20'+F);if(!z['resource'])throw new UnsupportedError(T(0xfe)+X);F[z['foreignKey']]=p;const x=await j({'name':z[T(0xff)],'data':F??{},'user':A});return x;};}
1
+ import{UnsupportedError}from'../../../errors.js';function c(S,Z){S=S-0xd7;const h=O();let U=h[S];return U;}function O(){const Y=['includes','\x22\x20requires\x20a\x20capabilities\x20\x22','query','body','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*','filePath','size','foreignKey','\x22\x20requires\x20a\x20project/provider\x20implementation','resource','Relation\x20update\x20is\x20not\x20configured:\x20'];O=function(){return Y;};return O();}import{createCreate}from'./create.js';export function createCreateRelation(S,Z){const h=createCreate(S,Z);return async function U({name:D,id:u,relation:e,data:q,user:x},n){const b=c,N=n?.['pg']??S['pg'],o=Z['get'](D);if(['notes','files'][b(0xd7)](e)&&!o['capabilities']?.['includes'](e))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+e+b(0xd8)+e+'\x22');if(e==='notes'){const i=await N[b(0xd9)]('INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*',[D,String(u),q?.[b(0xda)]]);return i['rows'][0x0];}if(e==='files'){const l=await N['query'](b(0xdb),[D,String(u),q?.[b(0xdc)],q?.[b(0xdd)]??null]);return l['rows'][0x0];}const j=o['relations']?.[e];if(!j?.[b(0xde)]||!j['resource']&&!j['table'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+e+b(0xdf));if(!q)throw new UnsupportedError('No\x20data\x20provided\x20for\x20relation:\x20'+q);if(!j[b(0xe0)])throw new UnsupportedError(b(0xe1)+e);q[j['foreignKey']]=u;const X=await h({'name':j['resource'],'data':q??{},'user':x});return X;};}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';function m(){const D=['created_at','push','created_by','length','query','join','rows','table','audit','module','keys'];m=function(){return D;};return m();}import{qi,qt,writableData}from'../utils/sql.js';import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function C(P,G){P=P-0x1e0;const j=m();let Z=j[P];return Z;}export function createCreate(P,G){return async function j({name:Z,data:q,user:p},X){const T=C,F=G['get'](Z);assertOperation(F,'create',p),validateInputData({'resource':F,'data':q});const A=writableData(F,q);F['fields']['created_at']&&A['push']([T(0x1e0),new Date()]);F['fields']['created_by']&&A[T(0x1e1)]([T(0x1e2),p?.['id']]);if(!A[T(0x1e3)])throw new ValidationError('No\x20writable\x20fields');const H=A['map'](([i])=>qi(i)),b=A['map']((i,y)=>'$'+(y+0x1)),E=A['map'](([,i])=>i),z=X?.['pg']??P['pg'],x=await z[T(0x1e4)]('INSERT\x20INTO\x20'+qt(F['table'])+'\x20('+H['join'](',\x20')+')\x20'+('VALUES\x20('+b[T(0x1e5)](',\x20')+')\x20')+'RETURNING\x20*',E),o=x[T(0x1e6)][0x0];return clearTableLookupCache(F[T(0x1e7)],z),await(X?.[T(0x1e8)]??P['audit'])?.['write']({'userId':p?.['id'],'module':F[T(0x1e9)],'resource':F['name'],'resourceId':o[F['key']],'action':'create','fields':Object[T(0x1ea)](q)}),o;};}
1
+ import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,writableData}from'../utils/sql.js';function c(S,Z){S=S-0x14d;const h=O();let U=h[S];return U;}function O(){const r=['get','fields','created_by','push','No\x20writable\x20fields','map','query','join','audit','module','name','keys'];O=function(){return r;};return O();}import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createCreate(S,Z){return async function h({name:U,data:D,user:u},e){const Y=c,q=Z[Y(0x14d)](U);assertOperation(q,'create',u),validateInputData({'resource':q,'data':D});const x=writableData(q,D);q[Y(0x14e)]['created_at']&&x['push'](['created_at',new Date()]);q['fields'][Y(0x14f)]&&x[Y(0x150)]([Y(0x14f),u?.['id']]);if(!x['length'])throw new ValidationError(Y(0x151));const n=x[Y(0x152)](([l])=>qi(l)),N=x[Y(0x152)]((l,b)=>'$'+(b+0x1)),o=x['map'](([,l])=>l),j=e?.['pg']??S['pg'],X=await j[Y(0x153)]('INSERT\x20INTO\x20'+qt(q['table'])+'\x20('+n['join'](',\x20')+')\x20'+('VALUES\x20('+N[Y(0x154)](',\x20')+')\x20')+'RETURNING\x20*',o),i=X['rows'][0x0];return clearTableLookupCache(q['table'],j),await(e?.[Y(0x155)]??S['audit'])?.['write']({'userId':u?.['id'],'module':q[Y(0x156)],'resource':q[Y(0x157)],'resourceId':i[q['key']],'action':'create','fields':Object[Y(0x158)](D)}),i;};}
@@ -1 +1 @@
1
- {"version":3,"file":"delete-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/delete-relation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,CAAC;AACF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,8CAKkB,oBAAoB,QACxD,UAAU,KACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAuDjC"}
1
+ {"version":3,"file":"delete-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/delete-relation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,CAAC;AACF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,8CAKkB,oBAAoB,QACxD,UAAU,KACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA+CjC"}
@@ -1 +1 @@
1
- function m(){const i=['get','notes','includes','query','DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3','foreignKey','Generic\x20Resource\x20relation\x20\x22','\x22\x20requires\x20a\x20project/provider\x20implementation','resource'];m=function(){return i;};return m();}import{UnsupportedError}from'../../../errors.js';import{createRemove}from'./delete.js';function C(P,G){P=P-0x1b1;const j=m();let Z=j[P];return Z;}export function createDeleteRelation(P,G){const j=createRemove(P,G);return async function Z({name:q,id:p,relation:X,relationId:F,user:A},H){const o=C,b=H?.['pg']??P['pg'],E=G[o(0x1b1)](q);if([o(0x1b2),'files','gallery']['includes'](X)&&!E['capabilities']?.[o(0x1b3)](X))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+X+'\x22\x20requires\x20a\x20capabilities\x20\x22'+X+'\x22');if(X==='notes')return await b[o(0x1b4)](o(0x1b5),[F,q,String(p)]),{'success':!![]};if(X==='files')return await b[o(0x1b4)]('DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[F,q,String(p)]),{'success':!![]};if(X==='gallery')return await b['query']('DELETE\x20FROM\x20admin.gallery\x20WHERE\x20id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[F,q,String(p)]),{'success':!![]};const z=E['relations']?.[X];if(!z?.['resource']||!z[o(0x1b6)])throw new UnsupportedError(o(0x1b7)+X+o(0x1b8));const x=await j({'name':z[o(0x1b9)],'id':F,'user':A,'where':{'column':z[o(0x1b6)],'value':p}},H);return{'success':x};};}
1
+ function O(){const l=['get','\x22\x20requires\x20a\x20capabilities\x20\x22','DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3','relations','foreignKey'];O=function(){return l;};return O();}import{UnsupportedError}from'../../../errors.js';import{createRemove}from'./delete.js';function c(S,Z){S=S-0x98;const h=O();let U=h[S];return U;}export function createDeleteRelation(S,Z){const h=createRemove(S,Z);return async function U({name:D,id:u,relation:e,relationId:q,user:x},n){const i=c,N=n?.['pg']??S['pg'],o=Z[i(0x98)](D);if(['notes','files']['includes'](e)&&!o['capabilities']?.['includes'](e))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+e+i(0x99)+e+'\x22');if(e==='notes')return await N['query']('DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[q,D,String(u)]),{'success':!![]};if(e==='files')return await N['query'](i(0x9a),[q,D,String(u)]),{'success':!![]};const j=o[i(0x9b)]?.[e];if(!j?.['resource']||!j[i(0x9c)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+e+'\x22\x20requires\x20a\x20project/provider\x20implementation');const X=await h({'name':j['resource'],'id':q,'user':x,'where':{'column':j['foreignKey'],'value':u}},n);return{'success':X};};}
@@ -1 +1 @@
1
- import{assertOperation}from'../utils/permissions.js';function C(P,G){P=P-0x17e;const j=m();let Z=j[P];return Z;}function m(){const o=['WHERE\x20','\x20=\x20$1','\x20=\x20$','length','\x20AND\x20(','DELETE\x20FROM\x20','table','write','module','delete'];m=function(){return o;};return m();}import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createRemove(P,G){return async function j({name:Z,id:q,user:p,where:X},F){const x=C,A=G['get'](Z);assertOperation(A,'delete',p);const H=F?.['pg']??P['pg'],b=[q];let E=x(0x17e)+qi(A['key'])+x(0x17f);X&&(b['push'](X['value']),E+='\x20AND\x20'+qi(X['column'])+x(0x180)+b[x(0x181)]);A['where']&&(E+=x(0x182)+A['where']+')');const z=await H['query'](x(0x183)+qt(A[x(0x184)])+'\x20'+E,b);if((z['rowCount']??0x0)>0x0)clearTableLookupCache(A[x(0x184)],H);if((z['rowCount']??0x0)>0x0)await(F?.['audit']??P['audit'])?.[x(0x185)]({'module':A[x(0x186)],'resource':A['name'],'resourceId':q,'action':x(0x187)});return(z['rowCount']??0x0)>0x0;};}
1
+ import{assertOperation}from'../utils/permissions.js';function O(){const i=['push','value','column','\x20=\x20$','table','rowCount','audit','module','name'];O=function(){return i;};return O();}import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function c(S,Z){S=S-0x140;const h=O();let U=h[S];return U;}export function createRemove(S,Z){return async function h({name:U,id:D,user:u,where:e},q){const X=c,x=Z['get'](U);assertOperation(x,'delete',u);const n=q?.['pg']??S['pg'],N=[D];let o='WHERE\x20'+qi(x['key'])+'\x20=\x20$1';e&&(N[X(0x140)](e[X(0x141)]),o+='\x20AND\x20'+qi(e[X(0x142)])+X(0x143)+N['length']);x['where']&&(o+='\x20AND\x20('+x['where']+')');const j=await n['query']('DELETE\x20FROM\x20'+qt(x[X(0x144)])+'\x20'+o,N);if((j['rowCount']??0x0)>0x0)clearTableLookupCache(x[X(0x144)],n);if((j[X(0x145)]??0x0)>0x0)await(q?.[X(0x146)]??S[X(0x146)])?.['write']({'module':x[X(0x147)],'resource':x[X(0x148)],'resourceId':D,'action':'delete'});return(j[X(0x145)]??0x0)>0x0;};}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';function C(P,G){P=P-0x184;const j=m();let Z=j[P];return Z;}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';import{createFindRelation}from'./find-relation.js';function m(){const T=['now','read','Invalid\x20id:\x20','joins','sql','\x20AND\x20(','SELECT\x20','\x20FROM\x20','\x20WHERE\x20','dictionary','fields','file','keys','isArray','include','split','type'];m=function(){return T;};return m();}export function createFindOne(P,G){return async function j({name:Z,id:q,query:query={},user:p}){const y=C,X=Date[y(0x184)](),F=G['get'](Z);assertOperation(F,y(0x185),p);if(F['fields'][F['key']]?.['type']==='integer'&&!Number['isInteger'](Number(q)))throw new ValidationError(y(0x186)+q+'\x20name:'+Z);const A=F[y(0x187)]?.['map'](o=>o[y(0x188)]+'\x20')['join']('\x20')||'',H=F['where']?y(0x189)+F['where']+')':'',b=await P['pg']['query'](y(0x18a)+readableFields(F)['join'](',\x20')+y(0x18b)+qt(F['table'])+'\x20t\x20'+A+y(0x18c)+qi(F['key'])+'=$1'+H+'\x20LIMIT\x201',[q]),E=b['rows'][0x0];if(!E)return null;await addDictionaryLookupData([E],F['fields'],P[y(0x18d)]),await addTableLookupData([E],F[y(0x18e)],P['pg']),addFileToken([E],F['fields'],P[y(0x18f)]);const z=(query['include']==='all'?Object[y(0x190)](F['relations']||{}):null)||(Array[y(0x191)](query['include'])?query[y(0x192)]:query['include']?.[y(0x193)](',')??[]),x=createFindRelation(P,G);for(const o of z){E[o]=await x({'name':Z,'id':q,'relation':o,'query':query,'user':p})['then'](i=>i['rows']??[])['then'](i=>F['relations']?.[o]?.[y(0x194)]==='one'?i[0x0]??null:i);}return E['time']=Date['now']()-X,E;};}
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';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';function O(){const Y=['type','integer','isInteger','Invalid\x20id:\x20','join','where','rows','fields','include','isArray','then','one','time','now'];O=function(){return Y;};return O();}function c(S,Z){S=S-0x161;const h=O();let U=h[S];return U;}import{createFindRelation}from'./find-relation.js';export function createFindOne(S,Z){return async function h({name:U,id:D,query:query={},user:u}){const b=c,e=Date['now'](),q=Z['get'](U);assertOperation(q,'read',u);if(q['fields'][q['key']]?.[b(0x161)]===b(0x162)&&!Number[b(0x163)](Number(D)))throw new ValidationError(b(0x164)+D+'\x20name:'+U);const x=q['joins']?.['map'](i=>i['sql']+'\x20')[b(0x165)]('\x20')||'',n=q[b(0x166)]?'\x20AND\x20('+q[b(0x166)]+')':'',N=await S['pg']['query']('SELECT\x20'+readableFields(q)['join'](',\x20')+'\x20FROM\x20'+qt(q['table'])+'\x20t\x20'+x+'\x20WHERE\x20'+qi(q['key'])+'=$1'+n+'\x20LIMIT\x201',[D]),o=N[b(0x167)][0x0];if(!o)return null;await addDictionaryLookupData([o],q['fields'],S['dictionary']),await addTableLookupData([o],q['fields'],S['pg']),addFileToken([o],q[b(0x168)],S['file']);const j=(query[b(0x169)]==='all'?Object['keys'](q['relations']||{}):null)||(Array[b(0x16a)](query['include'])?query['include']:query['include']?.['split'](',')??[]),X=createFindRelation(S,Z);for(const i of j){o[i]=await X({'name':U,'id':D,'relation':i,'query':query,'user':u})[b(0x16b)](l=>l['rows']??[])['then'](l=>q['relations']?.[i]?.['type']===b(0x16c)?l[0x0]??null:l);}return o[b(0x16d)]=Date[b(0x16e)]()-e,o;};}
@@ -1 +1 @@
1
- function C(P,G){P=P-0x137;const j=m();let Z=j[P];return Z;}import{UnsupportedError,ValidationError}from'../../../errors.js';function m(){const n=['now','max','isFinite','includes','\x22\x20requires\x20a\x20capabilities\x20\x22','notes','query','rows','files','SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC','resource','get','key','keys','junctionTable','JOIN\x20','junctionForeignKey','\x20=\x20t.','\x20=\x20(SELECT\x20','\x20FROM\x20','table','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20','sql','\x20t\x20','fields'];m=function(){return n;};return m();}import{qi,qt}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';import{autoIndex}from'../utils/auto-index.js';export function createFindRelation(P,G){return async function j({name:Z,id:q,relation:p,query:query={}}){const a=C,X=Date[a(0x137)](),F=Math['min'](Math['max'](query['limit']??0x14,0x1),0xc8),A=Math[a(0x138)](query['offset']??0x0,0x0);if(!Number['isFinite'](F)||!Number[a(0x139)](A))throw new ValidationError('Invalid\x20pagination');const H=G['get'](Z),b=H['relations']?.[p];if(['notes','files'][a(0x13a)](p)&&!H['capabilities']?.['includes'](p))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+p+a(0x13b)+p+'\x22');if(p===a(0x13c)){const L=await P['pg'][a(0x13d)]('SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[Z,String(q)]);return{'total':L[a(0x13e)]['length'],'time':Date['now']()-X,'rows':L['rows']};}if(p===a(0x13f)){const O=await P['pg'][a(0x13d)](a(0x140),[Z,String(q)]);return addFileToken(O['rows'],{'file_path':{'type':'file'}},P['file']),{'total':O[a(0x13e)]['length'],'time':Date['now']()-X,'rows':O['rows']};}if(!b?.[a(0x141)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+p+'\x22\x20requires\x20a\x20project/provider\x20implementation');const E=G[a(0x142)](b['resource']),z=E?.[a(0x143)]??'id',x=E?.['table'],o=Object[a(0x144)](E?.['fields']??{})['filter'](N=>E?.['fields'][N]?.['read']&&E?.['fields'][N]?.['scope']!=='item')['map'](qi)['join'](',\x20'),i=b['fields']?.['join'](',\x20')||o||'*';b['foreignKey']&&autoIndex(x,b['foreignKey'],'btree',P['pg']);const y=b[a(0x145)]?a(0x146)+qt(b['junctionTable'])+'\x20j\x20ON\x20j.'+qi(b[a(0x147)])+a(0x148)+(b['junctionTargetKey']||qi(z))+'\x20WHERE\x20'+qi(b['junctionLocalKey'])+'\x20=\x20$1\x20':'where\x20'+(b['foreignKey']||qi(z))+a(0x149)+qi(b['localKey']||H[a(0x143)])+a(0x14a)+qt(H[a(0x14b)])+a(0x14c)+qi(H['key'])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x20'+(b['where']?'AND\x20('+b['where']+')':''),T=E['joins']?.['map'](N=>N[a(0x14d)]+'\x20')['join']('\x20')||'',D='SELECT\x20'+i+'\x20FROM\x20'+qt(x)+a(0x14e)+T+'\x20'+y+'\x20LIMIT\x20$2\x20OFFSET\x20$3',h=await P['pg']['query'](D,[q,F,A]);return E&&(await addDictionaryLookupData(h[a(0x13e)],E[a(0x14f)],P['dictionary']),await addTableLookupData(h['rows'],E['fields'],P['pg']),addFileToken(h['rows'],E['fields'],P['file'])),{'limit':F,'offset':A,'total':h['rows']['length'],'time':Date['now']()-X,'rows':h['rows']??null};};}
1
+ import{UnsupportedError,ValidationError}from'../../../errors.js';import{qi,qt}from'../utils/sql.js';function O(){const B=['limit','isFinite','get','relations','notes','includes','now','files','resource','fields','filter','scope','foreignKey','btree','JOIN\x20','junctionTable','\x20j\x20ON\x20j.','junctionForeignKey','localKey','where','join','\x20t\x20','query','file'];O=function(){return B;};return O();}import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';function c(S,Z){S=S-0x1d1;const h=O();let U=h[S];return U;}import{autoIndex}from'../utils/auto-index.js';export function createFindRelation(S,Z){return async function h({name:U,id:D,relation:u,query:query={}}){const I=c,e=Date['now'](),q=Math['min'](Math['max'](query[I(0x1d1)]??0x14,0x1),0xc8),x=Math['max'](query['offset']??0x0,0x0);if(!Number['isFinite'](q)||!Number[I(0x1d2)](x))throw new ValidationError('Invalid\x20pagination');const n=Z[I(0x1d3)](U),N=n[I(0x1d4)]?.[u];if([I(0x1d5),'files']['includes'](u)&&!n['capabilities']?.[I(0x1d6)](u))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+u+'\x22\x20requires\x20a\x20capabilities\x20\x22'+u+'\x22');if(u==='notes'){const L=await S['pg']['query']('SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[U,String(D)]);return{'total':L['rows']['length'],'time':Date[I(0x1d7)]()-e,'rows':L['rows']};}if(u===I(0x1d8)){const V=await S['pg']['query']('SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[U,String(D)]);return addFileToken(V['rows'],{'file_path':{'type':'file'}},S['file']),{'total':V['rows']['length'],'time':Date['now']()-e,'rows':V['rows']};}if(!N?.[I(0x1d9)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+u+'\x22\x20requires\x20a\x20project/provider\x20implementation');const o=Z['get'](N['resource']),j=o?.['key']??'id',X=o?.['table'],i=Object['keys'](o?.[I(0x1da)]??{})[I(0x1db)](k=>o?.[I(0x1da)][k]?.['read']&&o?.['fields'][k]?.[I(0x1dc)]!=='item')['map'](qi)['join'](',\x20'),l=N['fields']?.['join'](',\x20')||i||'*';N[I(0x1dd)]&&autoIndex(X,N[I(0x1dd)],I(0x1de),S['pg']);const b=N['junctionTable']?I(0x1df)+qt(N[I(0x1e0)])+I(0x1e1)+qi(N[I(0x1e2)])+'\x20=\x20t.'+(N['junctionTargetKey']||qi(j))+'\x20WHERE\x20'+qi(N['junctionLocalKey'])+'\x20=\x20$1\x20':'where\x20'+(N['foreignKey']||qi(j))+'\x20=\x20(SELECT\x20'+qi(N[I(0x1e3)]||n['key'])+'\x20FROM\x20'+qt(n['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(n['key'])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x20'+(N[I(0x1e4)]?'AND\x20('+N[I(0x1e4)]+')':''),Y=o['joins']?.['map'](k=>k['sql']+'\x20')[I(0x1e5)]('\x20')||'',r='SELECT\x20'+l+'\x20FROM\x20'+qt(X)+I(0x1e6)+Y+'\x20'+b+'\x20LIMIT\x20$2\x20OFFSET\x20$3',E=await S['pg'][I(0x1e7)](r,[D,q,x]);return o&&(await addDictionaryLookupData(E['rows'],o[I(0x1da)],S['dictionary']),await addTableLookupData(E['rows'],o['fields'],S['pg']),addFileToken(E['rows'],o['fields'],S[I(0x1e8)])),{'limit':q,'offset':x,'total':E['rows']['length'],'time':Date['now']()-e,'rows':E['rows']??null};};}