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

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 (118) hide show
  1. package/LICENSE +3 -3
  2. package/README.md +71 -71
  3. package/dist/config.d.ts +1 -0
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +1 -1
  6. package/dist/context.js +1 -1
  7. package/dist/errors.js +1 -1
  8. package/dist/fastify.js +1 -1
  9. package/dist/fcore.d.ts.map +1 -1
  10. package/dist/fcore.js +1 -1
  11. package/dist/migrations/cli.js +1 -1
  12. package/dist/migrations/runner.js +1 -1
  13. package/dist/modules/auth/adduser-cli.js +1 -1
  14. package/dist/modules/auth/passwd-cli.js +1 -1
  15. package/dist/modules/auth/permission-cli.js +1 -1
  16. package/dist/modules/auth/route.d.ts.map +1 -1
  17. package/dist/modules/auth/route.js +1 -1
  18. package/dist/modules/auth/schema.js +1 -1
  19. package/dist/modules/auth/services/change-password.js +1 -1
  20. package/dist/modules/auth/services/get-current-user.d.ts +2 -0
  21. package/dist/modules/auth/services/get-current-user.d.ts.map +1 -1
  22. package/dist/modules/auth/services/get-current-user.js +1 -1
  23. package/dist/modules/auth/services/registration.js +1 -1
  24. package/dist/modules/auth/services/verify-two-factor.js +1 -1
  25. package/dist/modules/file/mime.js +1 -1
  26. package/dist/modules/file/route.js +1 -1
  27. package/dist/modules/file/schema.js +1 -1
  28. package/dist/modules/file/services/get-file.js +1 -1
  29. package/dist/modules/file/services/resize-file.js +1 -1
  30. package/dist/modules/file/services/upload-file.d.ts.map +1 -1
  31. package/dist/modules/file/services/upload-file.js +1 -1
  32. package/dist/modules/resource/route.d.ts.map +1 -1
  33. package/dist/modules/resource/route.js +1 -1
  34. package/dist/modules/resource/schema.d.ts +5 -0
  35. package/dist/modules/resource/schema.d.ts.map +1 -1
  36. package/dist/modules/resource/schema.js +1 -1
  37. package/dist/modules/resource/services/add-note.js +1 -1
  38. package/dist/modules/resource/services/add-resource-file.js +1 -1
  39. package/dist/modules/resource/services/create-resource-relation.js +1 -1
  40. package/dist/modules/resource/services/create-resource.js +1 -1
  41. package/dist/modules/resource/services/delete-resource-relation.js +1 -1
  42. package/dist/modules/resource/services/delete-resource.js +1 -1
  43. package/dist/modules/resource/services/export-resource.js +1 -1
  44. package/dist/modules/resource/services/get-resource.js +1 -1
  45. package/dist/modules/resource/services/list-resource-relation.js +1 -1
  46. package/dist/modules/resource/services/list-resources.js +1 -1
  47. package/dist/modules/resource/services/search-resource.js +1 -1
  48. package/dist/modules/resource/services/suggest-resource.js +1 -1
  49. package/dist/modules/resource/services/update-resource-relation.js +1 -1
  50. package/dist/modules/resource/services/update-resource.js +1 -1
  51. package/dist/modules/resource/services/upload-resource-file.js +1 -1
  52. package/dist/modules/system/route.js +1 -1
  53. package/dist/modules/system/schema.js +1 -1
  54. package/dist/modules/system/services/check-system.js +1 -1
  55. package/dist/modules/system/services/get-access.js +1 -1
  56. package/dist/modules/system/services/get-api-list.js +1 -1
  57. package/dist/modules/system/services/get-audit-log.js +1 -1
  58. package/dist/modules/system/services/get-dictionary.js +1 -1
  59. package/dist/modules/system/services/get-system-log.js +1 -1
  60. package/dist/modules/system/services/get-system-settings.js +1 -1
  61. package/dist/modules/system/services/list-dictionaries.js +1 -1
  62. package/dist/modules/system/services/set-access.js +1 -1
  63. package/dist/modules/system/services/update-dictionary.js +1 -1
  64. package/dist/modules/system/services/update-system-settings.js +1 -1
  65. package/dist/modules/utils/require-admin.js +1 -1
  66. package/dist/modules/utils/safe-user.js +1 -1
  67. package/dist/modules/utils/unsupported.js +1 -1
  68. package/dist/plugins/audit/audit.js +1 -1
  69. package/dist/plugins/audit/services/write-audit.js +1 -1
  70. package/dist/plugins/auth/get-user-permissions.js +1 -1
  71. package/dist/plugins/auth/index.d.ts.map +1 -1
  72. package/dist/plugins/auth/index.js +1 -1
  73. package/dist/plugins/auth/verifyUser.js +1 -1
  74. package/dist/plugins/dictionary.js +1 -1
  75. package/dist/plugins/file.d.ts +7 -3
  76. package/dist/plugins/file.d.ts.map +1 -1
  77. package/dist/plugins/file.js +1 -1
  78. package/dist/plugins/jwt.js +1 -1
  79. package/dist/plugins/logger/index.js +1 -1
  80. package/dist/plugins/logger/transport.js +1 -1
  81. package/dist/plugins/pg.js +1 -1
  82. package/dist/plugins/redis.d.ts.map +1 -1
  83. package/dist/plugins/redis.js +1 -1
  84. package/dist/plugins/resource/resource.d.ts +1 -1
  85. package/dist/plugins/resource/resource.d.ts.map +1 -1
  86. package/dist/plugins/resource/resource.js +1 -1
  87. package/dist/plugins/resource/resource.registry.d.ts +3 -2
  88. package/dist/plugins/resource/resource.registry.d.ts.map +1 -1
  89. package/dist/plugins/resource/resource.registry.js +1 -1
  90. package/dist/plugins/resource/resource.types.d.ts +5 -4
  91. package/dist/plugins/resource/resource.types.d.ts.map +1 -1
  92. package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
  93. package/dist/plugins/resource/services/add-file-token.js +1 -1
  94. package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
  95. package/dist/plugins/resource/services/create-relation.js +1 -1
  96. package/dist/plugins/resource/services/create.js +1 -1
  97. package/dist/plugins/resource/services/delete-relation.js +1 -1
  98. package/dist/plugins/resource/services/delete.js +1 -1
  99. package/dist/plugins/resource/services/find-one.d.ts.map +1 -1
  100. package/dist/plugins/resource/services/find-one.js +1 -1
  101. package/dist/plugins/resource/services/find-relation.js +1 -1
  102. package/dist/plugins/resource/services/find.d.ts.map +1 -1
  103. package/dist/plugins/resource/services/find.js +1 -1
  104. package/dist/plugins/resource/services/get-table-columns.js +1 -1
  105. package/dist/plugins/resource/services/update-relation.js +1 -1
  106. package/dist/plugins/resource/services/update.js +1 -1
  107. package/dist/plugins/resource/utils/auto-index.js +1 -1
  108. package/dist/plugins/resource/utils/fields.js +1 -1
  109. package/dist/plugins/resource/utils/filters.d.ts.map +1 -1
  110. package/dist/plugins/resource/utils/filters.js +1 -1
  111. package/dist/plugins/resource/utils/permissions.js +1 -1
  112. package/dist/plugins/resource/utils/sort.js +1 -1
  113. package/dist/plugins/resource/utils/sql.js +1 -1
  114. package/dist/plugins/resource/utils/summary.js +1 -1
  115. package/dist/shared/getIP.js +1 -1
  116. package/migrations/20260903130000_move_notes_files_to_admin.sql +17 -17
  117. package/migrations/20260903140000_settings_nulls_not_distinct.sql +18 -18
  118. package/package.json +93 -93
@@ -1 +1 @@
1
- function W(){const a=['get','/api/resource/:resource/search','fcore','user','Suggest\x20resource\x20values','params','config','resource','auth','Returns\x20records\x20from\x20a\x20registered\x20resource.','$resource:read','query','/api/resource/:resource/:id','Get\x20resource\x20record','resourceId','Updates\x20a\x20record\x20in\x20a\x20registered\x20resource.','delete','Delete\x20resource\x20record','post','/api/resource/:resource/:id/upload','$resource:update','file','File\x20is\x20required','admin','Missing\x20permission:\x20','filename','path','Returns\x20related\x20records\x20for\x20a\x20resource\x20record.','resourceIdRelation','Create\x20resource\x20relation','/api/resource/:resource/:id/:relation/:relationId','resourceIdRelationId','Update\x20resource\x20relation'];W=function(){return a;};return W();}import{ForbiddenError}from'../../errors.js';import{listResources}from'./services/list-resources.js';import{getResource}from'./services/get-resource.js';import{createResource}from'./services/create-resource.js';function n(s,J){s=s-0x1cb;const N=W();let O=N[s];return O;}import{updateResource}from'./services/update-resource.js';import{deleteResource}from'./services/delete-resource.js';import{listResourceRelation}from'./services/list-resource-relation.js';import{createResourceRelation}from'./services/create-resource-relation.js';import{updateResourceRelation}from'./services/update-resource-relation.js';import{deleteResourceRelation}from'./services/delete-resource-relation.js';import{searchResource}from'./services/search-resource.js';import{exportResource}from'./services/export-resource.js';import{suggestResource}from'./services/suggest-resource.js';import{resourceSchemas}from'./schema.js';import{uploadFile}from'../file/services/upload-file.js';const user=s=>s['user'];export function resourceRoutes(s){return async J=>{const T=n;J[T(0x1cb)](T(0x1cc),{'schema':{'tags':[T(0x1cd),'resource'],'summary':'Search\x20resource','description':'Searches\x20records\x20in\x20a\x20registered\x20resource.','access':'user','permissions':['$resource:read'],'params':resourceSchemas['resource']}},async N=>searchResource({...N['query'],...N['params'],'user':user(N)||s['config']?.['auth']?.[T(0x1ce)]},s)),J[T(0x1cb)]('/api/suggest/:resource/:field',{'schema':{'tags':['fcore','resource'],'summary':T(0x1cf),'description':'Returns\x20suggested\x20values\x20for\x20a\x20resource\x20field.','access':'user','permissions':['$resource:read'],'params':resourceSchemas['resourceField'],'querystring':resourceSchemas['suggestQuery']}},async N=>suggestResource({...N['query'],...N[T(0x1d0)],'user':user(N)||s[T(0x1d1)]?.['auth']?.[T(0x1ce)]},s)),J['get']('/api/resource/:resource/export',{'schema':{'tags':['fcore',T(0x1d2)],'summary':'Export\x20resource\x20records','description':'Exports\x20readable\x20records\x20from\x20a\x20registered\x20resource.','access':T(0x1ce),'permissions':['$resource:read'],'params':resourceSchemas['exportResource'],'querystring':resourceSchemas['exportResourceQuery']}},async N=>exportResource({...N['query'],...N[T(0x1d0)],'user':user(N)||s['config']?.[T(0x1d3)]?.['user']},s)),J['get']('/api/resource/:resource',{'schema':{'tags':['fcore',T(0x1d2)],'summary':'List\x20resource\x20records','description':T(0x1d4),'access':T(0x1ce),'permissions':[T(0x1d5)],'params':resourceSchemas['resource']}},async N=>listResources({...N[T(0x1d6)],...N['params'],'user':user(N)||s[T(0x1d1)]?.['auth']?.['user']},s)),J['post']('/api/resource/:resource',{'schema':{'tags':['fcore','resource'],'summary':'Create\x20resource\x20record','description':'Creates\x20a\x20record\x20in\x20a\x20registered\x20resource.','access':'user','permissions':['$resource:create'],'params':resourceSchemas['resource']}},async N=>createResource({...N['params'],'data':N['body'],'user':user(N)||s['config']?.['auth']?.['user']},s)),J[T(0x1cb)](T(0x1d7),{'schema':{'tags':['fcore','resource'],'summary':T(0x1d8),'description':'Returns\x20one\x20record\x20from\x20a\x20registered\x20resource.','access':'user','permissions':['$resource:read'],'params':resourceSchemas[T(0x1d9)],'querystring':resourceSchemas['resourceIncludeQuery']}},async N=>getResource({...N['query'],...N[T(0x1d0)],'user':user(N)||s['config']?.['auth']?.['user']},s)),J['put']('/api/resource/:resource/:id',{'schema':{'tags':['fcore','resource'],'summary':'Update\x20resource\x20record','description':T(0x1da),'access':'user','permissions':['$resource:update'],'params':resourceSchemas['resourceId']}},async N=>updateResource({...N['params'],'patch':N['body'],'user':user(N)||s[T(0x1d1)]?.[T(0x1d3)]?.['user']},s)),J[T(0x1db)]('/api/resource/:resource/:id',{'schema':{'tags':[T(0x1cd),T(0x1d2)],'summary':T(0x1dc),'description':'Deletes\x20a\x20record\x20from\x20a\x20registered\x20resource.','access':T(0x1ce),'permissions':['$resource:delete'],'params':resourceSchemas['resourceId']}},async N=>deleteResource({...N['params'],'user':user(N)||s[T(0x1d1)]?.[T(0x1d3)]?.[T(0x1ce)]},s)),J[T(0x1dd)](T(0x1de),{'schema':{'tags':['fcore',T(0x1d2)],'summary':'Upload\x20resource\x20file','description':'Uploads\x20a\x20file\x20to\x20a\x20Resource\x20record\x20and\x20stores\x20its\x20metadata.','access':T(0x1ce),'permissions':[T(0x1df)],'params':resourceSchemas['uploadResourceFile']}},async N=>{const f=T,O=await N[f(0x1e0)]();if(!O)throw new Error(f(0x1e1));const E=N[f(0x1d0)]['resource'],S=N[f(0x1d0)]['id'];if(N[f(0x1ce)]?.['type']!==f(0x1e2)&&!N[f(0x1ce)]?.['permissions']['includes'](E+':update'))throw new ForbiddenError(f(0x1e3)+E+':update');return uploadFile({'file':O,'metadata':{'name':O[f(0x1e4)],'path':O['fields'][f(0x1e5)]?.['value'],'resource':E,'resourceId':S},'user':N['user']},s);}),J['get']('/api/resource/:resource/:id/:relation',{'schema':{'tags':['fcore','resource'],'summary':'List\x20resource\x20relations','description':T(0x1e6),'access':T(0x1ce),'params':resourceSchemas[T(0x1e7)],'permissions':[T(0x1d5)]}},async N=>listResourceRelation({...N['query'],...N['params'],'user':user(N)||s['config']?.['auth']?.['user']},s)),J['post']('/api/resource/:resource/:id/:relation',{'schema':{'tags':[T(0x1cd),'resource'],'summary':T(0x1e8),'description':'Creates\x20a\x20relation\x20for\x20a\x20resource\x20record.','access':'user','permissions':['$resource:create'],'params':resourceSchemas['resourceIdRelation']}},async N=>createResourceRelation({...N[T(0x1d0)],'data':N['body'],'user':user(N)||s['config']?.[T(0x1d3)]?.[T(0x1ce)]},s)),J[T(0x1db)](T(0x1e9),{'schema':{'tags':[T(0x1cd),'resource'],'summary':'Delete\x20resource\x20relation','description':'Deletes\x20a\x20relation\x20from\x20a\x20resource\x20record.','access':'user','permissions':['$resource:delete'],'params':resourceSchemas[T(0x1ea)]}},async N=>deleteResourceRelation({...N[T(0x1d0)],'user':user(N)||s['config']?.[T(0x1d3)]?.[T(0x1ce)]},s)),J['put'](T(0x1e9),{'schema':{'tags':['fcore','resource'],'summary':T(0x1eb),'description':'Updates\x20a\x20related\x20resource\x20record.','access':'user','permissions':[T(0x1df)],'params':resourceSchemas[T(0x1ea)]}},async N=>updateResourceRelation({...N['params'],'data':N['body'],'user':user(N)||s['config']?.['auth']?.['user']},s));};}
1
+ import{listResources}from'./services/list-resources.js';import{getResource}from'./services/get-resource.js';function G(w,h){w=w-0x12b;const S=z();let X=S[w];return X;}import{createResource}from'./services/create-resource.js';import{updateResource}from'./services/update-resource.js';import{deleteResource}from'./services/delete-resource.js';import{listResourceRelation}from'./services/list-resource-relation.js';function z(){const y=['/api/resource/:resource/search','resource','Searches\x20records\x20in\x20a\x20registered\x20resource.','$resource:read','config','get','/api/suggest/:resource/:field','fcore','user','resourceField','suggestQuery','/api/resource/:resource/export','auth','params','post','Create\x20resource\x20record','$resource:create','Update\x20resource\x20record','Updates\x20a\x20record\x20in\x20a\x20registered\x20resource.','Delete\x20resource\x20record','Deletes\x20a\x20record\x20from\x20a\x20registered\x20resource.','resourceId','Upload\x20resource\x20file','Uploads\x20a\x20file\x20to\x20a\x20Resource\x20record\x20and\x20stores\x20its\x20metadata.','$resource:update','/api/resource/:resource/:id/file/:fid','File\x20not\x20found\x20for\x20this\x20resource\x20and\x20record','rows','query','delete','$resource:delete','resourceIdRelationId','put','Updates\x20a\x20related\x20resource\x20record.'];z=function(){return y;};return z();}import{createResourceRelation}from'./services/create-resource-relation.js';import{updateResourceRelation}from'./services/update-resource-relation.js';import{deleteResourceRelation}from'./services/delete-resource-relation.js';import{searchResource}from'./services/search-resource.js';import{exportResource}from'./services/export-resource.js';import{suggestResource}from'./services/suggest-resource.js';import{resourceSchemas}from'./schema.js';import{uploadFile}from'../file/services/upload-file.js';const user=w=>w['user'];export function resourceRoutes(w){return async h=>{const e=G;h['get'](e(0x12b),{'schema':{'tags':['fcore',e(0x12c)],'summary':'Search\x20resource','description':e(0x12d),'access':'user','permissions':[e(0x12e)],'params':resourceSchemas['resource']}},async S=>searchResource({...S['query'],...S['params'],'user':user(S)||w[e(0x12f)]?.['auth']?.['user']},w)),h[e(0x130)](e(0x131),{'schema':{'tags':[e(0x132),'resource'],'summary':'Suggest\x20resource\x20values','description':'Returns\x20suggested\x20values\x20for\x20a\x20resource\x20field.','access':e(0x133),'permissions':['$resource:read'],'params':resourceSchemas[e(0x134)],'querystring':resourceSchemas[e(0x135)]}},async S=>suggestResource({...S['query'],...S['params'],'user':user(S)||w['config']?.['auth']?.['user']},w)),h[e(0x130)](e(0x136),{'schema':{'tags':['fcore','resource'],'summary':'Export\x20resource\x20records','description':'Exports\x20readable\x20records\x20from\x20a\x20registered\x20resource.','access':'user','permissions':['$resource:read'],'params':resourceSchemas['exportResource'],'querystring':resourceSchemas['exportResourceQuery']}},async S=>exportResource({...S['query'],...S['params'],'user':user(S)||w['config']?.[e(0x137)]?.['user']},w)),h[e(0x130)]('/api/resource/:resource',{'schema':{'tags':[e(0x132),'resource'],'summary':'List\x20resource\x20records','description':'Returns\x20records\x20from\x20a\x20registered\x20resource.','access':e(0x133),'permissions':['$resource:read'],'params':resourceSchemas['resource']}},async S=>listResources({...S['query'],...S[e(0x138)],'user':user(S)||w['config']?.['auth']?.['user']},w)),h[e(0x139)]('/api/resource/:resource',{'schema':{'tags':[e(0x132),'resource'],'summary':e(0x13a),'description':'Creates\x20a\x20record\x20in\x20a\x20registered\x20resource.','access':'user','permissions':[e(0x13b)],'params':resourceSchemas[e(0x12c)]}},async S=>createResource({...S['params'],'data':S['body'],'user':user(S)||w['config']?.[e(0x137)]?.[e(0x133)]},w)),h['get']('/api/resource/:resource/:id',{'schema':{'tags':[e(0x132),'resource'],'summary':'Get\x20resource\x20record','description':'Returns\x20one\x20record\x20from\x20a\x20registered\x20resource.','access':'user','permissions':['$resource:read'],'params':resourceSchemas['resourceId'],'querystring':resourceSchemas['resourceIncludeQuery']}},async S=>getResource({...S['query'],...S['params'],'user':user(S)||w['config']?.['auth']?.[e(0x133)]},w)),h['put']('/api/resource/:resource/:id',{'schema':{'tags':['fcore','resource'],'summary':e(0x13c),'description':e(0x13d),'access':e(0x133),'permissions':['$resource:update'],'params':resourceSchemas['resourceId']}},async S=>updateResource({...S['params'],'patch':S['body'],'user':user(S)||w[e(0x12f)]?.[e(0x137)]?.['user']},w)),h['delete']('/api/resource/:resource/:id',{'schema':{'tags':['fcore',e(0x12c)],'summary':e(0x13e),'description':e(0x13f),'access':'user','permissions':['$resource:delete'],'params':resourceSchemas[e(0x140)]}},async S=>deleteResource({...S[e(0x138)],'user':user(S)||w[e(0x12f)]?.['auth']?.['user']},w)),h['post']('/api/resource/:resource/:id/upload',{'schema':{'tags':[e(0x132),'resource'],'summary':e(0x141),'description':e(0x142),'access':e(0x133),'permissions':[e(0x143)],'params':resourceSchemas['uploadResourceFile']}},async S=>{const Z=e,X=await S['file']();if(!X)throw new Error('File\x20is\x20required');const Y=S['params'][Z(0x12c)],v=S['params']['id'];return uploadFile({'file':X,'metadata':{'name':X['filename'],'path':X['fields']['path']?.['value'],'resource':Y,'resourceId':v},'user':S[Z(0x133)]},w);}),h['delete'](e(0x144),{'schema':{'tags':['fcore',e(0x12c)],'summary':'Delete\x20resource\x20file','description':'Deletes\x20a\x20file\x20linked\x20to\x20a\x20resource\x20record\x20after\x20validating\x20it\x20belongs\x20to\x20this\x20resource\x20and\x20record.','access':'user','permissions':[e(0x143)],'params':resourceSchemas['resourceIdFileId']}},async S=>{const K=e,{resource:X,id:Y,fid:v}=S['params'],D=await w['pg']['query']('SELECT\x20file_path\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3\x20LIMIT\x201',[v,X,String(Y)]);if(!D['rowCount'])throw new Error(K(0x145));const o=D[K(0x146)][0x0]?.['file_path'],q=await w['pg'][K(0x147)]('DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[v,X,String(Y)]);return await w['file'][K(0x148)](o),{'success':(q['rowCount']??0x0)>0x0,'resource':X,'resourceId':Y,'fileId':v};}),h[e(0x130)]('/api/resource/:resource/:id/:relation',{'schema':{'tags':['fcore','resource'],'summary':'List\x20resource\x20relations','description':'Returns\x20related\x20records\x20for\x20a\x20resource\x20record.','access':'user','params':resourceSchemas['resourceIdRelation'],'permissions':['$resource:read']}},async S=>listResourceRelation({...S[e(0x147)],...S[e(0x138)],'user':user(S)||w['config']?.[e(0x137)]?.['user']},w)),h['post']('/api/resource/:resource/:id/:relation',{'schema':{'tags':['fcore','resource'],'summary':'Create\x20resource\x20relation','description':'Creates\x20a\x20relation\x20for\x20a\x20resource\x20record.','access':'user','permissions':['$resource:create'],'params':resourceSchemas['resourceIdRelation']}},async S=>createResourceRelation({...S[e(0x138)],'data':S['body'],'user':user(S)||w['config']?.['auth']?.[e(0x133)]},w)),h[e(0x148)]('/api/resource/:resource/:id/:relation/:relationId',{'schema':{'tags':['fcore','resource'],'summary':'Delete\x20resource\x20relation','description':'Deletes\x20a\x20relation\x20from\x20a\x20resource\x20record.','access':'user','permissions':[e(0x149)],'params':resourceSchemas[e(0x14a)]}},async S=>deleteResourceRelation({...S['params'],'user':user(S)||w['config']?.['auth']?.['user']},w)),h[e(0x14b)]('/api/resource/:resource/:id/:relation/:relationId',{'schema':{'tags':[e(0x132),'resource'],'summary':'Update\x20resource\x20relation','description':e(0x14c),'access':e(0x133),'permissions':['$resource:update'],'params':resourceSchemas['resourceIdRelationId']}},async S=>updateResourceRelation({...S['params'],'data':S['body'],'user':user(S)||w['config']?.['auth']?.['user']},w));};}
@@ -50,6 +50,11 @@ export declare const resourceSchemas: {
50
50
  relation: import("@sinclair/typebox").TString;
51
51
  relationId: import("@sinclair/typebox").TString;
52
52
  }>;
53
+ resourceIdFileId: import("@sinclair/typebox").TObject<{
54
+ resource: import("@sinclair/typebox").TString;
55
+ id: import("@sinclair/typebox").TString;
56
+ fid: import("@sinclair/typebox").TString;
57
+ }>;
53
58
  uploadResourceFile: import("@sinclair/typebox").TObject<{
54
59
  resource: import("@sinclair/typebox").TString;
55
60
  id: 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;;;;;;;;;CASpB,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,gBAAgB;;;;;IAKhB,kBAAkB;;;;IAIlB,sBAAsB;;;;IAItB,mBAAmB;;;;;;;;;CASpB,CAAC"}
@@ -1 +1 @@
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
+ function G(w,h){w=w-0x111;const S=z();let X=S[w];return X;}const w=G;import{Type}from'@sinclair/typebox';export const identifier=Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':w(0x111)});export const resourceSchemas={'dictionaryName':Type[w(0x112)]({'name':identifier}),'resource':Type['Object']({'resource':identifier}),'exportResource':Type[w(0x112)]({'resource':identifier}),'resourceField':Type['Object']({'resource':identifier,'field':identifier}),'suggestQuery':Type['Object']({'q':Type['Optional'](Type['String']()),'search':Type[w(0x113)](Type[w(0x114)]()),'limit':Type['Optional'](Type['Integer']({'minimum':0x1,'maximum':0xc8}))}),'resourceId':Type['Object']({'resource':identifier,'id':identifier}),'resourceIncludeQuery':Type[w(0x112)]({'include':Type['Optional'](Type['String']({'minLength':0x1}))}),'resourceIdRelation':Type['Object']({'resource':identifier,'id':identifier,'relation':identifier}),'resourceIdRelationId':Type['Object']({'resource':identifier,'id':identifier,'relation':identifier,'relationId':identifier}),'resourceIdFileId':Type['Object']({'resource':identifier,'id':identifier,'fid':identifier}),'uploadResourceFile':Type['Object']({'resource':identifier,'id':identifier}),'uploadResourceFileBody':Type['Object']({'file':Type['Any'](),'fileName':Type['String']({'minLength':0x1,'maxLength':0xff})}),'exportResourceQuery':Type['Object']({'filter':Type['Optional'](Type['Record'](Type[w(0x114)](),Type['Unknown']())),'sort':Type[w(0x113)](Type[w(0x115)](Type['String']({'minLength':0x1}))),'search':Type[w(0x113)](Type['String']()),'scope':Type[w(0x113)](Type['String']()),'limit':Type['Optional'](Type[w(0x116)]({'minimum':0x1,'maximum':0xc8})),'offset':Type['Optional'](Type[w(0x116)]({'minimum':0x0})),'fields':Type['Optional'](Type[w(0x115)](identifier))})};function z(){const h=['^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$','Object','Optional','String','Array','Integer'];z=function(){return h;};return z();}
@@ -1 +1 @@
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
+ export async function addNote(w,h){const X=G,S=await h['pg'][X(0x7c)]('INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*',[w['resource'],String(w['id']),w['body']]);return S['rows'][0x0];}function G(w,h){w=w-0x7c;const S=z();let X=S[w];return X;}function z(){const Y=['query'];z=function(){return Y;};return z();}
@@ -1 +1 @@
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
+ function G(w,h){w=w-0x155;const S=z();let X=S[w];return X;}export async function addResourceFile(w,h){const X=G,S=await h['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',[w[X(0x155)],String(w['id']),w[X(0x156)],w['size']??null]);return S['rows'][0x0];}function z(){const Y=['resource','filePath'];z=function(){return Y;};return z();}
@@ -1 +1 @@
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
+ export async function createResourceRelation(w,h){const {resource:S,id:X,relation:Y,data:v,user:D}=w;return h['resource']['createRelation']({'name':S,'id':X,'relation':Y,'data':v,'user':D});}
@@ -1 +1 @@
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
+ function z(){var X=['create','data'];z=function(){return X;};return z();}function G(w,h){w=w-0x1d4;var S=z();var X=S[w];return X;}export async function createResource(w,h){var S=G;return h['resource'][S(0x1d4)]({'name':w['resource'],'data':w[S(0x1d5)],'user':w['user']});}
@@ -1 +1 @@
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
+ function G(w,h){w=w-0xe6;const S=z();let X=S[w];return X;}function z(){const o=['deleteRelation'];z=function(){return o;};return z();}export async function deleteResourceRelation(w,h){const D=G,{resource:S,id:X,relation:Y,relationId:v}=w;return h['resource'][D(0xe6)]({'name':S,'id':X,'relation':Y,'relationId':v});}
@@ -1 +1 @@
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
+ function z(){var X=['resource'];z=function(){return X;};return z();}function G(w,h){w=w-0x1b5;var S=z();var X=S[w];return X;}export async function deleteResource(w,h){var S=G;return h[S(0x1b5)]['delete']({'name':w['resource'],'id':w['id'],'user':w['user']});}
@@ -1 +1 @@
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
+ import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';export async function exportResource(w,h){const X=G,S=await h['resource'][X(0x1f4)]({'name':w[X(0x1f5)],'query':{'filter':parseFilterQuery(w),'sort':w['sort'],'search':w['search'],'limit':w['limit'],'offset':w['offset'],'fields':w[X(0x1f6)]},'user':w['user']});return S['rows'];}function G(w,h){w=w-0x1f4;const S=z();let X=S[w];return X;}function z(){const Y=['find','resource','fields'];z=function(){return Y;};return z();}
@@ -1 +1 @@
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
+ function G(w,h){w=w-0x72;var S=z();var X=S[w];return X;}export async function getResource(w,h){var S=G;return h['resource']['findOne']({'name':w[S(0x72)],'id':w['id'],'query':{'include':w[S(0x73)]},'user':w[S(0x74)]});}function z(){var X=['resource','include','user'];z=function(){return X;};return z();}
@@ -1 +1 @@
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
+ export async function listResourceRelation(w,h){const {resource:S,id:X,relation:Y,query:v,user:D}=w;return h['resource']['findRelation']({'name':S,'id':X,'relation':Y,'query':v,'user':D});}
@@ -1 +1 @@
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
+ import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function G(w,h){w=w-0x1a2;var S=z();var X=S[w];return X;}function z(){var X=['scope','offset'];z=function(){return X;};return z();}export async function listResources(w,h){var S=G;return h['resource']['find']({'name':w['resource'],'query':{'filter':parseFilterQuery(w),'sort':w['sort'],'search':w['search'],'scope':w[S(0x1a2)],'limit':w['limit'],'offset':w[S(0x1a3)]??(w['page']?Math['max'](w['page']-0x1,0x0):0x0)*(w['limit']??0x14)},'user':w['user']});}
@@ -1 +1 @@
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
+ import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function z(){var X=['resource','find'];z=function(){return X;};return z();}function G(w,h){w=w-0x10b;var S=z();var X=S[w];return X;}export async function searchResource(w,h){var S=G;return h[S(0x10b)][S(0x10c)]({'name':w['resource'],'query':{...w,'filter':parseFilterQuery(w)},'user':w['user']});}
@@ -1 +1 @@
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
+ import{ValidationError}from'../../../errors.js';function G(w,h){w=w-0xdf;const S=z();let X=S[w];return X;}import{autoIndex}from'../../../plugins/resource/utils/auto-index.js';export async function suggestResource(w,h){const H=G,S=h['resource']['get'](w[H(0xdf)]),X=String(w['search']??w['q']??'')['toLowerCase'](),Y=Math['min'](Math['max'](Number(w['limit']??0x14),0x1),0xc8),v=Date[H(0xe0)](),D=S['fields'][w[H(0xe1)]],o=D?.[H(0xe2)],q=D?.[H(0xe3)]?.['table'];if(q){const K=D['lookup']?.['text']??'name',y=D['lookup']?.[H(0xe4)]??'id';autoIndex(q,K,H(0xe5),h['pg']);const V=await h['pg'][H(0xe6)]('SELECT\x20'+y+'\x20as\x20id,\x20'+K+H(0xe7)+q+'\x20WHERE\x20lower('+K+')\x20~\x20$1\x20LIMIT\x20$2',[''+X['toLowerCase'](),Y])[H(0xe8)](O=>O[H(0xe9)]);return{'limit':Y,'count':V['length'],'search':X,'time':Date['now']()-v,'data':V};}if(!o)throw new ValidationError('Field\x20has\x20no\x20lookup\x20dictionary:\x20'+w['field']);const e=await h[H(0xe2)]['get'](o),Z=e['filter'](O=>!X||O['code'][H(0xea)](X)||O[H(0xeb)][H(0xea)](X))['slice'](0x0,Y)[H(0xec)](O=>({'id':O[H(0xed)]||O['id'],'text':O[H(0xeb)]||O['text']}));return{'search':X,'limit':Y,'count':Z['length'],'time':Date[H(0xe0)]()-v,'data':Z};}function z(){const R=['resource','now','field','dictionary','lookup','value','text','query','\x20as\x20text\x20FROM\x20','then','rows','startsWith','name','map','code'];z=function(){return R;};return z();}
@@ -1 +1 @@
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
+ export async function updateResourceRelation(w,h){const {resource:S,id:X,relation:Y,relationId:v,data:D,user:o}=w;return h['resource']['updateRelation']({'name':S,'id':X,'relation':Y,'relationId':v,'data':D,'user':o});}
@@ -1 +1 @@
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
+ function G(w,h){w=w-0x7d;var S=z();var X=S[w];return X;}function z(){var X=['resource','patch'];z=function(){return X;};return z();}export async function updateResource(w,h){var S=G;return h[S(0x7d)]['update']({'name':w['resource'],'id':w['id'],'data':w[S(0x7e)],'user':w['user']});}
@@ -1 +1 @@
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
+ import{ForbiddenError,NotFoundError,ValidationError}from'../../../errors.js';export async function uploadResourceFile(w,h){const D=G,S=h['resource'][D(0xad)](w[D(0xae)]);if(S['access']===D(0xaf)&&w['user']?.['type']!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(w['user']?.[D(0xb0)]!=='admin'&&!w[D(0xb1)]?.[D(0xb2)]?.[D(0xb3)]((S['permission']??S['name'])+':update'))throw new ForbiddenError('Missing\x20permission:\x20'+(S['permission']??S['name'])+':update');if(!Buffer['isBuffer'](w['file'])||w[D(0xb4)][D(0xb5)]===0x0)throw new ValidationError('File\x20is\x20required');const X=w[D(0xb6)][D(0xb7)](/[^A-Za-z0-9._-]/g,'_');if(!X)throw new ValidationError(D(0xb8));const Y='files/'+w['resource']+'/'+String(w['id'])+'/'+X;await h[D(0xb4)]['put'](Y,w['file']);if(!await h['file'][D(0xb9)](Y))throw new NotFoundError('Uploaded\x20file\x20not\x20found');const v=await h['pg'][D(0xba)]('\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',[w['resource'],String(w['id']),Y,w['file']['length']]);return v['rows'][0x0];}function G(w,h){w=w-0xad;const S=z();let X=S[w];return X;}function z(){const o=['get','resource','admin','type','user','permissions','includes','file','length','fileName','replace','File\x20name\x20is\x20required','exists','query'];z=function(){return o;};return z();}
@@ -1 +1 @@
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
+ const q=G;function z(){const Z=['user','/api/dictionary/:name','fcore','Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','system','Update\x20platform\x20dictionary','dictionaryName','params','body','get','system:access','post','/api/access/:type/:id','accessTarget','Get\x20system\x20settings','Returns\x20system\x20settings\x20as\x20nested\x20JSON.','admin','system:settings','settings','system:logs','/api/system/audit','Returns\x20the\x20system\x20audit\x20log\x20entries.','system:audit','Check\x20system\x20health'];z=function(){return Z;};return z();}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';import{getSystemLog}from'./services/get-system-log.js';import{getDictionary}from'./services/get-dictionary.js';import{updateDictionary}from'./services/update-dictionary.js';function G(w,h){w=w-0x69;const S=z();let X=S[w];return X;}import{getAccess}from'./services/get-access.js';import{setAccess}from'./services/set-access.js';import{systemSchemas}from'./schema.js';const u=w=>w[q(0x69)];export function systemRoutes(w,h=new Map()){return async S=>{const e=G;S['get'](e(0x6a),{'schema':{'tags':[e(0x6b),'system'],'summary':'Get\x20platform\x20dictionary','description':e(0x6c),'access':e(0x69),'permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName']}},async Y=>({'items':await getDictionary({...Y['params'],'user':u(Y)},w)})),S['post'](e(0x6a),{'schema':{'tags':[e(0x6b),e(0x6d)],'summary':e(0x6e),'description':'Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','access':'user','permissions':['system:dictionaries'],'params':systemSchemas[e(0x6f)],'body':systemSchemas['dictionaryItems']}},async Y=>updateDictionary({...Y[e(0x70)],...Y[e(0x71)],'user':u(Y)},w));const X=async Y=>getAccess({...Y['params'],'user':u(Y)},w);S[e(0x72)]('/api/access/:type/:id',{'schema':{'tags':['fcore','system'],'summary':'Get\x20access\x20rules','description':'Returns\x20direct\x20and\x20role-based\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':[e(0x73)],'params':systemSchemas['accessTarget']}},X),S[e(0x74)](e(0x75),{'schema':{'tags':['fcore','system'],'summary':'Set\x20access\x20rules','description':'Replaces\x20direct\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':['system:access'],'params':systemSchemas[e(0x76)],'body':systemSchemas['access']}},async Y=>setAccess({...Y['params'],...Y['body'],'user':u(Y)},w)),S['get']('/api/system/settings',{'schema':{'tags':[e(0x6b),'system'],'summary':e(0x77),'description':e(0x78),'access':e(0x79),'permissions':[e(0x7a)]}},async Y=>getSystemSettings({...Y['params'],'user':u(Y)},w)),S['post']('/api/system/settings',{'schema':{'tags':['fcore',e(0x6d)],'summary':'Update\x20system\x20settings','description':'Updates\x20system\x20settings\x20using\x20flat\x20dot-notation\x20keys.','access':'admin','permissions':['system:settings'],'body':systemSchemas[e(0x7b)]}},async Y=>updateSystemSettings({...Y[e(0x70)],'patch':Y[e(0x71)],'user':u(Y)},w)),S['get']('/api/system/logger',{'schema':{'tags':['fcore',e(0x6d)],'summary':'Get\x20system\x20log','description':'Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','access':'user','permissions':[e(0x7c)],'querystring':systemSchemas['logger']}},async(Y,v)=>{const {contentType:D,body:o}=await getSystemLog({...Y['query'],'user':u(Y)},w);return v['type'](D)['send'](o);}),S['get'](e(0x7d),{'schema':{'tags':[e(0x6b),'system'],'summary':'Get\x20audit\x20log','description':e(0x7e),'access':'user','permissions':[e(0x7f)]}},async Y=>getAuditLog({...Y['query'],'user':u(Y)},w)),S[e(0x72)]('/api/system/check',{'schema':{'tags':['fcore',e(0x6d)],'summary':e(0x80),'description':'Checks\x20the\x20availability\x20of\x20system\x20dependencies.','access':e(0x69),'permissions':['system:check']}},async Y=>checkSystem({'user':u(Y)},w)),S['get']('/api/system/list',{'schema':{'tags':['fcore','system'],'summary':'List\x20APIs','description':'Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','access':'admin','permissions':[],'querystring':systemSchemas['apiListQuery']}},async Y=>getApiList({'user':u(Y),'apiRoutes':h,...Y['query']},w));};}
@@ -1 +1 @@
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
+ const w=G;import{Type}from'@sinclair/typebox';function G(w,h){w=w-0x162;const S=z();let X=S[w];return X;}export const identifier=Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':w(0x162)});export const systemSchemas={'dictionaryName':Type['Object']({'name':identifier}),'dictionaryItems':Type[w(0x163)]({'items':Type[w(0x164)](Type['Object']({'id':Type['Optional'](Type['Union']([Type[w(0x165)](),Type[w(0x166)]()])),'code':Type[w(0x165)]({'minLength':0x1}),'name':Type[w(0x165)]({'minLength':0x1}),'parentId':Type[w(0x167)](Type[w(0x168)]([Type['String'](),Type['Number'](),Type[w(0x169)]()]))},{'additionalProperties':!![]}))}),'accessTarget':Type['Object']({'type':Type['Union']([Type['Literal']('user'),Type['Literal'](w(0x16a))]),'id':identifier}),'access':Type['Object']({'permissions':Type['Optional'](Type['Array'](Type[w(0x165)]({'minLength':0x1,'maxLength':0x80,'pattern':w(0x16b)}))),'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[w(0x168)]([Type['Literal']('short'),Type[w(0x16c)](w(0x16d))]))}),'settingsEntity':Type['Object']({'entity':Type['Optional'](identifier)}),'settings':Type['Record'](Type['String']({'minLength':0x1}),Type['Unknown']()),'logger':Type[w(0x163)]({'path':Type['Optional'](Type['String']({'maxLength':0x100,'pattern':'^[A-Za-z0-9_.\x5c-/]*$'}))})};function z(){const h=['^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$','Object','Array','String','Number','Optional','Union','Null','role','^[A-Za-z0-9_-]+(?::[A-Za-z0-9_-]+)?$','Literal','extended'];z=function(){return h;};return z();}
@@ -1 +1 @@
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
+ export async function checkSystem(w,h){const Y=G,[S,X]=await Promise['allSettled']([h['pg'][Y(0xcd)]('SELECT\x201'),h['redis']['ping']()]);return{'status':S['status']==='fulfilled'&&X['status']==='fulfilled'?'ok':'degraded','pg':S['status'],'redis':X['status']};}function G(w,h){w=w-0xcd;const S=z();let X=S[w];return X;}function z(){const v=['query'];z=function(){return v;};return z();}
@@ -1 +1 @@
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
+ export async function getAccess(w,h){const D=G,S=w[D(0xef)]===D(0xf0)?'\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':D(0xf1),X=await h['pg'][D(0xf2)](S,[w['id']]),Y=[...new Set(X['rows']['map'](v=>v['resource'])['filter'](v=>v!==null))];return{'access':X['rows'],'resources':Y};}function G(w,h){w=w-0xef;const S=z();let X=S[w];return X;}function z(){const o=['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\x20WHERE\x20ra.role_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20','query'];z=function(){return o;};return z();}
@@ -1 +1 @@
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
+ export async function getApiList(w,h){const o=G,S=[...w['apiRoutes'][o(0x1a0)]()]['sort']((X,Y)=>(X[o(0x1a1)]+'\x20'+X['method'])['localeCompare'](Y['endpoint']+'\x20'+Y['method']));if(w['format']!==o(0x1a2))return S;return S[o(0x1a3)](({method:X,endpoint:Y,access:v,permissions:D})=>X+'\x20'+Y);}function G(w,h){w=w-0x1a0;const S=z();let X=S[w];return X;}function z(){const q=['values','endpoint','short','map'];z=function(){return q;};return z();}
@@ -1 +1 @@
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
+ function G(w,h){w=w-0x18f;const S=z();let X=S[w];return X;}export async function getAuditLog(w,h){const v=G,S=Math['min'](Math['max'](w['limit']??0x32,0x1),0xc8),X=Math['max']((w['page']??0x1)-0x1,0x0)*S,Y=await h['pg'][v(0x18f)]('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',[S,X]);return{'rows':Y['rows'],'page':w['page']??0x1,'limit':S};}function z(){const D=['query'];z=function(){return D;};return z();}
@@ -1 +1 @@
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
+ function G(w,h){w=w-0xcd;var S=z();var X=S[w];return X;}export async function getDictionary(w,h){var S=G;return h['dictionary'][S(0xcd)](w['name']);}function z(){var X=['get'];z=function(){return X;};return z();}
@@ -1 +1 @@
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
+ function z(){const C=['logs','path','sep','Invalid\x20log\x20path','stat','catch','isDirectory','readdir','all','map','join','name','size','sort','localeCompare','unshift','directory','type','<li><a\x20href=\x22','<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>','\x0a</ul>\x0a</body>\x0a</html>','replace','&amp;','split','open','alloc','toString','slice','reverse'];z=function(){return C;};return z();}function G(w,h){w=w-0x161;const S=z();let X=S[w];return X;}const O=G;import w from'node:fs/promises';import h from'node:path';import{NotFoundError,ValidationError}from'../../../errors.js';const LOGS_ROOT=h['resolve'](process['cwd'](),O(0x161)),TAIL_LINES=0x64;export async function getSystemLog(S,X){const H=O,Y=normalizePath(S[H(0x162)]),v=h['resolve'](LOGS_ROOT,Y);if(v!==LOGS_ROOT&&!v['startsWith'](LOGS_ROOT+h[H(0x163)]))throw new ValidationError(H(0x164));const D=await w[H(0x165)](v)[H(0x166)](()=>null);if(!D)throw new NotFoundError('Log\x20path\x20not\x20found');if(D[H(0x167)]()){const q=await w[H(0x168)](v,{'withFileTypes':!![]}),e=await Promise[H(0x169)](q[H(0x16a)](async Z=>{const R=H,K=await w[R(0x165)](h[R(0x16b)](v,Z['name']));return{'name':Z[R(0x16c)],'path':Y?Y+'/'+Z['name']:Z['name'],'type':Z[R(0x167)]()?'directory':'file','size':Z['isDirectory']()?undefined:K[R(0x16d)],'modified':K['mtime']['toISOString']()};}));e[H(0x16e)]((Z,K)=>Z['name'][H(0x16f)](K['name']));if(Y){const Z=Y['split']('/')['slice'](0x0,-0x1)[H(0x16b)]('/');e[H(0x170)]({'name':'..','path':Z,'type':H(0x171)});}return{'contentType':'text/html;\x20charset=utf-8','body':renderDirectory(Y,e)};}const o=await tailFile(v,TAIL_LINES);return{'contentType':'text/plain;\x20charset=utf-8','body':o[H(0x16b)]('\x0a')};}function renderDirectory(S,X){const Q=O,Y=X[Q(0x16a)](D=>{const P=Q,o='?path='+encodeURIComponent(D['path']),q=D[P(0x172)]==='directory'?D[P(0x16c)]+'/':D['name'];return P(0x173)+o+'\x22>'+escapeHtml(q)+'</a></li>';})['join']('\x0a'),v=escapeHtml('logs/'+S);return Q(0x174)+v+'</title></head>\x0a<body>\x0a<h1>'+v+'</h1>\x0a<ul>\x0a'+Y+Q(0x175);}function escapeHtml(S){const x=O;return S[x(0x176)](/&/g,x(0x177))[x(0x176)](/</g,'&lt;')['replace'](/>/g,'&gt;')['replace'](/"/g,'&quot;');}function normalizePath(S){const c=O,X=(S??'')['replace'](/\\/g,'/')['replace'](/^\/+|\/+$/g,'');if(X[c(0x178)]('/')['some'](Y=>Y==='..'))throw new ValidationError('Invalid\x20log\x20path');return X;}async function tailFile(S,X){const d=O,Y=await w[d(0x179)](S,'r');try{const {size:v}=await Y['stat'](),D=0x40*0x400;let o=v,q=Buffer[d(0x17a)](0x0),e=0x0;while(o>0x0&&e<=X){const K=Math['min'](D,o);o-=K;const y=Buffer['alloc'](K);await Y['read'](y,0x0,K,o),q=Buffer['concat']([y,q]),e+=countNewlines(y);}const Z=q[d(0x17b)]('utf8')['split']('\x0a')['filter'](V=>V['length']>0x0);return Z[d(0x17c)](-X)[d(0x17d)]();}finally{await Y['close']();}}function countNewlines(S){let X=0x0;for(const Y of S){if(Y===0xa)X++;}return X;}
@@ -1 +1 @@
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
+ function G(w,h){w=w-0xd2;const S=z();let X=S[w];return X;}export async function getSystemSettings(w,h){const q=G,S=await h['pg'][q(0xd2)]('\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 S['rows'][q(0xd3)]((X,Y)=>{const e=q,v=String(Y[e(0xd4)])[e(0xd5)]('.');let D=X;for(const o of v['slice'](0x0,-0x1)){D[o]??={},D=D[o];}return D[v['at'](-0x1)]=Y['value'],X;},{});}function z(){const Z=['query','reduce','key','split'];z=function(){return Z;};return z();}
@@ -1 +1 @@
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
+ function z(){var X=['dictionary','list'];z=function(){return X;};return z();}function G(w,h){w=w-0x1ed;var S=z();var X=S[w];return X;}export async function listDictionaries(w,h){var S=G;return h[S(0x1ed)][S(0x1ee)]();}
@@ -1 +1 @@
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
+ function z(){const V=['read','create','set','user','permissions','type','resource','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)','actions'];z=function(){return V;};return z();}function G(w,h){w=w-0xd9;const S=z();let X=S[w];return X;}const Z=G;import{getAccess}from'./get-access.js';const CRUD_ACTIONS=[Z(0xd9),'update',Z(0xda),'delete'];function permissionsToAccess(w){const K=Z,h=new Map();for(const S of w){const [X,Y]=S['split'](':');if(!X)continue;const v=Y==='edit'?'update':Y,D=h['get'](X)??new Set();for(const o of v?[v]:CRUD_ACTIONS)D['add'](o);h[K(0xdb)](X,D);}return[...h]['map'](([q,e])=>({'resource':q,'actions':[...e]}));}export async function setAccess(w,h){const y=Z,S=await h['pg']['connect']();try{await S['query']('BEGIN');w['type']===y(0xdc)?await S['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL',[w['id']]):await S['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL',[w['id']]);const X=w[y(0xdd)]?permissionsToAccess(w[y(0xdd)]):w['access']??[];for(const Y of X){w[y(0xde)]===y(0xdc)?await S['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)',[Y[y(0xdf)],Y['actions'],w['id'],w[y(0xdc)]['id'],w['user']['id']]):await S[y(0xe0)](y(0xe1),[Y['resource'],Y[y(0xe2)],w['id'],w['user']['id'],w['user']['id']]);}await S['query']('COMMIT');}catch(v){await S['query']('ROLLBACK');throw v;}finally{S['release']();}return getAccess(w,h);}
@@ -1 +1 @@
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
+ function G(w,h){w=w-0x9a;var S=z();var X=S[w];return X;}export async function updateDictionary(w,h){var S=G;return await h['dictionary']['put'](w['name'],w[S(0x9a)]),{'success':!![]};}function z(){var X=['items'];z=function(){return X;};return z();}
@@ -1 +1 @@
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
+ function z(){const v=['entries'];z=function(){return v;};return z();}function G(w,h){w=w-0xc6;const S=z();let X=S[w];return X;}import{ValidationError}from'../../../errors.js';export async function updateSystemSettings(w,h){const Y=G;if(!Object['keys'](w['patch'])['length'])throw new ValidationError('Settings\x20patch\x20is\x20empty');for(const [S,X]of Object[Y(0xc6)](w['patch'])){if(!S['trim']()||S['includes']('..'))throw new ValidationError('Invalid\x20setting\x20key:\x20'+S);await h['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',[S,JSON['stringify'](X),w['user']['id']]);}return{'success':!![]};}
@@ -1 +1 @@
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
+ import{ForbiddenError}from'../../errors.js';function G(w,h){w=w-0x16a;var S=z();var X=S[w];return X;}function z(){var X=['type','Admin\x20access\x20required','permissions'];z=function(){return X;};return z();}export function requireAdmin(w,h){var S=G;if(!w)throw new ForbiddenError('User\x20required');if(w[S(0x16a)]!=='admin')throw new ForbiddenError(S(0x16b));if(w['type']!=='admin'&&h&&!w[S(0x16c)]?.['includes'](h))throw new ForbiddenError('Missing\x20permission:\x20'+h);}
@@ -1 +1 @@
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
+ function G(w,h){w=w-0x69;const S=z();let X=S[w];return X;}export const safeUser=w=>{const Y=G,h=['password','salt',Y(0x69),'credentials'];return Object[Y(0x6a)](Object[Y(0x6b)](w)[Y(0x6c)](([S])=>!h[Y(0x6d)](X=>S['toLowerCase']()['includes'](X))));};function z(){const v=['secret','fromEntries','entries','filter','some'];z=function(){return v;};return z();}
@@ -1 +1 @@
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
+ import{UnsupportedError}from'../../errors.js';export function unsupported(w){throw new UnsupportedError(w+'\x20requires\x20a\x20project/provider\x20implementation');}
@@ -1 +1 @@
1
- import{writeAudit}from'./services/write-audit.js';export function createAudit(s){const J=writeAudit(s);return{'write':J};}
1
+ import{writeAudit}from'./services/write-audit.js';export function createAudit(w){const h=writeAudit(w);return{'write':h};}
@@ -1 +1 @@
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
+ const secretPattern=/password|token|secret|credential|salt/i;function z(){const V=['isArray','fromEntries','query','map','warn','admin.audit_log','newValue','\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','resource','fields','test','field'];z=function(){return V;};return z();}function G(w,h){w=w-0x1a2;const S=z();let X=S[w];return X;}function clean(w){const e=G;if(Array[e(0x1a2)](w))return w['map'](clean);if(w&&typeof w==='object')return Object[e(0x1a3)](Object['entries'](w)['map'](([h,S])=>[h,secretPattern['test'](h)?'[REDACTED]':clean(S)]));return w;}export function writeAudit(w){let h,S;async function X(){const Z=G;if(!w['pg'])return![];if(h!==undefined)return h;return S??=w['pg'][Z(0x1a4)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20IN\x20(\x27audit_log\x27,\x20\x27audit_log_data\x27)\x0a\x20\x20\x20\x20\x20\x20\x20\x20')['then'](Y=>{const K=Z,v=new Set(Y['rows'][K(0x1a5)](D=>D['table_name']));return h=v['has']('audit_log')&&v['has']('audit_log_data'),!h&&w['logger'][K(0x1a6)]({'expectedTables':[K(0x1a7),'admin.audit_log_data'],'foundTables':[...v]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),h;})['catch'](Y=>{return h=![],w['logger']['warn']({'err':Y},'Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled'),![];}),S;}return async function Y(v){const y=G;if(!await X())return w['logger']['info']({'auditFallback':!![],'event':clean({...v,'changes':v['changes']?.['map'](q=>({...q,'oldValue':clean(q['oldValue']),'newValue':clean(q[y(0x1a8)])}))})},'audit'),0x0;if(!w['pg'])throw new Error('empty\x20pg');const D=await w['pg'][y(0x1a4)](y(0x1a9),[v['userId']??null,v['module'],v[y(0x1aa)],v['resourceId']==null?null:String(v['resourceId']),v[y(0x1ab)]??null,v['action'],v['requestId']??null,v['ipAddress']??null,clean(v['metadata']??{})]),o=D['rows'][0x0]['id'];for(const q of v['changes']??[]){if(secretPattern[y(0x1ac)](q['field']))continue;await w['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',[o,q[y(0x1ad)],JSON['stringify'](clean(q['oldValue'])),JSON['stringify'](clean(q['newValue']))]);}return o;};}
@@ -1 +1 @@
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
+ function z(){const v=['query'];z=function(){return v;};return z();}function G(w,h){w=w-0x1e7;const S=z();let X=S[w];return X;}export async function getUserPermissions(w,h){const Y=G,S=await h['pg'][Y(0x1e7)]('\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',[w]);return S['rows']['map'](X=>X['permission']);}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAUhC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAI5D,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAE1C,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKpE;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAalB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,mBAAmB,iBA6CzB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAYhC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAwD5D,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAE1C,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKpE;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAalB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,mBAAmB,iBAmDzB"}
@@ -1 +1 @@
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
+ export*from'./auth.types.js';import{randomBytes,scrypt as w,timingSafeEqual}from'node:crypto';function G(w,h){w=w-0x1f3;const S=z();let X=S[w];return X;}import{mkdir,readFile,unlink,writeFile}from'node:fs/promises';import{join,resolve}from'node:path';function z(){const Q=['path','.json','code','scrypt$','toString','hex','from','warn','register','cookieOptions','database','storagePath','./storage','sessions','secret','registerUserDeserializer'];z=function(){return Q;};return z();}import{promisify}from'node:util';const scrypt=promisify(w);import h from'@fastify/cookie';import S from'@fastify/session';import{Authenticator}from'@fastify/passport';import X from'fastify-session-redis-store';import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();class FileSessionStore{['path'];constructor(Y){this['path']=Y,void mkdir(this['path'],{'recursive':!![]});}['fileFor'](Y){const y=G;return join(this[y(0x1f3)],Y+y(0x1f4));}async['get'](Y,v){try{const D=await readFile(this['fileFor'](Y),'utf8');v(null,JSON['parse'](D));}catch(o){const q=o;if(q['code']==='ENOENT'){v(null,undefined);return;}v(q,undefined);}}async['set'](Y,v,D){try{await mkdir(this['path'],{'recursive':!![]}),await writeFile(this['fileFor'](Y),JSON['stringify'](v),'utf8'),D();}catch(o){D(o);}}async['destroy'](Y,v){try{await unlink(this['fileFor'](Y))['catch'](D=>{const V=G;if(D[V(0x1f5)]!=='ENOENT')throw D;}),v();}catch(D){v(D);}}}export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(Y){const O=G,v=randomBytes(0x10),D=await scrypt(Y,v,0x40);return O(0x1f6)+v[O(0x1f7)]('hex')+'$'+D[O(0x1f7)](O(0x1f8));}export async function verifyPassword(Y,v){const H=G,[D,o,q]=v?.['split']('$')||[];if(D!=='scrypt'||!o||!q)return![];const e=Buffer['from'](o,'hex'),Z=Buffer[H(0x1f9)](q,'hex'),K=await scrypt(Y,e,Z['length']);return timingSafeEqual(K,Z);}export async function createSessionStore(Y,v){const R=G,{config:D,redis:o}=v;if(!D){console[R(0x1fa)]('Missing\x20config\x20-\x20skipping\x20session\x20store\x20creation');return;}if(process.env.NODE_ENV==='test'||process.env.VITEST)return;await Y[R(0x1fb)](h,{'parseOptions':D['auth'][R(0x1fc)]});const q=D['redis']['host']?new X({'prefix':D['auth']['cookieName']+':'+(D['pg']?.[R(0x1fd)]||'db')+':','client':o}):new FileSessionStore(resolve(D[R(0x1fe)]??R(0x1ff),R(0x200)));await Y[R(0x1fb)](S,{'secret':D['auth'][R(0x201)],'cookieName':D['auth']['cookieName'],'cookie':D['auth'][R(0x1fc)],'store':q}),await Y['register'](fastifyPassport['initialize']()),await Y['register'](fastifyPassport['secureSession']()),fastifyPassport['registerUserSerializer'](async e=>({'user':e})),fastifyPassport[R(0x202)](async e=>{const Z=e?.['user']||e;return Z?.['id']&&(Z['permissions']=await getUserPermissions(Z['id'],v)),Z;});}
@@ -1 +1 @@
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
+ function z(){const K=['not\x20enough\x20params:\x20user','user\x20not\x20found','Wrong\x20password'];z=function(){return K;};return z();}function G(w,h){w=w-0x19c;const S=z();let X=S[w];return X;}import{BadRequestError}from'../../errors.js';import{verifyPassword}from'./index.js';export async function verifyUser({user:w,password:h,ip:S},{pg:X,logger:Y}){const Z=G;if(!w||w==='')throw new BadRequestError(Z(0x19c));if(!h||h==='')throw new BadRequestError('not\x20enough\x20params:\x20password');Y['metrics']('user.login');const v='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',D=await X['query'](v,[w])['then'](q=>q['rows']?.[0x0]);if(!D){const q=Z(0x19d);Y['info']({'file':'auth/warn','error':q,'user':w,'ip':S});throw new BadRequestError(q);}const o=await verifyPassword(h,D['password_hash']);if(!o){const e=Z(0x19e);Y['info']({'file':'auth/warn','error':e,'user':w,'ip':S});throw new BadRequestError(e);}return delete D['password_hash'],D;}