@opengis/fcore 0.0.29 → 0.0.30

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 (125) hide show
  1. package/LICENSE +3 -3
  2. package/README.md +71 -71
  3. package/dist/config.js +1 -1
  4. package/dist/context.d.ts +2 -0
  5. package/dist/context.d.ts.map +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 +2 -0
  10. package/dist/fcore.d.ts.map +1 -1
  11. package/dist/fcore.js +1 -1
  12. package/dist/migrations/cli.js +1 -1
  13. package/dist/migrations/runner.js +1 -1
  14. package/dist/modules/auth/adduser-cli.js +1 -1
  15. package/dist/modules/auth/passwd-cli.js +1 -1
  16. package/dist/modules/auth/permission-cli.js +1 -1
  17. package/dist/modules/auth/route.d.ts.map +1 -1
  18. package/dist/modules/auth/route.js +1 -1
  19. package/dist/modules/auth/schema.js +1 -1
  20. package/dist/modules/auth/services/change-password.js +1 -1
  21. package/dist/modules/auth/services/get-current-user.d.ts +2 -2
  22. package/dist/modules/auth/services/get-current-user.d.ts.map +1 -1
  23. package/dist/modules/auth/services/get-current-user.js +1 -1
  24. package/dist/modules/auth/services/registration.js +1 -1
  25. package/dist/modules/auth/services/verify-two-factor.js +1 -1
  26. package/dist/modules/file/mime.js +1 -1
  27. package/dist/modules/file/route.js +1 -1
  28. package/dist/modules/file/schema.js +1 -1
  29. package/dist/modules/file/services/get-file.js +1 -1
  30. package/dist/modules/file/services/resize-file.js +1 -1
  31. package/dist/modules/file/services/upload-file.js +1 -1
  32. package/dist/modules/resource/route.js +1 -1
  33. package/dist/modules/resource/schema.d.ts +3 -2
  34. package/dist/modules/resource/schema.d.ts.map +1 -1
  35. package/dist/modules/resource/schema.js +1 -1
  36. package/dist/modules/resource/services/add-note.js +1 -1
  37. package/dist/modules/resource/services/add-resource-file.js +1 -1
  38. package/dist/modules/resource/services/create-resource-relation.js +1 -1
  39. package/dist/modules/resource/services/create-resource.js +1 -1
  40. package/dist/modules/resource/services/delete-resource-relation.js +1 -1
  41. package/dist/modules/resource/services/delete-resource.js +1 -1
  42. package/dist/modules/resource/services/export-resource.js +1 -1
  43. package/dist/modules/resource/services/generate-resource-code.js +1 -1
  44. package/dist/modules/resource/services/get-resource-schema.js +1 -1
  45. package/dist/modules/resource/services/get-resource.d.ts +1 -1
  46. package/dist/modules/resource/services/get-resource.js +1 -1
  47. package/dist/modules/resource/services/list-resource-as-user.js +1 -1
  48. package/dist/modules/resource/services/list-resource-list.js +1 -1
  49. package/dist/modules/resource/services/list-resource-relation.js +1 -1
  50. package/dist/modules/resource/services/list-resources.js +1 -1
  51. package/dist/modules/resource/services/search-resource.js +1 -1
  52. package/dist/modules/resource/services/suggest-resource.d.ts.map +1 -1
  53. package/dist/modules/resource/services/suggest-resource.js +1 -1
  54. package/dist/modules/resource/services/update-resource-relation.js +1 -1
  55. package/dist/modules/resource/services/update-resource.js +1 -1
  56. package/dist/modules/resource/services/upload-resource-file.js +1 -1
  57. package/dist/modules/system/route.js +1 -1
  58. package/dist/modules/system/schema.js +1 -1
  59. package/dist/modules/system/services/check-system.js +1 -1
  60. package/dist/modules/system/services/get-access.js +1 -1
  61. package/dist/modules/system/services/get-api-list.js +1 -1
  62. package/dist/modules/system/services/get-audit-log.js +1 -1
  63. package/dist/modules/system/services/get-dictionary.js +1 -1
  64. package/dist/modules/system/services/get-resource-access.js +1 -1
  65. package/dist/modules/system/services/get-resource-scopes.js +1 -1
  66. package/dist/modules/system/services/get-system-log.js +1 -1
  67. package/dist/modules/system/services/get-system-settings.js +1 -1
  68. package/dist/modules/system/services/list-dictionaries.js +1 -1
  69. package/dist/modules/system/services/set-access.js +1 -1
  70. package/dist/modules/system/services/set-resource-access.js +1 -1
  71. package/dist/modules/system/services/set-resource-scopes.js +1 -1
  72. package/dist/modules/system/services/update-dictionary.js +1 -1
  73. package/dist/modules/system/services/update-system-settings.js +1 -1
  74. package/dist/modules/utils/require-admin.js +1 -1
  75. package/dist/modules/utils/safe-user.js +1 -1
  76. package/dist/modules/utils/unsupported.js +1 -1
  77. package/dist/plugins/audit/audit.js +1 -1
  78. package/dist/plugins/audit/services/write-audit.js +1 -1
  79. package/dist/plugins/auth/get-user-permissions.js +1 -1
  80. package/dist/plugins/auth/index.d.ts.map +1 -1
  81. package/dist/plugins/auth/index.js +1 -1
  82. package/dist/plugins/auth/verifyUser.js +1 -1
  83. package/dist/plugins/dictionary.js +1 -1
  84. package/dist/plugins/file.js +1 -1
  85. package/dist/plugins/hooks.d.ts +14 -0
  86. package/dist/plugins/hooks.d.ts.map +1 -0
  87. package/dist/plugins/hooks.js +1 -0
  88. package/dist/plugins/index.d.ts +1 -0
  89. package/dist/plugins/index.d.ts.map +1 -1
  90. package/dist/plugins/index.js +1 -1
  91. package/dist/plugins/jwt.js +1 -1
  92. package/dist/plugins/logger/index.js +1 -1
  93. package/dist/plugins/logger/transport.js +1 -1
  94. package/dist/plugins/pg.js +1 -1
  95. package/dist/plugins/redis.js +1 -1
  96. package/dist/plugins/resource/resource.js +1 -1
  97. package/dist/plugins/resource/resource.registry.js +1 -1
  98. package/dist/plugins/resource/resource.types.d.ts +1 -0
  99. package/dist/plugins/resource/resource.types.d.ts.map +1 -1
  100. package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
  101. package/dist/plugins/resource/services/add-file-token.js +1 -1
  102. package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
  103. package/dist/plugins/resource/services/create-relation.js +1 -1
  104. package/dist/plugins/resource/services/create.js +1 -1
  105. package/dist/plugins/resource/services/delete-relation.js +1 -1
  106. package/dist/plugins/resource/services/delete.js +1 -1
  107. package/dist/plugins/resource/services/find-one.d.ts.map +1 -1
  108. package/dist/plugins/resource/services/find-one.js +1 -1
  109. package/dist/plugins/resource/services/find-relation.js +1 -1
  110. package/dist/plugins/resource/services/find.js +1 -1
  111. package/dist/plugins/resource/services/get-table-columns.js +1 -1
  112. package/dist/plugins/resource/services/update-relation.js +1 -1
  113. package/dist/plugins/resource/services/update.js +1 -1
  114. package/dist/plugins/resource/utils/auto-index.js +1 -1
  115. package/dist/plugins/resource/utils/fields.js +1 -1
  116. package/dist/plugins/resource/utils/filters.js +1 -1
  117. package/dist/plugins/resource/utils/permissions.js +1 -1
  118. package/dist/plugins/resource/utils/scope.js +1 -1
  119. package/dist/plugins/resource/utils/sort.js +1 -1
  120. package/dist/plugins/resource/utils/sql.js +1 -1
  121. package/dist/plugins/resource/utils/summary.js +1 -1
  122. package/dist/shared/getIP.js +1 -1
  123. package/migrations/20260903130000_move_notes_files_to_admin.sql +17 -17
  124. package/migrations/20260929120000_allow_user_only_role_scopes.sql +1 -1
  125. package/package.json +92 -92
@@ -1 +1 @@
1
- import{UnsupportedError}from'../../../errors.js';function c(S,Z){S=S-0xd7;const h=O();let U=h[S];return U;}function O(){const Y=['includes','\x22\x20requires\x20a\x20capabilities\x20\x22','query','body','INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*','filePath','size','foreignKey','\x22\x20requires\x20a\x20project/provider\x20implementation','resource','Relation\x20update\x20is\x20not\x20configured:\x20'];O=function(){return Y;};return O();}import{createCreate}from'./create.js';export function createCreateRelation(S,Z){const h=createCreate(S,Z);return async function U({name:D,id:u,relation:e,data:q,user:x},n){const b=c,N=n?.['pg']??S['pg'],o=Z['get'](D);if(['notes','files'][b(0xd7)](e)&&!o['capabilities']?.['includes'](e))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+e+b(0xd8)+e+'\x22');if(e==='notes'){const i=await N[b(0xd9)]('INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*',[D,String(u),q?.[b(0xda)]]);return i['rows'][0x0];}if(e==='files'){const l=await N['query'](b(0xdb),[D,String(u),q?.[b(0xdc)],q?.[b(0xdd)]??null]);return l['rows'][0x0];}const j=o['relations']?.[e];if(!j?.[b(0xde)]||!j['resource']&&!j['table'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+e+b(0xdf));if(!q)throw new UnsupportedError('No\x20data\x20provided\x20for\x20relation:\x20'+q);if(!j[b(0xe0)])throw new UnsupportedError(b(0xe1)+e);q[j['foreignKey']]=u;const X=await h({'name':j['resource'],'data':q??{},'user':x});return X;};}
1
+ import{UnsupportedError}from'../../../errors.js';function g(i,E){i=i-0x6a;const W=T();let M=W[i];return M;}function T(){const r=['get','includes','Generic\x20Resource\x20relation\x20\x22','\x22\x20requires\x20a\x20capabilities\x20\x22','INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*','rows','files','INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*','size','\x22\x20requires\x20a\x20project/provider\x20implementation','resource','Relation\x20update\x20is\x20not\x20configured:\x20'];T=function(){return r;};return T();}import{createCreate}from'./create.js';export function createCreateRelation(i,E){const W=createCreate(i,E);return async function M({name:m,id:P,relation:D,data:x,user:Z},f){const o=g,b=f?.['pg']??i['pg'],K=E[o(0x6a)](m);if(['notes','files']['includes'](D)&&!K['capabilities']?.[o(0x6b)](D))throw new UnsupportedError(o(0x6c)+D+o(0x6d)+D+'\x22');if(D==='notes'){const y=await b['query'](o(0x6e),[m,String(P),x?.['body']]);return y[o(0x6f)][0x0];}if(D===o(0x70)){const s=await b['query'](o(0x71),[m,String(P),x?.['filePath'],x?.[o(0x72)]??null]);return s[o(0x6f)][0x0];}const J=K['relations']?.[D];if(!J?.['foreignKey']||!J['resource']&&!J['table'])throw new UnsupportedError(o(0x6c)+D+o(0x73));if(!x)throw new UnsupportedError('No\x20data\x20provided\x20for\x20relation:\x20'+x);if(!J[o(0x74)])throw new UnsupportedError(o(0x75)+D);x[J['foreignKey']]=P;const Q=await W({'name':J['resource'],'data':x??{},'user':Z});return Q;};}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,writableData}from'../utils/sql.js';function c(S,Z){S=S-0x14d;const h=O();let U=h[S];return U;}function O(){const r=['get','fields','created_by','push','No\x20writable\x20fields','map','query','join','audit','module','name','keys'];O=function(){return r;};return O();}import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createCreate(S,Z){return async function h({name:U,data:D,user:u},e){const Y=c,q=Z[Y(0x14d)](U);assertOperation(q,'create',u),validateInputData({'resource':q,'data':D});const x=writableData(q,D);q[Y(0x14e)]['created_at']&&x['push'](['created_at',new Date()]);q['fields'][Y(0x14f)]&&x[Y(0x150)]([Y(0x14f),u?.['id']]);if(!x['length'])throw new ValidationError(Y(0x151));const n=x[Y(0x152)](([l])=>qi(l)),N=x[Y(0x152)]((l,b)=>'$'+(b+0x1)),o=x['map'](([,l])=>l),j=e?.['pg']??S['pg'],X=await j[Y(0x153)]('INSERT\x20INTO\x20'+qt(q['table'])+'\x20('+n['join'](',\x20')+')\x20'+('VALUES\x20('+N[Y(0x154)](',\x20')+')\x20')+'RETURNING\x20*',o),i=X['rows'][0x0];return clearTableLookupCache(q['table'],j),await(e?.[Y(0x155)]??S['audit'])?.['write']({'userId':u?.['id'],'module':q[Y(0x156)],'resource':q[Y(0x157)],'resourceId':i[q['key']],'action':'create','fields':Object[Y(0x158)](D)}),i;};}
1
+ import{ValidationError}from'../../../errors.js';function T(){const G=['push','created_by','table','audit','create'];T=function(){return G;};return T();}function g(i,E){i=i-0xf3;const W=T();let M=W[i];return M;}import{assertOperation}from'../utils/permissions.js';import{qi,qt,writableData}from'../utils/sql.js';import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createCreate(i,E){return async function W({name:M,data:m,user:P},D){const r=g,x=E['get'](M);assertOperation(x,'create',P),validateInputData({'resource':x,'data':m});const Z=writableData(x,m);x['fields']['created_at']&&Z[r(0xf3)](['created_at',new Date()]);x['fields']['created_by']&&Z['push']([r(0xf4),P?.['id']]);if(!Z['length'])throw new ValidationError('No\x20writable\x20fields');const f=Z['map'](([s])=>qi(s)),b=Z['map']((s,o)=>'$'+(o+0x1)),K=Z['map'](([,s])=>s),J=D?.['pg']??i['pg'],Q=await J['query']('INSERT\x20INTO\x20'+qt(x['table'])+'\x20('+f['join'](',\x20')+')\x20'+('VALUES\x20('+b['join'](',\x20')+')\x20')+'RETURNING\x20*',K),y=Q['rows'][0x0];return clearTableLookupCache(x[r(0xf5)],J),await(D?.[r(0xf6)]??i['audit'])?.['write']({'userId':P?.['id'],'module':x['module'],'resource':x['name'],'resourceId':y[x['key']],'action':r(0xf7),'fields':Object['keys'](m)}),y;};}
@@ -1 +1 @@
1
- function O(){const l=['get','\x22\x20requires\x20a\x20capabilities\x20\x22','DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3','relations','foreignKey'];O=function(){return l;};return O();}import{UnsupportedError}from'../../../errors.js';import{createRemove}from'./delete.js';function c(S,Z){S=S-0x98;const h=O();let U=h[S];return U;}export function createDeleteRelation(S,Z){const h=createRemove(S,Z);return async function U({name:D,id:u,relation:e,relationId:q,user:x},n){const i=c,N=n?.['pg']??S['pg'],o=Z[i(0x98)](D);if(['notes','files']['includes'](e)&&!o['capabilities']?.['includes'](e))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+e+i(0x99)+e+'\x22');if(e==='notes')return await N['query']('DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[q,D,String(u)]),{'success':!![]};if(e==='files')return await N['query'](i(0x9a),[q,D,String(u)]),{'success':!![]};const j=o[i(0x9b)]?.[e];if(!j?.['resource']||!j[i(0x9c)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+e+'\x22\x20requires\x20a\x20project/provider\x20implementation');const X=await h({'name':j['resource'],'id':q,'user':x,'where':{'column':j['foreignKey'],'value':u}},n);return{'success':X};};}
1
+ import{UnsupportedError}from'../../../errors.js';import{createRemove}from'./delete.js';export function createDeleteRelation(i,E){const W=createRemove(i,E);return async function M({name:m,id:P,relation:D,relationId:x,user:Z},f){const y=g,b=f?.['pg']??i['pg'],K=E[y(0x175)](m);if([y(0x176),'files']['includes'](D)&&!K['capabilities']?.[y(0x177)](D))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+D+'\x22\x20requires\x20a\x20capabilities\x20\x22'+D+'\x22');if(D==='notes')return await b[y(0x178)](y(0x179),[x,m,String(P)]),{'success':!![]};if(D==='files')return await b[y(0x178)]('DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[x,m,String(P)]),{'success':!![]};const J=K['relations']?.[D];if(!J?.['resource']||!J['foreignKey'])throw new UnsupportedError(y(0x17a)+D+'\x22\x20requires\x20a\x20project/provider\x20implementation');const Q=await W({'name':J['resource'],'id':x,'user':Z,'where':{'column':J[y(0x17b)],'value':P}},f);return{'success':Q};};}function g(i,E){i=i-0x175;const W=T();let M=W[i];return M;}function T(){const s=['get','notes','includes','query','DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3','Generic\x20Resource\x20relation\x20\x22','foreignKey'];T=function(){return s;};return T();}
@@ -1 +1 @@
1
- import{assertOperation}from'../utils/permissions.js';function O(){const i=['push','value','column','\x20=\x20$','table','rowCount','audit','module','name'];O=function(){return i;};return O();}import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function c(S,Z){S=S-0x140;const h=O();let U=h[S];return U;}export function createRemove(S,Z){return async function h({name:U,id:D,user:u,where:e},q){const X=c,x=Z['get'](U);assertOperation(x,'delete',u);const n=q?.['pg']??S['pg'],N=[D];let o='WHERE\x20'+qi(x['key'])+'\x20=\x20$1';e&&(N[X(0x140)](e[X(0x141)]),o+='\x20AND\x20'+qi(e[X(0x142)])+X(0x143)+N['length']);x['where']&&(o+='\x20AND\x20('+x['where']+')');const j=await n['query']('DELETE\x20FROM\x20'+qt(x[X(0x144)])+'\x20'+o,N);if((j['rowCount']??0x0)>0x0)clearTableLookupCache(x[X(0x144)],n);if((j[X(0x145)]??0x0)>0x0)await(q?.[X(0x146)]??S[X(0x146)])?.['write']({'module':x[X(0x147)],'resource':x[X(0x148)],'resourceId':D,'action':'delete'});return(j[X(0x145)]??0x0)>0x0;};}
1
+ import{assertOperation}from'../utils/permissions.js';function g(i,E){i=i-0xe1;const W=T();let M=W[i];return M;}import{qt,qi}from'../utils/sql.js';function T(){const y=['WHERE\x20','key','length','\x20AND\x20(','where','DELETE\x20FROM\x20','audit','delete'];T=function(){return y;};return T();}import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createRemove(i,E){return async function W({name:M,id:m,user:P,where:D},x){const Q=g,Z=E['get'](M);assertOperation(Z,'delete',P);const f=x?.['pg']??i['pg'],b=[m];let K=Q(0xe1)+qi(Z[Q(0xe2)])+'\x20=\x20$1';D&&(b['push'](D['value']),K+='\x20AND\x20'+qi(D['column'])+'\x20=\x20$'+b[Q(0xe3)]);Z['where']&&(K+=Q(0xe4)+Z[Q(0xe5)]+')');const J=await f['query'](Q(0xe6)+qt(Z['table'])+'\x20'+K,b);if((J['rowCount']??0x0)>0x0)clearTableLookupCache(Z['table'],f);if((J['rowCount']??0x0)>0x0)await(x?.[Q(0xe7)]??i[Q(0xe7)])?.['write']({'module':Z['module'],'resource':Z['name'],'resourceId':m,'action':Q(0xe8)});return(J['rowCount']??0x0)>0x0;};}
@@ -1 +1 @@
1
- {"version":3,"file":"find-one.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/find-one.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,YAAY,EACb,MAAM,sBAAsB,CAAC;AAK9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,wBAAgB,aAAa,CAC3B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,gCAQvB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,6CAkDF"}
1
+ {"version":3,"file":"find-one.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/find-one.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,YAAY,EACb,MAAM,sBAAsB,CAAC;AAK9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,wBAAgB,aAAa,CAC3B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,gCAOvB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,6CA0EF"}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qt,qi,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';function O(){const Y=['type','integer','isInteger','Invalid\x20id:\x20','join','where','rows','fields','include','isArray','then','one','time','now'];O=function(){return Y;};return O();}function c(S,Z){S=S-0x161;const h=O();let U=h[S];return U;}import{createFindRelation}from'./find-relation.js';export function createFindOne(S,Z){return async function h({name:U,id:D,query:query={},user:u}){const b=c,e=Date['now'](),q=Z['get'](U);assertOperation(q,'read',u);if(q['fields'][q['key']]?.[b(0x161)]===b(0x162)&&!Number[b(0x163)](Number(D)))throw new ValidationError(b(0x164)+D+'\x20name:'+U);const x=q['joins']?.['map'](i=>i['sql']+'\x20')[b(0x165)]('\x20')||'',n=q[b(0x166)]?'\x20AND\x20('+q[b(0x166)]+')':'',N=await S['pg']['query']('SELECT\x20'+readableFields(q)['join'](',\x20')+'\x20FROM\x20'+qt(q['table'])+'\x20t\x20'+x+'\x20WHERE\x20'+qi(q['key'])+'=$1'+n+'\x20LIMIT\x201',[D]),o=N[b(0x167)][0x0];if(!o)return null;await addDictionaryLookupData([o],q['fields'],S['dictionary']),await addTableLookupData([o],q['fields'],S['pg']),addFileToken([o],q[b(0x168)],S['file']);const j=(query[b(0x169)]==='all'?Object['keys'](q['relations']||{}):null)||(Array[b(0x16a)](query['include'])?query['include']:query['include']?.['split'](',')??[]),X=createFindRelation(S,Z);for(const i of j){o[i]=await X({'name':U,'id':D,'relation':i,'query':query,'user':u})[b(0x16b)](l=>l['rows']??[])['then'](l=>q['relations']?.[i]?.['type']===b(0x16c)?l[0x0]??null:l);}return o[b(0x16d)]=Date[b(0x16e)]()-e,o;};}
1
+ import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qt,qi,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';function T(){const S=['now','read','key','isInteger','Unknown\x20scope:\x20','join','where','SELECT\x20','file','keys','then'];T=function(){return S;};return T();}import{addTableLookupData}from'./add-table-lookup-data.js';function g(i,E){i=i-0x9f;const W=T();let M=W[i];return M;}import{addFileToken}from'./add-file-token.js';import{createFindRelation}from'./find-relation.js';export function createFindOne(i,E){return async function W({name:M,id:m,query:query={},user:P}){const G=g,D=Date[G(0x9f)](),x=E['get'](M);assertOperation(x,G(0xa0),P);if(x['fields'][x[G(0xa1)]]?.['type']==='integer'&&!Number[G(0xa2)](Number(m)))throw new ValidationError('Invalid\x20id:\x20'+m+'\x20name:'+M);if(query['scope']&&x['scopes']?.[query['scope']]===undefined)throw new ValidationError(G(0xa3)+query['scope']);const Z=x['joins']?.['map'](o=>o['sql']+'\x20')[G(0xa4)]('\x20')||'',f=x[G(0xa5)]?'\x20AND\x20('+x[G(0xa5)]+')':'',b=query['scope']||(x['scopes']?.['default']?'default':undefined),K=b?'\x20AND\x20('+(x['scopes']?.[b]||'true')+')':'',J=await i['pg']['query'](G(0xa6)+readableFields(x)[G(0xa4)](',\x20')+'\x20FROM\x20'+qt(x['table'])+'\x20t\x20'+Z+'\x20WHERE\x20'+qi(x['key'])+'=$1'+f+K+'\x20LIMIT\x201',[m]),Q=J['rows'][0x0];if(!Q)return null;await addDictionaryLookupData([Q],x['fields'],i['dictionary']),await addTableLookupData([Q],x['fields'],i['pg']),addFileToken([Q],x['fields'],i[G(0xa7)]);const y=(query['include']==='all'?Object[G(0xa8)](x['relations']||{}):null)||(Array['isArray'](query['include'])?query['include']:query['include']?.['split'](',')??[]),s=createFindRelation(i,E);for(const o of y){Q[o]=await s({'name':M,'id':m,'relation':o,'query':query,'user':P})[G(0xa9)](r=>r['rows']??[])['then'](r=>x['relations']?.[o]?.['type']==='one'?r[0x0]??null:r);}return Q['time']=Date['now']()-D,Q;};}
@@ -1 +1 @@
1
- import{UnsupportedError,ValidationError}from'../../../errors.js';import{qi,qt}from'../utils/sql.js';function O(){const B=['limit','isFinite','get','relations','notes','includes','now','files','resource','fields','filter','scope','foreignKey','btree','JOIN\x20','junctionTable','\x20j\x20ON\x20j.','junctionForeignKey','localKey','where','join','\x20t\x20','query','file'];O=function(){return B;};return O();}import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';function c(S,Z){S=S-0x1d1;const h=O();let U=h[S];return U;}import{autoIndex}from'../utils/auto-index.js';export function createFindRelation(S,Z){return async function h({name:U,id:D,relation:u,query:query={}}){const I=c,e=Date['now'](),q=Math['min'](Math['max'](query[I(0x1d1)]??0x14,0x1),0xc8),x=Math['max'](query['offset']??0x0,0x0);if(!Number['isFinite'](q)||!Number[I(0x1d2)](x))throw new ValidationError('Invalid\x20pagination');const n=Z[I(0x1d3)](U),N=n[I(0x1d4)]?.[u];if([I(0x1d5),'files']['includes'](u)&&!n['capabilities']?.[I(0x1d6)](u))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+u+'\x22\x20requires\x20a\x20capabilities\x20\x22'+u+'\x22');if(u==='notes'){const L=await S['pg']['query']('SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[U,String(D)]);return{'total':L['rows']['length'],'time':Date[I(0x1d7)]()-e,'rows':L['rows']};}if(u===I(0x1d8)){const V=await S['pg']['query']('SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[U,String(D)]);return addFileToken(V['rows'],{'file_path':{'type':'file'}},S['file']),{'total':V['rows']['length'],'time':Date['now']()-e,'rows':V['rows']};}if(!N?.[I(0x1d9)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+u+'\x22\x20requires\x20a\x20project/provider\x20implementation');const o=Z['get'](N['resource']),j=o?.['key']??'id',X=o?.['table'],i=Object['keys'](o?.[I(0x1da)]??{})[I(0x1db)](k=>o?.[I(0x1da)][k]?.['read']&&o?.['fields'][k]?.[I(0x1dc)]!=='item')['map'](qi)['join'](',\x20'),l=N['fields']?.['join'](',\x20')||i||'*';N[I(0x1dd)]&&autoIndex(X,N[I(0x1dd)],I(0x1de),S['pg']);const b=N['junctionTable']?I(0x1df)+qt(N[I(0x1e0)])+I(0x1e1)+qi(N[I(0x1e2)])+'\x20=\x20t.'+(N['junctionTargetKey']||qi(j))+'\x20WHERE\x20'+qi(N['junctionLocalKey'])+'\x20=\x20$1\x20':'where\x20'+(N['foreignKey']||qi(j))+'\x20=\x20(SELECT\x20'+qi(N[I(0x1e3)]||n['key'])+'\x20FROM\x20'+qt(n['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(n['key'])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x20'+(N[I(0x1e4)]?'AND\x20('+N[I(0x1e4)]+')':''),Y=o['joins']?.['map'](k=>k['sql']+'\x20')[I(0x1e5)]('\x20')||'',r='SELECT\x20'+l+'\x20FROM\x20'+qt(X)+I(0x1e6)+Y+'\x20'+b+'\x20LIMIT\x20$2\x20OFFSET\x20$3',E=await S['pg'][I(0x1e7)](r,[D,q,x]);return o&&(await addDictionaryLookupData(E['rows'],o[I(0x1da)],S['dictionary']),await addTableLookupData(E['rows'],o['fields'],S['pg']),addFileToken(E['rows'],o['fields'],S[I(0x1e8)])),{'limit':q,'offset':x,'total':E['rows']['length'],'time':Date['now']()-e,'rows':E['rows']??null};};}
1
+ function T(){const U=['offset','isFinite','get','relations','capabilities','includes','\x22\x20requires\x20a\x20capabilities\x20\x22','query','length','now','file','rows','resource','key','table','fields','filter','join','junctionTargetKey','junctionLocalKey','\x20=\x20$1\x20','where\x20','localKey','\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x20','where','AND\x20(','joins','SELECT\x20'];T=function(){return U;};return T();}import{UnsupportedError,ValidationError}from'../../../errors.js';import{qi,qt}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';function g(i,E){i=i-0x127;const W=T();let M=W[i];return M;}import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';import{autoIndex}from'../utils/auto-index.js';export function createFindRelation(i,E){return async function W({name:M,id:m,relation:P,query:query={}}){const X=g,D=Date['now'](),x=Math['min'](Math['max'](query['limit']??0x14,0x1),0xc8),Z=Math['max'](query[X(0x127)]??0x0,0x0);if(!Number[X(0x128)](x)||!Number['isFinite'](Z))throw new ValidationError('Invalid\x20pagination');const f=E[X(0x129)](M),b=f[X(0x12a)]?.[P];if(['notes','files']['includes'](P)&&!f[X(0x12b)]?.[X(0x12c)](P))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+P+X(0x12d)+P+'\x22');if(P==='notes'){const p=await i['pg'][X(0x12e)]('SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[M,String(m)]);return{'total':p['rows'][X(0x12f)],'time':Date[X(0x130)]()-D,'rows':p['rows']};}if(P==='files'){const Y=await i['pg']['query']('SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[M,String(m)]);return addFileToken(Y['rows'],{'file_path':{'type':'file'}},i[X(0x131)]),{'total':Y[X(0x132)][X(0x12f)],'time':Date[X(0x130)]()-D,'rows':Y['rows']};}if(!b?.[X(0x133)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+P+'\x22\x20requires\x20a\x20project/provider\x20implementation');const K=E['get'](b['resource']),J=K?.[X(0x134)]??'id',Q=K?.[X(0x135)],y=Object['keys'](K?.[X(0x136)]??{})[X(0x137)](d=>K?.['fields'][d]?.['read']&&K?.['fields'][d]?.['scope']!=='item')['map'](qi)['join'](',\x20'),s=b['fields']?.[X(0x138)](',\x20')||y||'*';b['foreignKey']&&autoIndex(Q,b['foreignKey'],'btree',i['pg']);const o=b['junctionTable']?'JOIN\x20'+qt(b['junctionTable'])+'\x20j\x20ON\x20j.'+qi(b['junctionForeignKey'])+'\x20=\x20t.'+(b[X(0x139)]||qi(J))+'\x20WHERE\x20'+qi(b[X(0x13a)])+X(0x13b):X(0x13c)+(b['foreignKey']||qi(J))+'\x20=\x20(SELECT\x20'+qi(b[X(0x13d)]||f['key'])+'\x20FROM\x20'+qt(f['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(f[X(0x134)])+X(0x13e)+(b[X(0x13f)]?X(0x140)+b['where']+')':''),r=K[X(0x141)]?.['map'](d=>d['sql']+'\x20')[X(0x138)]('\x20')||'',G=X(0x142)+s+'\x20FROM\x20'+qt(Q)+'\x20t\x20'+r+'\x20'+o+'\x20LIMIT\x20$2\x20OFFSET\x20$3',S=await i['pg']['query'](G,[m,x,Z]);return K&&(await addDictionaryLookupData(S[X(0x132)],K['fields'],i['dictionary']),await addTableLookupData(S['rows'],K['fields'],i['pg']),addFileToken(S['rows'],K[X(0x136)],i['file'])),{'limit':x,'offset':Z,'total':S['rows']['length'],'time':Date['now']()-D,'rows':S[X(0x132)]??null};};}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{buildFilters,buildIndex}from'../utils/filters.js';import{assertOperation}from'../utils/permissions.js';import{buildSort}from'../utils/sort.js';import{qt,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';function O(){const k=['get','read','max','limit','sql','\x20AND\x20','Invalid\x20pagination','fields','filter','map','text','values',')\x20LIKE\x20$','scope','\x20WHERE\x20','true','joins','join','NULL','LIMIT\x20$','length','dictionary','rowCount','include'];O=function(){return k;};return O();}import{autoIndex}from'../utils/auto-index.js';function c(S,Z){S=S-0x16c;const h=O();let U=h[S];return U;}import{buildSummary}from'../utils/summary.js';import{buildUserResourceScopeFilter}from'../utils/scope.js';export function createFind(S,Z){return async function h({name:U,query:query={},user:D}){const V=c,u=Date['now'](),e=Z[V(0x16c)](U);assertOperation(e,V(0x16d),D);const q=Math['min'](Math[V(0x16e)](query[V(0x16f)]??0x14,0x1),0xc8),x=Math['max'](query['offset']??0x0,0x0);buildIndex(e,query['filter'],S['pg']);const n=buildFilters(e,query['filter']);e['where']&&(n['sql']+=(n[V(0x170)]?V(0x171):'\x20WHERE\x20')+('('+e['where']+')'));const N=buildSort(e,query['sort']);if(!Number['isFinite'](q)||!Number['isFinite'](x))throw new ValidationError(V(0x172));const o=e['searchable']||Object['keys'](e[V(0x173)])[V(0x174)](L=>e['fields'][L]?.['searchable']);query['search']&&o['length']&&(o[V(0x175)](L=>autoIndex(e['table'],L,V(0x176),S['pg'])),n[V(0x177)]['push'](query['search']['toLowerCase']()+'%'),n['sql']+=(n[V(0x170)]?'\x20AND\x20':'\x20WHERE\x20')+('\x20('+o?.['map'](L=>'lower('+qt(L)+V(0x178)+n[V(0x177)]['length'])['join']('\x20OR\x20')+')'));if(query['scope']&&e['scopes']?.[query['scope']]===undefined)throw new ValidationError('Unknown\x20scope:\x20'+query[V(0x179)]);const j=query['scope']||(e['scopes']?.['default']?'default':undefined);j&&(n['sql']+=(n[V(0x170)]?'\x20AND\x20':V(0x17a))+('('+(e['scopes']?.[j]||V(0x17b))+')'));const X=await buildUserResourceScopeFilter(e,D,S['pg'],n[V(0x177)]['length']+0x1);X['sql']&&(n[V(0x170)]+=(n[V(0x170)]?'\x20AND\x20':'\x20WHERE\x20')+('('+X['sql']+')'),n['values']['push'](...X['values']));const i=e[V(0x17c)]?.['filter'](L=>L[V(0x179)]!=='item')['map'](L=>L['sql']+'\x20')['join']('\x20')||'',l='SELECT\x20'+readableFields(e,'all')[V(0x17d)](',\x20')+'\x20'+('FROM\x20'+qt(e['table'])+'\x20t\x20')+(i+'\x20'+n['sql']['replace'](/:uid/g,'\x27'+(D?.['id']??V(0x17e))+'\x27')+'\x20'+N+'\x20')+(V(0x17f)+(n[V(0x177)][V(0x180)]+0x1)+'\x20')+('OFFSET\x20$'+(n['values']['length']+0x2)),b=buildSummary(e,query,D,X),[Y,r]=await Promise['all']([S['pg']['query'](l,[...n['values'],q,x]),S['pg']['query'](b['sql'],b['values'])['then'](L=>L['rows'][0x0]??{})]),E=Y['rows'];return await addDictionaryLookupData(E,e['fields'],S[V(0x181)]),await addTableLookupData(E,e['fields'],S['pg']),addFileToken(E,e[V(0x173)],S['file']),{'time':Date['now']()-u,'limit':q,'offset':x,'count':Y[V(0x182)],'total':r?.['count']??0x0,'summary':r,'rows':E,...query[V(0x183)]?.['includes']('fields')?{'fields':e['fields']}:{}};};}
1
+ import{ValidationError}from'../../../errors.js';import{buildFilters,buildIndex}from'../utils/filters.js';import{assertOperation}from'../utils/permissions.js';import{buildSort}from'../utils/sort.js';function T(){const d=['get','offset','filter','sort','isFinite','keys','fields','search','text','sql','lower(','scope','scopes','default','\x20WHERE\x20','joins','SELECT\x20','all','table','OFFSET\x20$','length','values','then','rows','dictionary','now'];T=function(){return d;};return T();}import{qt,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';function g(i,E){i=i-0x183;const W=T();let M=W[i];return M;}import{autoIndex}from'../utils/auto-index.js';import{buildSummary}from'../utils/summary.js';import{buildUserResourceScopeFilter}from'../utils/scope.js';export function createFind(i,E){return async function W({name:M,query:query={},user:m}){const Y=g,P=Date['now'](),D=E[Y(0x183)](M);assertOperation(D,'read',m);const x=Math['min'](Math['max'](query['limit']??0x14,0x1),0xc8),Z=Math['max'](query[Y(0x184)]??0x0,0x0);buildIndex(D,query[Y(0x185)],i['pg']);const f=buildFilters(D,query['filter']);D['where']&&(f['sql']+=(f['sql']?'\x20AND\x20':'\x20WHERE\x20')+('('+D['where']+')'));const b=buildSort(D,query[Y(0x186)]);if(!Number[Y(0x187)](x)||!Number['isFinite'](Z))throw new ValidationError('Invalid\x20pagination');const K=D['searchable']||Object[Y(0x188)](D[Y(0x189)])['filter'](p=>D[Y(0x189)][p]?.['searchable']);query[Y(0x18a)]&&K['length']&&(K['map'](p=>autoIndex(D['table'],p,Y(0x18b),i['pg'])),f['values']['push'](query['search']['toLowerCase']()+'%'),f[Y(0x18c)]+=(f['sql']?'\x20AND\x20':'\x20WHERE\x20')+('\x20('+K?.['map'](p=>Y(0x18d)+qt(p)+')\x20LIKE\x20$'+f['values']['length'])['join']('\x20OR\x20')+')'));if(query[Y(0x18e)]&&D['scopes']?.[query['scope']]===undefined)throw new ValidationError('Unknown\x20scope:\x20'+query['scope']);const J=query['scope']||(D[Y(0x18f)]?.[Y(0x190)]?Y(0x190):undefined);J&&(f['sql']+=(f['sql']?'\x20AND\x20':'\x20WHERE\x20')+('('+(D[Y(0x18f)]?.[J]||'true')+')'));const Q=await buildUserResourceScopeFilter(D,m,i['pg'],f['values']['length']+0x1);Q[Y(0x18c)]&&(f['sql']+=(f['sql']?'\x20AND\x20':Y(0x191))+('('+Q[Y(0x18c)]+')'),f['values']['push'](...Q['values']));const y=D[Y(0x192)]?.[Y(0x185)](p=>p['scope']!=='item')['map'](p=>p['sql']+'\x20')['join']('\x20')||'',s=Y(0x193)+readableFields(D,Y(0x194))['join'](',\x20')+'\x20'+('FROM\x20'+qt(D[Y(0x195)])+'\x20t\x20')+(y+'\x20'+f['sql']['replace'](/:uid/g,'\x27'+(m?.['id']??'NULL')+'\x27')+'\x20'+b+'\x20')+('LIMIT\x20$'+(f['values']['length']+0x1)+'\x20')+(Y(0x196)+(f['values'][Y(0x197)]+0x2)),o=buildSummary(D,query,m,Q),[r,G]=await Promise[Y(0x194)]([i['pg']['query'](s,[...f[Y(0x198)],x,Z]),i['pg']['query'](o['sql'],o['values'])[Y(0x199)](p=>p['rows'][0x0]??{})]),S=r[Y(0x19a)];return await addDictionaryLookupData(S,D['fields'],i[Y(0x19b)]),await addTableLookupData(S,D['fields'],i['pg']),addFileToken(S,D['fields'],i['file']),{'time':Date[Y(0x19c)]()-P,'limit':x,'offset':Z,'count':r['rowCount'],'total':G?.['count']??0x0,'summary':G,'rows':S,...query['include']?.['includes']('fields')?{'fields':D[Y(0x189)]}:{}};};}
@@ -1 +1 @@
1
- function O(){const u=['rows'];O=function(){return u;};return O();}function c(S,Z){S=S-0xab;const h=O();let U=h[S];return U;}export async function getTableColumns(S,Z){const D=c;if(!S)throw new Error('not\x20enough\x20params:\x20table');if(!Z?.['pg'])return[];const h=await Z['pg']['query']('\x0a\x20\x20\x20\x20select\x0a\x20\x20\x20\x20\x20\x20\x20\x20attname\x20as\x20name,\x20pg_catalog.col_description(attrelid,attnum)\x20as\x20title\x0a\x20\x20\x20\x20from\x20pg_catalog.pg_attribute\x20where\x20attrelid=$1::regclass\x20and\x20attnum>0\x20and\x20NOT\x20attisdropped',[S])['then'](U=>U[D(0xab)]||[]);return h;}
1
+ function T(){const P=['\x0a\x20\x20\x20\x20select\x0a\x20\x20\x20\x20\x20\x20\x20\x20attname\x20as\x20name,\x20pg_catalog.col_description(attrelid,attnum)\x20as\x20title\x0a\x20\x20\x20\x20from\x20pg_catalog.pg_attribute\x20where\x20attrelid=$1::regclass\x20and\x20attnum>0\x20and\x20NOT\x20attisdropped'];T=function(){return P;};return T();}function g(i,E){i=i-0x1b2;const W=T();let M=W[i];return M;}export async function getTableColumns(i,E){const m=g;if(!i)throw new Error('not\x20enough\x20params:\x20table');if(!E?.['pg'])return[];const W=await E['pg']['query'](m(0x1b2),[i])['then'](M=>M['rows']||[]);return W;}
@@ -1 +1 @@
1
- import{UnsupportedError,ValidationError}from'../../../errors.js';import{createUpdate}from'./update.js';function O(){const i=['foreignKey'];O=function(){return i;};return O();}function c(S,Z){S=S-0x9c;const h=O();let U=h[S];return U;}export function createUpdateRelation(S,Z){const h=createUpdate(S,Z);return async function U({name:D,id:u,relation:e,relationId:q,data:x,user:n},N){const X=c,o=Z['get'](D),j=o['relations']?.[e];if(!j?.['resource']||!j['foreignKey'])throw new UnsupportedError('Relation\x20update\x20is\x20not\x20configured:\x20'+e);if(Object['hasOwn'](x,j['foreignKey'])&&x[j['foreignKey']]!==u)throw new ValidationError('Cannot\x20change\x20relation:\x20'+j['foreignKey']);return h({'name':j['resource'],'id':q,'data':x,'user':n,'where':{'column':j[X(0x9c)],'value':u}},N);};}
1
+ function g(i,E){i=i-0x73;const W=T();let M=W[i];return M;}import{UnsupportedError,ValidationError}from'../../../errors.js';import{createUpdate}from'./update.js';function T(){const y=['relations','foreignKey','resource'];T=function(){return y;};return T();}export function createUpdateRelation(i,E){const W=createUpdate(i,E);return async function M({name:m,id:P,relation:D,relationId:x,data:Z,user:f},b){const Q=g,K=E['get'](m),J=K[Q(0x73)]?.[D];if(!J?.['resource']||!J[Q(0x74)])throw new UnsupportedError('Relation\x20update\x20is\x20not\x20configured:\x20'+D);if(Object['hasOwn'](Z,J['foreignKey'])&&Z[J['foreignKey']]!==P)throw new ValidationError('Cannot\x20change\x20relation:\x20'+J['foreignKey']);return W({'name':J[Q(0x75)],'id':x,'data':Z,'user':f,'where':{'column':J['foreignKey'],'value':P}},b);};}
@@ -1 +1 @@
1
- import{NotFoundError,ValidationError}from'../../../errors.js';function O(){const L=['update','length','No\x20writable\x20fields','fields','updated_by','push','map','\x20=\x20$','where','query','join','table','module'];O=function(){return L;};return O();}import{assertOperation}from'../utils/permissions.js';import{qi,qt,writableData}from'../utils/sql.js';function c(S,Z){S=S-0xea;const h=O();let U=h[S];return U;}import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createUpdate(S,Z){return async function h({name:U,id:D,data:u,user:e,where:q},x){const E=c,n=Z['get'](U);assertOperation(n,E(0xea),e);const N=writableData(n,u);if(!N[E(0xeb)])throw new ValidationError(E(0xec));const o=x?.['pg']??S['pg'];validateInputData({'resource':n,'data':u,'update':!![]});n['fields']['updated_at']&&N['push'](['updated_at',new Date()]);n[E(0xed)][E(0xee)]&&N[E(0xef)](['updated_by',e?.['id']]);delete u['user_type'];const j=N[E(0xf0)](([Y],r)=>qi(Y)+E(0xf1)+(r+0x1)),X=[...N[E(0xf0)](([,Y])=>Y),D];let i='WHERE\x20'+qi(n['key'])+'\x20=\x20$'+X['length'];q&&(X['push'](q['value']),i+='\x20AND\x20'+qi(q['column'])+'\x20=\x20$'+X['length']);n[E(0xf2)]&&(i+='\x20AND\x20('+n['where']+')');const l=await o[E(0xf3)]('UPDATE\x20'+qt(n['table'])+'\x20'+('SET\x20'+j['join'](',\x20')+'\x20')+(i+'\x20')+('RETURNING\x20'+Object['keys'](u)['map'](qi)[E(0xf4)](',\x20')),X),b=l['rows'][0x0];if(!b)throw new NotFoundError(U+':'+D);return clearTableLookupCache(n[E(0xf5)],o),await(x?.['audit']??S['audit'])?.['write']({'userId':e?.['id'],'module':n[E(0xf6)],'resource':n['name'],'resourceId':D,'action':E(0xea),'fields':Object['keys'](u)}),b;};}
1
+ import{NotFoundError,ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';function g(i,E){i=i-0x6d;const W=T();let M=W[i];return M;}import{qi,qt,writableData}from'../utils/sql.js';import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createUpdate(i,E){return async function W({name:M,id:m,data:P,user:D,where:x},Z){const S=g,f=E[S(0x6d)](M);assertOperation(f,'update',D);const b=writableData(f,P);if(!b['length'])throw new ValidationError('No\x20writable\x20fields');const K=Z?.['pg']??i['pg'];validateInputData({'resource':f,'data':P,'update':!![]});f[S(0x6e)]['updated_at']&&b[S(0x6f)](['updated_at',new Date()]);f['fields'][S(0x70)]&&b['push'](['updated_by',D?.['id']]);delete P['user_type'];const J=b[S(0x71)](([r],G)=>qi(r)+'\x20=\x20$'+(G+0x1)),Q=[...b[S(0x71)](([,r])=>r),m];let y='WHERE\x20'+qi(f[S(0x72)])+'\x20=\x20$'+Q['length'];x&&(Q['push'](x[S(0x73)]),y+='\x20AND\x20'+qi(x['column'])+S(0x74)+Q[S(0x75)]);f[S(0x76)]&&(y+='\x20AND\x20('+f['where']+')');const s=await K['query']('UPDATE\x20'+qt(f[S(0x77)])+'\x20'+('SET\x20'+J[S(0x78)](',\x20')+'\x20')+(y+'\x20')+('RETURNING\x20'+Object[S(0x79)](P)[S(0x71)](qi)['join'](',\x20')),Q),o=s['rows'][0x0];if(!o)throw new NotFoundError(M+':'+m);return clearTableLookupCache(f[S(0x77)],K),await(Z?.[S(0x7a)]??i['audit'])?.['write']({'userId':D?.['id'],'module':f['module'],'resource':f['name'],'resourceId':m,'action':S(0x7b),'fields':Object['keys'](P)}),o;};}function T(){const p=['get','fields','push','updated_by','map','key','value','\x20=\x20$','length','where','table','join','keys','audit','update'];T=function(){return p;};return T();}
@@ -1 +1 @@
1
- const x=c;import{qi,qt}from'./sql.js';const requestedIndexes=new WeakMap();export function autoIndex(S,Z,h=x(0x152),U){const n=x,D=requestedIndexes['get'](U)??new Set();requestedIndexes['set'](U,D);const u=S+':'+Z+':'+h;if(D['has'](u))return;D['add'](u),void ensureIndex(S,Z,h,U)[n(0x153)](()=>{D['delete'](u);});}function c(S,Z){S=S-0x152;const h=O();let U=h[S];return U;}function O(){const o=['btree','catch','length','query','\x20USING\x20btree\x20(lower(',')\x20text_pattern_ops)','CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20','\x20USING\x20gin\x20(lower('];O=function(){return o;};return O();}async function ensureIndex(S,Z,h,U){const N=x,D=S['split']('.'),u=D[N(0x154)]===0x2?D[0x0]:'public',e=(S+'_'+Z+'_'+h+'_idx')['replace'](/[^A-Za-z0-9_]/g,'_'),q=await U['query']('SELECT\x201\x20FROM\x20pg_indexes\x20WHERE\x20schemaname\x20=\x20$1\x20AND\x20indexname\x20=\x20$2',[u,e]);if(q['rowCount'])return;if(h==='text'){await U['query']('CREATE\x20EXTENSION\x20IF\x20NOT\x20EXISTS\x20pg_trgm'),await U[N(0x155)]('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(e+'_l')+'\x20ON\x20'+qt(S)+N(0x156)+qi(Z)+N(0x157)),await U['query'](N(0x158)+qi(e)+'\x20ON\x20'+qt(S)+N(0x159)+qi(Z)+')\x20gin_trgm_ops)');return;}await U['query'](N(0x158)+qi(e)+'\x20ON\x20'+qt(S)+'\x20USING\x20'+h+'\x20('+qi(Z)+')');}
1
+ import{qi,qt}from'./sql.js';function g(i,E){i=i-0x108;const W=T();let M=W[i];return M;}const requestedIndexes=new WeakMap();export function autoIndex(i,E,W='btree',M){const Z=g,m=requestedIndexes['get'](M)??new Set();requestedIndexes['set'](M,m);const P=i+':'+E+':'+W;if(m[Z(0x108)](P))return;m['add'](P),void ensureIndex(i,E,W,M)['catch'](()=>{m['delete'](P);});}function T(){const b=['has','length','public','rowCount','CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20','\x20ON\x20','query','\x20USING\x20'];T=function(){return b;};return T();}async function ensureIndex(i,E,W,M){const f=g,m=i['split']('.'),P=m[f(0x109)]===0x2?m[0x0]:f(0x10a),D=(i+'_'+E+'_'+W+'_idx')['replace'](/[^A-Za-z0-9_]/g,'_'),x=await M['query']('SELECT\x201\x20FROM\x20pg_indexes\x20WHERE\x20schemaname\x20=\x20$1\x20AND\x20indexname\x20=\x20$2',[P,D]);if(x[f(0x10b)])return;if(W==='text'){await M['query']('CREATE\x20EXTENSION\x20IF\x20NOT\x20EXISTS\x20pg_trgm'),await M['query'](f(0x10c)+qi(D+'_l')+f(0x10d)+qt(i)+'\x20USING\x20btree\x20(lower('+qi(E)+')\x20text_pattern_ops)'),await M[f(0x10e)](f(0x10c)+qi(D)+'\x20ON\x20'+qt(i)+'\x20USING\x20gin\x20(lower('+qi(E)+')\x20gin_trgm_ops)');return;}await M[f(0x10e)]('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(D)+f(0x10d)+qt(i)+f(0x10f)+W+'\x20('+qi(E)+')');}
@@ -1 +1 @@
1
- function O(){const u=['entries','fields','writable','Required\x20field:\x20','minLength','string','minLength\x20not\x20met:\x20','maxLength\x20exceeded:\x20','minimum','\x20should\x20be\x20>=\x20','pattern'];O=function(){return u;};return O();}function c(S,Z){S=S-0x128;const h=O();let U=h[S];return U;}import{ValidationError}from'../../../errors.js';export{readableFields,writableData,fieldColumn}from'./sql.js';const validateInputData=({resource:S,data:Z,update:update=![]})=>{const D=c;for(const [h,U]of Object[D(0x128)](S[D(0x129)])){if(U['required']&&U[D(0x12a)]!==![]&&(Z[h]===undefined||Z[h]===null)&&!update)throw new ValidationError(D(0x12b)+h);if(U['required']&&U[D(0x12a)]!==![]&&Object['hasOwn'](Z,h)&&(Z[h]===undefined||Z[h]===null)&&update)throw new ValidationError('Required\x20field:\x20'+h);if(U[D(0x12c)]&&typeof Z[h]===D(0x12d)&&Z[h]['length']<U['minLength'])throw new ValidationError(D(0x12e)+h);if(U['maxLength']&&typeof Z[h]==='string'&&Z[h]['length']>U['maxLength'])throw new ValidationError(D(0x12f)+h);if(U['minimum']&&typeof Z[h]==='number'&&Z[h]<U[D(0x130)])throw new ValidationError(h+D(0x131)+U[D(0x130)]);if(U['maximum']&&typeof Z[h]==='number'&&Z[h]>U['maximum'])throw new ValidationError(h+'\x20should\x20be\x20<=\x20'+U['maximum']);if(U['enum']&&Z[h]&&!U['enum']['includes'](Z[h]))throw new ValidationError(h+'\x20should\x20be\x20one\x20of\x20('+U['enum']['join'](',\x20')+')');if(U['pattern']&&typeof Z[h]==='string'&&!new RegExp(U[D(0x132)])['test'](Z[h]))throw new ValidationError(h+'\x20should\x20match\x20regular\x20expression\x20('+U['pattern']+')');}};export{validateInputData};
1
+ import{ValidationError}from'../../../errors.js';export{readableFields,writableData,fieldColumn}from'./sql.js';const validateInputData=({resource:i,data:E,update:update=![]})=>{const m=g;for(const [W,M]of Object['entries'](i['fields'])){if(M['required']&&M['writable']!==![]&&(E[W]===undefined||E[W]===null)&&!update)throw new ValidationError('Required\x20field:\x20'+W);if(M['required']&&M['writable']!==![]&&Object[m(0xe1)](E,W)&&(E[W]===undefined||E[W]===null)&&update)throw new ValidationError('Required\x20field:\x20'+W);if(M['minLength']&&typeof E[W]==='string'&&E[W]['length']<M[m(0xe2)])throw new ValidationError('minLength\x20not\x20met:\x20'+W);if(M['maxLength']&&typeof E[W]==='string'&&E[W]['length']>M['maxLength'])throw new ValidationError('maxLength\x20exceeded:\x20'+W);if(M['minimum']&&typeof E[W]==='number'&&E[W]<M[m(0xe3)])throw new ValidationError(W+m(0xe4)+M[m(0xe3)]);if(M['maximum']&&typeof E[W]===m(0xe5)&&E[W]>M['maximum'])throw new ValidationError(W+'\x20should\x20be\x20<=\x20'+M['maximum']);if(M['enum']&&E[W]&&!M[m(0xe6)]['includes'](E[W]))throw new ValidationError(W+m(0xe7)+M['enum']['join'](',\x20')+')');if(M['pattern']&&typeof E[W]==='string'&&!new RegExp(M['pattern'])['test'](E[W]))throw new ValidationError(W+'\x20should\x20match\x20regular\x20expression\x20('+M['pattern']+')');}};export{validateInputData};function g(i,E){i=i-0xe1;const W=T();let M=W[i];return M;}function T(){const P=['hasOwn','minLength','minimum','\x20should\x20be\x20>=\x20','number','enum','\x20should\x20be\x20one\x20of\x20('];T=function(){return P;};return T();}
@@ -1 +1 @@
1
- import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';import{autoIndex}from'./auto-index.js';function O(){const L=['exec','Unsupported\x20filter\x20operator:\x20','keys','entries','fields','filter','has','type','text','Operator\x20','\x20IS\x20','isArray','push','\x20WHERE\x20','like','geom'];O=function(){return L;};return O();}const filterOperators=new Set(['eq','ne','gt','gte','lt','lte','in','nin','like','ilike','null']);export function parseFilterQuery(S){const l=c,Z={...isRecord(S['filter'])?S['filter']:{}};for(const [h,U]of Object['entries'](S)){const D=/^filter\[([^\]]+)\](?:\[([^\]]+)\])?$/[l(0x167)](h);if(!D)continue;const [,u,e]=D;if(!u)continue;if(!e){Z[u]=U;continue;}if(!filterOperators['has'](e))throw new ValidationError(l(0x168)+e);const q=isRecord(Z[u])?Z[u]:{};q[e]=(e==='in'||e==='nin')&&typeof U==='string'?U['split'](','):U,Z[u]=q;}return Object[l(0x169)](Z)['length']?Z:undefined;}function c(S,Z){S=S-0x167;const h=O();let U=h[S];return U;}export function buildIndex(S,Z,h){const b=c;for(const [U,D]of Object[b(0x16a)](Z??{})){const u=S[b(0x16b)][U];if(!u||u['filter']!==!![]&&u['filterable']!==!![])throw new ValidationError('Field\x20is\x20not\x20filterable:\x20'+U);h&&autoIndex(S['table'],fieldColumn(S,U),indexTypeFor(u['type'],'eq'),h);}}export function buildFilters(S,Z,h=0x1){const Y=c,U=[],D=[];for(const [u,e]of Object['entries'](Z??{})){const q=S['fields'][u];if(!q||q[Y(0x16c)]!==!![]&&q['filterable']!==!![])throw new ValidationError('Field\x20is\x20not\x20filterable:\x20'+u);const x=qi(fieldColumn(S,u)),n=isRecord(e)?e:{'eq':e};for(const [N,o]of Object['entries'](n)){if(!filterOperators[Y(0x16d)](N))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+N);if((N==='like'||N==='ilike')&&q[Y(0x16e)]!=='string'&&q['type']!==Y(0x16f))throw new ValidationError(Y(0x170)+N+'\x20requires\x20a\x20text\x20field:\x20'+u);if(N==='null'){U['push'](x+Y(0x171)+(isTruthy(o)?'':'NOT\x20')+'NULL');continue;}if(N==='in'||N==='nin'){const i=Array[Y(0x172)](o)?o:[o];if(i['length']===0x0){U['push'](N==='in'?'FALSE':'TRUE');continue;}D[Y(0x173)](i),U[Y(0x173)](x+'\x20'+(N==='in'?'=\x20ANY':'<>\x20ALL')+'($'+(h+D['length']-0x1)+')');continue;}const j={'eq':'=','ne':'<>','gt':'>','gte':'>=','lt':'<','lte':'<=','like':'like'},X='$'+(h+D['length']);if(N==='like'){D[Y(0x173)](o+'%'),U['push']('lower('+x+')\x20like\x20lower('+X+')');continue;}D[Y(0x173)](o),U['push'](x+'\x20'+j[N]+'\x20'+X);}}return{'sql':U['length']?Y(0x174)+U['join']('\x20AND\x20'):'','values':D};}function isRecord(S){const r=c;return typeof S==='object'&&S!==null&&!Array[r(0x172)](S);}function isTruthy(S){return S===!![]||S==='true'||S==='1'||S===0x1;}function indexTypeFor(S,Z){const E=c;if(Z===E(0x175)||Z==='ilike')return E(0x16f);if(S===E(0x176)||S==='geometry')return'gist';return'btree';}
1
+ const s=g;import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';import{autoIndex}from'./auto-index.js';const filterOperators=new Set(['eq','ne','gt','gte','lt','lte','in','nin','like',s(0x16d),s(0x16e)]);export function parseFilterQuery(i){const o=s,E={...isRecord(i['filter'])?i['filter']:{}};for(const [W,M]of Object[o(0x16f)](i)){const m=/^filter\[([^\]]+)\](?:\[([^\]]+)\])?$/[o(0x170)](W);if(!m)continue;const [,P,D]=m;if(!P)continue;if(!D){E[P]=M;continue;}if(!filterOperators[o(0x171)](D))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+D);const x=isRecord(E[P])?E[P]:{};x[D]=(D==='in'||D===o(0x172))&&typeof M==='string'?M[o(0x173)](','):M,E[P]=x;}return Object['keys'](E)['length']?E:undefined;}function g(i,E){i=i-0x16d;const W=T();let M=W[i];return M;}export function buildIndex(i,E,W){for(const [M,m]of Object['entries'](E??{})){const P=i['fields'][M];if(!P||P['filter']!==!![]&&P['filterable']!==!![])throw new ValidationError('Field\x20is\x20not\x20filterable:\x20'+M);W&&autoIndex(i['table'],fieldColumn(i,M),indexTypeFor(P['type'],'eq'),W);}}export function buildFilters(i,E,W=0x1){const r=s,M=[],m=[];for(const [P,D]of Object['entries'](E??{})){const x=i['fields'][P];if(!x||x['filter']!==!![]&&x[r(0x174)]!==!![])throw new ValidationError('Field\x20is\x20not\x20filterable:\x20'+P);const Z=qi(fieldColumn(i,P)),f=isRecord(D)?D:{'eq':D};for(const [b,K]of Object[r(0x16f)](f)){if(!filterOperators[r(0x171)](b))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+b);if((b==='like'||b==='ilike')&&x['type']!=='string'&&x[r(0x175)]!=='text')throw new ValidationError('Operator\x20'+b+'\x20requires\x20a\x20text\x20field:\x20'+P);if(b===r(0x16e)){M['push'](Z+'\x20IS\x20'+(isTruthy(K)?'':'NOT\x20')+'NULL');continue;}if(b==='in'||b===r(0x172)){const y=Array[r(0x176)](K)?K:[K];if(y['length']===0x0){M[r(0x177)](b==='in'?r(0x178):'TRUE');continue;}m['push'](y),M[r(0x177)](Z+'\x20'+(b==='in'?'=\x20ANY':'<>\x20ALL')+'($'+(W+m['length']-0x1)+')');continue;}const J={'eq':'=','ne':'<>','gt':'>','gte':'>=','lt':'<','lte':'<=','like':'like'},Q='$'+(W+m['length']);if(b==='like'){m[r(0x177)](K+'%'),M[r(0x177)]('lower('+Z+r(0x179)+Q+')');continue;}m['push'](K),M['push'](Z+'\x20'+J[b]+'\x20'+Q);}}return{'sql':M['length']?r(0x17a)+M['join']('\x20AND\x20'):'','values':m};}function isRecord(i){const G=s;return typeof i===G(0x17b)&&i!==null&&!Array['isArray'](i);}function T(){const p=['ilike','null','entries','exec','has','nin','split','filterable','type','isArray','push','FALSE',')\x20like\x20lower(','\x20WHERE\x20','object','text','geom','geometry','btree'];T=function(){return p;};return T();}function isTruthy(i){return i===!![]||i==='true'||i==='1'||i===0x1;}function indexTypeFor(i,E){const S=s;if(E==='like'||E==='ilike')return S(0x17c);if(i===S(0x17d)||i===S(0x17e))return'gist';return S(0x17f);}
@@ -1 +1 @@
1
- function c(S,Z){S=S-0x75;const h=O();let U=h[S];return U;}import{ForbiddenError}from'../../../errors.js';import{getContext}from'../../../index.js';export function assertOperation(S,Z,h){const u=c,U=getContext()[u(0x75)];if(U['debug'])return;if(!S['operations']['includes'](Z))throw new ForbiddenError(S['name']+'.'+Z+u(0x76));if(S['access']!=='public'&&h===undefined)throw new ForbiddenError(u(0x77));if(S['access']==='admin'&&h?.[u(0x78)]!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(h?.['type']!=='admin'){const D=(S['permission']??S['name'])+':'+Z;if(!h?.['permissions']?.[u(0x79)](D))throw new ForbiddenError('Missing\x20permission:\x20'+D);}}function O(){const e=['config','\x20is\x20disabled','Authentication\x20required','type','includes'];O=function(){return e;};return O();}
1
+ function T(){const D=['config','includes','access','admin','permissions'];T=function(){return D;};return T();}import{ForbiddenError}from'../../../errors.js';function g(i,E){i=i-0x117;const W=T();let M=W[i];return M;}import{getContext}from'../../../index.js';export function assertOperation(i,E,W){const P=g,M=getContext()[P(0x117)];if(M['debug'])return;if(!i['operations'][P(0x118)](E))throw new ForbiddenError(i['name']+'.'+E+'\x20is\x20disabled');if(i['access']!=='public'&&W===undefined)throw new ForbiddenError('Authentication\x20required');if(i[P(0x119)]===P(0x11a)&&W?.['type']!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(W?.['type']!=='admin'){const m=(i['permission']??i['name'])+':'+E;if(!W?.[P(0x11b)]?.['includes'](m))throw new ForbiddenError('Missing\x20permission:\x20'+m);}}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{qi}from'./sql.js';const scopeCache=new Map(),CACHE_TTL_MS=0x7530;export function clearResourceScopeCache(S,Z){const o=c;if(S&&Z){scopeCache[o(0x1e8)](S+':'+Z);return;}if(S){for(const h of scopeCache[o(0x1e9)]()){if(h[o(0x1ea)](S+':'))scopeCache['delete'](h);}return;}scopeCache['clear']();}async function loadScopeRows(S,Z,h){const j=c,U=S+':'+Z,D=scopeCache[j(0x1eb)](U);if(D&&D['expiresAt']>Date[j(0x1ec)]())return D['promise'];const u=h[j(0x1ed)]('SELECT\x20DISTINCT\x20ras.scope,\x20ras.value\x0a\x20\x20\x20\x20\x20FROM\x20admin.role_access_scope\x20ras\x0a\x20\x20\x20\x20\x20WHERE\x20ras.resource\x20=\x20$2\x0a\x20\x20\x20\x20\x20\x20\x20AND\x20ras.enabled\x20=\x20TRUE\x0a\x20\x20\x20\x20\x20\x20\x20AND\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20ras.user_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20OR\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ras.user_id\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20ras.role_id\x20IN\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ur.role_id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20(ur.expiration\x20IS\x20NULL\x20OR\x20ur.expiration\x20>=\x20CURRENT_DATE)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20)',[S,Z])['then'](({rows:e})=>{const X=j,q=new Map();for(const x of e){const n=q['get'](x['scope'])??[];if(Array['isArray'](x['value']))n[X(0x1ee)](...x['value']);else{if(x['value']!==null&&x['value']!==undefined)n['push'](x['value']);}q['set'](x[X(0x1ef)],n);}return q;})['catch'](e=>{scopeCache['delete'](U);throw e;});return scopeCache['set'](U,{'expiresAt':Date['now']()+CACHE_TTL_MS,'promise':u}),u;}export async function getUserResourceScopes(S,Z,h){const i=c,U=await loadScopeRows(S,Z,h);return Object['fromEntries']([...U][i(0x1f0)](([D,u])=>[D,D==='me'?S:u]));}function columnForScope(S,Z){const l=c;if(Z===S['name'])return S['key'];if(Z==='me'){const U=['user_id',l(0x1f1),l(0x1f2),'created_by']['find'](D=>S['fields'][D]);if(!U)throw new ValidationError(l(0x1f3)+S[l(0x1f4)]);return S[l(0x1f5)][U]?.['column']??U;}const h=S['fields'][Z];if(!h)return'';return h['column']??Z;}export async function buildUserResourceScopeFilter(S,Z,h,U){const b=c;if(!Z||Z['type']==='admin')return{'sql':'','values':[]};const D=await loadScopeRows(Z['id'],S[b(0x1f4)],h),u=[],e=[];for(const [q,x]of D){const n=columnForScope(S,q);if(!n){u['push'](b(0x1f6));continue;}const N='t.'+qi(n);if(q==='me'){e[b(0x1ee)](Z['id']),u['push']('('+N+b(0x1f7)+(U+e[b(0x1f8)]-0x1)+')');continue;}if(x['length']===0x0){u['push']('(FALSE)');continue;}e['push'](x),u[b(0x1ee)]('('+N+b(0x1f9)+(U+e[b(0x1f8)]-0x1)+'))');}return{'sql':u[b(0x1fa)](b(0x1fb)),'values':e};}function c(S,Z){S=S-0x1e8;const h=O();let U=h[S];return U;}function O(){const Y=['delete','keys','startsWith','get','now','query','push','scope','map','user_uid','owner_id','Cannot\x20apply\x20\x22me\x22\x20scope\x20to\x20resource\x20without\x20an\x20owner\x20field:\x20','name','fields','(FALSE)','\x20=\x20$','length','\x20=\x20ANY($','join','\x20AND\x20'];O=function(){return Y;};return O();}
1
+ import{ValidationError}from'../../../errors.js';import{qi}from'./sql.js';const scopeCache=new Map(),CACHE_TTL_MS=0x7530;function T(){const o=['delete','keys','promise','then','set','now','key','user_uid','fields','column','name','push','length'];T=function(){return o;};return T();}export function clearResourceScopeCache(i,E){const K=g;if(i&&E){scopeCache[K(0x12d)](i+':'+E);return;}if(i){for(const W of scopeCache[K(0x12e)]()){if(W['startsWith'](i+':'))scopeCache['delete'](W);}return;}scopeCache['clear']();}async function loadScopeRows(i,E,W){const J=g,M=i+':'+E,m=scopeCache['get'](M);if(m&&m['expiresAt']>Date['now']())return m[J(0x12f)];const P=W['query']('SELECT\x20DISTINCT\x20ras.scope,\x20ras.value\x0a\x20\x20\x20\x20\x20FROM\x20admin.role_access_scope\x20ras\x0a\x20\x20\x20\x20\x20WHERE\x20ras.resource\x20=\x20$2\x0a\x20\x20\x20\x20\x20\x20\x20AND\x20ras.enabled\x20=\x20TRUE\x0a\x20\x20\x20\x20\x20\x20\x20AND\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20ras.user_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20OR\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ras.user_id\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20ras.role_id\x20IN\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ur.role_id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20(ur.expiration\x20IS\x20NULL\x20OR\x20ur.expiration\x20>=\x20CURRENT_DATE)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20)',[i,E])[J(0x130)](({rows:D})=>{const Q=J,x=new Map();for(const Z of D){const f=x['get'](Z['scope'])??[];if(Array['isArray'](Z['value']))f['push'](...Z['value']);else{if(Z['value']!==null&&Z['value']!==undefined)f['push'](Z['value']);}x[Q(0x131)](Z['scope'],f);}return x;})['catch'](D=>{scopeCache['delete'](M);throw D;});return scopeCache['set'](M,{'expiresAt':Date[J(0x132)]()+CACHE_TTL_MS,'promise':P}),P;}function g(i,E){i=i-0x12d;const W=T();let M=W[i];return M;}export async function getUserResourceScopes(i,E,W){const M=await loadScopeRows(i,E,W);return Object['fromEntries']([...M]['map'](([m,P])=>[m,m==='me'?i:P]));}function columnForScope(i,E){const y=g;if(E===i['name'])return i[y(0x133)];if(E==='me'){const M=['user_id',y(0x134),'owner_id','created_by']['find'](m=>i['fields'][m]);if(!M)throw new ValidationError('Cannot\x20apply\x20\x22me\x22\x20scope\x20to\x20resource\x20without\x20an\x20owner\x20field:\x20'+i['name']);return i[y(0x135)][M]?.['column']??M;}const W=i['fields'][E];if(!W)return'';return W[y(0x136)]??E;}export async function buildUserResourceScopeFilter(i,E,W,M){const s=g;if(!E||E['type']==='admin')return{'sql':'','values':[]};const m=await loadScopeRows(E['id'],i[s(0x137)],W),P=[],D=[];for(const [x,Z]of m){const f=columnForScope(i,x);if(!f){P[s(0x138)]('(FALSE)');continue;}const b='t.'+qi(f);if(x==='me'){D['push'](E['id']),P['push']('('+b+'\x20=\x20$'+(M+D[s(0x139)]-0x1)+')');continue;}if(Z['length']===0x0){P['push']('(FALSE)');continue;}D['push'](Z),P[s(0x138)]('('+b+'\x20=\x20ANY($'+(M+D['length']-0x1)+'))');}return{'sql':P['join']('\x20AND\x20'),'values':D};}
@@ -1 +1 @@
1
- function c(S,Z){S=S-0x159;const h=O();let U=h[S];return U;}import{fieldColumn,qi}from'./sql.js';function O(){const n=['string','sortable','Field\x20is\x20not\x20sortable:\x20','DESC','ASC','\x20ORDER\x20BY\x20'];O=function(){return n;};return O();}import{ValidationError}from'../../../errors.js';export function buildSort(S,Z){const q=c;if(!Z?.['length'])return'';typeof Z===q(0x159)&&(Z=[Z]);const h=Z['map'](U=>{const x=q,D=U['startsWith']('-'),u=D?U['slice'](0x1):U,e=S['fields'][u];if(!e||e[x(0x15a)]!==!![])throw new ValidationError(x(0x15b)+u);return qi(fieldColumn(S,u))+'\x20'+(D?x(0x15c):x(0x15d));});return q(0x15e)+h['join'](',\x20');}
1
+ function T(){const f=['map','fields'];T=function(){return f;};return T();}import{fieldColumn,qi}from'./sql.js';function g(i,E){i=i-0xc7;const W=T();let M=W[i];return M;}import{ValidationError}from'../../../errors.js';export function buildSort(i,E){const x=g;if(!E?.['length'])return'';typeof E==='string'&&(E=[E]);const W=E[x(0xc7)](M=>{const Z=x,m=M['startsWith']('-'),P=m?M['slice'](0x1):M,D=i[Z(0xc8)][P];if(!D||D['sortable']!==!![])throw new ValidationError('Field\x20is\x20not\x20sortable:\x20'+P);return qi(fieldColumn(i,P))+'\x20'+(m?'DESC':'ASC');});return'\x20ORDER\x20BY\x20'+W['join'](',\x20');}
@@ -1 +1 @@
1
- function O(){const N=['split','join','Unknown\x20field:\x20','column','entries','read','all','key','write'];O=function(){return N;};return O();}const e=c;import{ValidationError}from'../../../errors.js';export const quoteIdentifier=S=>'\x22'+S['replace'](/"/g,'\x22\x22')+'\x22';export const quoteTable=S=>S[e(0x113)]('.')['map'](quoteIdentifier)[e(0x114)]('.');export function fieldColumn(S,Z){const q=e;if(Z===S['key'])return S['key'];const h=S['fields'][Z];if(!h)throw new ValidationError(q(0x115)+Z);return h[q(0x116)]??Z;}export function readableFields(S,Z){const x=e,h=Object[x(0x117)](S['fields'])['filter'](([,U])=>U[x(0x118)]!==![]&&U['readable']!==![]&&(Z?(U['scope']??x(0x119))===Z:!![]))['map'](([U,D])=>quoteIdentifier(D['column']??U)+'\x20AS\x20'+quoteIdentifier(U));return!S['fields'][S[x(0x11a)]]&&h['unshift'](quoteIdentifier(S[x(0x11a)])),h;}export function writableData(S,Z){const n=e,h=[];for(const [U,D]of Object['entries'](Z)){const u=S['fields'][U];if(!u||u[n(0x11b)]===![]||u['writable']===![])throw new ValidationError('Field\x20is\x20not\x20writable:\x20'+U);if((u['write']??u['writable'])!==!![])continue;if(u['type']==='date'&&!Z[U])continue;h['push']([u['column']??U,D]);}return h;}export const qi=quoteIdentifier;function c(S,Z){S=S-0x113;const h=O();let U=h[S];return U;}export const qt=quoteTable;
1
+ import{ValidationError}from'../../../errors.js';export const quoteIdentifier=i=>'\x22'+i['replace'](/"/g,'\x22\x22')+'\x22';export const quoteTable=i=>i['split']('.')['map'](quoteIdentifier)['join']('.');function T(){const Z=['entries','filter','scope','map','column','\x20AS\x20','fields','writable','type','push'];T=function(){return Z;};return T();}export function fieldColumn(i,E){if(E===i['key'])return i['key'];const W=i['fields'][E];if(!W)throw new ValidationError('Unknown\x20field:\x20'+E);return W['column']??E;}export function readableFields(i,E){const D=g,W=Object[D(0x1e0)](i['fields'])[D(0x1e1)](([,M])=>M['read']!==![]&&M['readable']!==![]&&(E?(M[D(0x1e2)]??'all')===E:!![]))[D(0x1e3)](([M,m])=>quoteIdentifier(m[D(0x1e4)]??M)+D(0x1e5)+quoteIdentifier(M));return!i[D(0x1e6)][i['key']]&&W['unshift'](quoteIdentifier(i['key'])),W;}function g(i,E){i=i-0x1e0;const W=T();let M=W[i];return M;}export function writableData(i,E){const x=g,W=[];for(const [M,m]of Object['entries'](E)){const P=i['fields'][M];if(!P||P['write']===![]||P[x(0x1e7)]===![])throw new ValidationError('Field\x20is\x20not\x20writable:\x20'+M);if((P['write']??P['writable'])!==!![])continue;if(P[x(0x1e8)]==='date'&&!E[M])continue;W[x(0x1e9)]([P[x(0x1e4)]??M,m]);}return W;}export const qi=quoteIdentifier;export const qt=quoteTable;
@@ -1 +1 @@
1
- import{buildFilters}from'./filters.js';function c(S,Z){S=S-0x16b;const h=O();let U=h[S];return U;}import{qt}from'./sql.js';const defaultSummary={'count':{'aggregate':'count'}};export function buildSummary(S,Z,h,U){const X=c,D={...defaultSummary,...S['summary']??{}},u=Object[X(0x16b)](D)[X(0x16c)](([o,j])=>{const i=X;if('sql'in j)return'('+j['sql']+')\x20AS\x20\x22'+o+'\x22';switch(j['aggregate']){case'count':return'(COUNT(*)\x20FILTER\x20(where\x20'+(j[i(0x16d)]??'true')+'))::int\x20AS\x20\x22'+o+'\x22';case'countDistinct':return'(COUNT(DISTINCT\x20t.'+qt(j[i(0x16e)])+')\x20FILTER\x20(where\x20'+(j['where']??'true')+'))::int\x20AS\x20\x22'+o+'\x22';case'sum':return i(0x16f)+j['field']+')\x20FILTER\x20(where\x20'+(j['where']??i(0x170))+')\x20AS\x20\x22'+o+'\x22';case i(0x171):return i(0x172)+j['field']+')\x20FILTER\x20(where\x20'+(j['where']??'true')+')\x20AS\x20\x22'+o+'\x22';case'min':return'MIN('+j['field']+')\x20FILTER\x20(where\x20'+(j['where']??'true')+')\x20AS\x20\x22'+o+'\x22';case'max':return i(0x173)+j['field']+i(0x174)+(j[i(0x16d)]??'true')+')\x20AS\x20\x22'+o+'\x22';}}),e=buildFilters(S,Z['filter']);S['where']&&(e[X(0x175)]+=(e['sql']?'\x20AND\x20':X(0x176))+('('+S['where']+')'));const q=Z['scope']||(S['scopes']?.[X(0x177)]?'default':undefined);q&&(e[X(0x175)]+=(e['sql']?X(0x178):'\x20WHERE\x20')+('('+(S['scopes']?.[q]||'true')+')'));const x=S['searchable']||Object['keys'](S['fields'])[X(0x179)](o=>S[X(0x17a)][o]?.['searchable']);Z['search']&&x[X(0x17b)]&&(e['values']['push'](Z[X(0x17c)]['toLowerCase']()+'%'),e['sql']+=(e['sql']?'\x20AND\x20':'\x20WHERE\x20')+('\x20('+x['map'](o=>X(0x17d)+qt(o)+X(0x17e)+e['values']['length'])['join']('\x20OR\x20')+')'));U?.['sql']&&(e['sql']+=(e['sql']?X(0x178):'\x20WHERE\x20')+('('+U['sql']+')'),e['values']['push'](...U['values']));const n=S['joins']?.['filter'](o=>o[X(0x17f)]!=='item')['map'](o=>o[X(0x175)]+'\x20')['join']('\x20')||'',N='SELECT\x20'+u[X(0x180)](',\x20')+'\x20'+('FROM\x20'+qt(S['table'])+'\x20t\x20')+(n+'\x20'+e['sql']['replace'](/:uid/g,'\x27'+(h?.['id']??'NULL')+'\x27'));return{'sql':N,'values':e['values']};}function O(){const l=['entries','map','where','field','SUM(','true','avg','AVG(','MAX(',')\x20FILTER\x20(where\x20','sql','\x20WHERE\x20','default','\x20AND\x20','filter','fields','length','search','lower(',')\x20LIKE\x20$','scope','join'];O=function(){return l;};return O();}
1
+ const Q=g;import{buildFilters}from'./filters.js';import{qt}from'./sql.js';function T(){const o=['count','summary','sql',')\x20AS\x20\x22','(COUNT(*)\x20FILTER\x20(where\x20','SUM(','field',')\x20FILTER\x20(where\x20','where','avg','AVG(','max','true','\x20AND\x20','keys','fields','push','join','\x20t\x20','replace','NULL'];T=function(){return o;};return T();}function g(i,E){i=i-0x1a0;const W=T();let M=W[i];return M;}const defaultSummary={'count':{'aggregate':Q(0x1a0)}};export function buildSummary(i,E,W,M){const y=Q,m={...defaultSummary,...i[y(0x1a1)]??{}},P=Object['entries'](m)['map'](([K,J])=>{const s=y;if('sql'in J)return'('+J[s(0x1a2)]+s(0x1a3)+K+'\x22';switch(J['aggregate']){case s(0x1a0):return s(0x1a4)+(J['where']??'true')+'))::int\x20AS\x20\x22'+K+'\x22';case'countDistinct':return'(COUNT(DISTINCT\x20t.'+qt(J['field'])+')\x20FILTER\x20(where\x20'+(J['where']??'true')+'))::int\x20AS\x20\x22'+K+'\x22';case'sum':return s(0x1a5)+J[s(0x1a6)]+s(0x1a7)+(J[s(0x1a8)]??'true')+')\x20AS\x20\x22'+K+'\x22';case s(0x1a9):return s(0x1aa)+J['field']+')\x20FILTER\x20(where\x20'+(J['where']??'true')+')\x20AS\x20\x22'+K+'\x22';case'min':return'MIN('+J[s(0x1a6)]+s(0x1a7)+(J[s(0x1a8)]??'true')+')\x20AS\x20\x22'+K+'\x22';case s(0x1ab):return'MAX('+J['field']+')\x20FILTER\x20(where\x20'+(J['where']??s(0x1ac))+')\x20AS\x20\x22'+K+'\x22';}}),D=buildFilters(i,E['filter']);i['where']&&(D['sql']+=(D[y(0x1a2)]?'\x20AND\x20':'\x20WHERE\x20')+('('+i['where']+')'));const x=E['scope']||(i['scopes']?.['default']?'default':undefined);x&&(D['sql']+=(D['sql']?y(0x1ad):'\x20WHERE\x20')+('('+(i['scopes']?.[x]||'true')+')'));const Z=i['searchable']||Object[y(0x1ae)](i[y(0x1af)])['filter'](K=>i['fields'][K]?.['searchable']);E['search']&&Z['length']&&(D['values']['push'](E['search']['toLowerCase']()+'%'),D[y(0x1a2)]+=(D['sql']?'\x20AND\x20':'\x20WHERE\x20')+('\x20('+Z['map'](K=>'lower('+qt(K)+')\x20LIKE\x20$'+D['values']['length'])['join']('\x20OR\x20')+')'));M?.['sql']&&(D['sql']+=(D[y(0x1a2)]?'\x20AND\x20':'\x20WHERE\x20')+('('+M['sql']+')'),D['values'][y(0x1b0)](...M['values']));const f=i['joins']?.['filter'](K=>K['scope']!=='item')['map'](K=>K['sql']+'\x20')['join']('\x20')||'',b='SELECT\x20'+P[y(0x1b1)](',\x20')+'\x20'+('FROM\x20'+qt(i['table'])+y(0x1b2))+(f+'\x20'+D['sql'][y(0x1b3)](/:uid/g,'\x27'+(W?.['id']??y(0x1b4))+'\x27'));return{'sql':b,'values':D['values']};}
@@ -1 +1 @@
1
- const Z=c,getIP=S=>(S['headers']?.['x-real-ip']||S['headers']?.['x-forwarded-for']||S['ip']||S[Z(0x1c3)]?.['remoteAddress']||'')['split'](':')[Z(0x1c4)]();function c(S,Z){S=S-0x1c3;const h=O();let U=h[S];return U;}export default getIP;function O(){const h=['connection','pop'];O=function(){return h;};return O();}
1
+ const E=g,getIP=i=>(i['headers']?.['x-real-ip']||i['headers']?.['x-forwarded-for']||i['ip']||i[E(0x74)]?.[E(0x75)]||'')['split'](':')[E(0x76)]();function T(){const W=['connection','remoteAddress','pop'];T=function(){return W;};return T();}function g(i,E){i=i-0x74;const W=T();let M=W[i];return M;}export default getIP;
@@ -1,18 +1,18 @@
1
- CREATE SCHEMA IF NOT EXISTS admin;
2
-
3
- DO $$
4
- BEGIN
5
- IF to_regclass('crm.notes') IS NOT NULL
6
- AND to_regclass('admin.notes') IS NULL THEN
7
- ALTER TABLE crm.notes SET SCHEMA admin;
8
- END IF;
9
-
10
- IF to_regclass('crm.files') IS NOT NULL
11
- AND to_regclass('admin.files') IS NULL THEN
12
- ALTER TABLE crm.files SET SCHEMA admin;
13
- END IF;
14
- END
15
- $$;
16
-
17
- ALTER INDEX IF EXISTS crm_notes_resource_idx RENAME TO admin_notes_resource_idx;
1
+ CREATE SCHEMA IF NOT EXISTS admin;
2
+
3
+ DO $$
4
+ BEGIN
5
+ IF to_regclass('crm.notes') IS NOT NULL
6
+ AND to_regclass('admin.notes') IS NULL THEN
7
+ ALTER TABLE crm.notes SET SCHEMA admin;
8
+ END IF;
9
+
10
+ IF to_regclass('crm.files') IS NOT NULL
11
+ AND to_regclass('admin.files') IS NULL THEN
12
+ ALTER TABLE crm.files SET SCHEMA admin;
13
+ END IF;
14
+ END
15
+ $$;
16
+
17
+ ALTER INDEX IF EXISTS crm_notes_resource_idx RENAME TO admin_notes_resource_idx;
18
18
  ALTER INDEX IF EXISTS crm_notes_uid_idx RENAME TO admin_notes_uid_idx;
@@ -1,2 +1,2 @@
1
- ALTER TABLE admin.role_access_scope
1
+ ALTER TABLE admin.role_access_scope
2
2
  ALTER COLUMN role_id DROP NOT NULL;