@opengis/fcore 0.0.1-beta.8 → 0.0.1-beta.9

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 (97) hide show
  1. package/LICENSE +3 -3
  2. package/README.md +71 -71
  3. package/dist/config.js +1 -1
  4. package/dist/context.js +1 -1
  5. package/dist/errors.js +1 -1
  6. package/dist/fastify.js +1 -1
  7. package/dist/fcore.js +1 -1
  8. package/dist/migrations/cli.js +1 -1
  9. package/dist/migrations/runner.js +1 -1
  10. package/dist/modules/auth/adduser-cli.js +1 -1
  11. package/dist/modules/auth/passwd-cli.js +1 -1
  12. package/dist/modules/auth/permission-cli.js +1 -1
  13. package/dist/modules/auth/route.js +1 -1
  14. package/dist/modules/auth/schema.js +1 -1
  15. package/dist/modules/auth/services/change-password.js +1 -1
  16. package/dist/modules/auth/services/get-current-user.js +1 -1
  17. package/dist/modules/auth/services/registration.js +1 -1
  18. package/dist/modules/auth/services/verify-two-factor.js +1 -1
  19. package/dist/modules/file/mime.js +1 -1
  20. package/dist/modules/file/route.js +1 -1
  21. package/dist/modules/file/schema.js +1 -1
  22. package/dist/modules/file/services/get-file.js +1 -1
  23. package/dist/modules/file/services/resize-file.js +1 -1
  24. package/dist/modules/file/services/upload-file.js +1 -1
  25. package/dist/modules/resource/route.js +1 -1
  26. package/dist/modules/resource/schema.js +1 -1
  27. package/dist/modules/resource/services/add-note.js +1 -1
  28. package/dist/modules/resource/services/add-resource-file.js +1 -1
  29. package/dist/modules/resource/services/create-resource-relation.js +1 -1
  30. package/dist/modules/resource/services/create-resource.js +1 -1
  31. package/dist/modules/resource/services/delete-resource-relation.js +1 -1
  32. package/dist/modules/resource/services/delete-resource.js +1 -1
  33. package/dist/modules/resource/services/export-resource.js +1 -1
  34. package/dist/modules/resource/services/get-resource.js +1 -1
  35. package/dist/modules/resource/services/list-resource-relation.js +1 -1
  36. package/dist/modules/resource/services/list-resources.js +1 -1
  37. package/dist/modules/resource/services/search-resource.js +1 -1
  38. package/dist/modules/resource/services/suggest-resource.js +1 -1
  39. package/dist/modules/resource/services/update-resource-relation.js +1 -1
  40. package/dist/modules/resource/services/update-resource.js +1 -1
  41. package/dist/modules/resource/services/upload-resource-file.js +1 -1
  42. package/dist/modules/system/route.js +1 -1
  43. package/dist/modules/system/schema.js +1 -1
  44. package/dist/modules/system/services/check-system.js +1 -1
  45. package/dist/modules/system/services/get-access.js +1 -1
  46. package/dist/modules/system/services/get-api-list.js +1 -1
  47. package/dist/modules/system/services/get-audit-log.js +1 -1
  48. package/dist/modules/system/services/get-dictionary.js +1 -1
  49. package/dist/modules/system/services/get-system-log.js +1 -1
  50. package/dist/modules/system/services/get-system-settings.js +1 -1
  51. package/dist/modules/system/services/list-dictionaries.js +1 -1
  52. package/dist/modules/system/services/set-access.js +1 -1
  53. package/dist/modules/system/services/update-dictionary.js +1 -1
  54. package/dist/modules/system/services/update-system-settings.js +1 -1
  55. package/dist/modules/utils/require-admin.js +1 -1
  56. package/dist/modules/utils/safe-user.js +1 -1
  57. package/dist/modules/utils/unsupported.js +1 -1
  58. package/dist/plugins/audit/audit.js +1 -1
  59. package/dist/plugins/audit/services/write-audit.js +1 -1
  60. package/dist/plugins/auth/get-user-permissions.js +1 -1
  61. package/dist/plugins/auth/index.js +1 -1
  62. package/dist/plugins/auth/verifyUser.js +1 -1
  63. package/dist/plugins/dictionary.js +1 -1
  64. package/dist/plugins/file.js +1 -1
  65. package/dist/plugins/jwt.js +1 -1
  66. package/dist/plugins/logger/index.js +1 -1
  67. package/dist/plugins/logger/transport.js +1 -1
  68. package/dist/plugins/pg.js +1 -1
  69. package/dist/plugins/redis.js +1 -1
  70. package/dist/plugins/resource/resource.js +1 -1
  71. package/dist/plugins/resource/resource.registry.js +1 -1
  72. package/dist/plugins/resource/resource.types.d.ts +6 -4
  73. package/dist/plugins/resource/resource.types.d.ts.map +1 -1
  74. package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
  75. package/dist/plugins/resource/services/add-file-token.js +1 -1
  76. package/dist/plugins/resource/services/add-table-lookup-data.d.ts.map +1 -1
  77. package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
  78. package/dist/plugins/resource/services/create-relation.js +1 -1
  79. package/dist/plugins/resource/services/create.js +1 -1
  80. package/dist/plugins/resource/services/delete-relation.js +1 -1
  81. package/dist/plugins/resource/services/delete.js +1 -1
  82. package/dist/plugins/resource/services/find-one.js +1 -1
  83. package/dist/plugins/resource/services/find-relation.js +1 -1
  84. package/dist/plugins/resource/services/find.js +1 -1
  85. package/dist/plugins/resource/services/update-relation.js +1 -1
  86. package/dist/plugins/resource/services/update.js +1 -1
  87. package/dist/plugins/resource/utils/auto-index.js +1 -1
  88. package/dist/plugins/resource/utils/fields.js +1 -1
  89. package/dist/plugins/resource/utils/filters.js +1 -1
  90. package/dist/plugins/resource/utils/permissions.js +1 -1
  91. package/dist/plugins/resource/utils/sort.js +1 -1
  92. package/dist/plugins/resource/utils/sql.js +1 -1
  93. package/dist/shared/getIP.js +1 -1
  94. package/migrations/20260903130000_move_notes_files_to_admin.sql +17 -17
  95. package/migrations/20260903140000_settings_nulls_not_distinct.sql +18 -18
  96. package/migrations/20260907090000_core_schema.sql +32 -2
  97. package/package.json +93 -93
@@ -23,11 +23,12 @@ export interface ResourceFieldContract {
23
23
  filter?: boolean;
24
24
  sort?: boolean;
25
25
  search?: boolean;
26
+ dictionary?: string;
26
27
  lookup?: {
27
- dictionary?: string;
28
- table?: string;
29
- valueField?: string;
30
- textField?: string;
28
+ table: string;
29
+ value: string;
30
+ text: string;
31
+ fields?: string[];
31
32
  };
32
33
  enum?: string[] | number[];
33
34
  minLength?: number;
@@ -40,6 +41,7 @@ export interface ResourceRelationContract {
40
41
  resource?: string;
41
42
  table?: string;
42
43
  sourceField?: string;
44
+ key?: string;
43
45
  foreignKey?: string;
44
46
  targetField?: string;
45
47
  type?: "one" | "many";
@@ -1 +1 @@
1
- {"version":3,"file":"resource.types.d.ts","sourceRoot":"","sources":["../../../src/plugins/resource/resource.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource.types.d.ts","sourceRoot":"","sources":["../../../src/plugins/resource/resource.types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- function A(z,j){z=z-0x1b7;const c=U();let p=c[z];return p;}function U(){const o=['set','map','has','get','code','text','color','icon','length'];U=function(){return o;};return U();}const dictionaryIndexesCache=new WeakMap(),dictionaryRevisionsCache=new WeakMap();async function getDictionaryIndexes(z,j){const q=A,c=dictionaryIndexesCache['get'](j)??new Map(),p=dictionaryRevisionsCache['get'](j)??new Map();dictionaryIndexesCache['set'](j,c),dictionaryRevisionsCache[q(0x1b7)](j,p);const M=z['filter'](i=>p['get'](i)!==j['revision'](i));if(M['length']===0x0)return c;const H=await Promise['all'](M[q(0x1b8)](async i=>{const Z=q;if(!j[Z(0x1b9)](i))return[i,new Map()];const b=await j[Z(0x1ba)](i),n=new Map();for(const v of b){const r=v[Z(0x1bb)]??v['id'];if(r==null)continue;n[Z(0x1b7)](String(r),{'id':r,'text':v['name']??v[Z(0x1bc)],...v[Z(0x1bd)]!==undefined?{'color':v['color']}:{},...v[Z(0x1be)]!==undefined?{'icon':v['icon']}:{}});}return[i,n];}));for(const [i,b]of H){c[q(0x1b7)](i,b),p[q(0x1b7)](i,j['revision'](i));}return c;}export async function addDictionaryLookupData(z,j,c){const e=A;if(!c||z[e(0x1bf)]===0x0)return z;const p=Object['entries'](j)['flatMap'](([H,i])=>{const b=i['lookup']?.['dictionary'];return b?[{'field':H,'dictionaryName':b}]:[];});if(p['length']===0x0)return z;const M=await getDictionaryIndexes([...new Set(p['map'](({dictionaryName:H})=>H))],c);for(const H of z){for(const {field:i,dictionaryName:b}of p){const n=H[i];H[i+'_data']=n==null?null:M['get'](b)?.['get'](String(n))??null;}}return z;}
1
+ function c(J,e){J=J-0xf6;const p=L();let b=p[J];return b;}const dictionaryIndexesCache=new WeakMap(),dictionaryRevisionsCache=new WeakMap();async function getDictionaryIndexes(J,e){const w=c,p=dictionaryIndexesCache['get'](e)??new Map(),b=dictionaryRevisionsCache['get'](e)??new Map();dictionaryIndexesCache[w(0xf6)](e,p),dictionaryRevisionsCache[w(0xf6)](e,b);const F=J['filter'](h=>b[w(0xf7)](h)!==e['revision'](h));if(F['length']===0x0)return p;const P=await Promise['all'](F['map'](async h=>{const X=w;if(!e['has'](h))return[h,new Map()];const u=await e['get'](h),H=new Map();for(const D of u){const U=D['code']??D['id'];if(U==null)continue;H['set'](String(U),{'id':U,'text':D['name']??D['text'],...D['color']!==undefined?{'color':D['color']}:{},...D[X(0xf8)]!==undefined?{'icon':D[X(0xf8)]}:{}});}return[h,H];}));for(const [h,u]of P){p[w(0xf6)](h,u),b['set'](h,e['revision'](h));}return p;}export async function addDictionaryLookupData(J,e,p){const E=c;if(!p||J['length']===0x0)return J;const b=Object['entries'](e)['flatMap'](([P,h])=>{const u=h['dictionary'];return u?[{'field':P,'dictionaryName':u}]:[];});if(b[E(0xf9)]===0x0)return J;const F=await getDictionaryIndexes([...new Set(b['map'](({dictionaryName:P})=>P))],p);for(const P of J){for(const {field:h,dictionaryName:u}of b){const H=P[h];P[h+'_data']=H==null?null:F['get'](u)?.[E(0xf7)](String(H))??null;}}return J;}function L(){const Q=['set','get','icon','length'];L=function(){return Q;};return L();}
@@ -1 +1 @@
1
- function A(z,j){z=z-0x83;const c=U();let p=c[z];return p;}export function addFileToken(z,j,c){const b=A;if(!c||z[b(0x83)]===0x0)return z;const p=Object[b(0x84)](j)[b(0x85)](([,M])=>M[b(0x86)]==='file')['map'](([M])=>M);for(const M of z){for(const H of p){const i=M[H];typeof i==='string'&&i['length']>0x0&&(M[H]=c['create'](i));}}return z;}function U(){const n=['length','entries','filter','type'];U=function(){return n;};return U();}
1
+ function c(J,e){J=J-0x9c;const p=L();let b=p[J];return b;}export function addFileToken(J,e,p){const u=c;if(!p||J['length']===0x0)return J;const b=Object[u(0x9c)](e)[u(0x9d)](([,F])=>F['type']==='file')['map'](([F])=>F);for(const F of J){for(const P of b){const h=F[P];typeof h==='string'&&h['length']>0x0&&(F[P]=p['create'](h));}}return J;}function L(){const H=['entries','filter'];L=function(){return H;};return L();}
@@ -1 +1 @@
1
- {"version":3,"file":"add-table-lookup-data.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/add-table-lookup-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAenF,wBAAgB,qBAAqB,CACjC,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,GAC5C,IAAI,CASN;AAED,wBAAsB,kBAAkB,CACpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAClC,EAAE,EAAE,oBAAoB,CAAC,IAAI,CAAC,GAC/B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CA8DpC"}
1
+ {"version":3,"file":"add-table-lookup-data.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/add-table-lookup-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAQnF,wBAAgB,qBAAqB,CACjC,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,GAC5C,IAAI,CASN;AAED,wBAAsB,kBAAkB,CACpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAClC,EAAE,EAAE,oBAAoB,CAAC,IAAI,CAAC,GAC/B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CA8DpC"}
@@ -1 +1 @@
1
- import{qi,qt}from'../utils/sql.js';function U(){const B=['entries','name','lookup','set','textField','get','has','query','\x20AS\x20id,\x20','valueField','field'];U=function(){return B;};return U();}function A(z,j){z=z-0x150;const c=U();let p=c[z];return p;}const tableLookupCache=new WeakMap();export function clearTableLookupCache(z,j){const c=tableLookupCache['get'](j);if(!c)return;for(const p of c['keys']()){p['startsWith'](z+':')&&c['delete'](p);}}export async function addTableLookupData(z,j,c){const g=A;if(!c||z['length']===0x0)return z;const p=tableLookupCache['get'](c)??new Map();tableLookupCache['set'](c,p);const M=Object[g(0x150)](j)['flatMap'](([H,i])=>{const y=g,{table:b,valueField:valueField='id',textField:textField=y(0x151)}=i[y(0x152)]??{};return b?[{'field':H,'table':b,'valueField':valueField,'textField':textField}]:[];});for(const H of M){const i=new Map();for(const r of z){const q=r[H['field']];(typeof q==='string'||typeof q==='number')&&i[g(0x153)](String(q),q);}const b=H['table']+':'+H['valueField']+':'+H[g(0x154)],n=p[g(0x155)](b)??new Map();p['set'](b,n);const v=[...i['entries']()]['filter'](([Z])=>!n[g(0x156)](Z))['map'](([,Z])=>Z);if(v['length']>0x0){const Z=await c[g(0x157)]('SELECT\x20'+qi(H['valueField'])+g(0x158)+qi(H['textField'])+'\x20AS\x20text\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20'+qt(H['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(H[g(0x159)])+'\x20=\x20ANY($1)',[v]);for(const e of Z['rows']){n['set'](String(e['id']),e);}for(const o of v){!n['has'](String(o))&&n['set'](String(o),null);}}for(const P of z){const t=P[H[g(0x15a)]];P[H[g(0x15a)]+'_data']=t==null?null:n['get'](String(t))??null;}}return z;}
1
+ import{qi,qt}from'../utils/sql.js';function c(J,e){J=J-0x6a;const p=L();let b=p[J];return b;}const tableLookupCache=new WeakMap();export function clearTableLookupCache(J,e){const a=c,p=tableLookupCache[a(0x6a)](e);if(!p)return;for(const b of p[a(0x6b)]()){b['startsWith'](J+':')&&p['delete'](b);}}export async function addTableLookupData(J,e,p){const M=c;if(!p||J['length']===0x0)return J;const b=tableLookupCache['get'](p)??new Map();tableLookupCache['set'](p,b);const F=Object['entries'](e)[M(0x6c)](([P,h])=>{const d=M,{table:u,value:value='id',text:text=d(0x6d)}=h[d(0x6e)]??{};return u?[{'field':P,'table':u,'value':value,'text':text}]:[];});for(const P of F){const h=new Map();for(const U of J){const w=U[P[M(0x6f)]];(typeof w===M(0x70)||typeof w==='number')&&h['set'](String(w),w);}const u=P[M(0x71)]+':'+P['value']+':'+P['text'],H=b['get'](u)??new Map();b['set'](u,H);const D=[...h['entries']()]['filter'](([X])=>!H['has'](X))['map'](([,X])=>X);if(D['length']>0x0){const X=await p['query']('SELECT\x20'+qi(P[M(0x72)])+'\x20AS\x20id,\x20'+qi(P['text'])+'\x20AS\x20text\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20'+qt(P[M(0x71)])+M(0x73)+qi(P['value'])+'\x20=\x20ANY($1)',[D]);for(const E of X[M(0x74)]){H[M(0x75)](String(E['id']),E);}for(const Q of D){!H[M(0x76)](String(Q))&&H[M(0x75)](String(Q),null);}}for(const T of J){const l=T[P['field']];T[P['field']+'_data']=l==null?null:H['get'](String(l))??null;}}return J;}function L(){const A=['get','keys','flatMap','name','lookup','field','string','table','value','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20','rows','set','has'];L=function(){return A;};return L();}
@@ -1 +1 @@
1
- function U(){const C=['body','files','resource','includes','No\x20writable\x20fields','map','query','rows','UPDATE\x20','foreignKey','key'];U=function(){return C;};return U();}import{UnsupportedError,ValidationError}from'../../../errors.js';import{qi,qt}from'../utils/sql.js';function A(z,j){z=z-0xb6;const c=U();let p=c[z];return p;}import{createCreate}from'./create.js';export function createCreateRelation(z,j){const c=createCreate(z,j);return async function p({name:M,id:H,relation:i,data:b,user:n}){const D=A;if(!z['pg'])throw new Error('empty\x20pg');if(i==='notes'){const e=await z['pg']['query']('INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*',[M,String(H),b?.[D(0xb6)]]);return e['rows'][0x0];}if(i===D(0xb7)){const o=await z['pg']['query']('INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*',[M,String(H),b?.['filePath'],b?.['size']??null]);return o['rows'][0x0];}const v=j['get'](M),r=v['relations']?.[i];if(!r?.['foreignKey']||!r[D(0xb8)]&&!r['table'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+i+'\x22\x20requires\x20a\x20project/provider\x20implementation');let q,Z;if(r['resource'])q=await c({'name':r[D(0xb8)],'data':b??{},'user':n}),Z=q[j['get'](r['resource'])['key']];else{const P=r['fields'];if(!P?.['length'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+i+'\x22\x20requires\x20a\x20project/provider\x20implementation');const t=Object['entries'](b??{})['filter'](([s])=>P[D(0xb9)](s));if(!t['length'])throw new ValidationError(D(0xba));const g=t[D(0xbb)](([s])=>qi(s)),y=t['map']((s,R)=>'$'+(R+0x1)),B=t[D(0xbb)](([,s])=>s),Y=await z['pg'][D(0xbc)]('INSERT\x20INTO\x20'+qt(r['table'])+'\x20('+g['join'](',\x20')+')\x20VALUES\x20('+y['join'](',\x20')+')\x20RETURNING\x20*',B);q=Y[D(0xbd)][0x0],Z=q['id'];}return await z['pg'][D(0xbc)](D(0xbe)+qt(v['table'])+'\x20SET\x20'+qi(r[D(0xbf)])+'\x20=\x20$1\x20WHERE\x20'+qi(v[D(0xc0)])+'\x20=\x20$2',[Z,H]),q;};}
1
+ import{UnsupportedError,ValidationError}from'../../../errors.js';function L(){const R=['query','INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*','rows','relations','Generic\x20Resource\x20relation\x20\x22','get','resource','entries','length','table',')\x20VALUES\x20(','join','UPDATE\x20','\x20SET\x20','\x20=\x20$1\x20WHERE\x20'];L=function(){return R;};return L();}import{qi,qt}from'../utils/sql.js';function c(J,e){J=J-0x180;const p=L();let b=p[J];return b;}import{createCreate}from'./create.js';export function createCreateRelation(J,e){const p=createCreate(J,e);return async function b({name:F,id:P,relation:h,data:u,user:H}){const z=c;if(!J['pg'])throw new Error('empty\x20pg');if(h==='notes'){const E=await J['pg'][z(0x180)](z(0x181),[F,String(P),u?.['body']]);return E[z(0x182)][0x0];}if(h==='files'){const Q=await J['pg']['query']('INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*',[F,String(P),u?.['filePath'],u?.['size']??null]);return Q['rows'][0x0];}const D=e['get'](F),U=D[z(0x183)]?.[h];if(!U?.['foreignKey']||!U['resource']&&!U['table'])throw new UnsupportedError(z(0x184)+h+'\x22\x20requires\x20a\x20project/provider\x20implementation');let w,X;if(U['resource'])w=await p({'name':U['resource'],'data':u??{},'user':H}),X=w[e[z(0x185)](U[z(0x186)])['key']];else{const T=U['fields'];if(!T?.['length'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+h+'\x22\x20requires\x20a\x20project/provider\x20implementation');const l=Object[z(0x187)](u??{})['filter'](([Y])=>T['includes'](Y));if(!l[z(0x188)])throw new ValidationError('No\x20writable\x20fields');const a=l['map'](([Y])=>qi(Y)),M=l['map']((Y,q)=>'$'+(q+0x1)),d=l['map'](([,Y])=>Y),A=await J['pg']['query']('INSERT\x20INTO\x20'+qt(U[z(0x189)])+'\x20('+a['join'](',\x20')+z(0x18a)+M[z(0x18b)](',\x20')+')\x20RETURNING\x20*',d);w=A['rows'][0x0],X=w['id'];}return await J['pg']['query'](z(0x18c)+qt(D[z(0x189)])+z(0x18d)+qi(U['foreignKey'])+z(0x18e)+qi(D['key'])+'\x20=\x20$2',[X,P]),w;};}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,readableFields,writableData}from'../utils/sql.js';function U(){const t=['map','empty\x20pg','VALUES\x20(','RETURNING\x20','rows','table','audit','name','create'];U=function(){return t;};return U();}import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function A(z,j){z=z-0x178;const c=U();let p=c[z];return p;}export function createCreate(z,j){return async function c({name:p,data:M,user:H}){const P=A,i=j['get'](p);assertOperation(i,'create',H),validateInputData({'resource':i,'data':M});const b=writableData(i,M);if(!b['length'])throw new ValidationError('No\x20writable\x20fields');const n=b[P(0x178)](([e])=>qi(e)),v=b['map']((e,o)=>'$'+(o+0x1)),r=b[P(0x178)](([,e])=>e);if(!z['pg'])throw new Error(P(0x179));const q=await z['pg']['query']('INSERT\x20INTO\x20'+qt(i['table'])+'\x20('+n['join'](',\x20')+')\x20'+(P(0x17a)+v['join'](',\x20')+')\x20')+(P(0x17b)+readableFields(i)['join'](',\x20')),r),Z=q[P(0x17c)][0x0];return clearTableLookupCache(i[P(0x17d)],z['pg']),await z[P(0x17e)]?.['write']({'userId':H?.['id'],'module':i['module'],'resource':i[P(0x17f)],'resourceId':Z[i['key']],'action':P(0x180),'fields':Object['keys'](M)}),Z;};}
1
+ 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';function c(J,e){J=J-0x1c8;const p=L();let b=p[J];return b;}export function createCreate(J,e){return async function p({name:b,data:F,user:P}){const T=c,h=e[T(0x1c8)](b);assertOperation(h,T(0x1c9),P),validateInputData({'resource':h,'data':F});const u=writableData(h,F);if(!u['length'])throw new ValidationError(T(0x1ca));const H=u['map'](([E])=>qi(E)),D=u[T(0x1cb)]((E,Q)=>'$'+(Q+0x1)),U=u[T(0x1cb)](([,E])=>E);if(!J['pg'])throw new Error('empty\x20pg');const w=await J['pg']['query'](T(0x1cc)+qt(h['table'])+'\x20('+H['join'](',\x20')+')\x20'+(T(0x1cd)+D['join'](',\x20')+')\x20')+(T(0x1ce)+readableFields(h)['join'](',\x20')),U),X=w[T(0x1cf)][0x0];return clearTableLookupCache(h['table'],J['pg']),await J[T(0x1d0)]?.[T(0x1d1)]({'userId':P?.['id'],'module':h['module'],'resource':h['name'],'resourceId':X[h[T(0x1d2)]],'action':'create','fields':Object['keys'](F)}),X;};}function L(){const l=['get','create','No\x20writable\x20fields','map','INSERT\x20INTO\x20','VALUES\x20(','RETURNING\x20','rows','audit','write','key'];L=function(){return l;};return L();}
@@ -1 +1 @@
1
- function A(z,j){z=z-0x78;var c=U();var p=c[z];return p;}import{UnsupportedError}from'../../../errors.js';export function createDeleteRelation(z,j){return async function c({name:p,id:M,relation:H,relationId:i}){var b=A;if(!z['pg'])throw new Error('empty\x20pg');if(H==='notes')return await z['pg'][b(0x78)]('DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[i,p,String(M)]),{'success':!![]};if(H===b(0x79))return await z['pg'][b(0x78)]('DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[i,p,String(M)]),{'success':!![]};throw new UnsupportedError(b(0x7a)+H+'\x22\x20requires\x20a\x20project/provider\x20implementation');};}function U(){var n=['query','files','Generic\x20Resource\x20relation\x20\x22'];U=function(){return n;};return U();}
1
+ import{UnsupportedError}from'../../../errors.js';function c(J,e){J=J-0xf1;var p=L();var b=p[J];return b;}function L(){var H=['notes','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','\x22\x20requires\x20a\x20project/provider\x20implementation'];L=function(){return H;};return L();}export function createDeleteRelation(J,e){return async function p({name:b,id:F,relation:P,relationId:h}){var u=c;if(!J['pg'])throw new Error('empty\x20pg');if(P===u(0xf1))return await J['pg']['query'](u(0xf2),[h,b,String(F)]),{'success':!![]};if(P==='files')return await J['pg']['query']('DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[h,b,String(F)]),{'success':!![]};throw new UnsupportedError(u(0xf3)+P+u(0xf4));};}
@@ -1 +1 @@
1
- import{assertOperation}from'../utils/permissions.js';function U(){const v=['=$1','delete'];U=function(){return v;};return U();}import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function A(z,j){z=z-0x79;const c=U();let p=c[z];return p;}export function createRemove(z,j){return async function c({name:p,id:M,user:H}){const n=A,i=j['get'](p);assertOperation(i,'delete',H);if(!z['pg'])throw new Error('empty\x20pg');const b=await z['pg']['query']('DELETE\x20FROM\x20'+qt(i['table'])+'\x20WHERE\x20'+qi(i['key'])+n(0x79),[M]);if((b['rowCount']??0x0)>0x0)clearTableLookupCache(i['table'],z['pg']);if((b['rowCount']??0x0)>0x0)await z['audit']?.['write']({'module':i['module'],'resource':i['name'],'resourceId':M,'action':n(0x7a)});return(b['rowCount']??0x0)>0x0;};}
1
+ import{assertOperation}from'../utils/permissions.js';import{qt,qi}from'../utils/sql.js';function L(){const D=['delete','empty\x20pg','=$1','audit','name'];L=function(){return D;};return L();}import{clearTableLookupCache}from'./add-table-lookup-data.js';function c(J,e){J=J-0xd3;const p=L();let b=p[J];return b;}export function createRemove(J,e){return async function p({name:b,id:F,user:P}){const H=c,h=e['get'](b);assertOperation(h,H(0xd3),P);if(!J['pg'])throw new Error(H(0xd4));const u=await J['pg']['query']('DELETE\x20FROM\x20'+qt(h['table'])+'\x20WHERE\x20'+qi(h['key'])+H(0xd5),[F]);if((u['rowCount']??0x0)>0x0)clearTableLookupCache(h['table'],J['pg']);if((u['rowCount']??0x0)>0x0)await J[H(0xd6)]?.['write']({'module':h['module'],'resource':h[H(0xd7)],'resourceId':F,'action':'delete'});return(u['rowCount']??0x0)>0x0;};}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qt,qi,readableFields}from'../utils/sql.js';function A(z,j){z=z-0x1c0;const c=U();let p=c[z];return p;}import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';function U(){const Y=['read','query','join','=$1\x20LIMIT\x201','dictionary','file','include','split','relations','table','Unknown\x20relation:\x20','resource','key','SELECT\x20'];U=function(){return Y;};return U();}import{addFileToken}from'./add-file-token.js';export function createFindOne(z,j){return async function c({name:p,id:M,query:query={},user:H}){const B=A,i=Date['now'](),b=j['get'](p);assertOperation(b,B(0x1c0),H);if(!z['pg'])throw new Error('empty\x20pg');const n=await z['pg'][B(0x1c1)]('SELECT\x20'+readableFields(b)[B(0x1c2)](',\x20')+'\x20FROM\x20'+qt(b['table'])+'\x20WHERE\x20'+qi(b['key'])+B(0x1c3),[M]),v=n['rows'][0x0];if(!v)return null;await addDictionaryLookupData([v],b['fields'],z[B(0x1c4)]),await addTableLookupData([v],b['fields'],z['pg']),addFileToken([v],b['fields'],z[B(0x1c5)]);const r=Array['isArray'](query[B(0x1c6)])?query['include']:query[B(0x1c6)]?.[B(0x1c7)](',')??[];for(const q of r){const Z=b[B(0x1c8)]?.[q];if(!Z?.['foreignKey']||!Z['resource']&&!Z[B(0x1c9)])throw new ValidationError(B(0x1ca)+q);const e=Z['resource']?j['get'](Z[B(0x1cb)]):undefined,o=Z['table']??e[B(0x1c9)],P=e?.[B(0x1cc)]??'id',t=e?readableFields(e)['join'](',\x20'):'*',g=B(0x1cd)+t+'\x20FROM\x20'+qt(o)+'\x20WHERE\x20'+qi(P)+'\x20=\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20'+qi(Z['foreignKey'])+'\x20FROM\x20'+qt(b['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(b[B(0x1cc)])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)',y=(await z['pg']['query'](g,[M]))['rows'];e&&(await addDictionaryLookupData(y,e['fields'],z['dictionary']),await addTableLookupData(y,e['fields'],z['pg']),addFileToken(y,e['fields'],z['file'])),v[q]=y;}return v['time']=Date['now']()-i,v;};}
1
+ import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';function L(){const A=['now','empty\x20pg','\x20FROM\x20','table','fields','isArray','include','resource','get','SELECT\x20','\x20WHERE\x20','\x20=\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20','foreignKey','query'];L=function(){return A;};return L();}function c(J,e){J=J-0x67;const p=L();let b=p[J];return b;}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(J,e){return async function p({name:b,id:F,query:query={},user:P}){const d=c,h=Date[d(0x67)](),u=e['get'](b);assertOperation(u,'read',P);if(!J['pg'])throw new Error(d(0x68));const H=await J['pg']['query']('SELECT\x20'+readableFields(u)['join'](',\x20')+d(0x69)+qt(u[d(0x6a)])+'\x20WHERE\x20'+qi(u['key'])+'=$1\x20LIMIT\x201',[F]),D=H['rows'][0x0];if(!D)return null;await addDictionaryLookupData([D],u['fields'],J['dictionary']),await addTableLookupData([D],u[d(0x6b)],J['pg']),addFileToken([D],u['fields'],J['file']);const U=Array[d(0x6c)](query['include'])?query['include']:query[d(0x6d)]?.['split'](',')??[];for(const w of U){const X=u['relations']?.[w];if(!X?.['foreignKey']||!X[d(0x6e)]&&!X['table'])throw new ValidationError('Unknown\x20relation:\x20'+w);const E=X[d(0x6e)]?e[d(0x6f)](X['resource']):undefined,Q=X['table']??E[d(0x6a)],T=E?.['key']??'id',l=E?readableFields(E)['join'](',\x20'):'*',a=d(0x70)+l+'\x20FROM\x20'+qt(Q)+d(0x71)+qi(T)+d(0x72)+qi(X[d(0x73)])+d(0x69)+qt(u['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(u['key'])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)',M=(await J['pg'][d(0x74)](a,[F]))['rows'];E&&(await addDictionaryLookupData(M,E['fields'],J['dictionary']),await addTableLookupData(M,E['fields'],J['pg']),addFileToken(M,E['fields'],J['file'])),D[w]=M;}return D['time']=Date['now']()-h,D;};}
@@ -1 +1 @@
1
- import{UnsupportedError,ValidationError}from'../../../errors.js';function U(){const Y=['now','query','rows','file','table','resource','key','length','dictionary','fields'];U=function(){return Y;};return U();}import{qi,qt}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';function A(z,j){z=z-0x16f;const c=U();let p=c[z];return p;}import{addFileToken}from'./add-file-token.js';export function createFindRelation(z,j){return async function c({name:p,id:M,relation:H,query:query={}}){const B=A,i=Date[B(0x16f)](),b=Math['min'](Math['max'](query['limit']??0x14,0x1),0xc8),n=Math['max'](query['offset']??0x0,0x0);if(!Number['isFinite'](b)||!Number['isFinite'](n))throw new ValidationError('Invalid\x20pagination');if(H==='notes'){const g=await z['pg'][B(0x170)]('SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[p,String(M)]);return{'total':g[B(0x171)]['length'],'time':Date['now']()-i,'rows':g['rows']};}if(H==='files'){const y=await z['pg']['query']('SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[p,String(M)]);return addFileToken(y[B(0x171)],{'file_path':{'type':B(0x172)}},z['file']),{'total':y['rows']['length'],'time':Date['now']()-i,'rows':y['rows']};}const v=j['get'](p),r=v['relations']?.[H];if(!r?.['foreignKey']||!r['resource']&&!r[B(0x173)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+H+'\x22\x20requires\x20a\x20project/provider\x20implementation');const q=r['resource']?j['get'](r[B(0x174)]):undefined,Z=r['table']??q['table'],e=q?.[B(0x175)]??'id',o=r['fields']?.[B(0x176)]?r['fields']['map'](qi)['join'](',\x20'):'*',P='SELECT\x20'+o+'\x20FROM\x20'+qt(Z)+'\x20WHERE\x20\x0a\x20\x20\x20\x20'+qi(e)+'\x20=\x20(select\x20'+qi(r['foreignKey'])+'\x20FROM\x20'+qt(v[B(0x173)])+'\x20WHERE\x20'+qi(v['key'])+'\x20=\x20$1\x20LIMIT\x201)\x20\x0a\x20\x20\x20\x20LIMIT\x20$2\x20OFFSET\x20$3',t=await z['pg']['query'](P,[M,b,n]);return q&&(await addDictionaryLookupData(t['rows'],q['fields'],z[B(0x177)]),await addTableLookupData(t['rows'],q['fields'],z['pg']),addFileToken(t['rows'],q[B(0x178)],z['file'])),{'limit':b,'offset':n,'total':t[B(0x171)][B(0x176)],'time':Date['now']()-i,'rows':t['rows']??null};};}
1
+ import{UnsupportedError,ValidationError}from'../../../errors.js';import{qi,qt}from'../utils/sql.js';function c(J,e){J=J-0x12b;const p=L();let b=p[J];return b;}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(J,e){return async function p({name:b,id:F,relation:P,query:query={}}){const d=c,h=Date[d(0x12b)](),u=Math['min'](Math['max'](query[d(0x12c)]??0x14,0x1),0xc8),H=Math['max'](query['offset']??0x0,0x0);if(!Number['isFinite'](u)||!Number['isFinite'](H))throw new ValidationError('Invalid\x20pagination');if(P===d(0x12d)){const a=await J['pg'][d(0x12e)]('SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[b,String(F)]);return{'total':a[d(0x12f)]['length'],'time':Date[d(0x12b)]()-h,'rows':a['rows']};}if(P===d(0x130)){const M=await J['pg']['query'](d(0x131),[b,String(F)]);return addFileToken(M[d(0x12f)],{'file_path':{'type':d(0x132)}},J['file']),{'total':M['rows']['length'],'time':Date['now']()-h,'rows':M['rows']};}const D=e['get'](b),U=D[d(0x133)]?.[P];if(!U?.['foreignKey']||!U['resource']&&!U['table'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+P+'\x22\x20requires\x20a\x20project/provider\x20implementation');const w=U[d(0x134)]?e[d(0x135)](U['resource']):undefined,X=U[d(0x136)]??w['table'],E=w?.['key']??'id',Q=U['fields']?.['length']?U['fields'][d(0x137)](qi)[d(0x138)](',\x20'):'*',T='SELECT\x20'+Q+'\x20FROM\x20'+qt(X)+'\x20WHERE\x20\x0a\x20\x20\x20\x20'+qi(E)+'\x20=\x20(select\x20'+qi(U['foreignKey'])+'\x20FROM\x20'+qt(D['table'])+d(0x139)+qi(D['key'])+d(0x13a),l=await J['pg']['query'](T,[F,u,H]);return w&&(await addDictionaryLookupData(l['rows'],w['fields'],J['dictionary']),await addTableLookupData(l['rows'],w['fields'],J['pg']),addFileToken(l['rows'],w['fields'],J['file'])),{'limit':u,'offset':H,'total':l[d(0x12f)][d(0x13b)],'time':Date['now']()-h,'rows':l[d(0x12f)]??null};};}function L(){const A=['now','limit','notes','query','rows','files','SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC','file','relations','resource','get','table','map','join','\x20WHERE\x20','\x20=\x20$1\x20LIMIT\x201)\x20\x0a\x20\x20\x20\x20LIMIT\x20$2\x20OFFSET\x20$3','length'];L=function(){return A;};return L();}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{buildFilters}from'../utils/filters.js';import{assertOperation}from'../utils/permissions.js';import{buildSort}from'../utils/sort.js';function U(){const P=['now','max','offset','filter','length','OFFSET\x20$','query'];U=function(){return P;};return U();}import{qt,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';function A(z,j){z=z-0x1d4;const c=U();let p=c[z];return p;}import{addFileToken}from'./add-file-token.js';export function createFind(z,j){return async function c({name:p,query:query={},user:M}){const o=A,H=Date[o(0x1d4)](),i=j['get'](p);assertOperation(i,'read',M);const b=Math['min'](Math['max'](query['limit']??0x14,0x1),0xc8),n=Math[o(0x1d5)](query[o(0x1d6)]??0x0,0x0),v=buildFilters(i,query[o(0x1d7)],0x1,z['pg']),r=buildSort(i,query['sort']);if(!Number['isFinite'](b)||!Number['isFinite'](n))throw new ValidationError('Invalid\x20pagination');const q='SELECT\x20'+readableFields(i)['join'](',\x20')+'\x20'+('FROM\x20'+qt(i['table']))+(''+v['sql']+r+'\x20')+('LIMIT\x20$'+(v['values'][o(0x1d8)]+0x1)+'\x20')+(o(0x1d9)+(v['values']['length']+0x2)),Z=await z['pg'][o(0x1da)](q,[...v['values'],b,n]),e=Z['rows'];return await addDictionaryLookupData(e,i['fields'],z['dictionary']),await addTableLookupData(e,i['fields'],z['pg']),addFileToken(e,i['fields'],z['file']),{'limit':b,'offset':n,'total':Z['rowCount'],'time':Date[o(0x1d4)]()-H,'rows':e};};}
1
+ import{ValidationError}from'../../../errors.js';import{buildFilters}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';function c(J,e){J=J-0x75;const p=L();let b=p[J];return b;}import{addTableLookupData}from'./add-table-lookup-data.js';function L(){const T=['min','max','filter','sort','isFinite','SELECT\x20','OFFSET\x20$','fields','now'];L=function(){return T;};return L();}import{addFileToken}from'./add-file-token.js';export function createFind(J,e){return async function p({name:b,query:query={},user:F}){const Q=c,P=Date['now'](),h=e['get'](b);assertOperation(h,'read',F);const u=Math[Q(0x75)](Math[Q(0x76)](query['limit']??0x14,0x1),0xc8),H=Math[Q(0x76)](query['offset']??0x0,0x0),D=buildFilters(h,query[Q(0x77)],0x1,J['pg']),U=buildSort(h,query[Q(0x78)]);if(!Number['isFinite'](u)||!Number[Q(0x79)](H))throw new ValidationError('Invalid\x20pagination');const w=Q(0x7a)+readableFields(h)['join'](',\x20')+'\x20'+('FROM\x20'+qt(h['table']))+(''+D['sql']+U+'\x20')+('LIMIT\x20$'+(D['values']['length']+0x1)+'\x20')+(Q(0x7b)+(D['values']['length']+0x2)),X=await J['pg']['query'](w,[...D['values'],u,H]),E=X['rows'];return await addDictionaryLookupData(E,h[Q(0x7c)],J['dictionary']),await addTableLookupData(E,h[Q(0x7c)],J['pg']),addFileToken(E,h['fields'],J['file']),{'limit':u,'offset':H,'total':X['rowCount'],'time':Date[Q(0x7d)]()-P,'rows':E};};}
@@ -1 +1 @@
1
- import{UnsupportedError}from'../../../errors.js';import{createUpdate}from'./update.js';export function createUpdateRelation(z,j){const c=createUpdate(z,j);return async function p({name:M,id:H,relation:i,relationId:b,data:n,user:v}){if(!z['pg'])throw new Error('empty\x20pg');const r=j['get'](M),q=r['relations']?.[i];if(!q?.['resource']||!q['foreignKey'])throw new UnsupportedError('Relation\x20update\x20is\x20not\x20configured:\x20'+i);return c({'name':q['resource'],'id':b,'data':n,'user':v});};}
1
+ function c(J,e){J=J-0x118;const p=L();let b=p[J];return b;}function L(){const E=['empty\x20pg','resource','foreignKey'];L=function(){return E;};return L();}import{UnsupportedError}from'../../../errors.js';import{createUpdate}from'./update.js';export function createUpdateRelation(J,e){const p=createUpdate(J,e);return async function b({name:F,id:P,relation:h,relationId:u,data:H,user:D}){const X=c;if(!J['pg'])throw new Error(X(0x118));const U=e['get'](F),w=U['relations']?.[h];if(!w?.[X(0x119)]||!w[X(0x11a)])throw new UnsupportedError('Relation\x20update\x20is\x20not\x20configured:\x20'+h);return p({'name':w['resource'],'id':u,'data':H,'user':D});};}
@@ -1 +1 @@
1
- import{NotFoundError,ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,readableFields,writableData}from'../utils/sql.js';function A(z,j){z=z-0x1d8;const c=U();let p=c[z];return p;}import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function U(){const t=['get','length','No\x20writable\x20fields','map','WHERE\x20','write'];U=function(){return t;};return U();}export function createUpdate(z,j){return async function c({name:p,id:M,data:H,user:i}){const P=A,b=j[P(0x1d8)](p);assertOperation(b,'update',i);const n=writableData(b,H);if(!n[P(0x1d9)])throw new ValidationError(P(0x1da));if(!z['pg'])throw new Error('empty\x20pg');validateInputData({'resource':b,'data':H,'update':!![]}),delete H['user_type'];const v=n['map'](([e],o)=>qi(e)+'\x20=\x20$'+(o+0x1)),r=[...n[P(0x1db)](([,e])=>e),M],q=await z['pg']['query']('UPDATE\x20'+qt(b['table'])+'\x20'+('SET\x20'+v['join'](',\x20')+'\x20')+(P(0x1dc)+qi(b['key'])+'\x20=\x20$'+(n['length']+0x1)+'\x20')+('RETURNING\x20'+readableFields(b)['join'](',\x20')),r),Z=q['rows'][0x0];if(!Z)throw new NotFoundError(p+':'+M);return clearTableLookupCache(b['table'],z['pg']),await z['audit']?.[P(0x1dd)]({'userId':i?.['id'],'module':b['module'],'resource':b['name'],'resourceId':M,'action':'update','fields':Object['keys'](H)}),Z;};}
1
+ import{NotFoundError,ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,readableFields,writableData}from'../utils/sql.js';function c(J,e){J=J-0x13a;const p=L();let b=p[J];return b;}function L(){const l=['get','query','SET\x20','table','module'];L=function(){return l;};return L();}import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createUpdate(J,e){return async function p({name:b,id:F,data:P,user:h}){const T=c,u=e[T(0x13a)](b);assertOperation(u,'update',h);const H=writableData(u,P);if(!H['length'])throw new ValidationError('No\x20writable\x20fields');if(!J['pg'])throw new Error('empty\x20pg');validateInputData({'resource':u,'data':P,'update':!![]}),delete P['user_type'];const D=H['map'](([E],Q)=>qi(E)+'\x20=\x20$'+(Q+0x1)),U=[...H['map'](([,E])=>E),F],w=await J['pg'][T(0x13b)]('UPDATE\x20'+qt(u['table'])+'\x20'+(T(0x13c)+D['join'](',\x20')+'\x20')+('WHERE\x20'+qi(u['key'])+'\x20=\x20$'+(H['length']+0x1)+'\x20')+('RETURNING\x20'+readableFields(u)['join'](',\x20')),U),X=w['rows'][0x0];if(!X)throw new NotFoundError(b+':'+F);return clearTableLookupCache(u[T(0x13d)],J['pg']),await J['audit']?.['write']({'userId':h?.['id'],'module':u[T(0x13e)],'resource':u['name'],'resourceId':F,'action':'update','fields':Object['keys'](P)}),X;};}
@@ -1 +1 @@
1
- const n=A;import{qi,qt}from'./sql.js';const requestedIndexes=new WeakMap();function A(z,j){z=z-0xb8;const c=U();let p=c[z];return p;}export function autoIndex(z,j,c=n(0xb8),p){const v=n,M=requestedIndexes['get'](p)??new Set();requestedIndexes[v(0xb9)](p,M);const H=z+':'+j+':'+c;if(M['has'](H))return;M['add'](H),void ensureIndex(z,j,c,p)['catch'](()=>{M['delete'](H);});}function U(){const q=['btree','set','public','replace','query','text','CREATE\x20EXTENSION\x20IF\x20NOT\x20EXISTS\x20pg_trgm','CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20','\x20ON\x20'];U=function(){return q;};return U();}async function ensureIndex(z,j,c,p){const r=n,M=z['split']('.'),H=M['length']===0x2?M[0x0]:r(0xba),i=(z+'_'+j+'_'+c+'_idx')[r(0xbb)](/[^A-Za-z0-9_]/g,'_'),b=await p[r(0xbc)]('SELECT\x201\x20FROM\x20pg_indexes\x20WHERE\x20schemaname\x20=\x20$1\x20AND\x20indexname\x20=\x20$2',[H,i]);if(b['rowCount'])return;if(c===r(0xbd)){await p['query'](r(0xbe)),await p['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(i+'_l')+'\x20ON\x20'+qt(z)+'\x20USING\x20btree\x20(lower('+qi(j)+')\x20text_pattern_ops)'),await p['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(i)+'\x20ON\x20'+qt(z)+'\x20USING\x20gin\x20(lower('+qi(j)+')\x20gin_trgm_ops)');return;}await p['query'](r(0xbf)+qi(i)+r(0xc0)+qt(z)+'\x20USING\x20'+c+'\x20('+qi(j)+')');}
1
+ import{qi,qt}from'./sql.js';const requestedIndexes=new WeakMap();export function autoIndex(J,e,p='btree',b){const H=c,F=requestedIndexes[H(0xf1)](b)??new Set();requestedIndexes[H(0xf2)](b,F);const P=J+':'+e+':'+p;if(F[H(0xf3)](P))return;F[H(0xf4)](P),void ensureIndex(J,e,p,b)[H(0xf5)](()=>{F['delete'](P);});}function c(J,e){J=J-0xf1;const p=L();let b=p[J];return b;}function L(){const U=['get','set','has','add','catch','text','query','CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20','\x20USING\x20gin\x20(lower(','\x20ON\x20'];L=function(){return U;};return L();}async function ensureIndex(J,e,p,b){const D=c,F=J['split']('.'),P=F['length']===0x2?F[0x0]:'public',h=(J+'_'+e+'_'+p+'_idx')['replace'](/[^A-Za-z0-9_]/g,'_'),u=await b['query']('SELECT\x201\x20FROM\x20pg_indexes\x20WHERE\x20schemaname\x20=\x20$1\x20AND\x20indexname\x20=\x20$2',[P,h]);if(u['rowCount'])return;if(p===D(0xf6)){await b['query']('CREATE\x20EXTENSION\x20IF\x20NOT\x20EXISTS\x20pg_trgm'),await b[D(0xf7)](D(0xf8)+qi(h+'_l')+'\x20ON\x20'+qt(J)+'\x20USING\x20btree\x20(lower('+qi(e)+')\x20text_pattern_ops)'),await b[D(0xf7)]('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(h)+'\x20ON\x20'+qt(J)+D(0xf9)+qi(e)+')\x20gin_trgm_ops)');return;}await b['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(h)+D(0xfa)+qt(J)+'\x20USING\x20'+p+'\x20('+qi(e)+')');}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';function U(){const H=['entries','fields','required','writable','string','maxLength\x20exceeded:\x20','minimum','maximum','\x20should\x20be\x20<=\x20','\x20should\x20be\x20one\x20of\x20(','enum','pattern'];U=function(){return H;};return U();}function A(z,j){z=z-0x11c;const c=U();let p=c[z];return p;}export{readableFields,writableData,fieldColumn}from'./sql.js';const validateInputData=({resource:z,data:j,update:update=![]})=>{const M=A;for(const [c,p]of Object[M(0x11c)](z[M(0x11d)])){if(p[M(0x11e)]&&p['writable']!==![]&&(j[c]===undefined||j[c]===null)&&!update)throw new ValidationError('Required\x20field:\x20'+c);if(p['required']&&p[M(0x11f)]!==![]&&Object['hasOwn'](j,c)&&(j[c]===undefined||j[c]===null)&&update)throw new ValidationError('Required\x20field:\x20'+c);if(p['minLength']&&typeof j[c]===M(0x120)&&j[c]['length']<p['minLength'])throw new ValidationError('minLength\x20not\x20met:\x20'+c);if(p['maxLength']&&typeof j[c]==='string'&&j[c]['length']>p['maxLength'])throw new ValidationError(M(0x121)+c);if(p[M(0x122)]&&typeof j[c]==='number'&&j[c]<p['minimum'])throw new ValidationError(c+'\x20should\x20be\x20>=\x20'+p['minimum']);if(p[M(0x123)]&&typeof j[c]==='number'&&j[c]>p['maximum'])throw new ValidationError(c+M(0x124)+p['maximum']);if(p['enum']&&j[c]&&!p['enum']['includes'](j[c]))throw new ValidationError(c+M(0x125)+p[M(0x126)]['join'](',\x20')+')');if(p[M(0x127)]&&typeof j[c]===M(0x120)&&!new RegExp(p[M(0x127)])['test'](j[c]))throw new ValidationError(c+'\x20should\x20match\x20regular\x20expression\x20('+p['pattern']+')');}};export{validateInputData};
1
+ import{ValidationError}from'../../../errors.js';export{readableFields,writableData,fieldColumn}from'./sql.js';function L(){const P=['writable','string','minimum','\x20should\x20be\x20>=\x20','number','maximum','\x20should\x20be\x20<=\x20'];L=function(){return P;};return L();}const validateInputData=({resource:J,data:e,update:update=![]})=>{const F=c;for(const [p,b]of Object['entries'](J['fields'])){if(b['required']&&b['writable']!==![]&&(e[p]===undefined||e[p]===null)&&!update)throw new ValidationError('Required\x20field:\x20'+p);if(b['required']&&b[F(0x102)]!==![]&&Object['hasOwn'](e,p)&&(e[p]===undefined||e[p]===null)&&update)throw new ValidationError('Required\x20field:\x20'+p);if(b['minLength']&&typeof e[p]===F(0x103)&&e[p]['length']<b['minLength'])throw new ValidationError('minLength\x20not\x20met:\x20'+p);if(b['maxLength']&&typeof e[p]==='string'&&e[p]['length']>b['maxLength'])throw new ValidationError('maxLength\x20exceeded:\x20'+p);if(b[F(0x104)]&&typeof e[p]==='number'&&e[p]<b['minimum'])throw new ValidationError(p+F(0x105)+b['minimum']);if(b['maximum']&&typeof e[p]===F(0x106)&&e[p]>b[F(0x107)])throw new ValidationError(p+F(0x108)+b[F(0x107)]);if(b['enum']&&e[p]&&!b['enum']['includes'](e[p]))throw new ValidationError(p+'\x20should\x20be\x20one\x20of\x20('+b['enum']['join'](',\x20')+')');if(b['pattern']&&typeof e[p]==='string'&&!new RegExp(b['pattern'])['test'](e[p]))throw new ValidationError(p+'\x20should\x20match\x20regular\x20expression\x20('+b['pattern']+')');}};function c(J,e){J=J-0x102;const p=L();let b=p[J];return b;}export{validateInputData};
@@ -1 +1 @@
1
- const t=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',t(0x72),'lt','lte','in','nin','like','ilike','null']);function U(){const R=['gte','filter','keys','fields','Field\x20is\x20not\x20filterable:\x20','entries','Unsupported\x20filter\x20operator:\x20','like','ilike','\x20requires\x20a\x20text\x20field:\x20','null','push','=\x20ANY','length','isArray','true','text','geom','geometry','btree'];U=function(){return R;};return U();}export function parseFilterQuery(z){const g=t,j={...isRecord(z[g(0x73)])?z[g(0x73)]:{}};for(const [c,p]of Object['entries'](z)){const M=/^filter\[([^\]]+)\](?:\[([^\]]+)\])?$/['exec'](c);if(!M)continue;const [,H,i]=M;if(!H)continue;if(!i){j[H]=p;continue;}if(!filterOperators['has'](i))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+i);const b=isRecord(j[H])?j[H]:{};b[i]=(i==='in'||i==='nin')&&typeof p==='string'?p['split'](','):p,j[H]=b;}return Object[g(0x74)](j)['length']?j:undefined;}export function buildFilters(z,j,c=0x1,p){const y=t,M=[],H=[];for(const [i,b]of Object['entries'](j??{})){const n=z[y(0x75)][i];if(!n||n['filter']!==!![]&&n['filterable']!==!![])throw new ValidationError(y(0x76)+i);const v=qi(fieldColumn(z,i)),r=isRecord(b)?b:{'eq':b};for(const [q,Z]of Object[y(0x77)](r)){if(!filterOperators['has'](q))throw new ValidationError(y(0x78)+q);if((q===y(0x79)||q===y(0x7a))&&n['type']!=='string'&&n['type']!=='text')throw new ValidationError('Operator\x20'+q+y(0x7b)+i);p&&autoIndex(z['table'],fieldColumn(z,i),indexTypeFor(n['type'],q),p);if(q===y(0x7c)){M['push'](v+'\x20IS\x20'+(isTruthy(Z)?'':'NOT\x20')+'NULL');continue;}if(q==='in'||q==='nin'){const P=Array['isArray'](Z)?Z:[Z];if(P['length']===0x0){M['push'](q==='in'?'FALSE':'TRUE');continue;}H['push'](P),M[y(0x7d)](v+'\x20'+(q==='in'?y(0x7e):'<>\x20ALL')+'($'+(c+H['length']-0x1)+')');continue;}const e={'eq':'=','ne':'<>','gt':'>','gte':'>=','lt':'<','lte':'<=','like':y(0x79)},o='$'+(c+H['length']);if(q==='like'){H[y(0x7d)](Z+'%'),M['push']('lower('+v+')\x20like\x20lower('+o+')');continue;}H['push'](Z),M[y(0x7d)](v+'\x20'+e[q]+'\x20'+o);}}return{'sql':M[y(0x7f)]?'\x20WHERE\x20'+M['join']('\x20AND\x20'):'','values':H};}function isRecord(z){const B=t;return typeof z==='object'&&z!==null&&!Array[B(0x80)](z);}function A(z,j){z=z-0x72;const c=U();let p=c[z];return p;}function isTruthy(z){const Y=t;return z===!![]||z===Y(0x81)||z==='1'||z===0x1;}function indexTypeFor(z,j){const s=t;if(j==='like'||j==='ilike')return s(0x82);if(z===s(0x83)||z===s(0x84))return'gist';return s(0x85);}
1
+ function c(J,e){J=J-0xa9;const p=L();let b=p[J];return b;}const l=c;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',l(0xa9),'in','nin','like',l(0xaa),'null']);export function parseFilterQuery(J){const a=l,e={...isRecord(J['filter'])?J[a(0xab)]:{}};for(const [p,b]of Object['entries'](J)){const F=/^filter\[([^\]]+)\](?:\[([^\]]+)\])?$/['exec'](p);if(!F)continue;const [,P,h]=F;if(!P)continue;if(!h){e[P]=b;continue;}if(!filterOperators['has'](h))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+h);const u=isRecord(e[P])?e[P]:{};u[h]=(h==='in'||h===a(0xac))&&typeof b==='string'?b[a(0xad)](','):b,e[P]=u;}return Object[a(0xae)](e)[a(0xaf)]?e:undefined;}function L(){const A=['lte','ilike','filter','nin','split','keys','length','fields','filterable','text','NULL','like',')\x20like\x20lower(','\x20AND\x20','geometry','btree'];L=function(){return A;};return L();}export function buildFilters(J,e,p=0x1,b){const M=l,F=[],P=[];for(const [h,u]of Object['entries'](e??{})){const H=J[M(0xb0)][h];if(!H||H['filter']!==!![]&&H[M(0xb1)]!==!![])throw new ValidationError('Field\x20is\x20not\x20filterable:\x20'+h);const D=qi(fieldColumn(J,h)),U=isRecord(u)?u:{'eq':u};for(const [w,X]of Object['entries'](U)){if(!filterOperators['has'](w))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+w);if((w==='like'||w==='ilike')&&H['type']!=='string'&&H['type']!==M(0xb2))throw new ValidationError('Operator\x20'+w+'\x20requires\x20a\x20text\x20field:\x20'+h);b&&autoIndex(J['table'],fieldColumn(J,h),indexTypeFor(H['type'],w),b);if(w==='null'){F['push'](D+'\x20IS\x20'+(isTruthy(X)?'':'NOT\x20')+M(0xb3));continue;}if(w==='in'||w==='nin'){const T=Array['isArray'](X)?X:[X];if(T['length']===0x0){F['push'](w==='in'?'FALSE':'TRUE');continue;}P['push'](T),F['push'](D+'\x20'+(w==='in'?'=\x20ANY':'<>\x20ALL')+'($'+(p+P['length']-0x1)+')');continue;}const E={'eq':'=','ne':'<>','gt':'>','gte':'>=','lt':'<','lte':'<=','like':'like'},Q='$'+(p+P['length']);if(w===M(0xb4)){P['push'](X+'%'),F['push']('lower('+D+M(0xb5)+Q+')');continue;}P['push'](X),F['push'](D+'\x20'+E[w]+'\x20'+Q);}}return{'sql':F['length']?'\x20WHERE\x20'+F['join'](M(0xb6)):'','values':P};}function isRecord(J){return typeof J==='object'&&J!==null&&!Array['isArray'](J);}function isTruthy(J){return J===!![]||J==='true'||J==='1'||J===0x1;}function indexTypeFor(J,e){const d=l;if(e==='like'||e===d(0xaa))return'text';if(J==='geom'||J===d(0xb7))return'gist';return d(0xb8);}
@@ -1 +1 @@
1
- import{ForbiddenError}from'../../../errors.js';function A(z,j){z=z-0x1d7;const c=U();let p=c[z];return p;}function U(){const i=['name','public','Authentication\x20required','admin','type','permissions','Missing\x20permission:\x20'];U=function(){return i;};return U();}import{getContext}from'../../../index.js';export function assertOperation(z,j,c){const H=A,p=getContext()['config'];if(p['debug'])return;if(!z['operations']['includes'](j))throw new ForbiddenError(z[H(0x1d7)]+'.'+j+'\x20is\x20disabled');if(z['access']!==H(0x1d8)&&c===undefined)throw new ForbiddenError(H(0x1d9));if(z['access']===H(0x1da)&&c?.[H(0x1db)]!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(c?.['type']!=='admin'){const M=(z['permission']??z[H(0x1d7)])+':'+j;if(!c?.[H(0x1dc)]?.['includes'](M))throw new ForbiddenError(H(0x1dd)+M);}}
1
+ function c(J,e){J=J-0x156;const p=L();let b=p[J];return b;}import{ForbiddenError}from'../../../errors.js';import{getContext}from'../../../index.js';export function assertOperation(J,e,p){const P=c,b=getContext()['config'];if(b['debug'])return;if(!J['operations'][P(0x156)](e))throw new ForbiddenError(J['name']+'.'+e+'\x20is\x20disabled');if(J['access']!=='public'&&p===undefined)throw new ForbiddenError('Authentication\x20required');if(J[P(0x157)]==='admin'&&p?.['type']!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(p?.['type']!=='admin'){const F=(J['permission']??J['name'])+':'+e;if(!p?.[P(0x158)]?.['includes'](F))throw new ForbiddenError('Missing\x20permission:\x20'+F);}}function L(){const h=['includes','access','permissions'];L=function(){return h;};return L();}
@@ -1 +1 @@
1
- import{fieldColumn,qi}from'./sql.js';function A(z,j){z=z-0xef;const c=U();let p=c[z];return p;}import{ValidationError}from'../../../errors.js';export function buildSort(z,j){if(!j?.['length'])return'';typeof j==='string'&&(j=[j]);const c=j['map'](p=>{const b=A,M=p['startsWith']('-'),H=M?p['slice'](0x1):p,i=z[b(0xef)][H];if(!i||i['sort']!==!![]&&i[b(0xf0)]!==!![])throw new ValidationError('Field\x20is\x20not\x20sortable:\x20'+H);return qi(fieldColumn(z,H))+'\x20'+(M?'DESC':b(0xf1));});return'\x20ORDER\x20BY\x20'+c['join'](',\x20');}function U(){const n=['fields','sortable','ASC'];U=function(){return n;};return U();}
1
+ function c(J,e){J=J-0x113;const p=L();let b=p[J];return b;}function L(){const D=['string','startsWith'];L=function(){return D;};return L();}import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';export function buildSort(J,e){const u=c;if(!e?.['length'])return'';typeof e===u(0x113)&&(e=[e]);const p=e['map'](b=>{const H=u,F=b[H(0x114)]('-'),P=F?b['slice'](0x1):b,h=J['fields'][P];if(!h||h['sort']!==!![]&&h['sortable']!==!![])throw new ValidationError('Field\x20is\x20not\x20sortable:\x20'+P);return qi(fieldColumn(J,P))+'\x20'+(F?'DESC':'ASC');});return'\x20ORDER\x20BY\x20'+p['join'](',\x20');}
@@ -1 +1 @@
1
- const i=A;function U(){const v=['split','join','entries','fields','key','unshift','Field\x20is\x20not\x20writable:\x20'];U=function(){return v;};return U();}import{ValidationError}from'../../../errors.js';export const quoteIdentifier=z=>'\x22'+z['replace'](/"/g,'\x22\x22')+'\x22';export const quoteTable=z=>z[i(0xa5)]('.')['map'](quoteIdentifier)[i(0xa6)]('.');export function fieldColumn(z,j){if(j===z['key'])return z['key'];const c=z['fields'][j];if(!c)throw new ValidationError('Unknown\x20field:\x20'+j);return c['column']??j;}export function readableFields(z){const b=i,j=Object[b(0xa7)](z[b(0xa8)])['filter'](([,c])=>c['read']!==![]&&c['readable']!==![])['map'](([c,p])=>quoteIdentifier(p['column']??c)+'\x20AS\x20'+quoteIdentifier(c));return!z[b(0xa8)][z[b(0xa9)]]&&j[b(0xaa)](quoteIdentifier(z[b(0xa9)])),j;}function A(z,j){z=z-0xa5;const c=U();let p=c[z];return p;}export function writableData(z,j){const n=i,c=[];for(const [p,M]of Object['entries'](j)){const H=z['fields'][p];if(!H||H['write']===![]||H['writable']===![])throw new ValidationError(n(0xab)+p);c['push']([H['column']??p,M]);}return c;}export const qi=quoteIdentifier;export const qt=quoteTable;
1
+ const h=c;import{ValidationError}from'../../../errors.js';export const quoteIdentifier=J=>'\x22'+J['replace'](/"/g,'\x22\x22')+'\x22';function c(J,e){J=J-0x10e;const p=L();let b=p[J];return b;}export const quoteTable=J=>J[h(0x10e)]('.')['map'](quoteIdentifier)[h(0x10f)]('.');export function fieldColumn(J,e){const u=h;if(e===J[u(0x110)])return J['key'];const p=J['fields'][e];if(!p)throw new ValidationError('Unknown\x20field:\x20'+e);return p['column']??e;}export function readableFields(J){const H=h,e=Object['entries'](J[H(0x111)])['filter'](([,p])=>p['read']!==![]&&p['readable']!==![])[H(0x112)](([p,b])=>quoteIdentifier(b['column']??p)+'\x20AS\x20'+quoteIdentifier(p));return!J[H(0x111)][J['key']]&&e[H(0x113)](quoteIdentifier(J['key'])),e;}export function writableData(J,e){const D=h,p=[];for(const [b,F]of Object['entries'](e)){const P=J[D(0x111)][b];if(!P||P['write']===![]||P['writable']===![])throw new ValidationError('Field\x20is\x20not\x20writable:\x20'+b);p['push']([P[D(0x114)]??b,F]);}return p;}export const qi=quoteIdentifier;export const qt=quoteTable;function L(){const U=['split','join','key','fields','map','unshift','column'];L=function(){return U;};return L();}
@@ -1 +1 @@
1
- function U(){const c=['headers','pop'];U=function(){return c;};return U();}function A(z,j){z=z-0x99;const c=U();let p=c[z];return p;}const j=A,getIP=z=>(z['headers']?.['x-real-ip']||z[j(0x99)]?.['x-forwarded-for']||z['ip']||z['connection']?.['remoteAddress']||'')['split'](':')[j(0x9a)]();export default getIP;
1
+ const e=c,getIP=J=>(J[e(0x7c)]?.['x-real-ip']||J['headers']?.['x-forwarded-for']||J['ip']||J['connection']?.['remoteAddress']||'')['split'](':')['pop']();function c(J,e){J=J-0x7c;const p=L();let b=p[J];return b;}export default getIP;function L(){const p=['headers'];L=function(){return p;};return L();}
@@ -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,19 +1,19 @@
1
- CREATE SCHEMA IF NOT EXISTS admin;
2
-
3
- CREATE TABLE IF NOT EXISTS admin.settings (
4
- id text PRIMARY KEY DEFAULT next_id(),
5
- resource text NOT NULL DEFAULT 'system',
6
- resource_id text,
7
- key text NOT NULL,
8
- value jsonb,
9
- updated_by text,
10
- updated_at timestamptz NOT NULL DEFAULT now(),
11
- created_by text,
12
- created_at timestamptz NOT NULL DEFAULT now()
13
- );
14
-
15
- DROP INDEX IF EXISTS settings_resource_key_uidx;
16
-
17
- CREATE UNIQUE INDEX settings_resource_key_uidx
18
- ON admin.settings (resource, resource_id, key)
1
+ CREATE SCHEMA IF NOT EXISTS admin;
2
+
3
+ CREATE TABLE IF NOT EXISTS admin.settings (
4
+ id text PRIMARY KEY DEFAULT next_id(),
5
+ resource text NOT NULL DEFAULT 'system',
6
+ resource_id text,
7
+ key text NOT NULL,
8
+ value jsonb,
9
+ updated_by text,
10
+ updated_at timestamptz NOT NULL DEFAULT now(),
11
+ created_by text,
12
+ created_at timestamptz NOT NULL DEFAULT now()
13
+ );
14
+
15
+ DROP INDEX IF EXISTS settings_resource_key_uidx;
16
+
17
+ CREATE UNIQUE INDEX settings_resource_key_uidx
18
+ ON admin.settings (resource, resource_id, key)
19
19
  NULLS NOT DISTINCT;
@@ -1,2 +1,32 @@
1
- alter table admin.users add column if not exists password_hash text;
2
- alter table admin.users add column if not exists twofa boolean not null default false;
1
+ DO $$
2
+ declare
3
+ _password_column_exists boolean;
4
+ BEGIN
5
+ IF to_regclass('admin.users') IS NOT NULL then
6
+
7
+ select true from pg_attribute where attrelid::regclass::text='admin.users' and attname='password' into _password_column_exists;
8
+
9
+ IF _password_column_exists is true then
10
+ alter table admin.users add column if not exists password_hash text;
11
+ update admin.users set password_hash = password where password is not null and password_hash is null;
12
+ alter table admin.users drop column if exists password;
13
+ END IF;
14
+
15
+ alter table admin.users add column if not exists twofa boolean not null default false;
16
+
17
+ END IF;
18
+
19
+ END
20
+ $$;
21
+
22
+ CREATE OR REPLACE FUNCTION next_id()
23
+ RETURNS text AS
24
+ $BODY$
25
+ DECLARE
26
+
27
+ BEGIN
28
+ return encode(public.gen_random_bytes(6), 'hex');
29
+ END;
30
+ $BODY$
31
+ LANGUAGE plpgsql VOLATILE
32
+ COST 100;