@opengis/fcore 0.0.1-beta.10 → 0.0.1-beta.12

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 (104) hide show
  1. package/dist/config.js +1 -1
  2. package/dist/context.js +1 -1
  3. package/dist/errors.js +1 -1
  4. package/dist/fastify.d.ts.map +1 -1
  5. package/dist/fastify.js +1 -1
  6. package/dist/fcore.js +1 -1
  7. package/dist/migrations/cli.js +1 -1
  8. package/dist/migrations/runner.js +1 -1
  9. package/dist/modules/auth/adduser-cli.js +1 -1
  10. package/dist/modules/auth/passwd-cli.js +1 -1
  11. package/dist/modules/auth/permission-cli.js +1 -1
  12. package/dist/modules/auth/route.js +1 -1
  13. package/dist/modules/auth/schema.js +1 -1
  14. package/dist/modules/auth/services/change-password.js +1 -1
  15. package/dist/modules/auth/services/get-current-user.js +1 -1
  16. package/dist/modules/auth/services/registration.js +1 -1
  17. package/dist/modules/auth/services/verify-two-factor.js +1 -1
  18. package/dist/modules/file/mime.js +1 -1
  19. package/dist/modules/file/route.js +1 -1
  20. package/dist/modules/file/schema.js +1 -1
  21. package/dist/modules/file/services/get-file.js +1 -1
  22. package/dist/modules/file/services/resize-file.js +1 -1
  23. package/dist/modules/file/services/upload-file.js +1 -1
  24. package/dist/modules/resource/route.js +1 -1
  25. package/dist/modules/resource/schema.js +1 -1
  26. package/dist/modules/resource/services/add-note.js +1 -1
  27. package/dist/modules/resource/services/add-resource-file.js +1 -1
  28. package/dist/modules/resource/services/create-resource-relation.js +1 -1
  29. package/dist/modules/resource/services/create-resource.js +1 -1
  30. package/dist/modules/resource/services/delete-resource-relation.js +1 -1
  31. package/dist/modules/resource/services/delete-resource.js +1 -1
  32. package/dist/modules/resource/services/export-resource.js +1 -1
  33. package/dist/modules/resource/services/get-resource.js +1 -1
  34. package/dist/modules/resource/services/list-resource-relation.js +1 -1
  35. package/dist/modules/resource/services/list-resources.js +1 -1
  36. package/dist/modules/resource/services/search-resource.js +1 -1
  37. package/dist/modules/resource/services/suggest-resource.js +1 -1
  38. package/dist/modules/resource/services/update-resource-relation.js +1 -1
  39. package/dist/modules/resource/services/update-resource.js +1 -1
  40. package/dist/modules/resource/services/upload-resource-file.js +1 -1
  41. package/dist/modules/system/route.js +1 -1
  42. package/dist/modules/system/schema.js +1 -1
  43. package/dist/modules/system/services/check-system.js +1 -1
  44. package/dist/modules/system/services/get-access.js +1 -1
  45. package/dist/modules/system/services/get-api-list.js +1 -1
  46. package/dist/modules/system/services/get-audit-log.js +1 -1
  47. package/dist/modules/system/services/get-dictionary.js +1 -1
  48. package/dist/modules/system/services/get-system-log.js +1 -1
  49. package/dist/modules/system/services/get-system-settings.js +1 -1
  50. package/dist/modules/system/services/list-dictionaries.js +1 -1
  51. package/dist/modules/system/services/set-access.js +1 -1
  52. package/dist/modules/system/services/update-dictionary.js +1 -1
  53. package/dist/modules/system/services/update-system-settings.js +1 -1
  54. package/dist/modules/utils/require-admin.js +1 -1
  55. package/dist/modules/utils/safe-user.js +1 -1
  56. package/dist/modules/utils/unsupported.js +1 -1
  57. package/dist/plugins/audit/audit.js +1 -1
  58. package/dist/plugins/audit/services/write-audit.js +1 -1
  59. package/dist/plugins/auth/get-user-permissions.js +1 -1
  60. package/dist/plugins/auth/index.js +1 -1
  61. package/dist/plugins/auth/verifyUser.js +1 -1
  62. package/dist/plugins/dictionary.js +1 -1
  63. package/dist/plugins/file.js +1 -1
  64. package/dist/plugins/jwt.js +1 -1
  65. package/dist/plugins/logger/index.js +1 -1
  66. package/dist/plugins/logger/transport.js +1 -1
  67. package/dist/plugins/pg.js +1 -1
  68. package/dist/plugins/redis.js +1 -1
  69. package/dist/plugins/resource/resource.js +1 -1
  70. package/dist/plugins/resource/resource.registry.js +1 -1
  71. package/dist/plugins/resource/resource.types.d.ts +5 -2
  72. package/dist/plugins/resource/resource.types.d.ts.map +1 -1
  73. package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
  74. package/dist/plugins/resource/services/add-file-token.js +1 -1
  75. package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
  76. package/dist/plugins/resource/services/create-relation.d.ts.map +1 -1
  77. package/dist/plugins/resource/services/create-relation.js +1 -1
  78. package/dist/plugins/resource/services/create.d.ts.map +1 -1
  79. package/dist/plugins/resource/services/create.js +1 -1
  80. package/dist/plugins/resource/services/delete-relation.d.ts.map +1 -1
  81. package/dist/plugins/resource/services/delete-relation.js +1 -1
  82. package/dist/plugins/resource/services/delete.d.ts +5 -1
  83. package/dist/plugins/resource/services/delete.d.ts.map +1 -1
  84. package/dist/plugins/resource/services/delete.js +1 -1
  85. package/dist/plugins/resource/services/find-one.js +1 -1
  86. package/dist/plugins/resource/services/find-relation.d.ts.map +1 -1
  87. package/dist/plugins/resource/services/find-relation.js +1 -1
  88. package/dist/plugins/resource/services/find.d.ts.map +1 -1
  89. package/dist/plugins/resource/services/find.js +1 -1
  90. package/dist/plugins/resource/services/update-relation.d.ts.map +1 -1
  91. package/dist/plugins/resource/services/update-relation.js +1 -1
  92. package/dist/plugins/resource/services/update.d.ts +5 -1
  93. package/dist/plugins/resource/services/update.d.ts.map +1 -1
  94. package/dist/plugins/resource/services/update.js +1 -1
  95. package/dist/plugins/resource/utils/auto-index.js +1 -1
  96. package/dist/plugins/resource/utils/fields.js +1 -1
  97. package/dist/plugins/resource/utils/filters.js +1 -1
  98. package/dist/plugins/resource/utils/permissions.js +1 -1
  99. package/dist/plugins/resource/utils/sort.js +1 -1
  100. package/dist/plugins/resource/utils/sql.js +1 -1
  101. package/dist/shared/getIP.js +1 -1
  102. package/migrations/20260903120000_core_schema.sql +5 -2
  103. package/migrations/20260903130001_add_file_fields.sql +5 -0
  104. package/package.json +2 -2
@@ -1 +1 @@
1
- function S(d,h){d=d-0x1ec;const p=v();let Z=p[d];return Z;}import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,readableFields,writableData}from'../utils/sql.js';import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createCreate(d,h){return async function p({name:Z,data:D,user:u},n){const M=S,X=h['get'](Z);assertOperation(X,'create',u),validateInputData({'resource':X,'data':D});const Y=writableData(X,D);if(!Y[M(0x1ec)])throw new ValidationError('No\x20writable\x20fields');const w=Y['map'](([g])=>qi(g)),y=Y['map']((g,s)=>'$'+(s+0x1)),Q=Y['map'](([,g])=>g),F=n?.['pg']??d['pg'],B=await F['query']('INSERT\x20INTO\x20'+qt(X['table'])+'\x20('+w[M(0x1ed)](',\x20')+')\x20'+('VALUES\x20('+y['join'](',\x20')+')\x20')+(M(0x1ee)+readableFields(X)[M(0x1ed)](',\x20')),Q),K=B['rows'][0x0];return clearTableLookupCache(X[M(0x1ef)],F),await(n?.['audit']??d['audit'])?.[M(0x1f0)]({'userId':u?.['id'],'module':X[M(0x1f1)],'resource':X[M(0x1f2)],'resourceId':K[X['key']],'action':M(0x1f3),'fields':Object['keys'](D)}),K;};}function v(){const O=['length','join','RETURNING\x20','table','write','module','name','create'];v=function(){return O;};return v();}
1
+ import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,readableFields,writableData}from'../utils/sql.js';function A(x,q){x=x-0x1eb;const C=g();let J=C[x];return J;}import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createCreate(x,q){return async function C({name:J,data:K,user:Z},Y){const R=A,b=q[R(0x1eb)](J);assertOperation(b,R(0x1ec),Z),validateInputData({'resource':b,'data':K});const k=writableData(b,K);b['fields']['created_at']&&k[R(0x1ed)](['created_at',new Date()]);b[R(0x1ee)]['created_by']&&k['push'](['created_by',Z?.['id']]);if(!k['length'])throw new ValidationError('No\x20writable\x20fields');const H=k['map'](([p])=>qi(p)),F=k['map']((p,w)=>'$'+(w+0x1)),y=k['map'](([,p])=>p),r=Y?.['pg']??x['pg'],B=await r[R(0x1ef)](R(0x1f0)+qt(b['table'])+'\x20('+H['join'](',\x20')+')\x20'+('VALUES\x20('+F[R(0x1f1)](',\x20')+')\x20')+('RETURNING\x20'+readableFields(b)['join'](',\x20')),y),t=B['rows'][0x0];return clearTableLookupCache(b['table'],r),await(Y?.['audit']??x['audit'])?.['write']({'userId':Z?.['id'],'module':b['module'],'resource':b['name'],'resourceId':t[b['key']],'action':R(0x1ec),'fields':Object['keys'](K)}),t;};}function g(){const s=['get','create','push','fields','query','INSERT\x20INTO\x20','join'];g=function(){return s;};return g();}
@@ -1 +1 @@
1
- {"version":3,"file":"delete-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/delete-relation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,CAAC;AACF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,+CAEsD,oBAAoB,QAAQ,UAAU,KAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAwBvJ"}
1
+ {"version":3,"file":"delete-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/delete-relation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,CAAC;AACF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,+CAIsD,oBAAoB,QAAQ,UAAU,KAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAqCvJ"}
@@ -1 +1 @@
1
- function S(d,h){d=d-0x19c;const p=v();let Z=p[d];return Z;}import{UnsupportedError}from'../../../errors.js';function v(){const Q=['DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3','files','DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3','Generic\x20Resource\x20relation\x20\x22'];v=function(){return Q;};return v();}export function createDeleteRelation(d,h){return async function p({name:Z,id:D,relation:u,relationId:n,user:X},Y){const y=S,w=Y?.['pg']??d['pg'];if(u==='notes')return await w['query'](y(0x19c),[n,Z,String(D)]),{'success':!![]};if(u===y(0x19d))return await w['query'](y(0x19e),[n,Z,String(D)]),{'success':!![]};throw new UnsupportedError(y(0x19f)+u+'\x22\x20requires\x20a\x20project/provider\x20implementation');};}
1
+ import{UnsupportedError}from'../../../errors.js';function A(x,q){x=x-0x166;const C=g();let J=C[x];return J;}import{createRemove}from'./delete.js';function g(){const p=['includes','Generic\x20Resource\x20relation\x20\x22','DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3','resource','foreignKey'];g=function(){return p;};return g();}export function createDeleteRelation(x,q){const C=createRemove(x,q);return async function J({name:K,id:Z,relation:Y,relationId:b,user:k},H){const t=A,F=H?.['pg']??x['pg'],y=q['get'](K);if(['notes','files'][t(0x166)](Y)&&!y['capabilities']?.[t(0x166)](Y))throw new UnsupportedError(t(0x167)+Y+'\x22\x20requires\x20a\x20capabilities\x20\x22'+Y+'\x22');if(Y==='notes')return await F['query'](t(0x168),[b,K,String(Z)]),{'success':!![]};if(Y==='files')return await F['query']('DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[b,K,String(Z)]),{'success':!![]};const r=y['relations']?.[Y];if(!r?.[t(0x169)]||!r[t(0x16a)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+Y+'\x22\x20requires\x20a\x20project/provider\x20implementation');const B=await C({'name':r['resource'],'id':b,'user':k,'where':{'column':r['foreignKey'],'value':Z}},H);return{'success':B};};}
@@ -8,7 +8,11 @@ type RemoveParams = {
8
8
  name: string;
9
9
  id: string | number;
10
10
  user?: ResourceUser;
11
+ where?: {
12
+ column: string;
13
+ value: string | number;
14
+ };
11
15
  };
12
- export declare function createRemove(deps: ResourceDependencies, registry: ResourceRegistry): ({ name, id, user, }: RemoveParams, ctx?: AppContext) => Promise<boolean>;
16
+ export declare function createRemove(deps: ResourceDependencies, registry: ResourceRegistry): ({ name, id, user, where, }: RemoveParams, ctx?: AppContext) => Promise<boolean>;
13
17
  export {};
14
18
  //# sourceMappingURL=delete.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/delete.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAI/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,CAAC;AACF,wBAAgB,YAAY,CAC1B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,yBAEwB,YAAY,QAAQ,UAAU,sBAyBjF"}
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/delete.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAI/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACpD,CAAC;AACF,wBAAgB,YAAY,CAC1B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,gCAE+B,YAAY,QAAQ,UAAU,sBAiCxF"}
@@ -1 +1 @@
1
- import{assertOperation}from'../utils/permissions.js';function S(d,h){d=d-0x9f;const p=v();let Z=p[d];return Z;}import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createRemove(d,h){return async function p({name:Z,id:D,user:u},n){const y=S,X=h['get'](Z);assertOperation(X,y(0x9f),u);const Y=n?.['pg']??d['pg'],w=await Y['query']('DELETE\x20FROM\x20'+qt(X[y(0xa0)])+'\x20WHERE\x20'+qi(X['key'])+y(0xa1),[D]);if((w[y(0xa2)]??0x0)>0x0)clearTableLookupCache(X['table'],Y);if((w['rowCount']??0x0)>0x0)await(n?.['audit']??d[y(0xa3)])?.['write']({'module':X['module'],'resource':X['name'],'resourceId':D,'action':'delete'});return(w['rowCount']??0x0)>0x0;};}function v(){const Q=['delete','table','=$1','rowCount','audit'];v=function(){return Q;};return v();}
1
+ import{assertOperation}from'../utils/permissions.js';import{qt,qi}from'../utils/sql.js';function A(x,q){x=x-0xf0;const C=g();let J=C[x];return J;}function g(){const t=['get','key','length','audit','write','name','rowCount'];g=function(){return t;};return g();}import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createRemove(x,q){return async function C({name:J,id:K,user:Z,where:Y},b){const B=A,k=q[B(0xf0)](J);assertOperation(k,'delete',Z);const H=b?.['pg']??x['pg'],F=[K];let y='WHERE\x20'+qi(k[B(0xf1)])+'\x20=\x20$1';Y&&(F['push'](Y['value']),y+='\x20AND\x20'+qi(Y['column'])+'\x20=\x20$'+F[B(0xf2)]);const r=await H['query']('DELETE\x20FROM\x20'+qt(k['table'])+'\x20'+y,F);if((r['rowCount']??0x0)>0x0)clearTableLookupCache(k['table'],H);if((r['rowCount']??0x0)>0x0)await(b?.[B(0xf3)]??x['audit'])?.[B(0xf4)]({'module':k['module'],'resource':k[B(0xf5)],'resourceId':K,'action':'delete'});return(r[B(0xf6)]??0x0)>0x0;};}
@@ -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';export function createFindOne(d,h){return async function p({name:Z,id:D,query:query={},user:u}){const R=S,n=Date['now'](),X=h['get'](Z);assertOperation(X,'read',u);if(!d['pg'])throw new Error('empty\x20pg');const Y=await d['pg']['query'](R(0x1cb)+readableFields(X)['join'](',\x20')+R(0x1cc)+qt(X[R(0x1cd)])+'\x20WHERE\x20'+qi(X['key'])+'=$1\x20LIMIT\x201',[D]),w=Y['rows'][0x0];if(!w)return null;await addDictionaryLookupData([w],X['fields'],d[R(0x1ce)]),await addTableLookupData([w],X['fields'],d['pg']),addFileToken([w],X[R(0x1cf)],d['file']);const y=Array['isArray'](query['include'])?query['include']:query['include']?.[R(0x1d0)](',')??[];for(const Q of y){const F=X[R(0x1d1)]?.[Q];if(!F?.['foreignKey']||!F['resource']&&!F[R(0x1cd)])throw new ValidationError('Unknown\x20relation:\x20'+Q);const B=F['resource']?h['get'](F['resource']):undefined,K=F['table']??B[R(0x1cd)],g=B?.['key']??'id',s=B?readableFields(B)['join'](',\x20'):'*',M='SELECT\x20'+s+R(0x1cc)+qt(K)+'\x20WHERE\x20'+qi(g)+'\x20=\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20'+qi(F[R(0x1d2)])+'\x20FROM\x20'+qt(X[R(0x1cd)])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(X['key'])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)',O=(await d['pg']['query'](M,[D]))['rows'];B&&(await addDictionaryLookupData(O,B['fields'],d[R(0x1ce)]),await addTableLookupData(O,B['fields'],d['pg']),addFileToken(O,B[R(0x1cf)],d['file'])),w[Q]=O;}return w['time']=Date['now']()-n,w;};}function S(d,h){d=d-0x1cb;const p=v();let Z=p[d];return Z;}function v(){const E=['SELECT\x20','\x20FROM\x20','table','dictionary','fields','split','relations','foreignKey'];v=function(){return E;};return v();}
1
+ import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';function g(){const h=['read','key','integer','Invalid\x20id:\x20','join','fields','include','resource','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20','dictionary','time'];g=function(){return h;};return g();}function A(x,q){x=x-0x10e;const C=g();let J=C[x];return J;}import{qt,qi,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';export function createFindOne(x,q){return async function C({name:J,id:K,query:query={},user:Z}){const G=A,Y=Date['now'](),b=q['get'](J);assertOperation(b,G(0x10e),Z);if(b['fields'][b[G(0x10f)]]?.['type']===G(0x110)&&!Number['isInteger'](Number(K)))throw new ValidationError(G(0x111)+K+'\x20name:'+J);const k=await x['pg']['query']('SELECT\x20'+readableFields(b)[G(0x112)](',\x20')+'\x20FROM\x20'+qt(b['table'])+'\x20WHERE\x20'+qi(b['key'])+'=$1\x20LIMIT\x201',[K]),H=k['rows'][0x0];if(!H)return null;await addDictionaryLookupData([H],b['fields'],x['dictionary']),await addTableLookupData([H],b[G(0x113)],x['pg']),addFileToken([H],b['fields'],x['file']);const F=Array['isArray'](query['include'])?query[G(0x114)]:query['include']?.['split'](',')??[];for(const y of F){const r=b['relations']?.[y];if(!r?.['foreignKey']||!r['resource']&&!r['table'])throw new ValidationError('Unknown\x20relation:\x20'+y);const B=r['resource']?q['get'](r[G(0x115)]):undefined,t=r['table']??B['table'],p=B?.[G(0x10f)]??'id',w=B?readableFields(B)['join'](',\x20'):'*',R='SELECT\x20'+w+'\x20FROM\x20'+qt(t)+'\x20WHERE\x20'+qi(p)+'\x20=\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20'+qi(r['foreignKey'])+'\x20FROM\x20'+qt(b['table'])+G(0x116)+qi(b[G(0x10f)])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)',s=(await x['pg']['query'](R,[K]))['rows'];B&&(await addDictionaryLookupData(s,B[G(0x113)],x[G(0x117)]),await addTableLookupData(s,B['fields'],x['pg']),addFileToken(s,B[G(0x113)],x['file'])),H[y]=s;}return H[G(0x118)]=Date['now']()-Y,H;};}
@@ -1 +1 @@
1
- {"version":3,"file":"find-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/find-relation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAOhE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,oCAOvB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,KAAG,OAAO,CAAC,GAAG,CAAC,CAyEjB"}
1
+ {"version":3,"file":"find-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/find-relation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAQhE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,oCAOvB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,KAAG,OAAO,CAAC,GAAG,CAAC,CAoGjB"}
@@ -1 +1 @@
1
- import{UnsupportedError,ValidationError}from'../../../errors.js';function v(){const E=['max','SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC','length','now','rows','file','get','resource','table','key','map','\x20WHERE\x20\x0a\x20\x20\x20\x20','\x20FROM\x20','\x20WHERE\x20','\x20=\x20$1\x20LIMIT\x201)\x20\x0a\x20\x20\x20\x20LIMIT\x20$2\x20OFFSET\x20$3','query','dictionary','fields'];v=function(){return E;};return v();}function S(d,h){d=d-0xe0;const p=v();let Z=p[d];return Z;}import{qi,qt}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';export function createFindRelation(d,h){return async function p({name:Z,id:D,relation:u,query:query={}}){const R=S,n=Date['now'](),X=Math['min'](Math[R(0xe0)](query['limit']??0x14,0x1),0xc8),Y=Math['max'](query['offset']??0x0,0x0);if(!Number['isFinite'](X)||!Number['isFinite'](Y))throw new ValidationError('Invalid\x20pagination');if(u==='notes'){const M=await d['pg']['query'](R(0xe1),[Z,String(D)]);return{'total':M['rows'][R(0xe2)],'time':Date[R(0xe3)]()-n,'rows':M[R(0xe4)]};}if(u==='files'){const O=await d['pg']['query']('SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[Z,String(D)]);return addFileToken(O['rows'],{'file_path':{'type':R(0xe5)}},d['file']),{'total':O[R(0xe4)][R(0xe2)],'time':Date['now']()-n,'rows':O[R(0xe4)]};}const w=h[R(0xe6)](Z),y=w['relations']?.[u];if(!y?.['foreignKey']||!y['resource']&&!y['table'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+u+'\x22\x20requires\x20a\x20project/provider\x20implementation');const Q=y['resource']?h[R(0xe6)](y[R(0xe7)]):undefined,F=y[R(0xe8)]??Q['table'],B=Q?.[R(0xe9)]??'id',K=y['fields']?.[R(0xe2)]?y['fields'][R(0xea)](qi)['join'](',\x20'):'*',g='SELECT\x20'+K+'\x20FROM\x20'+qt(F)+R(0xeb)+qi(B)+'\x20=\x20(select\x20'+qi(y['foreignKey'])+R(0xec)+qt(w['table'])+R(0xed)+qi(w['key'])+R(0xee),s=await d['pg'][R(0xef)](g,[D,X,Y]);return Q&&(await addDictionaryLookupData(s['rows'],Q['fields'],d[R(0xf0)]),await addTableLookupData(s[R(0xe4)],Q[R(0xf1)],d['pg']),addFileToken(s[R(0xe4)],Q['fields'],d['file'])),{'limit':X,'offset':Y,'total':s[R(0xe4)]['length'],'time':Date['now']()-n,'rows':s['rows']??null};};}
1
+ import{UnsupportedError,ValidationError}from'../../../errors.js';function A(x,q){x=x-0x1a7;const C=g();let J=C[x];return J;}import{qi,qt}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';import{autoIndex}from'../utils/auto-index.js';export function createFindRelation(x,q){return async function C({name:J,id:K,relation:Z,query:query={}}){const a=A,Y=Date['now'](),b=Math['min'](Math[a(0x1a7)](query[a(0x1a8)]??0x14,0x1),0xc8),k=Math[a(0x1a7)](query['offset']??0x0,0x0);if(!Number[a(0x1a9)](b)||!Number['isFinite'](k))throw new ValidationError('Invalid\x20pagination');const H=q['get'](J),F=H['relations']?.[Z];if(['notes',a(0x1aa)][a(0x1ab)](Z)&&!H[a(0x1ac)]?.['includes'](Z))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+Z+a(0x1ad)+Z+'\x22');if(Z==='notes'){const s=await x['pg']['query']('SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[J,String(K)]);return{'total':s[a(0x1ae)]['length'],'time':Date['now']()-Y,'rows':s['rows']};}if(Z==='files'){const G=await x['pg']['query']('SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[J,String(K)]);return addFileToken(G['rows'],{'file_path':{'type':'file'}},x[a(0x1af)]),{'total':G['rows']['length'],'time':Date['now']()-Y,'rows':G['rows']};}const y=!!(F?.[a(0x1b0)]&&F[a(0x1b1)]&&F[a(0x1b2)]);if(!F||!y&&!F['foreignKey']||!F['resource']&&!F['table'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+Z+'\x22\x20requires\x20a\x20project/provider\x20implementation');const r=F['resource']?q['get'](F['resource']):undefined,B=F['table']??r['table'],t=r?.['key']??'id',p=F['fields']?.[a(0x1b3)]?F[a(0x1b4)]['map'](h=>y?'t.'+qi(h):qi(h))['join'](',\x20'):y?'t.*':'*';F['foreignKey']&&autoIndex(B,F['foreignKey'],'btree',x['pg']);const w=y?'SELECT\x20'+p+'\x20FROM\x20'+qt(B)+'\x20t\x0a\x20\x20\x20\x20JOIN\x20'+qt(F['junctionTable'])+'\x20j\x20ON\x20j.'+qi(F[a(0x1b2)])+a(0x1b5)+qi(t)+'\x0a\x20\x20\x20\x20WHERE\x20j.'+qi(F['junctionLocalKey'])+a(0x1b6):'SELECT\x20'+p+'\x20FROM\x20'+qt(B)+'\x20WHERE\x20'+qi(F['foreignKey'])+'\x20=\x20$1\x20LIMIT\x20$2\x20OFFSET\x20$3',R=await x['pg'][a(0x1b7)](w,[K,b,k]);return r&&(await addDictionaryLookupData(R['rows'],r['fields'],x[a(0x1b8)]),await addTableLookupData(R['rows'],r['fields'],x['pg']),addFileToken(R['rows'],r['fields'],x['file'])),{'limit':b,'offset':k,'total':R[a(0x1ae)]['length'],'time':Date['now']()-Y,'rows':R['rows']??null};};}function g(){const m=['max','limit','isFinite','files','includes','capabilities','\x22\x20requires\x20a\x20capabilities\x20\x22','rows','file','junctionTable','junctionLocalKey','junctionForeignKey','length','fields','\x20=\x20t.','\x20=\x20$1\x0a\x20\x20\x20\x20LIMIT\x20$2\x20OFFSET\x20$3','query','dictionary'];g=function(){return m;};return g();}
@@ -1 +1 @@
1
- {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/find.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACb,MAAM,sBAAsB,CAAC;AAK9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,wBAAgB,UAAU,CACxB,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,4BAMvB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,KAAG,OAAO,CAAC,kBAAkB,CAAC,CAsChC"}
1
+ {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/find.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACb,MAAM,sBAAsB,CAAC;AAK9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAMhE,wBAAgB,UAAU,CACxB,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,4BAMvB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,KAAG,OAAO,CAAC,kBAAkB,CAAC,CA+ChC"}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';function v(){const g=['min','max','filter','isFinite','SELECT\x20','sql','length','query','dictionary','rowCount'];v=function(){return g;};return v();}import{buildFilters}from'../utils/filters.js';function S(d,h){d=d-0x100;const p=v();let Z=p[d];return Z;}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';export function createFind(d,h){return async function p({name:Z,query:query={},user:D}){const K=S,u=Date['now'](),n=h['get'](Z);assertOperation(n,'read',D);const X=Math[K(0x100)](Math['max'](query['limit']??0x14,0x1),0xc8),Y=Math[K(0x101)](query['offset']??0x0,0x0),w=buildFilters(n,query[K(0x102)],0x1,d['pg']),y=buildSort(n,query['sort']);if(!Number[K(0x103)](X)||!Number['isFinite'](Y))throw new ValidationError('Invalid\x20pagination');const Q=K(0x104)+readableFields(n)['join'](',\x20')+'\x20'+('FROM\x20'+qt(n['table']))+(''+w[K(0x105)]+y+'\x20')+('LIMIT\x20$'+(w['values'][K(0x106)]+0x1)+'\x20')+('OFFSET\x20$'+(w['values']['length']+0x2)),F=await d['pg'][K(0x107)](Q,[...w['values'],X,Y]),B=F['rows'];return await addDictionaryLookupData(B,n['fields'],d[K(0x108)]),await addTableLookupData(B,n['fields'],d['pg']),addFileToken(B,n['fields'],d['file']),{'limit':X,'offset':Y,'total':F[K(0x109)],'time':Date['now']()-u,'rows':B};};}
1
+ import{ValidationError}from'../../../errors.js';import{buildFilters}from'../utils/filters.js';import{assertOperation}from'../utils/permissions.js';function A(x,q){x=x-0x1ae;const C=g();let J=C[x];return J;}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';function g(){const R=['get','read','min','max','limit','offset','filter','isFinite','Invalid\x20pagination','length','table','toLowerCase','sql','\x20WHERE\x20','map','lower(','values','SELECT\x20','join','OFFSET\x20$','rows','fields'];g=function(){return R;};return g();}import{addFileToken}from'./add-file-token.js';import{autoIndex}from'../utils/auto-index.js';export function createFind(x,q){return async function C({name:J,query:query={},user:K}){const w=A,Z=Date['now'](),Y=q[w(0x1ae)](J);assertOperation(Y,w(0x1af),K);const b=Math[w(0x1b0)](Math[w(0x1b1)](query[w(0x1b2)]??0x14,0x1),0xc8),k=Math['max'](query[w(0x1b3)]??0x0,0x0),H=buildFilters(Y,query[w(0x1b4)],0x1,x['pg']),F=buildSort(Y,query['sort']);if(!Number['isFinite'](b)||!Number[w(0x1b5)](k))throw new ValidationError(w(0x1b6));const y=Y['searchable']||Object['keys'](Y['fields'])[w(0x1b4)](p=>Y['fields'][p]?.['searchable']);query['search']&&y[w(0x1b7)]&&(y['map'](p=>autoIndex(Y[w(0x1b8)],p,'text',x['pg'])),H['values']['push'](query['search'][w(0x1b9)]()+'%'),H['sql']+=(H[w(0x1ba)]?'\x20AND\x20':w(0x1bb))+('\x20('+y?.[w(0x1bc)](p=>w(0x1bd)+qt(p)+')\x20LIKE\x20$'+H[w(0x1be)][w(0x1b7)])['join']('\x20OR\x20')+')'));const r=w(0x1bf)+readableFields(Y)[w(0x1c0)](',\x20')+'\x20'+('FROM\x20'+qt(Y['table']))+(''+H['sql']+F+'\x20')+('LIMIT\x20$'+(H['values']['length']+0x1)+'\x20')+(w(0x1c1)+(H[w(0x1be)]['length']+0x2)),B=await x['pg']['query'](r,[...H['values'],b,k]),t=B[w(0x1c2)];return await addDictionaryLookupData(t,Y[w(0x1c3)],x['dictionary']),await addTableLookupData(t,Y['fields'],x['pg']),addFileToken(t,Y['fields'],x['file']),{'limit':b,'offset':k,'total':B['rowCount'],'time':Date['now']()-Z,'rows':t};};}
@@ -1 +1 @@
1
- {"version":3,"file":"update-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/update-relation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,KAAK,oBAAoB,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,qDAI4D,oBAAoB,QAAQ,UAAU,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAUlK"}
1
+ {"version":3,"file":"update-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/update-relation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,KAAK,oBAAoB,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,qDAI4D,oBAAoB,QAAQ,UAAU,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAclK"}
@@ -1 +1 @@
1
- function v(){const K=['foreignKey','Relation\x20update\x20is\x20not\x20configured:\x20','resource'];v=function(){return K;};return v();}import{UnsupportedError}from'../../../errors.js';function S(d,h){d=d-0x1b5;const p=v();let Z=p[d];return Z;}import{createUpdate}from'./update.js';export function createUpdateRelation(d,h){const p=createUpdate(d,h);return async function Z({name:D,id:u,relation:n,relationId:X,data:Y,user:w},y){const B=S,Q=h['get'](D),F=Q['relations']?.[n];if(!F?.['resource']||!F[B(0x1b5)])throw new UnsupportedError(B(0x1b6)+n);return p({'name':F[B(0x1b7)],'id':X,'data':Y,'user':w},y);};}
1
+ function A(x,q){x=x-0x181;const C=g();let J=C[x];return J;}import{UnsupportedError,ValidationError}from'../../../errors.js';import{createUpdate}from'./update.js';export function createUpdateRelation(x,q){const C=createUpdate(x,q);return async function J({name:K,id:Z,relation:Y,relationId:b,data:k,user:H},F){const B=A,y=q['get'](K),r=y[B(0x181)]?.[Y];if(!r?.[B(0x182)]||!r['foreignKey'])throw new UnsupportedError(B(0x183)+Y);if(Object['hasOwn'](k,r['foreignKey'])&&k[r['foreignKey']]!==Z)throw new ValidationError('Cannot\x20change\x20relation:\x20'+r[B(0x184)]);return C({'name':r['resource'],'id':b,'data':k,'user':H,'where':{'column':r['foreignKey'],'value':Z}},F);};}function g(){const t=['relations','resource','Relation\x20update\x20is\x20not\x20configured:\x20','foreignKey'];g=function(){return t;};return g();}
@@ -6,7 +6,11 @@ type UpdateParams = {
6
6
  id: string | number;
7
7
  data: Record<string, unknown>;
8
8
  user?: ResourceUser;
9
+ where?: {
10
+ column: string;
11
+ value: string | number;
12
+ };
9
13
  };
10
- export declare function createUpdate(deps: ResourceDependencies, registry: ResourceRegistry): ({ name, id, data, user, }: UpdateParams, ctx?: AppContext) => Promise<Record<string, unknown>>;
14
+ export declare function createUpdate(deps: ResourceDependencies, registry: ResourceRegistry): ({ name, id, data, user, where, }: UpdateParams, ctx?: AppContext) => Promise<Record<string, unknown>>;
11
15
  export {};
12
16
  //# sourceMappingURL=update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/update.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAG/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,CAAC;AACF,wBAAgB,YAAY,CAC1B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,+BAE8B,YAAY,QAAQ,UAAU,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA4C1H"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/update.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAG/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACpD,CAAC;AACF,wBAAgB,YAAY,CAC1B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,sCAEqC,YAAY,QAAQ,UAAU,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAwDjI"}
@@ -1 +1 @@
1
- import{NotFoundError,ValidationError}from'../../../errors.js';function v(){const O=['length','map','SET\x20','RETURNING\x20','rows','table','write','module','name','update'];v=function(){return O;};return v();}function S(d,h){d=d-0x1aa;const p=v();let Z=p[d];return Z;}import{assertOperation}from'../utils/permissions.js';import{qi,qt,readableFields,writableData}from'../utils/sql.js';import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createUpdate(d,h){return async function p({name:Z,id:D,data:u,user:n},X){const M=S,Y=h['get'](Z);assertOperation(Y,'update',n);const w=writableData(Y,u);if(!w[M(0x1aa)])throw new ValidationError('No\x20writable\x20fields');const y=X?.['pg']??d['pg'];validateInputData({'resource':Y,'data':u,'update':!![]}),delete u['user_type'];const Q=w[M(0x1ab)](([g],s)=>qi(g)+'\x20=\x20$'+(s+0x1)),F=[...w[M(0x1ab)](([,g])=>g),D],B=await y['query']('UPDATE\x20'+qt(Y['table'])+'\x20'+(M(0x1ac)+Q['join'](',\x20')+'\x20')+('WHERE\x20'+qi(Y['key'])+'\x20=\x20$'+(w['length']+0x1)+'\x20')+(M(0x1ad)+readableFields(Y)['join'](',\x20')),F),K=B[M(0x1ae)][0x0];if(!K)throw new NotFoundError(Z+':'+D);return clearTableLookupCache(Y[M(0x1af)],y),await(X?.['audit']??d['audit'])?.[M(0x1b0)]({'userId':n?.['id'],'module':Y[M(0x1b1)],'resource':Y[M(0x1b2)],'resourceId':D,'action':M(0x1b3),'fields':Object['keys'](u)}),K;};}
1
+ import{NotFoundError,ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,readableFields,writableData}from'../utils/sql.js';import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function A(x,q){x=x-0x8b;const C=g();let J=C[x];return J;}export function createUpdate(x,q){return async function C({name:J,id:K,data:Z,user:Y,where:b},k){const G=A,H=q['get'](J);assertOperation(H,'update',Y);const F=writableData(H,Z);if(!F['length'])throw new ValidationError('No\x20writable\x20fields');const y=k?.['pg']??x['pg'];validateInputData({'resource':H,'data':Z,'update':!![]});H['fields']['updated_at']&&F['push'](['updated_at',new Date()]);H[G(0x8b)]['updated_by']&&F['push']([G(0x8c),Y?.['id']]);delete Z[G(0x8d)];const r=F[G(0x8e)](([R],s)=>qi(R)+'\x20=\x20$'+(s+0x1)),B=[...F['map'](([,R])=>R),K];let t='WHERE\x20'+qi(H['key'])+'\x20=\x20$'+B[G(0x8f)];b&&(B['push'](b['value']),t+='\x20AND\x20'+qi(b['column'])+'\x20=\x20$'+B['length']);const p=await y['query']('UPDATE\x20'+qt(H[G(0x90)])+'\x20'+('SET\x20'+r[G(0x91)](',\x20')+'\x20')+(t+'\x20')+('RETURNING\x20'+readableFields(H)[G(0x91)](',\x20')),B),w=p[G(0x92)][0x0];if(!w)throw new NotFoundError(J+':'+K);return clearTableLookupCache(H[G(0x90)],y),await(k?.['audit']??x['audit'])?.['write']({'userId':Y?.['id'],'module':H[G(0x93)],'resource':H['name'],'resourceId':K,'action':'update','fields':Object[G(0x94)](Z)}),w;};}function g(){const h=['fields','updated_by','user_type','map','length','table','join','rows','module','keys'];g=function(){return h;};return g();}
@@ -1 +1 @@
1
- import{qi,qt}from'./sql.js';function S(d,h){d=d-0x11c;const p=v();let Z=p[d];return Z;}const requestedIndexes=new WeakMap();function v(){const y=['get','set','has','split','public','replace','rowCount','CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20',')\x20text_pattern_ops)','\x20USING\x20'];v=function(){return y;};return v();}export function autoIndex(d,h,p='btree',Z){const Y=S,D=requestedIndexes[Y(0x11c)](Z)??new Set();requestedIndexes[Y(0x11d)](Z,D);const u=d+':'+h+':'+p;if(D[Y(0x11e)](u))return;D['add'](u),void ensureIndex(d,h,p,Z)['catch'](()=>{D['delete'](u);});}async function ensureIndex(d,h,p,Z){const w=S,D=d[w(0x11f)]('.'),u=D['length']===0x2?D[0x0]:w(0x120),n=(d+'_'+h+'_'+p+'_idx')[w(0x121)](/[^A-Za-z0-9_]/g,'_'),X=await Z['query']('SELECT\x201\x20FROM\x20pg_indexes\x20WHERE\x20schemaname\x20=\x20$1\x20AND\x20indexname\x20=\x20$2',[u,n]);if(X[w(0x122)])return;if(p==='text'){await Z['query']('CREATE\x20EXTENSION\x20IF\x20NOT\x20EXISTS\x20pg_trgm'),await Z['query'](w(0x123)+qi(n+'_l')+'\x20ON\x20'+qt(d)+'\x20USING\x20btree\x20(lower('+qi(h)+w(0x124)),await Z['query'](w(0x123)+qi(n)+'\x20ON\x20'+qt(d)+'\x20USING\x20gin\x20(lower('+qi(h)+')\x20gin_trgm_ops)');return;}await Z['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(n)+'\x20ON\x20'+qt(d)+w(0x125)+p+'\x20('+qi(h)+')');}
1
+ function A(x,q){x=x-0x1d7;const C=g();let J=C[x];return J;}import{qi,qt}from'./sql.js';const requestedIndexes=new WeakMap();export function autoIndex(x,q,C='btree',J){const k=A,K=requestedIndexes['get'](J)??new Set();requestedIndexes['set'](J,K);const Z=x+':'+q+':'+C;if(K[k(0x1d7)](Z))return;K['add'](Z),void ensureIndex(x,q,C,J)[k(0x1d8)](()=>{K['delete'](Z);});}async function ensureIndex(x,q,C,J){const H=A,K=x['split']('.'),Z=K['length']===0x2?K[0x0]:H(0x1d9),Y=(x+'_'+q+'_'+C+H(0x1da))['replace'](/[^A-Za-z0-9_]/g,'_'),b=await J[H(0x1db)](H(0x1dc),[Z,Y]);if(b['rowCount'])return;if(C===H(0x1dd)){await J[H(0x1db)]('CREATE\x20EXTENSION\x20IF\x20NOT\x20EXISTS\x20pg_trgm'),await J['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(Y+'_l')+'\x20ON\x20'+qt(x)+'\x20USING\x20btree\x20(lower('+qi(q)+H(0x1de)),await J['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(Y)+'\x20ON\x20'+qt(x)+'\x20USING\x20gin\x20(lower('+qi(q)+H(0x1df));return;}await J['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(Y)+H(0x1e0)+qt(x)+'\x20USING\x20'+C+'\x20('+qi(q)+')');}function g(){const F=['has','catch','public','_idx','query','SELECT\x201\x20FROM\x20pg_indexes\x20WHERE\x20schemaname\x20=\x20$1\x20AND\x20indexname\x20=\x20$2','text',')\x20text_pattern_ops)',')\x20gin_trgm_ops)','\x20ON\x20'];g=function(){return F;};return g();}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';function S(d,h){d=d-0x163;const p=v();let Z=p[d];return Z;}export{readableFields,writableData,fieldColumn}from'./sql.js';const validateInputData=({resource:d,data:h,update:update=![]})=>{const D=S;for(const [p,Z]of Object['entries'](d['fields'])){if(Z['required']&&Z['writable']!==![]&&(h[p]===undefined||h[p]===null)&&!update)throw new ValidationError(D(0x163)+p);if(Z[D(0x164)]&&Z[D(0x165)]!==![]&&Object[D(0x166)](h,p)&&(h[p]===undefined||h[p]===null)&&update)throw new ValidationError('Required\x20field:\x20'+p);if(Z['minLength']&&typeof h[p]==='string'&&h[p][D(0x167)]<Z['minLength'])throw new ValidationError('minLength\x20not\x20met:\x20'+p);if(Z[D(0x168)]&&typeof h[p]==='string'&&h[p]['length']>Z['maxLength'])throw new ValidationError(D(0x169)+p);if(Z[D(0x16a)]&&typeof h[p]==='number'&&h[p]<Z['minimum'])throw new ValidationError(p+'\x20should\x20be\x20>=\x20'+Z['minimum']);if(Z['maximum']&&typeof h[p]===D(0x16b)&&h[p]>Z[D(0x16c)])throw new ValidationError(p+'\x20should\x20be\x20<=\x20'+Z['maximum']);if(Z['enum']&&h[p]&&!Z['enum'][D(0x16d)](h[p]))throw new ValidationError(p+D(0x16e)+Z['enum']['join'](',\x20')+')');if(Z['pattern']&&typeof h[p]==='string'&&!new RegExp(Z['pattern'])[D(0x16f)](h[p]))throw new ValidationError(p+D(0x170)+Z['pattern']+')');}};function v(){const u=['Required\x20field:\x20','required','writable','hasOwn','length','maxLength','maxLength\x20exceeded:\x20','minimum','number','maximum','includes','\x20should\x20be\x20one\x20of\x20(','test','\x20should\x20match\x20regular\x20expression\x20('];v=function(){return u;};return v();}export{validateInputData};
1
+ function g(){const Z=['writable','minLength','maxLength','length','maxLength\x20exceeded:\x20','number','maximum','enum','join','pattern'];g=function(){return Z;};return g();}import{ValidationError}from'../../../errors.js';export{readableFields,writableData,fieldColumn}from'./sql.js';function A(x,q){x=x-0x11d;const C=g();let J=C[x];return J;}const validateInputData=({resource:x,data:q,update:update=![]})=>{const K=A;for(const [C,J]of Object['entries'](x['fields'])){if(J['required']&&J['writable']!==![]&&(q[C]===undefined||q[C]===null)&&!update)throw new ValidationError('Required\x20field:\x20'+C);if(J['required']&&J[K(0x11d)]!==![]&&Object['hasOwn'](q,C)&&(q[C]===undefined||q[C]===null)&&update)throw new ValidationError('Required\x20field:\x20'+C);if(J[K(0x11e)]&&typeof q[C]==='string'&&q[C]['length']<J['minLength'])throw new ValidationError('minLength\x20not\x20met:\x20'+C);if(J[K(0x11f)]&&typeof q[C]==='string'&&q[C][K(0x120)]>J[K(0x11f)])throw new ValidationError(K(0x121)+C);if(J['minimum']&&typeof q[C]==='number'&&q[C]<J['minimum'])throw new ValidationError(C+'\x20should\x20be\x20>=\x20'+J['minimum']);if(J['maximum']&&typeof q[C]===K(0x122)&&q[C]>J[K(0x123)])throw new ValidationError(C+'\x20should\x20be\x20<=\x20'+J['maximum']);if(J['enum']&&q[C]&&!J[K(0x124)]['includes'](q[C]))throw new ValidationError(C+'\x20should\x20be\x20one\x20of\x20('+J['enum'][K(0x125)](',\x20')+')');if(J['pattern']&&typeof q[C]==='string'&&!new RegExp(J[K(0x126)])['test'](q[C]))throw new ValidationError(C+'\x20should\x20match\x20regular\x20expression\x20('+J['pattern']+')');}};export{validateInputData};
@@ -1 +1 @@
1
- const s=S;import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';import{autoIndex}from'./auto-index.js';function S(d,h){d=d-0x15d;const p=v();let Z=p[d];return Z;}const filterOperators=new Set(['eq','ne','gt','gte','lt','lte','in','nin',s(0x15d),s(0x15e),s(0x15f)]);export function parseFilterQuery(d){const M=s,h={...isRecord(d[M(0x160)])?d['filter']:{}};for(const [p,Z]of Object['entries'](d)){const D=/^filter\[([^\]]+)\](?:\[([^\]]+)\])?$/[M(0x161)](p);if(!D)continue;const [,u,n]=D;if(!u)continue;if(!n){h[u]=Z;continue;}if(!filterOperators['has'](n))throw new ValidationError(M(0x162)+n);const X=isRecord(h[u])?h[u]:{};X[n]=(n==='in'||n==='nin')&&typeof Z==='string'?Z['split'](','):Z,h[u]=X;}return Object['keys'](h)[M(0x163)]?h:undefined;}export function buildFilters(d,h,p=0x1,Z){const O=s,D=[],u=[];for(const [n,X]of Object['entries'](h??{})){const Y=d['fields'][n];if(!Y||Y['filter']!==!![]&&Y['filterable']!==!![])throw new ValidationError('Field\x20is\x20not\x20filterable:\x20'+n);const w=qi(fieldColumn(d,n)),y=isRecord(X)?X:{'eq':X};for(const [Q,F]of Object['entries'](y)){if(!filterOperators[O(0x164)](Q))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+Q);if((Q==='like'||Q===O(0x15e))&&Y['type']!==O(0x165)&&Y['type']!==O(0x166))throw new ValidationError('Operator\x20'+Q+'\x20requires\x20a\x20text\x20field:\x20'+n);Z&&autoIndex(d[O(0x167)],fieldColumn(d,n),indexTypeFor(Y[O(0x168)],Q),Z);if(Q==='null'){D['push'](w+'\x20IS\x20'+(isTruthy(F)?'':'NOT\x20')+'NULL');continue;}if(Q==='in'||Q==='nin'){const g=Array[O(0x169)](F)?F:[F];if(g[O(0x163)]===0x0){D['push'](Q==='in'?O(0x16a):O(0x16b));continue;}u[O(0x16c)](g),D[O(0x16c)](w+'\x20'+(Q==='in'?'=\x20ANY':O(0x16d))+'($'+(p+u['length']-0x1)+')');continue;}const B={'eq':'=','ne':'<>','gt':'>','gte':'>=','lt':'<','lte':'<=','like':O(0x15d)},K='$'+(p+u[O(0x163)]);if(Q===O(0x15d)){u['push'](F+'%'),D['push']('lower('+w+O(0x16e)+K+')');continue;}u['push'](F),D['push'](w+'\x20'+B[Q]+'\x20'+K);}}return{'sql':D['length']?O(0x16f)+D['join'](O(0x170)):'','values':u};}function v(){const J=['like','ilike','null','filter','exec','Unsupported\x20filter\x20operator:\x20','length','has','string','text','table','type','isArray','FALSE','TRUE','push','<>\x20ALL',')\x20like\x20lower(','\x20WHERE\x20','\x20AND\x20','object','btree'];v=function(){return J;};return v();}function isRecord(d){const R=s;return typeof d===R(0x171)&&d!==null&&!Array[R(0x169)](d);}function isTruthy(d){return d===!![]||d==='true'||d==='1'||d===0x1;}function indexTypeFor(d,h){const E=s;if(h==='like'||h===E(0x15e))return'text';if(d==='geom'||d==='geometry')return'gist';return E(0x172);}
1
+ const w=A;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',w(0xe6),'like',w(0xe7),w(0xe8)]);export function parseFilterQuery(x){const R=w,q={...isRecord(x['filter'])?x['filter']:{}};for(const [C,J]of Object['entries'](x)){const K=/^filter\[([^\]]+)\](?:\[([^\]]+)\])?$/['exec'](C);if(!K)continue;const [,Z,Y]=K;if(!Z)continue;if(!Y){q[Z]=J;continue;}if(!filterOperators['has'](Y))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+Y);const b=isRecord(q[Z])?q[Z]:{};b[Y]=(Y==='in'||Y==='nin')&&typeof J==='string'?J['split'](','):J,q[Z]=b;}return Object[R(0xe9)](q)['length']?q:undefined;}export function buildFilters(x,q,C=0x1,J){const s=w,K=[],Z=[];for(const [Y,b]of Object['entries'](q??{})){const k=x[s(0xea)][Y];if(!k||k['filter']!==!![]&&k[s(0xeb)]!==!![])throw new ValidationError(s(0xec)+Y);const H=qi(fieldColumn(x,Y)),F=isRecord(b)?b:{'eq':b};for(const [y,r]of Object['entries'](F)){if(!filterOperators[s(0xed)](y))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+y);if((y===s(0xee)||y==='ilike')&&k[s(0xef)]!==s(0xf0)&&k[s(0xef)]!==s(0xf1))throw new ValidationError('Operator\x20'+y+s(0xf2)+Y);J&&autoIndex(x['table'],fieldColumn(x,Y),indexTypeFor(k[s(0xef)],y),J);if(y==='null'){K['push'](H+'\x20IS\x20'+(isTruthy(r)?'':'NOT\x20')+'NULL');continue;}if(y==='in'||y==='nin'){const p=Array['isArray'](r)?r:[r];if(p['length']===0x0){K[s(0xf3)](y==='in'?'FALSE':'TRUE');continue;}Z['push'](p),K[s(0xf3)](H+'\x20'+(y==='in'?'=\x20ANY':s(0xf4))+'($'+(C+Z['length']-0x1)+')');continue;}const B={'eq':'=','ne':'<>','gt':'>','gte':'>=','lt':'<','lte':'<=','like':'like'},t='$'+(C+Z['length']);if(y==='like'){Z[s(0xf3)](r+'%'),K['push']('lower('+H+s(0xf5)+t+')');continue;}Z[s(0xf3)](r),K['push'](H+'\x20'+B[y]+'\x20'+t);}}return{'sql':K['length']?s(0xf6)+K['join']('\x20AND\x20'):'','values':Z};}function isRecord(x){return typeof x==='object'&&x!==null&&!Array['isArray'](x);}function A(x,q){x=x-0xe6;const C=g();let J=C[x];return J;}function isTruthy(x){return x===!![]||x==='true'||x==='1'||x===0x1;}function indexTypeFor(x,q){const G=w;if(q===G(0xee)||q==='ilike')return G(0xf1);if(x==='geom'||x===G(0xf7))return G(0xf8);return G(0xf9);}function g(){const h=['nin','ilike','null','keys','fields','filterable','Field\x20is\x20not\x20filterable:\x20','has','like','type','string','text','\x20requires\x20a\x20text\x20field:\x20','push','<>\x20ALL',')\x20like\x20lower(','\x20WHERE\x20','geometry','gist','btree'];g=function(){return h;};return g();}
@@ -1 +1 @@
1
- import{ForbiddenError}from'../../../errors.js';function v(){const n=['public','admin'];v=function(){return n;};return v();}import{getContext}from'../../../index.js';function S(d,h){d=d-0xff;const p=v();let Z=p[d];return Z;}export function assertOperation(d,h,p){const u=S,Z=getContext()['config'];if(Z['debug'])return;if(!d['operations']['includes'](h))throw new ForbiddenError(d['name']+'.'+h+'\x20is\x20disabled');if(d['access']!==u(0xff)&&p===undefined)throw new ForbiddenError('Authentication\x20required');if(d['access']==='admin'&&p?.['type']!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(p?.['type']!==u(0x100)){const D=(d['permission']??d['name'])+':'+h;if(!p?.['permissions']?.['includes'](D))throw new ForbiddenError('Missing\x20permission:\x20'+D);}}
1
+ import{ForbiddenError}from'../../../errors.js';function A(x,q){x=x-0x184;const C=g();let J=C[x];return J;}function g(){const Y=['config','access','admin','type'];g=function(){return Y;};return g();}import{getContext}from'../../../index.js';export function assertOperation(x,q,C){const Z=A,J=getContext()[Z(0x184)];if(J['debug'])return;if(!x['operations']['includes'](q))throw new ForbiddenError(x['name']+'.'+q+'\x20is\x20disabled');if(x[Z(0x185)]!=='public'&&C===undefined)throw new ForbiddenError('Authentication\x20required');if(x[Z(0x185)]===Z(0x186)&&C?.['type']!==Z(0x186))throw new ForbiddenError('Admin\x20access\x20required');if(C?.[Z(0x187)]!==Z(0x186)){const K=(x['permission']??x['name'])+':'+q;if(!C?.['permissions']?.['includes'](K))throw new ForbiddenError('Missing\x20permission:\x20'+K);}}
@@ -1 +1 @@
1
- function S(d,h){d=d-0x1bf;const p=v();let Z=p[d];return Z;}function v(){const w=['length','slice','sort','sortable','Field\x20is\x20not\x20sortable:\x20'];v=function(){return w;};return v();}import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';export function buildSort(d,h){const X=S;if(!h?.[X(0x1bf)])return'';typeof h==='string'&&(h=[h]);const p=h['map'](Z=>{const Y=X,D=Z['startsWith']('-'),u=D?Z[Y(0x1c0)](0x1):Z,n=d['fields'][u];if(!n||n[Y(0x1c1)]!==!![]&&n[Y(0x1c2)]!==!![])throw new ValidationError(Y(0x1c3)+u);return qi(fieldColumn(d,u))+'\x20'+(D?'DESC':'ASC');});return'\x20ORDER\x20BY\x20'+p['join'](',\x20');}
1
+ function A(x,q){x=x-0x10e;const C=g();let J=C[x];return J;}import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';export function buildSort(x,q){const b=A;if(!q?.['length'])return'';typeof q==='string'&&(q=[q]);const C=q['map'](J=>{const K=J['startsWith']('-'),Z=K?J['slice'](0x1):J,Y=x['fields'][Z];if(!Y||Y['sort']!==!![]&&Y['sortable']!==!![])throw new ValidationError('Field\x20is\x20not\x20sortable:\x20'+Z);return qi(fieldColumn(x,Z))+'\x20'+(K?'DESC':'ASC');});return'\x20ORDER\x20BY\x20'+C[b(0x10e)](',\x20');}function g(){const k=['join'];g=function(){return k;};return g();}
@@ -1 +1 @@
1
- const n=S;import{ValidationError}from'../../../errors.js';function v(){const y=['replace','Unknown\x20field:\x20','column','fields','\x20AS\x20','writable'];v=function(){return y;};return v();}export const quoteIdentifier=d=>'\x22'+d[n(0x171)](/"/g,'\x22\x22')+'\x22';export const quoteTable=d=>d['split']('.')['map'](quoteIdentifier)['join']('.');export function fieldColumn(d,h){const X=n;if(h===d['key'])return d['key'];const p=d['fields'][h];if(!p)throw new ValidationError(X(0x172)+h);return p[X(0x173)]??h;}export function readableFields(d){const Y=n,h=Object['entries'](d[Y(0x174)])['filter'](([,p])=>p['read']!==![]&&p['readable']!==![])['map'](([p,Z])=>quoteIdentifier(Z['column']??p)+Y(0x175)+quoteIdentifier(p));return!d['fields'][d['key']]&&h['unshift'](quoteIdentifier(d['key'])),h;}function S(d,h){d=d-0x171;const p=v();let Z=p[d];return Z;}export function writableData(d,h){const w=n,p=[];for(const [Z,D]of Object['entries'](h)){const u=d[w(0x174)][Z];if(!u||u['write']===![]||u[w(0x176)]===![])throw new ValidationError('Field\x20is\x20not\x20writable:\x20'+Z);p['push']([u[w(0x173)]??Z,D]);}return p;}export const qi=quoteIdentifier;export const qt=quoteTable;
1
+ const Y=A;import{ValidationError}from'../../../errors.js';export const quoteIdentifier=x=>'\x22'+x[Y(0x7f)](/"/g,'\x22\x22')+'\x22';export const quoteTable=x=>x[Y(0x80)]('.')['map'](quoteIdentifier)['join']('.');export function fieldColumn(x,q){const b=Y;if(q===x['key'])return x['key'];const C=x[b(0x81)][q];if(!C)throw new ValidationError('Unknown\x20field:\x20'+q);return C['column']??q;}export function readableFields(x){const k=Y,q=Object['entries'](x['fields'])['filter'](([,C])=>C['read']!==![]&&C['readable']!==![])['map'](([C,J])=>quoteIdentifier(J['column']??C)+k(0x82)+quoteIdentifier(C));return!x['fields'][x['key']]&&q['unshift'](quoteIdentifier(x[k(0x83)])),q;}function g(){const F=['replace','split','fields','\x20AS\x20','key','write','Field\x20is\x20not\x20writable:\x20','push','column'];g=function(){return F;};return g();}export function writableData(x,q){const H=Y,C=[];for(const [J,K]of Object['entries'](q)){const Z=x['fields'][J];if(!Z||Z[H(0x84)]===![]||Z['writable']===![])throw new ValidationError(H(0x85)+J);C[H(0x86)]([Z[H(0x87)]??J,K]);}return C;}function A(x,q){x=x-0x7f;const C=g();let J=C[x];return J;}export const qi=quoteIdentifier;export const qt=quoteTable;
@@ -1 +1 @@
1
- function S(d,h){d=d-0x90;const p=v();let Z=p[d];return Z;}const h=S,getIP=d=>(d[h(0x90)]?.['x-real-ip']||d['headers']?.[h(0x91)]||d['ip']||d[h(0x92)]?.['remoteAddress']||'')['split'](':')['pop']();function v(){const p=['headers','x-forwarded-for','connection'];v=function(){return p;};return v();}export default getIP;
1
+ function A(x,q){x=x-0x196;const C=g();let J=C[x];return J;}function g(){const C=['connection'];g=function(){return C;};return g();}const q=A,getIP=x=>(x['headers']?.['x-real-ip']||x['headers']?.['x-forwarded-for']||x['ip']||x[q(0x196)]?.['remoteAddress']||'')['split'](':')['pop']();export default getIP;
@@ -182,9 +182,12 @@ CREATE TABLE IF NOT EXISTS admin.files (
182
182
  file_status numeric,
183
183
  file_name text,
184
184
  size numeric,
185
- ext text,
185
+ mime_type text,
186
186
  tags text[],
187
- file_path text,
187
+ file_path text,
188
+ field_name text,
189
+ status text DEFAULT 'pending', // File processing status, e.g., 'pending', 'attached'
190
+ expires_at timestamptz DEFAULT now() + interval '1 day',
188
191
  verified boolean DEFAULT false,
189
192
  resized boolean,
190
193
  created_by text REFERENCES admin.users(uid) ,
@@ -0,0 +1,5 @@
1
+
2
+ alter table admin.files add column if not exists mime_type text;
3
+ alter table admin.files add column if not exists status text default 'pending';
4
+ alter table admin.files add column if not exists expires_at timestamptz default now() + interval '1 day';
5
+ alter table admin.files add column if not exists field_name text;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengis/fcore",
3
- "version": "0.0.1-beta.10",
3
+ "version": "0.0.1-beta.12",
4
4
  "description": "Reusable backend foundation for OpenGIS Node.js applications",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -90,4 +90,4 @@
90
90
  "vitest": "4.1.11"
91
91
  },
92
92
  "license": "UNLICENSED"
93
- }
93
+ }