@opengis/fcore 0.0.1-beta.22 → 0.0.1-beta.24

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 (117) 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.d.ts.map +1 -1
  7. package/dist/fastify.js +1 -1
  8. package/dist/fcore.js +1 -1
  9. package/dist/migrations/cli.js +1 -1
  10. package/dist/migrations/runner.js +1 -1
  11. package/dist/modules/auth/adduser-cli.js +1 -1
  12. package/dist/modules/auth/passwd-cli.js +1 -1
  13. package/dist/modules/auth/permission-cli.js +1 -1
  14. package/dist/modules/auth/route.js +1 -1
  15. package/dist/modules/auth/schema.js +1 -1
  16. package/dist/modules/auth/services/change-password.js +1 -1
  17. package/dist/modules/auth/services/get-current-user.js +1 -1
  18. package/dist/modules/auth/services/registration.js +1 -1
  19. package/dist/modules/auth/services/verify-two-factor.js +1 -1
  20. package/dist/modules/file/mime.js +1 -1
  21. package/dist/modules/file/route.js +1 -1
  22. package/dist/modules/file/schema.js +1 -1
  23. package/dist/modules/file/services/get-file.js +1 -1
  24. package/dist/modules/file/services/resize-file.js +1 -1
  25. package/dist/modules/file/services/upload-file.js +1 -1
  26. package/dist/modules/resource/route.js +1 -1
  27. package/dist/modules/resource/schema.d.ts +1 -0
  28. package/dist/modules/resource/schema.d.ts.map +1 -1
  29. package/dist/modules/resource/schema.js +1 -1
  30. package/dist/modules/resource/services/add-note.js +1 -1
  31. package/dist/modules/resource/services/add-resource-file.js +1 -1
  32. package/dist/modules/resource/services/create-resource-relation.js +1 -1
  33. package/dist/modules/resource/services/create-resource.js +1 -1
  34. package/dist/modules/resource/services/delete-resource-relation.js +1 -1
  35. package/dist/modules/resource/services/delete-resource.js +1 -1
  36. package/dist/modules/resource/services/export-resource.js +1 -1
  37. package/dist/modules/resource/services/get-resource.js +1 -1
  38. package/dist/modules/resource/services/list-resource-relation.js +1 -1
  39. package/dist/modules/resource/services/list-resources.d.ts.map +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-system-log.js +1 -1
  54. package/dist/modules/system/services/get-system-settings.js +1 -1
  55. package/dist/modules/system/services/list-dictionaries.js +1 -1
  56. package/dist/modules/system/services/set-access.js +1 -1
  57. package/dist/modules/system/services/update-dictionary.js +1 -1
  58. package/dist/modules/system/services/update-system-settings.js +1 -1
  59. package/dist/modules/utils/require-admin.js +1 -1
  60. package/dist/modules/utils/safe-user.js +1 -1
  61. package/dist/modules/utils/unsupported.js +1 -1
  62. package/dist/plugins/audit/audit.js +1 -1
  63. package/dist/plugins/audit/services/write-audit.js +1 -1
  64. package/dist/plugins/auth/get-user-permissions.js +1 -1
  65. package/dist/plugins/auth/index.js +1 -1
  66. package/dist/plugins/auth/verifyUser.js +1 -1
  67. package/dist/plugins/dictionary.js +1 -1
  68. package/dist/plugins/file.js +1 -1
  69. package/dist/plugins/jwt.js +1 -1
  70. package/dist/plugins/logger/index.js +1 -1
  71. package/dist/plugins/logger/transport.js +1 -1
  72. package/dist/plugins/pg.js +1 -1
  73. package/dist/plugins/redis.js +1 -1
  74. package/dist/plugins/resource/resource.js +1 -1
  75. package/dist/plugins/resource/resource.registry.js +1 -1
  76. package/dist/plugins/resource/resource.types.d.ts +22 -0
  77. package/dist/plugins/resource/resource.types.d.ts.map +1 -1
  78. package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
  79. package/dist/plugins/resource/services/add-file-token.js +1 -1
  80. package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
  81. package/dist/plugins/resource/services/create-relation.d.ts +1 -1
  82. package/dist/plugins/resource/services/create-relation.d.ts.map +1 -1
  83. package/dist/plugins/resource/services/create-relation.js +1 -1
  84. package/dist/plugins/resource/services/create.js +1 -1
  85. package/dist/plugins/resource/services/delete-relation.d.ts +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.d.ts.map +1 -1
  90. package/dist/plugins/resource/services/find-one.js +1 -1
  91. package/dist/plugins/resource/services/find-relation.d.ts.map +1 -1
  92. package/dist/plugins/resource/services/find-relation.js +1 -1
  93. package/dist/plugins/resource/services/find.d.ts.map +1 -1
  94. package/dist/plugins/resource/services/find.js +1 -1
  95. package/dist/plugins/resource/services/get-table-columns.d.ts +8 -0
  96. package/dist/plugins/resource/services/get-table-columns.d.ts.map +1 -0
  97. package/dist/plugins/resource/services/get-table-columns.js +1 -0
  98. package/dist/plugins/resource/services/update-relation.js +1 -1
  99. package/dist/plugins/resource/services/update.js +1 -1
  100. package/dist/plugins/resource/utils/auto-index.js +1 -1
  101. package/dist/plugins/resource/utils/fields.js +1 -1
  102. package/dist/plugins/resource/utils/filters.d.ts +2 -1
  103. package/dist/plugins/resource/utils/filters.d.ts.map +1 -1
  104. package/dist/plugins/resource/utils/filters.js +1 -1
  105. package/dist/plugins/resource/utils/permissions.js +1 -1
  106. package/dist/plugins/resource/utils/sort.js +1 -1
  107. package/dist/plugins/resource/utils/sql.js +1 -1
  108. package/dist/plugins/resource/utils/summary.d.ts +3 -0
  109. package/dist/plugins/resource/utils/summary.d.ts.map +1 -0
  110. package/dist/plugins/resource/utils/summary.js +1 -0
  111. package/dist/shared/getIP.js +1 -1
  112. package/migrations/20260903120000_core_schema.sql +1 -1
  113. package/migrations/20260903130000_move_notes_files_to_admin.sql +17 -17
  114. package/migrations/20260903140000_settings_nulls_not_distinct.sql +18 -18
  115. package/migrations/20260905120000_add_user_foreign_keys.sql +42 -42
  116. package/migrations/20260910170000_core_schema.sql +22 -0
  117. package/package.json +2 -2
@@ -62,6 +62,7 @@ export declare const resourceSchemas: {
62
62
  filter: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
63
63
  sort: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
64
64
  search: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
65
+ scope: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
65
66
  limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
66
67
  offset: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
67
68
  fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/modules/resource/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,aAAa;QACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;QACrC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB;CACF;AAED,eAAO,MAAM,UAAU,qCAIrB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAEnD,eAAO,MAAM,eAAe;IAC1B,cAAc;;;IACd,QAAQ;;;IACR,cAAc;;;IACd,aAAa;;;;IACb,YAAY;;;;;IAKZ,UAAU;;;;IACV,oBAAoB;;;IAGpB,kBAAkB;;;;;IAKlB,oBAAoB;;;;;;IAMpB,kBAAkB;;;;IAIlB,sBAAsB;;;;IAItB,mBAAmB;;;;;;;;CAQpB,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/modules/resource/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,aAAa;QACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;QACrC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB;CACF;AAED,eAAO,MAAM,UAAU,qCAIrB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAEnD,eAAO,MAAM,eAAe;IAC1B,cAAc;;;IACd,QAAQ;;;IACR,cAAc;;;IACd,aAAa;;;;IACb,YAAY;;;;;IAKZ,UAAU;;;;IACV,oBAAoB;;;IAGpB,kBAAkB;;;;;IAKlB,oBAAoB;;;;;;IAMpB,kBAAkB;;;;IAIlB,sBAAsB;;;;IAItB,mBAAmB;;;;;;;;;CASpB,CAAC"}
@@ -1 +1 @@
1
- const B=d;function d(B,K){B=B-0x14e;const T=E();let L=T[B];return L;}import{Type}from'@sinclair/typebox';function E(){const K=['String','Object','Optional','Array'];E=function(){return K;};return E();}export const identifier=Type[B(0x14e)]({'minLength':0x1,'maxLength':0x80,'pattern':'^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$'});export const resourceSchemas={'dictionaryName':Type[B(0x14f)]({'name':identifier}),'resource':Type['Object']({'resource':identifier}),'exportResource':Type['Object']({'resource':identifier}),'resourceField':Type['Object']({'resource':identifier,'field':identifier}),'suggestQuery':Type['Object']({'q':Type['Optional'](Type['String']()),'search':Type[B(0x150)](Type['String']()),'limit':Type['Optional'](Type['Integer']({'minimum':0x1,'maximum':0xc8}))}),'resourceId':Type['Object']({'resource':identifier,'id':identifier}),'resourceIncludeQuery':Type[B(0x14f)]({'include':Type['Optional'](Type[B(0x14e)]({'minLength':0x1}))}),'resourceIdRelation':Type['Object']({'resource':identifier,'id':identifier,'relation':identifier}),'resourceIdRelationId':Type[B(0x14f)]({'resource':identifier,'id':identifier,'relation':identifier,'relationId':identifier}),'uploadResourceFile':Type[B(0x14f)]({'resource':identifier,'id':identifier}),'uploadResourceFileBody':Type['Object']({'file':Type['Any'](),'fileName':Type['String']({'minLength':0x1,'maxLength':0xff})}),'exportResourceQuery':Type[B(0x14f)]({'filter':Type['Optional'](Type['Record'](Type['String'](),Type['Unknown']())),'sort':Type['Optional'](Type[B(0x151)](Type['String']({'minLength':0x1}))),'search':Type['Optional'](Type['String']()),'limit':Type[B(0x150)](Type['Integer']({'minimum':0x1,'maximum':0xc8})),'offset':Type['Optional'](Type['Integer']({'minimum':0x0})),'fields':Type[B(0x150)](Type['Array'](identifier))})};
1
+ const s=n;function n(s,J){s=s-0x198;const N=W();let O=N[s];return O;}import{Type}from'@sinclair/typebox';export const identifier=Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':'^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$'});function W(){const J=['Object','String','Optional','Record','Array'];W=function(){return J;};return W();}export const resourceSchemas={'dictionaryName':Type['Object']({'name':identifier}),'resource':Type['Object']({'resource':identifier}),'exportResource':Type[s(0x198)]({'resource':identifier}),'resourceField':Type['Object']({'resource':identifier,'field':identifier}),'suggestQuery':Type['Object']({'q':Type['Optional'](Type['String']()),'search':Type['Optional'](Type['String']()),'limit':Type['Optional'](Type['Integer']({'minimum':0x1,'maximum':0xc8}))}),'resourceId':Type['Object']({'resource':identifier,'id':identifier}),'resourceIncludeQuery':Type['Object']({'include':Type['Optional'](Type[s(0x199)]({'minLength':0x1}))}),'resourceIdRelation':Type['Object']({'resource':identifier,'id':identifier,'relation':identifier}),'resourceIdRelationId':Type['Object']({'resource':identifier,'id':identifier,'relation':identifier,'relationId':identifier}),'uploadResourceFile':Type['Object']({'resource':identifier,'id':identifier}),'uploadResourceFileBody':Type[s(0x198)]({'file':Type['Any'](),'fileName':Type['String']({'minLength':0x1,'maxLength':0xff})}),'exportResourceQuery':Type[s(0x198)]({'filter':Type[s(0x19a)](Type[s(0x19b)](Type[s(0x199)](),Type['Unknown']())),'sort':Type['Optional'](Type[s(0x19c)](Type['String']({'minLength':0x1}))),'search':Type['Optional'](Type['String']()),'scope':Type['Optional'](Type['String']()),'limit':Type[s(0x19a)](Type['Integer']({'minimum':0x1,'maximum':0xc8})),'offset':Type[s(0x19a)](Type['Integer']({'minimum':0x0})),'fields':Type['Optional'](Type['Array'](identifier))})};
@@ -1 +1 @@
1
- function d(B,K){B=B-0x138;const T=E();let L=T[B];return L;}function E(){const x=['resource','body'];E=function(){return x;};return E();}export async function addNote(B,K){const L=d,T=await K['pg']['query']('INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*',[B[L(0x138)],String(B['id']),B[L(0x139)]]);return T['rows'][0x0];}
1
+ function n(s,J){s=s-0x187;const N=W();let O=N[s];return O;}function W(){const E=['query','INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*','rows'];W=function(){return E;};return W();}export async function addNote(s,J){const O=n,N=await J['pg'][O(0x187)](O(0x188),[s['resource'],String(s['id']),s['body']]);return N[O(0x189)][0x0];}
@@ -1 +1 @@
1
- export async function addResourceFile(B,K){const T=await K['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*\x0a\x20\x20\x20\x20\x20\x20',[B['resource'],String(B['id']),B['filePath'],B['size']??null]);return T['rows'][0x0];}
1
+ function n(s,J){s=s-0x1e6;const N=W();let O=N[s];return O;}function W(){const E=['\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*\x0a\x20\x20\x20\x20\x20\x20'];W=function(){return E;};return W();}export async function addResourceFile(s,J){const O=n,N=await J['pg']['query'](O(0x1e6),[s['resource'],String(s['id']),s['filePath'],s['size']??null]);return N['rows'][0x0];}
@@ -1 +1 @@
1
- export async function createResourceRelation(B,K){const {resource:T,id:L,relation:x,data:y,user:P}=B;return K['resource']['createRelation']({'name':T,'id':L,'relation':x,'data':y,'user':P});}
1
+ function W(){const a=['resource','createRelation'];W=function(){return a;};return W();}function n(s,J){s=s-0x165;const N=W();let O=N[s];return O;}export async function createResourceRelation(s,J){const f=n,{resource:N,id:O,relation:E,data:S,user:T}=s;return J[f(0x165)][f(0x166)]({'name':N,'id':O,'relation':E,'data':S,'user':T});}
@@ -1 +1 @@
1
- function d(B,K){B=B-0x192;var T=E();var L=T[B];return L;}function E(){var L=['resource','data','user'];E=function(){return L;};return E();}export async function createResource(B,K){var T=d;return K['resource']['create']({'name':B[T(0x192)],'data':B[T(0x193)],'user':B[T(0x194)]});}
1
+ export async function createResource(s,J){var N=n;return J[N(0x15c)]['create']({'name':s['resource'],'data':s[N(0x15d)],'user':s['user']});}function n(s,J){s=s-0x15c;var N=W();var O=N[s];return O;}function W(){var O=['resource','data'];W=function(){return O;};return W();}
@@ -1 +1 @@
1
- export async function deleteResourceRelation(B,K){const P=d,{resource:T,id:L,relation:x,relationId:y}=B;return K[P(0x133)]['deleteRelation']({'name':T,'id':L,'relation':x,'relationId':y});}function d(B,K){B=B-0x133;const T=E();let L=T[B];return L;}function E(){const g=['resource'];E=function(){return g;};return E();}
1
+ export async function deleteResourceRelation(s,J){const T=n,{resource:N,id:O,relation:E,relationId:S}=s;return J[T(0x98)]['deleteRelation']({'name':N,'id':O,'relation':E,'relationId':S});}function n(s,J){s=s-0x98;const N=W();let O=N[s];return O;}function W(){const f=['resource'];W=function(){return f;};return W();}
@@ -1 +1 @@
1
- function E(){var L=['user'];E=function(){return L;};return E();}function d(B,K){B=B-0x1ae;var T=E();var L=T[B];return L;}export async function deleteResource(B,K){var T=d;return K['resource']['delete']({'name':B['resource'],'id':B['id'],'user':B[T(0x1ae)]});}
1
+ function W(){var O=['user'];W=function(){return O;};return W();}function n(s,J){s=s-0x11b;var N=W();var O=N[s];return O;}export async function deleteResource(s,J){var N=n;return J['resource']['delete']({'name':s['resource'],'id':s['id'],'user':s[N(0x11b)]});}
@@ -1 +1 @@
1
- function d(B,K){B=B-0x97;const T=E();let L=T[B];return L;}function E(){const x=['resource','rows'];E=function(){return x;};return E();}import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';export async function exportResource(B,K){const L=d,T=await K[L(0x97)]['find']({'name':B[L(0x97)],'query':{'filter':parseFilterQuery(B),'sort':B['sort'],'search':B['search'],'limit':B['limit'],'offset':B['offset'],'fields':B['fields']},'user':B['user']});return T[L(0x98)];}
1
+ function n(s,J){s=s-0x12f;const N=W();let O=N[s];return O;}function W(){const E=['fields'];W=function(){return E;};return W();}import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';export async function exportResource(s,J){const O=n,N=await J['resource']['find']({'name':s['resource'],'query':{'filter':parseFilterQuery(s),'sort':s['sort'],'search':s['search'],'limit':s['limit'],'offset':s['offset'],'fields':s[O(0x12f)]},'user':s['user']});return N['rows'];}
@@ -1 +1 @@
1
- function d(B,K){B=B-0xfb;var T=E();var L=T[B];return L;}export async function getResource(B,K){var T=d;return K[T(0xfb)][T(0xfc)]({'name':B[T(0xfb)],'id':B['id'],'query':{'include':B['include']},'user':B['user']});}function E(){var L=['resource','findOne'];E=function(){return L;};return E();}
1
+ export async function getResource(s,J){var N=n;return J['resource']['findOne']({'name':s['resource'],'id':s['id'],'query':{'include':s[N(0xfc)]},'user':s['user']});}function n(s,J){s=s-0xfc;var N=W();var O=N[s];return O;}function W(){var O=['include'];W=function(){return O;};return W();}
@@ -1 +1 @@
1
- export async function listResourceRelation(B,K){const {resource:T,id:L,relation:x,query:y,user:P}=B;return K['resource']['findRelation']({'name':T,'id':L,'relation':x,'query':y,'user':P});}
1
+ export async function listResourceRelation(s,J){const {resource:N,id:O,relation:E,query:S,user:T}=s;return J['resource']['findRelation']({'name':N,'id':O,'relation':E,'query':S,'user':T});}
@@ -1 +1 @@
1
- {"version":3,"file":"list-resources.d.ts","sourceRoot":"","sources":["../../../../src/modules/resource/services/list-resources.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,wBAAsB,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAY9E"}
1
+ {"version":3,"file":"list-resources.d.ts","sourceRoot":"","sources":["../../../../src/modules/resource/services/list-resources.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,wBAAsB,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAa9E"}
@@ -1 +1 @@
1
- import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function d(B,K){B=B-0x11e;var T=E();var L=T[B];return L;}export async function listResources(B,K){var T=d;return K['resource']['find']({'name':B['resource'],'query':{'filter':parseFilterQuery(B),'sort':B['sort'],'search':B['search'],'limit':B['limit'],'offset':B['offset']??(B['page']?Math['max'](B['page']-0x1,0x0):0x0)*(B[T(0x11e)]??0x14)},'user':B[T(0x11f)]});}function E(){var L=['limit','user'];E=function(){return L;};return E();}
1
+ function W(){var O=['resource','search','limit','max'];W=function(){return O;};return W();}import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function n(s,J){s=s-0xf4;var N=W();var O=N[s];return O;}export async function listResources(s,J){var N=n;return J[N(0xf4)]['find']({'name':s[N(0xf4)],'query':{'filter':parseFilterQuery(s),'sort':s['sort'],'search':s[N(0xf5)],'scope':s['scope'],'limit':s[N(0xf6)],'offset':s['offset']??(s['page']?Math[N(0xf7)](s['page']-0x1,0x0):0x0)*(s['limit']??0x14)},'user':s['user']});}
@@ -1 +1 @@
1
- import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';export async function searchResource(B,K){return K['resource']['find']({'name':B['resource'],'query':{...B,'filter':parseFilterQuery(B)},'user':B['user']});}
1
+ function W(){var O=['resource','find'];W=function(){return O;};return W();}import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function n(s,J){s=s-0xd3;var N=W();var O=N[s];return O;}export async function searchResource(s,J){var N=n;return J[N(0xd3)][N(0xd4)]({'name':s['resource'],'query':{...s,'filter':parseFilterQuery(s)},'user':s['user']});}
@@ -1 +1 @@
1
- function E(){const u=['min','max','limit','now','table','text','value','query','SELECT\x20','\x20as\x20text\x20FROM\x20','\x20WHERE\x20lower(','toLowerCase','then','field','filter','startsWith'];E=function(){return u;};return E();}import{ValidationError}from'../../../errors.js';function d(B,K){B=B-0x1eb;const T=E();let L=T[B];return L;}import{autoIndex}from'../../../plugins/resource/utils/auto-index.js';export async function suggestResource(B,K){const r=d,T=K['resource']['get'](B['resource']),L=String(B['search']??B['q']??'')['toLowerCase'](),x=Math[r(0x1eb)](Math[r(0x1ec)](Number(B[r(0x1ed)]??0x14),0x1),0xc8),y=Date[r(0x1ee)](),P=T['fields'][B['field']],g=P?.['dictionary'],j=P?.['lookup']?.[r(0x1ef)];if(j){const Q=P['lookup']?.[r(0x1f0)]??'name',G=P['lookup']?.[r(0x1f1)]??'id';autoIndex(j,Q,r(0x1f0),K['pg']);const f=await K['pg'][r(0x1f2)](r(0x1f3)+G+'\x20as\x20id,\x20'+Q+r(0x1f4)+j+r(0x1f5)+Q+')\x20~\x20$1\x20LIMIT\x20$2',[''+L[r(0x1f6)](),x])[r(0x1f7)](A=>A['rows']);return{'limit':x,'count':f['length'],'search':L,'time':Date['now']()-y,'data':f};}if(!g)throw new ValidationError('Field\x20has\x20no\x20lookup\x20dictionary:\x20'+B[r(0x1f8)]);const p=await K['dictionary']['get'](g),J=p[r(0x1f9)](A=>!L||A['code'][r(0x1fa)](L)||A['name'][r(0x1fa)](L))['slice'](0x0,x)['map'](A=>({'id':A['code']||A['id'],'text':A['name']||A[r(0x1f0)]}));return{'search':L,'limit':x,'count':J['length'],'time':Date['now']()-y,'data':J};}
1
+ function n(s,J){s=s-0xd0;const N=W();let O=N[s];return O;}function W(){const Q=['limit','now','lookup','text','value','query','SELECT\x20','\x20as\x20text\x20FROM\x20','length','field','code','startsWith'];W=function(){return Q;};return W();}import{ValidationError}from'../../../errors.js';import{autoIndex}from'../../../plugins/resource/utils/auto-index.js';export async function suggestResource(s,J){const i=n,N=J['resource']['get'](s['resource']),O=String(s['search']??s['q']??'')['toLowerCase'](),E=Math['min'](Math['max'](Number(s[i(0xd0)]??0x14),0x1),0xc8),S=Date[i(0xd1)](),T=N['fields'][s['field']],f=T?.['dictionary'],a=T?.[i(0xd2)]?.['table'];if(a){const D=T['lookup']?.[i(0xd3)]??'name',R=T['lookup']?.[i(0xd4)]??'id';autoIndex(a,D,'text',J['pg']);const v=await J['pg'][i(0xd5)](i(0xd6)+R+'\x20as\x20id,\x20'+D+i(0xd7)+a+'\x20WHERE\x20lower('+D+')\x20~\x20$1\x20LIMIT\x20$2',[''+O['toLowerCase'](),E])['then'](o=>o['rows']);return{'limit':E,'count':v[i(0xd8)],'search':O,'time':Date['now']()-S,'data':v};}if(!f)throw new ValidationError('Field\x20has\x20no\x20lookup\x20dictionary:\x20'+s[i(0xd9)]);const g=await J['dictionary']['get'](f),p=g['filter'](o=>!O||o[i(0xda)][i(0xdb)](O)||o['name']['startsWith'](O))['slice'](0x0,E)['map'](o=>({'id':o['code']||o['id'],'text':o['name']||o[i(0xd3)]}));return{'search':O,'limit':E,'count':p['length'],'time':Date['now']()-S,'data':p};}
@@ -1 +1 @@
1
- export async function updateResourceRelation(B,K){const j=d,{resource:T,id:L,relation:x,relationId:y,data:P,user:g}=B;return K['resource'][j(0xfa)]({'name':T,'id':L,'relation':x,'relationId':y,'data':P,'user':g});}function d(B,K){B=B-0xfa;const T=E();let L=T[B];return L;}function E(){const p=['updateRelation'];E=function(){return p;};return E();}
1
+ export async function updateResourceRelation(s,J){const {resource:N,id:O,relation:E,relationId:S,data:T,user:f}=s;return J['resource']['updateRelation']({'name':N,'id':O,'relation':E,'relationId':S,'data':T,'user':f});}
@@ -1 +1 @@
1
- export async function updateResource(B,K){var T=d;return K[T(0x196)]['update']({'name':B[T(0x196)],'id':B['id'],'data':B['patch'],'user':B['user']});}function d(B,K){B=B-0x196;var T=E();var L=T[B];return L;}function E(){var L=['resource'];E=function(){return L;};return E();}
1
+ function n(s,J){s=s-0xb8;var N=W();var O=N[s];return O;}function W(){var O=['resource','update'];W=function(){return O;};return W();}export async function updateResource(s,J){var N=n;return J[N(0xb8)][N(0xb9)]({'name':s['resource'],'id':s['id'],'data':s['patch'],'user':s['user']});}
@@ -1 +1 @@
1
- import{ForbiddenError,NotFoundError,ValidationError}from'../../../errors.js';function d(B,K){B=B-0x1ac;const T=E();let L=T[B];return L;}function E(){const g=['resource','get','user','permissions','file','replace','files/','\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*\x0a\x20\x20\x20\x20','length'];E=function(){return g;};return E();}export async function uploadResourceFile(B,K){const P=d,T=K[P(0x1ac)][P(0x1ad)](B['resource']);if(T['access']==='admin'&&B[P(0x1ae)]?.['type']!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(B['user']?.['type']!=='admin'&&!B[P(0x1ae)]?.[P(0x1af)]?.['includes']((T['permission']??T['name'])+':update'))throw new ForbiddenError('Missing\x20permission:\x20'+(T['permission']??T['name'])+':update');if(!Buffer['isBuffer'](B['file'])||B[P(0x1b0)]['length']===0x0)throw new ValidationError('File\x20is\x20required');const L=B['fileName'][P(0x1b1)](/[^A-Za-z0-9._-]/g,'_');if(!L)throw new ValidationError('File\x20name\x20is\x20required');const x=P(0x1b2)+B['resource']+'/'+String(B['id'])+'/'+L;await K['file']['put'](x,B['file']);if(!await K['file']['exists'](x))throw new NotFoundError('Uploaded\x20file\x20not\x20found');const y=await K['pg']['query'](P(0x1b3),[B['resource'],String(B['id']),x,B[P(0x1b0)][P(0x1b4)]]);return y['rows'][0x0];}
1
+ import{ForbiddenError,NotFoundError,ValidationError}from'../../../errors.js';function n(s,J){s=s-0x1b3;const N=W();let O=N[s];return O;}export async function uploadResourceFile(s,J){const T=n,N=J['resource']['get'](s['resource']);if(N['access']==='admin'&&s['user']?.['type']!=='admin')throw new ForbiddenError(T(0x1b3));if(s['user']?.[T(0x1b4)]!=='admin'&&!s[T(0x1b5)]?.[T(0x1b6)]?.['includes']((N[T(0x1b7)]??N['name'])+':update'))throw new ForbiddenError('Missing\x20permission:\x20'+(N['permission']??N['name'])+':update');if(!Buffer['isBuffer'](s['file'])||s['file']['length']===0x0)throw new ValidationError('File\x20is\x20required');const O=s['fileName']['replace'](/[^A-Za-z0-9._-]/g,'_');if(!O)throw new ValidationError(T(0x1b8));const E='files/'+s[T(0x1b9)]+'/'+String(s['id'])+'/'+O;await J[T(0x1ba)]['put'](E,s['file']);if(!await J['file']['exists'](E))throw new NotFoundError(T(0x1bb));const S=await J['pg']['query'](T(0x1bc),[s[T(0x1b9)],String(s['id']),E,s['file'][T(0x1bd)]]);return S['rows'][0x0];}function W(){const f=['Admin\x20access\x20required','type','user','permissions','permission','File\x20name\x20is\x20required','resource','file','Uploaded\x20file\x20not\x20found','\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*\x0a\x20\x20\x20\x20','length'];W=function(){return f;};return W();}
@@ -1 +1 @@
1
- const j=d;import{getSystemSettings}from'./services/get-system-settings.js';function E(){const Q=['user','fcore','/api/dictionary/:name','system','Update\x20platform\x20dictionary','Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','dictionaryName','/api/access/:type/:id','post','Replaces\x20direct\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','system:access','system:settings','settings','Get\x20system\x20log','Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','type','get','Get\x20audit\x20log','system:audit','/api/system/list','List\x20APIs','apiListQuery'];E=function(){return Q;};return E();}import{updateSystemSettings}from'./services/update-system-settings.js';import{getAuditLog}from'./services/get-audit-log.js';import{checkSystem}from'./services/check-system.js';import{getApiList}from'./services/get-api-list.js';import{getSystemLog}from'./services/get-system-log.js';import{getDictionary}from'./services/get-dictionary.js';function d(B,K){B=B-0x1a1;const T=E();let L=T[B];return L;}import{updateDictionary}from'./services/update-dictionary.js';import{getAccess}from'./services/get-access.js';import{setAccess}from'./services/set-access.js';import{systemSchemas}from'./schema.js';const u=B=>B[j(0x1a1)];export function systemRoutes(B,K=new Map()){return async T=>{const p=d;T['get']('/api/dictionary/:name',{'schema':{'tags':[p(0x1a2),'system'],'summary':'Get\x20platform\x20dictionary','description':'Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','access':'user','permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName']}},async x=>({'items':await getDictionary({...x['params'],'user':u(x)},B)})),T['post'](p(0x1a3),{'schema':{'tags':[p(0x1a2),p(0x1a4)],'summary':p(0x1a5),'description':p(0x1a6),'access':'user','permissions':['system:dictionaries'],'params':systemSchemas[p(0x1a7)],'body':systemSchemas['dictionaryItems']}},async x=>updateDictionary({...x['params'],...x['body'],'user':u(x)},B));const L=async x=>getAccess({...x['params'],'user':u(x)},B);T['get'](p(0x1a8),{'schema':{'tags':[p(0x1a2),'system'],'summary':'Get\x20access\x20rules','description':'Returns\x20direct\x20and\x20role-based\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':['system:access'],'params':systemSchemas['accessTarget']}},L),T[p(0x1a9)]('/api/access/:type/:id',{'schema':{'tags':['fcore','system'],'summary':'Set\x20access\x20rules','description':p(0x1aa),'access':'admin','permissions':[p(0x1ab)],'params':systemSchemas['accessTarget'],'body':systemSchemas['access']}},async x=>setAccess({...x['params'],...x['body'],'user':u(x)},B)),T['get']('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20settings','description':'Returns\x20system\x20settings\x20as\x20nested\x20JSON.','access':'admin','permissions':['system:settings']}},async x=>getSystemSettings({...x['params'],'user':u(x)},B)),T['post']('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':'Update\x20system\x20settings','description':'Updates\x20system\x20settings\x20using\x20flat\x20dot-notation\x20keys.','access':'admin','permissions':[p(0x1ac)],'body':systemSchemas[p(0x1ad)]}},async x=>updateSystemSettings({...x['params'],'patch':x['body'],'user':u(x)},B)),T['get']('/api/system/logger',{'schema':{'tags':['fcore','system'],'summary':p(0x1ae),'description':p(0x1af),'access':'user','permissions':['system:logs'],'querystring':systemSchemas['logger']}},async(x,y)=>{const J=p,{contentType:P,body:g}=await getSystemLog({...x['query'],'user':u(x)},B);return y[J(0x1b0)](P)['send'](g);}),T[p(0x1b1)]('/api/system/audit',{'schema':{'tags':['fcore','system'],'summary':p(0x1b2),'description':'Returns\x20the\x20system\x20audit\x20log\x20entries.','access':'user','permissions':[p(0x1b3)]}},async x=>getAuditLog({...x['query'],'user':u(x)},B)),T['get']('/api/system/check',{'schema':{'tags':[p(0x1a2),'system'],'summary':'Check\x20system\x20health','description':'Checks\x20the\x20availability\x20of\x20system\x20dependencies.','access':'user','permissions':['system:check']}},async x=>checkSystem({'user':u(x)},B)),T[p(0x1b1)](p(0x1b4),{'schema':{'tags':[p(0x1a2),'system'],'summary':p(0x1b5),'description':'Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','access':'admin','permissions':[],'querystring':systemSchemas[p(0x1b6)]}},async x=>getApiList({'user':u(x),'apiRoutes':K,...x['query']},B));};}
1
+ import{getSystemSettings}from'./services/get-system-settings.js';import{updateSystemSettings}from'./services/update-system-settings.js';import{getAuditLog}from'./services/get-audit-log.js';import{checkSystem}from'./services/check-system.js';import{getApiList}from'./services/get-api-list.js';function n(s,J){s=s-0x1da;const N=W();let O=N[s];return O;}import{getSystemLog}from'./services/get-system-log.js';import{getDictionary}from'./services/get-dictionary.js';import{updateDictionary}from'./services/update-dictionary.js';import{getAccess}from'./services/get-access.js';import{setAccess}from'./services/set-access.js';import{systemSchemas}from'./schema.js';const u=s=>s['user'];export function systemRoutes(s,J=new Map()){return async N=>{const a=n;N['get']('/api/dictionary/:name',{'schema':{'tags':['fcore','system'],'summary':'Get\x20platform\x20dictionary','description':'Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','access':'user','permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName']}},async E=>({'items':await getDictionary({...E['params'],'user':u(E)},s)})),N[a(0x1da)](a(0x1db),{'schema':{'tags':['fcore','system'],'summary':'Update\x20platform\x20dictionary','description':a(0x1dc),'access':'user','permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName'],'body':systemSchemas['dictionaryItems']}},async E=>updateDictionary({...E[a(0x1dd)],...E[a(0x1de)],'user':u(E)},s));const O=async E=>getAccess({...E['params'],'user':u(E)},s);N[a(0x1df)]('/api/access/:type/:id',{'schema':{'tags':['fcore','system'],'summary':a(0x1e0),'description':'Returns\x20direct\x20and\x20role-based\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':['system:access'],'params':systemSchemas['accessTarget']}},O),N['post']('/api/access/:type/:id',{'schema':{'tags':[a(0x1e1),a(0x1e2)],'summary':'Set\x20access\x20rules','description':'Replaces\x20direct\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':['system:access'],'params':systemSchemas['accessTarget'],'body':systemSchemas['access']}},async E=>setAccess({...E['params'],...E[a(0x1de)],'user':u(E)},s)),N[a(0x1df)](a(0x1e3),{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20settings','description':'Returns\x20system\x20settings\x20as\x20nested\x20JSON.','access':'admin','permissions':['system:settings']}},async E=>getSystemSettings({...E['params'],'user':u(E)},s)),N['post']('/api/system/settings',{'schema':{'tags':['fcore',a(0x1e2)],'summary':'Update\x20system\x20settings','description':a(0x1e4),'access':'admin','permissions':['system:settings'],'body':systemSchemas['settings']}},async E=>updateSystemSettings({...E[a(0x1dd)],'patch':E[a(0x1de)],'user':u(E)},s)),N['get']('/api/system/logger',{'schema':{'tags':['fcore','system'],'summary':a(0x1e5),'description':'Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','access':a(0x1e6),'permissions':['system:logs'],'querystring':systemSchemas['logger']}},async(E,S)=>{const g=a,{contentType:T,body:f}=await getSystemLog({...E['query'],'user':u(E)},s);return S[g(0x1e7)](T)['send'](f);}),N['get']('/api/system/audit',{'schema':{'tags':['fcore','system'],'summary':'Get\x20audit\x20log','description':'Returns\x20the\x20system\x20audit\x20log\x20entries.','access':'user','permissions':['system:audit']}},async E=>getAuditLog({...E['query'],'user':u(E)},s)),N[a(0x1df)]('/api/system/check',{'schema':{'tags':['fcore','system'],'summary':'Check\x20system\x20health','description':a(0x1e8),'access':'user','permissions':['system:check']}},async E=>checkSystem({'user':u(E)},s)),N[a(0x1df)]('/api/system/list',{'schema':{'tags':[a(0x1e1),'system'],'summary':'List\x20APIs','description':'Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','access':a(0x1e9),'permissions':[],'querystring':systemSchemas['apiListQuery']}},async E=>getApiList({'user':u(E),'apiRoutes':J,...E['query']},s));};}function W(){const p=['post','/api/dictionary/:name','Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','params','body','get','Get\x20access\x20rules','fcore','system','/api/system/settings','Updates\x20system\x20settings\x20using\x20flat\x20dot-notation\x20keys.','Get\x20system\x20log','user','type','Checks\x20the\x20availability\x20of\x20system\x20dependencies.','admin'];W=function(){return p;};return W();}
@@ -1 +1 @@
1
- function d(B,K){B=B-0x7d;const T=E();let L=T[B];return L;}const B=d;function E(){const K=['^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$','Object','Optional','Union','String','^[A-Za-z0-9_-]+(?::[A-Za-z0-9_-]+)?$','Array','short','extended','Record'];E=function(){return K;};return E();}import{Type}from'@sinclair/typebox';export const identifier=Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':B(0x7d)});export const systemSchemas={'dictionaryName':Type['Object']({'name':identifier}),'dictionaryItems':Type[B(0x7e)]({'items':Type['Array'](Type['Object']({'id':Type[B(0x7f)](Type[B(0x80)]([Type[B(0x81)](),Type['Number']()])),'code':Type[B(0x81)]({'minLength':0x1}),'name':Type[B(0x81)]({'minLength':0x1}),'parentId':Type[B(0x7f)](Type['Union']([Type[B(0x81)](),Type['Number'](),Type['Null']()]))},{'additionalProperties':!![]}))}),'accessTarget':Type[B(0x7e)]({'type':Type['Union']([Type['Literal']('user'),Type['Literal']('role')]),'id':identifier}),'access':Type['Object']({'permissions':Type[B(0x7f)](Type['Array'](Type[B(0x81)]({'minLength':0x1,'maxLength':0x80,'pattern':B(0x82)}))),'access':Type['Optional'](Type[B(0x83)](Type['Object']({'resource':Type['String']({'minLength':0x1,'maxLength':0x80}),'actions':Type[B(0x83)](Type['String']({'minLength':0x1,'maxLength':0x80}),{'minItems':0x1})})))}),'apiListQuery':Type['Object']({'format':Type['Optional'](Type['Union']([Type['Literal'](B(0x84)),Type['Literal'](B(0x85))]))}),'settingsEntity':Type[B(0x7e)]({'entity':Type['Optional'](identifier)}),'settings':Type[B(0x86)](Type['String']({'minLength':0x1}),Type['Unknown']()),'logger':Type['Object']({'path':Type[B(0x7f)](Type[B(0x81)]({'maxLength':0x100,'pattern':'^[A-Za-z0-9_.\x5c-/]*$'}))})};
1
+ function W(){const J=['^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$','Optional','Union','extended','Object','String'];W=function(){return J;};return W();}const s=n;import{Type}from'@sinclair/typebox';function n(s,J){s=s-0xfc;const N=W();let O=N[s];return O;}export const identifier=Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':s(0xfc)});export const systemSchemas={'dictionaryName':Type['Object']({'name':identifier}),'dictionaryItems':Type['Object']({'items':Type['Array'](Type['Object']({'id':Type[s(0xfd)](Type['Union']([Type['String'](),Type['Number']()])),'code':Type['String']({'minLength':0x1}),'name':Type['String']({'minLength':0x1}),'parentId':Type['Optional'](Type[s(0xfe)]([Type['String'](),Type['Number'](),Type['Null']()]))},{'additionalProperties':!![]}))}),'accessTarget':Type['Object']({'type':Type['Union']([Type['Literal']('user'),Type['Literal']('role')]),'id':identifier}),'access':Type['Object']({'permissions':Type['Optional'](Type['Array'](Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':'^[A-Za-z0-9_-]+(?::[A-Za-z0-9_-]+)?$'}))),'access':Type['Optional'](Type['Array'](Type['Object']({'resource':Type['String']({'minLength':0x1,'maxLength':0x80}),'actions':Type['Array'](Type['String']({'minLength':0x1,'maxLength':0x80}),{'minItems':0x1})})))}),'apiListQuery':Type['Object']({'format':Type['Optional'](Type[s(0xfe)]([Type['Literal']('short'),Type['Literal'](s(0xff))]))}),'settingsEntity':Type[s(0x100)]({'entity':Type[s(0xfd)](identifier)}),'settings':Type['Record'](Type[s(0x101)]({'minLength':0x1}),Type['Unknown']()),'logger':Type[s(0x100)]({'path':Type[s(0xfd)](Type['String']({'maxLength':0x100,'pattern':'^[A-Za-z0-9_.\x5c-/]*$'}))})};
@@ -1 +1 @@
1
- export async function checkSystem(B,K){const x=d,[T,L]=await Promise['allSettled']([K['pg'][x(0x7b)]('SELECT\x201'),K['redis'][x(0x7c)]()]);return{'status':T['status']==='fulfilled'&&L['status']==='fulfilled'?'ok':x(0x7d),'pg':T['status'],'redis':L[x(0x7e)]};}function d(B,K){B=B-0x7b;const T=E();let L=T[B];return L;}function E(){const y=['query','ping','degraded','status'];E=function(){return y;};return E();}
1
+ function n(s,J){s=s-0x1a5;const N=W();let O=N[s];return O;}function W(){const S=['query','SELECT\x201','ping','fulfilled','degraded'];W=function(){return S;};return W();}export async function checkSystem(s,J){const E=n,[N,O]=await Promise['allSettled']([J['pg'][E(0x1a5)](E(0x1a6)),J['redis'][E(0x1a7)]()]);return{'status':N['status']==='fulfilled'&&O['status']===E(0x1a8)?'ok':E(0x1a9),'pg':N['status'],'redis':O['status']};}
@@ -1 +1 @@
1
- function d(B,K){B=B-0x71;const T=E();let L=T[B];return L;}export async function getAccess(B,K){const P=d,T=B['type']==='user'?P(0x71):'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.role_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20',L=await K['pg']['query'](T,[B['id']]),x=[...new Set(L[P(0x72)][P(0x73)](y=>y['resource'])['filter'](y=>y!==null))];return{'access':L['rows'],'resources':x};}function E(){const g=['\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20ur.role_id\x20=\x20ra.role_id\x20AND\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20','rows','map'];E=function(){return g;};return E();}
1
+ function n(s,J){s=s-0x1a9;const N=W();let O=N[s];return O;}function W(){const f=['query','filter','rows'];W=function(){return f;};return W();}export async function getAccess(s,J){const T=n,N=s['type']==='user'?'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20ur.role_id\x20=\x20ra.role_id\x20AND\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20':'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.role_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20',O=await J['pg'][T(0x1a9)](N,[s['id']]),E=[...new Set(O['rows']['map'](S=>S['resource'])[T(0x1aa)](S=>S!==null))];return{'access':O[T(0x1ab)],'resources':E};}
@@ -1 +1 @@
1
- export async function getApiList(B,K){const g=d,T=[...B[g(0x19b)][g(0x19c)]()][g(0x19d)]((L,x)=>(L['endpoint']+'\x20'+L[g(0x19e)])[g(0x19f)](x['endpoint']+'\x20'+x['method']));if(B['format']!=='short')return T;return T['map'](({method:L,endpoint:x,access:y,permissions:P})=>L+'\x20'+x);}function d(B,K){B=B-0x19b;const T=E();let L=T[B];return L;}function E(){const j=['apiRoutes','values','sort','method','localeCompare'];E=function(){return j;};return E();}
1
+ function n(s,J){s=s-0x78;const N=W();let O=N[s];return O;}export async function getApiList(s,J){const f=n,N=[...s[f(0x78)]['values']()][f(0x79)]((O,E)=>(O[f(0x7a)]+'\x20'+O['method'])['localeCompare'](E[f(0x7a)]+'\x20'+E['method']));if(s['format']!=='short')return N;return N['map'](({method:O,endpoint:E,access:S,permissions:T})=>O+'\x20'+E);}function W(){const a=['apiRoutes','sort','endpoint'];W=function(){return a;};return W();}
@@ -1 +1 @@
1
- function d(B,K){B=B-0xd6;const T=E();let L=T[B];return L;}function E(){const P=['max','SELECT\x0a\x20\x20\x20\x20\x20\x20l.*,\x0a\x20\x20\x20\x20\x20\x20case\x20when\x20u.first_name\x20is\x20not\x20null\x20then\x20coalesce(u.last_name,\x27\x27)||coalesce(\x27\x20\x27||u.first_name,\x27\x27)\x20else\x20coalesce(u.login,\x20u.email,\x27\x27)\x20end\x20as\x20user_id_text\x0a\x20\x20\x20\x20FROM\x20admin.audit_log\x20l\x0a\x20\x20\x20\x20JOIN\x20admin.users\x20u\x20ON\x20l.user_id=u.uid\x0a\x20\x20\x20\x20ORDER\x20BY\x20id\x20DESC\x20LIMIT\x20$1\x20OFFSET\x20$2','page'];E=function(){return P;};return E();}export async function getAuditLog(B,K){const y=d,T=Math['min'](Math[y(0xd6)](B['limit']??0x32,0x1),0xc8),L=Math[y(0xd6)]((B['page']??0x1)-0x1,0x0)*T,x=await K['pg']['query'](y(0xd7),[T,L]);return{'rows':x['rows'],'page':B[y(0xd8)]??0x1,'limit':T};}
1
+ function n(s,J){s=s-0x173;const N=W();let O=N[s];return O;}function W(){const T=['min','limit','max','SELECT\x0a\x20\x20\x20\x20\x20\x20l.*,\x0a\x20\x20\x20\x20\x20\x20case\x20when\x20u.first_name\x20is\x20not\x20null\x20then\x20coalesce(u.last_name,\x27\x27)||coalesce(\x27\x20\x27||u.first_name,\x27\x27)\x20else\x20coalesce(u.login,\x20u.email,\x27\x27)\x20end\x20as\x20user_id_text\x0a\x20\x20\x20\x20FROM\x20admin.audit_log\x20l\x0a\x20\x20\x20\x20JOIN\x20admin.users\x20u\x20ON\x20l.user_id=u.uid\x0a\x20\x20\x20\x20ORDER\x20BY\x20id\x20DESC\x20LIMIT\x20$1\x20OFFSET\x20$2'];W=function(){return T;};return W();}export async function getAuditLog(s,J){const S=n,N=Math[S(0x173)](Math['max'](s[S(0x174)]??0x32,0x1),0xc8),O=Math[S(0x175)]((s['page']??0x1)-0x1,0x0)*N,E=await J['pg']['query'](S(0x176),[N,O]);return{'rows':E['rows'],'page':s['page']??0x1,'limit':N};}
@@ -1 +1 @@
1
- export async function getDictionary(B,K){var T=d;return K[T(0x13a)]['get'](B['name']);}function d(B,K){B=B-0x13a;var T=E();var L=T[B];return L;}function E(){var L=['dictionary'];E=function(){return L;};return E();}
1
+ function W(){var O=['dictionary','name'];W=function(){return O;};return W();}function n(s,J){s=s-0xab;var N=W();var O=N[s];return O;}export async function getDictionary(s,J){var N=n;return J[N(0xab)]['get'](s[N(0xac)]);}
@@ -1 +1 @@
1
- const A=d;import B from'node:fs/promises';import K from'node:path';import{NotFoundError,ValidationError}from'../../../errors.js';const LOGS_ROOT=K[A(0x14d)](process['cwd'](),'logs'),TAIL_LINES=0x64;function E(){const O=['resolve','sep','join','name','directory','mtime','sort','text/plain;\x20charset=utf-8','map','replace','&gt;','split','open','concat','toString','utf8','filter'];E=function(){return O;};return E();}export async function getSystemLog(T,L){const r=A,x=normalizePath(T['path']),y=K['resolve'](LOGS_ROOT,x);if(y!==LOGS_ROOT&&!y['startsWith'](LOGS_ROOT+K[r(0x14e)]))throw new ValidationError('Invalid\x20log\x20path');const P=await B['stat'](y)['catch'](()=>null);if(!P)throw new NotFoundError('Log\x20path\x20not\x20found');if(P['isDirectory']()){const j=await B['readdir'](y,{'withFileTypes':!![]}),p=await Promise['all'](j['map'](async J=>{const u=r,Q=await B['stat'](K[u(0x14f)](y,J[u(0x150)]));return{'name':J['name'],'path':x?x+'/'+J['name']:J['name'],'type':J['isDirectory']()?u(0x151):'file','size':J['isDirectory']()?undefined:Q['size'],'modified':Q[u(0x152)]['toISOString']()};}));p[r(0x153)]((J,Q)=>J[r(0x150)]['localeCompare'](Q[r(0x150)]));if(x){const J=x['split']('/')['slice'](0x0,-0x1)[r(0x14f)]('/');p['unshift']({'name':'..','path':J,'type':'directory'});}return{'contentType':'text/html;\x20charset=utf-8','body':renderDirectory(x,p)};}const g=await tailFile(y,TAIL_LINES);return{'contentType':r(0x154),'body':g['join']('\x0a')};}function renderDirectory(T,L){const c=A,x=L[c(0x155)](P=>{const h=c,g='?path='+encodeURIComponent(P['path']),j=P['type']===h(0x151)?P['name']+'/':P['name'];return'<li><a\x20href=\x22'+g+'\x22>'+escapeHtml(j)+'</a></li>';})[c(0x14f)]('\x0a'),y=escapeHtml('logs/'+T);return'<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>'+y+'</title></head>\x0a<body>\x0a<h1>'+y+'</h1>\x0a<ul>\x0a'+x+'\x0a</ul>\x0a</body>\x0a</html>';}function escapeHtml(T){const S=A;return T['replace'](/&/g,'&amp;')[S(0x156)](/</g,'&lt;')['replace'](/>/g,S(0x157))['replace'](/"/g,'&quot;');}function normalizePath(T){const Y=A,L=(T??'')['replace'](/\\/g,'/')['replace'](/^\/+|\/+$/g,'');if(L[Y(0x158)]('/')['some'](x=>x==='..'))throw new ValidationError('Invalid\x20log\x20path');return L;}async function tailFile(T,L){const l=A,x=await B[l(0x159)](T,'r');try{const {size:y}=await x['stat'](),P=0x40*0x400;let g=y,j=Buffer['alloc'](0x0),p=0x0;while(g>0x0&&p<=L){const Q=Math['min'](P,g);g-=Q;const G=Buffer['alloc'](Q);await x['read'](G,0x0,Q,g),j=Buffer[l(0x15a)]([G,j]),p+=countNewlines(G);}const J=j[l(0x15b)](l(0x15c))['split']('\x0a')[l(0x15d)](f=>f['length']>0x0);return J['slice'](-L)['reverse']();}finally{await x['close']();}}function d(B,K){B=B-0x14d;const T=E();let L=T[B];return L;}function countNewlines(T){let L=0x0;for(const x of T){if(x===0xa)L++;}return L;}
1
+ import s from'node:fs/promises';import J from'node:path';import{NotFoundError,ValidationError}from'../../../errors.js';const LOGS_ROOT=J['resolve'](process['cwd'](),'logs'),TAIL_LINES=0x64;export async function getSystemLog(N,O){const o=n,E=normalizePath(N['path']),S=J['resolve'](LOGS_ROOT,E);if(S!==LOGS_ROOT&&!S['startsWith'](LOGS_ROOT+J['sep']))throw new ValidationError('Invalid\x20log\x20path');const T=await s['stat'](S)['catch'](()=>null);if(!T)throw new NotFoundError('Log\x20path\x20not\x20found');if(T['isDirectory']()){const a=await s['readdir'](S,{'withFileTypes':!![]}),g=await Promise[o(0x121)](a['map'](async p=>{const i=o,D=await s['stat'](J[i(0x122)](S,p['name']));return{'name':p['name'],'path':E?E+'/'+p['name']:p['name'],'type':p[i(0x123)]()?i(0x124):'file','size':p['isDirectory']()?undefined:D[i(0x125)],'modified':D['mtime']['toISOString']()};}));g[o(0x126)]((p,D)=>p['name']['localeCompare'](D['name']));if(E){const p=E['split']('/')['slice'](0x0,-0x1)['join']('/');g[o(0x127)]({'name':'..','path':p,'type':'directory'});}return{'contentType':'text/html;\x20charset=utf-8','body':renderDirectory(E,g)};}const f=await tailFile(S,TAIL_LINES);return{'contentType':o(0x128),'body':f['join']('\x0a')};}function W(){const L=['all','join','isDirectory','directory','size','sort','unshift','text/plain;\x20charset=utf-8','?path=','logs/','</title></head>\x0a<body>\x0a<h1>','replace','&gt;','alloc','min','utf8','split','slice','reverse'];W=function(){return L;};return W();}function renderDirectory(N,O){const u=n,E=O['map'](T=>{const Q=n,f=Q(0x129)+encodeURIComponent(T['path']),a=T['type']==='directory'?T['name']+'/':T['name'];return'<li><a\x20href=\x22'+f+'\x22>'+escapeHtml(a)+'</a></li>';})['join']('\x0a'),S=escapeHtml(u(0x12a)+N);return'<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>'+S+u(0x12b)+S+'</h1>\x0a<ul>\x0a'+E+'\x0a</ul>\x0a</body>\x0a</html>';}function n(s,J){s=s-0x121;const N=W();let O=N[s];return O;}function escapeHtml(N){const e=n;return N['replace'](/&/g,'&amp;')[e(0x12c)](/</g,'&lt;')['replace'](/>/g,e(0x12d))[e(0x12c)](/"/g,'&quot;');}function normalizePath(N){const x=n,O=(N??'')[x(0x12c)](/\\/g,'/')['replace'](/^\/+|\/+$/g,'');if(O['split']('/')['some'](E=>E==='..'))throw new ValidationError('Invalid\x20log\x20path');return O;}async function tailFile(N,O){const G=n,E=await s['open'](N,'r');try{const {size:S}=await E['stat'](),T=0x40*0x400;let f=S,a=Buffer[G(0x12e)](0x0),g=0x0;while(f>0x0&&g<=O){const D=Math[G(0x12f)](T,f);f-=D;const R=Buffer['alloc'](D);await E['read'](R,0x0,D,f),a=Buffer['concat']([R,a]),g+=countNewlines(R);}const p=a['toString'](G(0x130))[G(0x131)]('\x0a')['filter'](v=>v['length']>0x0);return p[G(0x132)](-O)[G(0x133)]();}finally{await E['close']();}}function countNewlines(N){let O=0x0;for(const E of N){if(E===0xa)O++;}return O;}
@@ -1 +1 @@
1
- function E(){const J=['\x0a\x20\x20\x20\x20\x20\x20SELECT\x20key,\x20value\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.settings\x0a\x20\x20\x20\x20\x20\x20WHERE\x20resource\x20=\x20\x27system\x27\x20AND\x20resource_id\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20key\x0a\x20\x20\x20\x20','rows','reduce','key','split'];E=function(){return J;};return E();}function d(B,K){B=B-0x146;const T=E();let L=T[B];return L;}export async function getSystemSettings(B,K){const j=d,T=await K['pg']['query'](j(0x146));return T[j(0x147)][j(0x148)]((L,x)=>{const p=j,y=String(x[p(0x149)])[p(0x14a)]('.');let P=L;for(const g of y['slice'](0x0,-0x1)){P[g]??={},P=P[g];}return P[y['at'](-0x1)]=x['value'],L;},{});}
1
+ function n(s,J){s=s-0x9c;const N=W();let O=N[s];return O;}export async function getSystemSettings(s,J){const a=n,N=await J['pg'][a(0x9c)]('\x0a\x20\x20\x20\x20\x20\x20SELECT\x20key,\x20value\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.settings\x0a\x20\x20\x20\x20\x20\x20WHERE\x20resource\x20=\x20\x27system\x27\x20AND\x20resource_id\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20key\x0a\x20\x20\x20\x20');return N[a(0x9d)]['reduce']((O,E)=>{const g=a,S=String(E[g(0x9e)])['split']('.');let T=O;for(const f of S['slice'](0x0,-0x1)){T[f]??={},T=T[f];}return T[S['at'](-0x1)]=E['value'],O;},{});}function W(){const p=['query','rows','key'];W=function(){return p;};return W();}
@@ -1 +1 @@
1
- function E(){var L=['list'];E=function(){return L;};return E();}function d(B,K){B=B-0x146;var T=E();var L=T[B];return L;}export async function listDictionaries(B,K){var T=d;return K['dictionary'][T(0x146)]();}
1
+ function W(){var O=['dictionary'];W=function(){return O;};return W();}function n(s,J){s=s-0x1a6;var N=W();var O=N[s];return O;}export async function listDictionaries(s,J){var N=n;return J[N(0x1a6)]['list']();}
@@ -1 +1 @@
1
- const J=d;import{getAccess}from'./get-access.js';function d(B,K){B=B-0x16f;const T=E();let L=T[B];return L;}const CRUD_ACTIONS=['read',J(0x16f),'create',J(0x170)];function permissionsToAccess(B){const K=new Map();for(const T of B){const [L,x]=T['split'](':');if(!L)continue;const y=x==='edit'?'update':x,P=K['get'](L)??new Set();for(const g of y?[y]:CRUD_ACTIONS)P['add'](g);K['set'](L,P);}return[...K]['map'](([j,p])=>({'resource':j,'actions':[...p]}));}export async function setAccess(B,K){const Q=J,T=await K['pg']['connect']();try{await T[Q(0x171)](Q(0x172));B[Q(0x173)]==='user'?await T['query'](Q(0x174),[B['id']]):await T['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL',[B['id']]);const L=B['permissions']?permissionsToAccess(B['permissions']):B['access']??[];for(const x of L){B[Q(0x173)]==='user'?await T['query'](Q(0x175),[x['resource'],x['actions'],B['id'],B['user']['id'],B[Q(0x176)]['id']]):await T['query']('INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20role_id,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)',[x['resource'],x['actions'],B['id'],B['user']['id'],B['user']['id']]);}await T['query']('COMMIT');}catch(y){await T[Q(0x171)]('ROLLBACK');throw y;}finally{T[Q(0x177)]();}return getAccess(B,K);}function E(){const G=['update','delete','query','BEGIN','type','DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL','INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20user_uid,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)','user','release'];E=function(){return G;};return E();}
1
+ function n(s,J){s=s-0x9e;const N=W();let O=N[s];return O;}function W(){const v=['create','get','add','map','connect','query','BEGIN','type','DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL','permissions','user','actions','COMMIT'];W=function(){return v;};return W();}const p=n;import{getAccess}from'./get-access.js';const CRUD_ACTIONS=['read','update',p(0x9e),'delete'];function permissionsToAccess(s){const D=p,J=new Map();for(const N of s){const [O,E]=N['split'](':');if(!O)continue;const S=E==='edit'?'update':E,T=J[D(0x9f)](O)??new Set();for(const f of S?[S]:CRUD_ACTIONS)T[D(0xa0)](f);J['set'](O,T);}return[...J][D(0xa1)](([a,g])=>({'resource':a,'actions':[...g]}));}export async function setAccess(s,J){const R=p,N=await J['pg'][R(0xa2)]();try{await N[R(0xa3)](R(0xa4));s[R(0xa5)]==='user'?await N['query'](R(0xa6),[s['id']]):await N['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL',[s['id']]);const O=s[R(0xa7)]?permissionsToAccess(s[R(0xa7)]):s['access']??[];for(const E of O){s['type']==='user'?await N['query']('INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20user_uid,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)',[E['resource'],E['actions'],s['id'],s[R(0xa8)]['id'],s['user']['id']]):await N['query']('INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20role_id,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)',[E['resource'],E[R(0xa9)],s['id'],s[R(0xa8)]['id'],s[R(0xa8)]['id']]);}await N['query'](R(0xaa));}catch(S){await N['query']('ROLLBACK');throw S;}finally{N['release']();}return getAccess(s,J);}
@@ -1 +1 @@
1
- function d(B,K){B=B-0x1a1;var T=E();var L=T[B];return L;}export async function updateDictionary(B,K){var T=d;return await K['dictionary']['put'](B[T(0x1a1)],B['items']),{'success':!![]};}function E(){var L=['name'];E=function(){return L;};return E();}
1
+ export async function updateDictionary(s,J){var N=n;return await J[N(0xc0)]['put'](s['name'],s[N(0xc1)]),{'success':!![]};}function n(s,J){s=s-0xc0;var N=W();var O=N[s];return O;}function W(){var O=['dictionary','items'];W=function(){return O;};return W();}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';function d(B,K){B=B-0x1b0;const T=E();let L=T[B];return L;}export async function updateSystemSettings(B,K){const x=d;if(!Object[x(0x1b0)](B[x(0x1b1)])[x(0x1b2)])throw new ValidationError('Settings\x20patch\x20is\x20empty');for(const [T,L]of Object['entries'](B['patch'])){if(!T['trim']()||T[x(0x1b3)]('..'))throw new ValidationError('Invalid\x20setting\x20key:\x20'+T);await K['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',[T,JSON[x(0x1b4)](L),B['user']['id']]);}return{'success':!![]};}function E(){const y=['keys','patch','length','includes','stringify'];E=function(){return y;};return E();}
1
+ import{ValidationError}from'../../../errors.js';export async function updateSystemSettings(s,J){const E=n;if(!Object[E(0xd5)](s['patch'])[E(0xd6)])throw new ValidationError('Settings\x20patch\x20is\x20empty');for(const [N,O]of Object[E(0xd7)](s[E(0xd8)])){if(!N['trim']()||N[E(0xd9)]('..'))throw new ValidationError(E(0xda)+N);await J['pg']['query'](E(0xdb),[N,JSON['stringify'](O),s[E(0xdc)]['id']]);}return{'success':!![]};}function n(s,J){s=s-0xd5;const N=W();let O=N[s];return O;}function W(){const S=['keys','length','entries','patch','includes','Invalid\x20setting\x20key:\x20','\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','user'];W=function(){return S;};return W();}
@@ -1 +1 @@
1
- function d(B,K){B=B-0x15a;var T=E();var L=T[B];return L;}import{ForbiddenError}from'../../errors.js';function E(){var L=['admin','Admin\x20access\x20required'];E=function(){return L;};return E();}export function requireAdmin(B,K){var T=d;if(!B)throw new ForbiddenError('User\x20required');if(B['type']!==T(0x15a))throw new ForbiddenError(T(0x15b));if(B['type']!=='admin'&&K&&!B['permissions']?.['includes'](K))throw new ForbiddenError('Missing\x20permission:\x20'+K);}
1
+ function W(){var O=['includes'];W=function(){return O;};return W();}function n(s,J){s=s-0x1d2;var N=W();var O=N[s];return O;}import{ForbiddenError}from'../../errors.js';export function requireAdmin(s,J){var N=n;if(!s)throw new ForbiddenError('User\x20required');if(s['type']!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(s['type']!=='admin'&&J&&!s['permissions']?.[N(0x1d2)](J))throw new ForbiddenError('Missing\x20permission:\x20'+J);}
@@ -1 +1 @@
1
- function d(B,K){B=B-0xdc;const T=E();let L=T[B];return L;}function E(){const y=['secret','credentials','fromEntries','entries'];E=function(){return y;};return E();}export const safeUser=B=>{const x=d,K=['password','salt',x(0xdc),x(0xdd)];return Object[x(0xde)](Object[x(0xdf)](B)['filter'](([T])=>!K['some'](L=>T['toLowerCase']()['includes'](L))));};
1
+ function n(s,J){s=s-0x1dc;const N=W();let O=N[s];return O;}function W(){const S=['salt','credentials','fromEntries','entries','includes'];W=function(){return S;};return W();}export const safeUser=s=>{const E=n,J=['password',E(0x1dc),'secret',E(0x1dd)];return Object[E(0x1de)](Object[E(0x1df)](s)['filter'](([N])=>!J['some'](O=>N['toLowerCase']()[E(0x1e0)](O))));};
@@ -1 +1 @@
1
- function E(){var T=['\x20requires\x20a\x20project/provider\x20implementation'];E=function(){return T;};return E();}import{UnsupportedError}from'../../errors.js';function d(B,K){B=B-0x11b;var T=E();var L=T[B];return L;}export function unsupported(B){var K=d;throw new UnsupportedError(B+K(0x11b));}
1
+ function n(s,J){s=s-0x1e6;var N=W();var O=N[s];return O;}function W(){var N=['\x20requires\x20a\x20project/provider\x20implementation'];W=function(){return N;};return W();}import{UnsupportedError}from'../../errors.js';export function unsupported(s){var J=n;throw new UnsupportedError(s+J(0x1e6));}
@@ -1 +1 @@
1
- import{writeAudit}from'./services/write-audit.js';export function createAudit(B){const K=writeAudit(B);return{'write':K};}
1
+ import{writeAudit}from'./services/write-audit.js';export function createAudit(s){const J=writeAudit(s);return{'write':J};}
@@ -1 +1 @@
1
- function d(B,K){B=B-0x15b;const T=E();let L=T[B];return L;}const secretPattern=/password|token|secret|credential|salt/i;function clean(B){const p=d;if(Array['isArray'](B))return B[p(0x15b)](clean);if(B&&typeof B===p(0x15c))return Object['fromEntries'](Object[p(0x15d)](B)['map'](([K,T])=>[K,secretPattern[p(0x15e)](K)?'[REDACTED]':clean(T)]));return B;}function E(){const A=['map','object','entries','test','query','then','has','audit_log_data','admin.audit_log','warn','changes','empty\x20pg','resourceId','requestId','ipAddress','\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','field'];E=function(){return A;};return E();}export function writeAudit(B){let K,T;async function L(){const J=d;if(!B['pg'])return![];if(K!==undefined)return K;return T??=B['pg'][J(0x15f)]('\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')[J(0x160)](x=>{const Q=J,y=new Set(x['rows'][Q(0x15b)](P=>P['table_name']));return K=y[Q(0x161)]('audit_log')&&y[Q(0x161)](Q(0x162)),!K&&B['logger']['warn']({'expectedTables':[Q(0x163),'admin.audit_log_data'],'foundTables':[...y]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),K;})['catch'](x=>{const G=J;return K=![],B['logger'][G(0x164)]({'err':x},'Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled'),![];}),T;}return async function x(y){const f=d;if(!await L())return B['logger']['info']({'auditFallback':!![],'event':clean({...y,'changes':y[f(0x165)]?.['map'](j=>({...j,'oldValue':clean(j['oldValue']),'newValue':clean(j['newValue'])}))})},'audit'),0x0;if(!B['pg'])throw new Error(f(0x166));const P=await B['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20user_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20module,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resource,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resource_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fields,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20action,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20request_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ip_address,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20metadata\x0a\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5,\x20$6,\x20$7,\x20$8,\x20$9)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20id\x0a\x20\x20\x20\x20\x20\x20',[y['userId']??null,y['module'],y['resource'],y['resourceId']==null?null:String(y[f(0x167)]),y['fields']??null,y['action'],y[f(0x168)]??null,y[f(0x169)]??null,clean(y['metadata']??{})]),g=P['rows'][0x0]['id'];for(const j of y[f(0x165)]??[]){if(secretPattern[f(0x15e)](j['field']))continue;await B['pg'][f(0x15f)](f(0x16a),[g,j[f(0x16b)],JSON['stringify'](clean(j['oldValue'])),JSON['stringify'](clean(j['newValue']))]);}return g;};}
1
+ const secretPattern=/password|token|secret|credential|salt/i;function n(s,J){s=s-0x1ba;const N=W();let O=N[s];return O;}function clean(s){const g=n;if(Array[g(0x1ba)](s))return s['map'](clean);if(s&&typeof s==='object')return Object['fromEntries'](Object['entries'](s)['map'](([J,N])=>[J,secretPattern['test'](J)?'[REDACTED]':clean(N)]));return s;}export function writeAudit(s){let J,N;async function O(){const p=n;if(!s['pg'])return![];if(J!==undefined)return J;return N??=s['pg']['query'](p(0x1bb))['then'](E=>{const D=p,S=new Set(E['rows']['map'](T=>T['table_name']));return J=S[D(0x1bc)](D(0x1bd))&&S['has']('audit_log_data'),!J&&s[D(0x1be)]['warn']({'expectedTables':[D(0x1bf),D(0x1c0)],'foundTables':[...S]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),J;})['catch'](E=>{return J=![],s['logger']['warn']({'err':E},'Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled'),![];}),N;}return async function E(S){const R=n;if(!await O())return s['logger']['info']({'auditFallback':!![],'event':clean({...S,'changes':S[R(0x1c1)]?.[R(0x1c2)](a=>({...a,'oldValue':clean(a['oldValue']),'newValue':clean(a[R(0x1c3)])}))})},'audit'),0x0;if(!s['pg'])throw new Error(R(0x1c4));const T=await s['pg'][R(0x1c5)]('\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',[S['userId']??null,S[R(0x1c6)],S['resource'],S['resourceId']==null?null:String(S['resourceId']),S['fields']??null,S['action'],S['requestId']??null,S['ipAddress']??null,clean(S['metadata']??{})]),f=T[R(0x1c7)][0x0]['id'];for(const a of S['changes']??[]){if(secretPattern['test'](a[R(0x1c8)]))continue;await s['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log_data\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20audit_log_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20field,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20old_value,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20new_value\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[f,a['field'],JSON[R(0x1c9)](clean(a['oldValue'])),JSON['stringify'](clean(a[R(0x1c3)]))]);}return f;};}function W(){const v=['isArray','\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','has','audit_log','logger','admin.audit_log','admin.audit_log_data','changes','map','newValue','empty\x20pg','query','module','rows','field','stringify'];W=function(){return v;};return W();}
@@ -1 +1 @@
1
- function d(B,K){B=B-0x1d5;const T=E();let L=T[B];return L;}export async function getUserPermissions(B,K){const x=d,T=await K['pg'][x(0x1d5)]('\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',[B]);return T[x(0x1d6)]['map'](L=>L['permission']);}function E(){const y=['query','rows'];E=function(){return y;};return E();}
1
+ export async function getUserPermissions(s,J){const N=await J['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',[s]);return N['rows']['map'](O=>O['permission']);}
@@ -1 +1 @@
1
- export*from'./auth.types.js';import{randomBytes,scrypt as B,timingSafeEqual}from'node:crypto';import{promisify}from'node:util';const scrypt=promisify(B);import K from'@fastify/cookie';import T from'@fastify/session';import{Authenticator}from'@fastify/passport';import L from'fastify-session-redis-store';import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();export*from'./verifyUser.js';export*from'./get-user-permissions.js';function E(){const u=['toString','hex','auth','cookieOptions','register','cookieName','initialize','permissions'];E=function(){return u;};return E();}function d(B,K){B=B-0x11d;const T=E();let L=T[B];return L;}export async function hashPassword(x){const G=d,y=randomBytes(0x10),P=await scrypt(x,y,0x40);return'scrypt$'+y[G(0x11d)](G(0x11e))+'$'+P['toString']('hex');}export async function verifyPassword(x,y){const f=d,[P,g,j]=y?.['split']('$')||[];if(P!=='scrypt'||!g||!j)return![];const p=Buffer['from'](g,f(0x11e)),J=Buffer['from'](j,f(0x11e)),Q=await scrypt(x,p,J['length']);return timingSafeEqual(Q,J);}export async function createSessionStore(x,y){const A=d,{config:P,redis:g}=y;if(!P||!g){console['warn']('Missing\x20config\x20or\x20redis\x20-\x20skipping\x20session\x20store\x20creation');return;}if(process.env.NODE_ENV==='test'||process.env.VITEST)return;await x['register'](K,{'parseOptions':P[A(0x11f)][A(0x120)]}),await x[A(0x121)](T,{'secret':P['auth']['secret'],'cookieName':P['auth']['cookieName'],'cookie':P[A(0x11f)]['cookieOptions'],'store':new L({'prefix':P[A(0x11f)][A(0x122)]+':'+(P['pg']?.['database']||'db')+':','client':g})}),await x[A(0x121)](fastifyPassport[A(0x123)]()),await x['register'](fastifyPassport['secureSession']()),fastifyPassport['registerUserSerializer'](async j=>({'user':j})),fastifyPassport['registerUserDeserializer'](async j=>{const r=A,p=j?.['user']||j;return p?.['id']&&(p[r(0x124)]=await getUserPermissions(p['id'],y)),p;});}
1
+ export*from'./auth.types.js';import{randomBytes,scrypt as s,timingSafeEqual}from'node:crypto';import{promisify}from'node:util';const scrypt=promisify(s);import J from'@fastify/cookie';import N from'@fastify/session';import{Authenticator}from'@fastify/passport';import O from'fastify-session-redis-store';function W(){const Q=['scrypt$','toString','hex','split','scrypt','from','test','cookieOptions','auth','register','registerUserSerializer','registerUserDeserializer','user'];W=function(){return Q;};return W();}import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();function n(s,J){s=s-0x192;const N=W();let O=N[s];return O;}export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(E){const R=n,S=randomBytes(0x10),T=await scrypt(E,S,0x40);return R(0x192)+S[R(0x193)](R(0x194))+'$'+T[R(0x193)]('hex');}export async function verifyPassword(E,S){const v=n,[T,f,a]=S?.[v(0x195)]('$')||[];if(T!==v(0x196)||!f||!a)return![];const g=Buffer[v(0x197)](f,'hex'),p=Buffer['from'](a,'hex'),D=await scrypt(E,g,p['length']);return timingSafeEqual(D,p);}export async function createSessionStore(E,S){const o=n,{config:T,redis:f}=S;if(!T||!f){console['warn']('Missing\x20config\x20or\x20redis\x20-\x20skipping\x20session\x20store\x20creation');return;}if(process.env.NODE_ENV===o(0x198)||process.env.VITEST)return;await E['register'](J,{'parseOptions':T['auth'][o(0x199)]}),await E['register'](N,{'secret':T['auth']['secret'],'cookieName':T['auth']['cookieName'],'cookie':T[o(0x19a)]['cookieOptions'],'store':new O({'prefix':T['auth']['cookieName']+':'+(T['pg']?.['database']||'db')+':','client':f})}),await E['register'](fastifyPassport['initialize']()),await E[o(0x19b)](fastifyPassport['secureSession']()),fastifyPassport[o(0x19c)](async a=>({'user':a})),fastifyPassport[o(0x19d)](async a=>{const i=o,g=a?.[i(0x19e)]||a;return g?.['id']&&(g['permissions']=await getUserPermissions(g['id'],S)),g;});}
@@ -1 +1 @@
1
- import{BadRequestError}from'../../errors.js';import{verifyPassword}from'./index.js';function d(B,K){B=B-0xbf;const T=E();let L=T[B];return L;}function E(){const Q=['not\x20enough\x20params:\x20user','then','Wrong\x20password','info','auth/warn'];E=function(){return Q;};return E();}export async function verifyUser({user:B,password:K,ip:T},{pg:L,logger:x}){const J=d;if(!B||B==='')throw new BadRequestError(J(0xbf));if(!K||K==='')throw new BadRequestError('not\x20enough\x20params:\x20password');x['metrics']('user.login');const y='select\x20uid\x20as\x20id,\x20user_type\x20as\x20type,\x20password_hash,\x20twofa\x20from\x20admin.users\x20where\x20$1\x20in\x20(login,email,phone)\x20and\x20enabled\x20limit\x201',P=await L['query'](y,[B])[J(0xc0)](j=>j['rows']?.[0x0]);if(!P){const j='user\x20not\x20found';x['info']({'file':'auth/warn','error':j,'user':B,'ip':T});throw new BadRequestError(j);}const g=await verifyPassword(K,P['password_hash']);if(!g){const p=J(0xc1);x[J(0xc2)]({'file':J(0xc3),'error':p,'user':B,'ip':T});throw new BadRequestError(p);}return delete P['password_hash'],P;}
1
+ import{BadRequestError}from'../../errors.js';import{verifyPassword}from'./index.js';function n(s,J){s=s-0x184;const N=W();let O=N[s];return O;}export async function verifyUser({user:s,password:J,ip:N},{pg:O,logger:E}){const p=n;if(!s||s==='')throw new BadRequestError(p(0x184));if(!J||J==='')throw new BadRequestError(p(0x185));E['metrics']('user.login');const S='select\x20uid\x20as\x20id,\x20user_type\x20as\x20type,\x20password_hash,\x20twofa\x20from\x20admin.users\x20where\x20$1\x20in\x20(login,email,phone)\x20and\x20enabled\x20limit\x201',T=await O['query'](S,[s])[p(0x186)](a=>a['rows']?.[0x0]);if(!T){const a='user\x20not\x20found';E['info']({'file':p(0x187),'error':a,'user':s,'ip':N});throw new BadRequestError(a);}const f=await verifyPassword(J,T[p(0x188)]);if(!f){const g='Wrong\x20password';E['info']({'file':'auth/warn','error':g,'user':s,'ip':N});throw new BadRequestError(g);}return delete T['password_hash'],T;}function W(){const D=['not\x20enough\x20params:\x20user','not\x20enough\x20params:\x20password','then','auth/warn','password_hash'];W=function(){return D;};return W();}
@@ -1 +1 @@
1
- function E(){const X=['\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20=\x20\x27dictionaries\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20','then','table_name','test','items','has','set','code','static','rows','Dictionary\x20items\x20must\x20be\x20an\x20array','Dictionary\x20table\x20not\x20found','empty\x20pg','\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','query','parentId','delete','get'];E=function(){return X;};return E();}function d(B,K){B=B-0x81;const T=E();let L=T[B];return L;}import{ConflictError,NotFoundError,ValidationError}from'../errors.js';const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;export function createDictionary({pg:B,dictionaries:dictionaries=[]}){const K=new Map(),T=new Map();let L,x;async function y(){const O=d;if(L!==undefined)return L;if(!B)throw new Error('empty\x20pg');return x??=B['query'](O(0x81))[O(0x82)](A=>{const k=O,r=A['rows'][0x0]?.[k(0x83)];L=r==='dictionaries'?r:null;}),await x,L;}function P(A){const N=d;if(!dictionaryName[N(0x84)](A))throw new ValidationError('Invalid\x20dictionary\x20name:\x20'+A);}function g(A){const R=d;for(const r of Array['isArray'](A)?A:[A]){P(r['code']);if(!Array['isArray'](r[R(0x85)]))throw new ValidationError('Invalid\x20dictionary\x20items:\x20'+r['code']);if(K[R(0x86)](r['code']))throw new ConflictError('Dictionary\x20already\x20registered:\x20'+r['code']);K[R(0x87)](r[R(0x88)],{...r,'source':R(0x89)});}}function j(A){const H=d;return K[H(0x86)](A);}async function p(A){const M=d;P(A);const r=K['get'](A);if(r&&r['checked'])return r[M(0x85)];const u=await y();if(!u)throw new NotFoundError('Dictionary\x20table\x20not\x20found');const c=await B?.['query']('\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',[A]);if(c?.['rows']?.['length']){const h=c?.[M(0x8a)];return K['set'](A,{'code':A,'name':A,'items':h,'source':'database','checked':!![]}),h;}if(!r?.[M(0x85)])throw new NotFoundError('Dictionary\x20not\x20found:\x20'+A);return r['checked']=!![],r['items'];}async function J(A,r){const Z=d;P(A);if(!Array['isArray'](r))throw new ValidationError(Z(0x8b));const u=await y();if(!u)throw new NotFoundError(Z(0x8c));if(!B)throw new Error(Z(0x8d));const c=await B['connect']();try{await c['query']('BEGIN');const h=await c['query'](Z(0x8e),[A,A,'fcore','custom',!![]]),S=h['rows'][0x0]['id'];await c['query'](Z(0x8f),[S]);for(const Y of r){await c[Z(0x90)]('\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',[S,Y[Z(0x88)],Y['name'],Y[Z(0x91)]??null]);}await c['query']('COMMIT');}catch(l){await c['query']('ROLLBACK');throw l;}finally{c['release']();}K['set'](A,{'items':r,'code':A,'source':'static','checked':!![]}),T['set'](A,(T['get'](A)??0x0)+0x1);}function Q(A){const s=d;return P(A),T[s(0x87)](A,(T['get'](A)??0x0)+0x1),K[s(0x92)](A);}function G(A){const q=d;return T[q(0x93)](A)??0x0;}async function f(){const w=d,A=[...K['values']()]['map'](({code:c,name:h,source:S})=>({'code':c,'name':h??c,'source':S})),r=await y();if(!r)return A;if(!B)throw new Error(w(0x8d));const u=await B[w(0x90)]('\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 c of u['rows']){!K['has'](c['code'])&&A['push'](c);}return A;}return g(dictionaries),{'register':g,'get':p,'put':J,'clear':Q,'revision':G,'list':f,'has':j};}
1
+ function W(){const P=['empty\x20pg','query','Invalid\x20dictionary\x20name:\x20','code','has','items','Dictionary\x20table\x20not\x20found','rows','database','checked','DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1','parentId','COMMIT','ROLLBACK','values'];W=function(){return P;};return W();}import{ConflictError,NotFoundError,ValidationError}from'../errors.js';const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;function n(s,J){s=s-0x19d;const N=W();let O=N[s];return O;}export function createDictionary({pg:s,dictionaries:dictionaries=[]}){const J=new Map(),N=new Map();let O,E;async function S(){const l=n;if(O!==undefined)return O;if(!s)throw new Error(l(0x19d));return E??=s[l(0x19e)]('\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 i=o['rows'][0x0]?.['table_name'];O=i==='dictionaries'?i:null;}),await E,O;}function T(o){const H=n;if(!dictionaryName['test'](o))throw new ValidationError(H(0x19f)+o);}function f(o){const U=n;for(const i of Array['isArray'](o)?o:[o]){T(i[U(0x1a0)]);if(!Array['isArray'](i['items']))throw new ValidationError('Invalid\x20dictionary\x20items:\x20'+i['code']);if(J['has'](i['code']))throw new ConflictError('Dictionary\x20already\x20registered:\x20'+i[U(0x1a0)]);J['set'](i['code'],{...i,'source':'static'});}}function a(o){const F=n;return J[F(0x1a1)](o);}async function g(o){const B=n;T(o);const i=J['get'](o);if(i&&i['checked'])return i[B(0x1a2)];const Q=await S();if(!Q)throw new NotFoundError(B(0x1a3));const u=await s?.['query']('\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(u?.[B(0x1a4)]?.['length']){const e=u?.['rows'];return J['set'](o,{'code':o,'name':o,'items':e,'source':B(0x1a5),'checked':!![]}),e;}if(!i?.['items'])throw new NotFoundError('Dictionary\x20not\x20found:\x20'+o);return i[B(0x1a6)]=!![],i[B(0x1a2)];}async function p(o,i){const k=n;T(o);if(!Array['isArray'](i))throw new ValidationError('Dictionary\x20items\x20must\x20be\x20an\x20array');const Q=await S();if(!Q)throw new NotFoundError('Dictionary\x20table\x20not\x20found');if(!s)throw new Error('empty\x20pg');const u=await s['connect']();try{await u['query']('BEGIN');const e=await u['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',[o,o,'fcore','custom',!![]]),x=e[k(0x1a4)][0x0]['id'];await u['query'](k(0x1a7),[x]);for(const G of i){await u[k(0x19e)]('\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',[x,G['code'],G['name'],G[k(0x1a8)]??null]);}await u['query'](k(0x1a9));}catch(L){await u['query'](k(0x1aa));throw L;}finally{u['release']();}J['set'](o,{'items':i,'code':o,'source':'static','checked':!![]}),N['set'](o,(N['get'](o)??0x0)+0x1);}function D(o){return T(o),N['set'](o,(N['get'](o)??0x0)+0x1),J['delete'](o);}function R(o){return N['get'](o)??0x0;}async function v(){const q=n,o=[...J[q(0x1ab)]()]['map'](({code:u,name:e,source:x})=>({'code':u,'name':e??u,'source':x})),i=await S();if(!i)return o;if(!s)throw new Error('empty\x20pg');const Q=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 u of Q['rows']){!J['has'](u[q(0x1a0)])&&o['push'](u);}return o;}return f(dictionaries),{'register':f,'get':g,'put':p,'clear':D,'revision':R,'list':v,'has':a};}
@@ -1 +1 @@
1
- function d(B,K){B=B-0x11d;const T=E();let L=T[B];return L;}import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';import B from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function keyFor(K,T){const Q=d;if(!T||T['startsWith']('/')||T['includes']('..'))throw new ValidationError('Invalid\x20file\x20path');const L=T[Q(0x11d)](/\\/g,'/')['replace'](/^\/+/,''),x=(K??'')['replace'](/^\/+|\/+$/g,'');return x?x+'/'+L:L;}function E(){const u=['replace','function','toString','hex','endpoint','region','accessKeyId','digest','base64url','Invalid\x20file\x20token','update','length','timingSafeEqual','utf8'];E=function(){return u;};return E();}async function bodyToBuffer(K){const G=d;if(!K)return Buffer['alloc'](0x0);const T=K;if(typeof T['transformToByteArray']===G(0x11e))return Buffer['from'](await T['transformToByteArray']());const L=[];for await(const x of K){L['push'](Buffer['from'](x));}return Buffer['concat'](L);}export function createFileS3(K){const f=d,T=K['tokenSecret']??process.env.FILE_TOKEN_SECRET??B['randomBytes'](0x20)[f(0x11f)](f(0x120)),L=new S3Client({'endpoint':K[f(0x121)],'region':K[f(0x122)]??'us-east-1','forcePathStyle':K['forcePathStyle']??!![],'credentials':K['accessKeyId']||K['accessKey']?{'accessKeyId':K[f(0x123)]??K['accessKey'],'secretAccessKey':K['secretAccessKey']??K['secretKey']}:undefined}),x=y=>keyFor(K['folder'],y);return{async 'put'(y,P){await L['send'](new PutObjectCommand({'Bucket':K['bucket'],'Key':x(y),'Body':P}));},async 'get'(y){const P=await L['send'](new GetObjectCommand({'Bucket':K['bucket'],'Key':x(y)}));return bodyToBuffer(P['Body']);},async 'exists'(y){try{return await L['send'](new HeadObjectCommand({'Bucket':K['bucket'],'Key':x(y)})),!![];}catch(P){const g=P;if(g['$metadata']?.['httpStatusCode']===0x194||g['name']==='NotFound')return![];throw P;}},async 'delete'(y){await L['send'](new DeleteObjectCommand({'Bucket':K['bucket'],'Key':x(y)}));},'create'(y,P=K['tokenTtl']??0xe10){const A=f,g=Buffer['from'](y)['toString']('base64url'),j=B['createHmac']('sha256',T)['update'](g)[A(0x124)](A(0x125));return g+'.'+j;},'verify'(y){const r=f,[P,g]=y['split']('.');if(!P||!g)throw new UnauthorizedError(r(0x126));const j=B['createHmac']('sha256',T)[r(0x127)](P)['digest'](),p=Buffer['from'](g,r(0x125));if(j[r(0x128)]!==p['length']||!B[r(0x129)](j,p))throw new UnauthorizedError('Invalid\x20file\x20token');const J=Buffer['from'](P,r(0x125))[r(0x11f)](r(0x12a));return J;}};}
1
+ import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';function W(){const x=['replace','push','from','accessKeyId','accessKey','send','Body','$metadata','httpStatusCode','tokenTtl','toString','update','Invalid\x20file\x20token','sha256','digest','length'];W=function(){return x;};return W();}import s from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function keyFor(J,N){const D=n;if(!N||N['startsWith']('/')||N['includes']('..'))throw new ValidationError('Invalid\x20file\x20path');const O=N[D(0xb7)](/\\/g,'/')['replace'](/^\/+/,''),E=(J??'')['replace'](/^\/+|\/+$/g,'');return E?E+'/'+O:O;}function n(s,J){s=s-0xb7;const N=W();let O=N[s];return O;}async function bodyToBuffer(J){const R=n;if(!J)return Buffer['alloc'](0x0);const N=J;if(typeof N['transformToByteArray']==='function')return Buffer['from'](await N['transformToByteArray']());const O=[];for await(const E of J){O[R(0xb8)](Buffer[R(0xb9)](E));}return Buffer['concat'](O);}export function createFileS3(J){const v=n,N=J['tokenSecret']??process.env.FILE_TOKEN_SECRET??s['randomBytes'](0x20)['toString']('hex'),O=new S3Client({'endpoint':J['endpoint'],'region':J['region']??'us-east-1','forcePathStyle':J['forcePathStyle']??!![],'credentials':J[v(0xba)]||J[v(0xbb)]?{'accessKeyId':J[v(0xba)]??J['accessKey'],'secretAccessKey':J['secretAccessKey']??J['secretKey']}:undefined}),E=S=>keyFor(J['folder'],S);return{async 'put'(S,T){await O['send'](new PutObjectCommand({'Bucket':J['bucket'],'Key':E(S),'Body':T}));},async 'get'(S){const o=v,T=await O[o(0xbc)](new GetObjectCommand({'Bucket':J['bucket'],'Key':E(S)}));return bodyToBuffer(T[o(0xbd)]);},async 'exists'(S){const i=v;try{return await O['send'](new HeadObjectCommand({'Bucket':J['bucket'],'Key':E(S)})),!![];}catch(T){const f=T;if(f[i(0xbe)]?.[i(0xbf)]===0x194||f['name']==='NotFound')return![];throw T;}},async 'delete'(S){const Q=v;await O[Q(0xbc)](new DeleteObjectCommand({'Bucket':J['bucket'],'Key':E(S)}));},'create'(S,T=J[v(0xc0)]??0xe10){const u=v,f=Buffer['from'](S)[u(0xc1)]('base64url'),a=s['createHmac']('sha256',N)[u(0xc2)](f)['digest']('base64url');return f+'.'+a;},'verify'(S){const e=v,[T,f]=S['split']('.');if(!T||!f)throw new UnauthorizedError(e(0xc3));const a=s['createHmac'](e(0xc4),N)['update'](T)[e(0xc5)](),g=Buffer['from'](f,'base64url');if(a[e(0xc6)]!==g['length']||!s['timingSafeEqual'](a,g))throw new UnauthorizedError('Invalid\x20file\x20token');const p=Buffer['from'](T,'base64url')[e(0xc1)]('utf8');return p;}};}
@@ -1 +1 @@
1
- function E(){const P=['catch'];E=function(){return P;};return E();}import{SignJWT,jwtVerify}from'jose';function d(B,K){B=B-0x137;const T=E();let L=T[B];return L;}const secret=new TextEncoder()['encode'](process.env.AUTH_JWT_SECRET);export async function jwtSignToken(B){if(!process.env.AUTH_JWT_SECRET)return;const {id:K,type:T,permissions:L}=B,x=await new SignJWT({'id':K,'type':T,'permissions':L})['setProtectedHeader']({'alg':'HS256'})['setIssuedAt']()['setExpirationTime']('1h')['sign'](secret);return x;}export async function jwtVerifyToken(B){const y=d,K=await jwtVerify(B,secret,{'algorithms':['HS256']})[y(0x137)](T=>{console['log'](T['message']);});return K?.['payload'];}
1
+ function n(s,J){s=s-0xe7;const N=W();let O=N[s];return O;}import{SignJWT,jwtVerify}from'jose';function W(){const f=['HS256','setIssuedAt','catch','payload'];W=function(){return f;};return W();}const secret=new TextEncoder()['encode'](process.env.AUTH_JWT_SECRET);export async function jwtSignToken(s){const S=n;if(!process.env.AUTH_JWT_SECRET)return;const {id:J,type:N,permissions:O}=s,E=await new SignJWT({'id':J,'type':N,'permissions':O})['setProtectedHeader']({'alg':S(0xe7)})[S(0xe8)]()['setExpirationTime']('1h')['sign'](secret);return E;}export async function jwtVerifyToken(s){const T=n,J=await jwtVerify(s,secret,{'algorithms':['HS256']})[T(0xe9)](N=>{console['log'](N['message']);});return J?.[T(0xea)];}
@@ -1 +1 @@
1
- import B from'pino';function E(){const j=['isoTime','assign','bind'];E=function(){return j;};return E();}function d(B,K){B=B-0x14d;const T=E();let L=T[B];return L;}export function createLogger(){const g=d,K=B['transport']({'target':'./transport.js'}),T=B({'level':'info','timestamp':B['stdTimeFunctions'][g(0x14d)],'base':{'service':'app'},'redact':{'paths':['req.headers.authorization','password','token','accessToken','refreshToken'],'censor':'[REDACTED]'}},K),L={};function x(y,P){if(y===undefined)return{...L};L[y]=(L[y]??0x0)+(P??0x1);}return Object[g(0x14e)](T,{'close':async()=>K['end'](),'metrics':x,'file':()=>T['info'][g(0x14f)](T)});}
1
+ function W(){const a=['app','password','accessToken','[REDACTED]','bind'];W=function(){return a;};return W();}function n(s,J){s=s-0x92;const N=W();let O=N[s];return O;}import s from'pino';export function createLogger(){const f=n,J=s['transport']({'target':'./transport.js'}),N=s({'level':'info','timestamp':s['stdTimeFunctions']['isoTime'],'base':{'service':f(0x92)},'redact':{'paths':['req.headers.authorization',f(0x93),'token',f(0x94),'refreshToken'],'censor':f(0x95)}},J),O={};function E(S,T){if(S===undefined)return{...O};O[S]=(O[S]??0x0)+(T??0x1);}return Object['assign'](N,{'close':async()=>J['end'](),'metrics':E,'file':()=>N['info'][f(0x96)](N)});}
@@ -1 +1 @@
1
- const g=d;import B from'node:fs';import K from'node:path';import T from'pino-abstract-transport';const LEVELS={0x1e:'info',0x28:'warn',0x32:g(0xe7),0x3c:g(0xe7)},streams=new Map();function getDate(){return new Date()['toISOString']()['slice'](0x0,0xa);}function createStream(L,x){const y=K['resolve']('logs',L);return B['mkdirSync'](y,{'recursive':!![]}),B['createWriteStream'](K['join'](y,x+'.log'),{'flags':'a'});}function E(){const J=['error','set','values','clear'];E=function(){return J;};return E();}function d(B,K){B=B-0xe7;const T=E();let L=T[B];return L;}function getStream(L){const j=g,x=getDate(),y=streams['get'](L);if(y&&y['date']===x)return y['stream'];y?.['stream']['end']();const P=createStream(L,x);return streams[j(0xe8)](L,{'date':x,'stream':P}),P;}function closeStreams(){const p=g;for(const {stream:L}of streams[p(0xe9)]()){L['end']();}streams[p(0xea)]();}export default async function loggerTransport(){return T(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(L){for await(const x of L){const y=LEVELS[x['level']];if(!y)continue;const P=getStream(x['file']||y);delete x['file'],P['write'](JSON['stringify'](x)+'\x0a');}}
1
+ const f=n;import s from'node:fs';import J from'node:path';import N from'pino-abstract-transport';const LEVELS={0x1e:f(0xdd),0x28:f(0xde),0x32:'error',0x3c:f(0xdf)},streams=new Map();function n(s,J){s=s-0xdd;const N=W();let O=N[s];return O;}function getDate(){return new Date()['toISOString']()['slice'](0x0,0xa);}function createStream(O,E){const a=f,S=J[a(0xe0)]('logs',O);return s['mkdirSync'](S,{'recursive':!![]}),s['createWriteStream'](J[a(0xe1)](S,E+'.log'),{'flags':'a'});}function getStream(O){const g=f,E=getDate(),S=streams['get'](O);if(S&&S[g(0xe2)]===E)return S[g(0xe3)];S?.['stream']['end']();const T=createStream(O,E);return streams['set'](O,{'date':E,'stream':T}),T;}function closeStreams(){const p=f;for(const {stream:O}of streams[p(0xe4)]()){O['end']();}streams['clear']();}function W(){const R=['info','warn','error','resolve','join','date','stream','values','file'];W=function(){return R;};return W();}export default async function loggerTransport(){return N(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(O){const D=f;for await(const E of O){const S=LEVELS[E['level']];if(!S)continue;const T=getStream(E[D(0xe5)]||S);delete E['file'],T['write'](JSON['stringify'](E)+'\x0a');}}