@opengis/fcore 0.0.1-beta.7 → 0.0.1-beta.8
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.
- package/dist/config.js +1 -1
- package/dist/context.js +1 -1
- package/dist/errors.js +1 -1
- package/dist/fastify.js +1 -1
- package/dist/fcore.js +1 -1
- package/dist/migrations/cli.js +1 -1
- package/dist/migrations/runner.js +1 -1
- package/dist/modules/auth/adduser-cli.js +1 -1
- package/dist/modules/auth/passwd-cli.js +1 -1
- package/dist/modules/auth/permission-cli.js +1 -1
- package/dist/modules/auth/route.js +1 -1
- package/dist/modules/auth/schema.js +1 -1
- package/dist/modules/auth/services/change-password.js +1 -1
- package/dist/modules/auth/services/get-current-user.js +1 -1
- package/dist/modules/auth/services/registration.js +1 -1
- package/dist/modules/auth/services/verify-two-factor.js +1 -1
- package/dist/modules/file/mime.js +1 -1
- package/dist/modules/file/route.js +1 -1
- package/dist/modules/file/schema.js +1 -1
- package/dist/modules/file/services/get-file.js +1 -1
- package/dist/modules/file/services/resize-file.js +1 -1
- package/dist/modules/file/services/upload-file.js +1 -1
- package/dist/modules/resource/route.js +1 -1
- package/dist/modules/resource/schema.js +1 -1
- package/dist/modules/resource/services/add-note.js +1 -1
- package/dist/modules/resource/services/add-resource-file.js +1 -1
- package/dist/modules/resource/services/create-resource-relation.js +1 -1
- package/dist/modules/resource/services/create-resource.js +1 -1
- package/dist/modules/resource/services/delete-resource-relation.js +1 -1
- package/dist/modules/resource/services/delete-resource.js +1 -1
- package/dist/modules/resource/services/export-resource.js +1 -1
- package/dist/modules/resource/services/get-resource.js +1 -1
- package/dist/modules/resource/services/list-resource-relation.js +1 -1
- package/dist/modules/resource/services/list-resources.js +1 -1
- package/dist/modules/resource/services/search-resource.js +1 -1
- package/dist/modules/resource/services/suggest-resource.js +1 -1
- package/dist/modules/resource/services/update-resource-relation.js +1 -1
- package/dist/modules/resource/services/update-resource.js +1 -1
- package/dist/modules/resource/services/upload-resource-file.js +1 -1
- package/dist/modules/system/route.js +1 -1
- package/dist/modules/system/schema.js +1 -1
- package/dist/modules/system/services/check-system.js +1 -1
- package/dist/modules/system/services/get-access.js +1 -1
- package/dist/modules/system/services/get-api-list.js +1 -1
- package/dist/modules/system/services/get-audit-log.js +1 -1
- package/dist/modules/system/services/get-dictionary.js +1 -1
- package/dist/modules/system/services/get-system-log.js +1 -1
- package/dist/modules/system/services/get-system-settings.js +1 -1
- package/dist/modules/system/services/list-dictionaries.js +1 -1
- package/dist/modules/system/services/set-access.js +1 -1
- package/dist/modules/system/services/update-dictionary.js +1 -1
- package/dist/modules/system/services/update-system-settings.js +1 -1
- package/dist/modules/utils/require-admin.js +1 -1
- package/dist/modules/utils/safe-user.js +1 -1
- package/dist/modules/utils/unsupported.js +1 -1
- package/dist/plugins/audit/audit.js +1 -1
- package/dist/plugins/audit/services/write-audit.js +1 -1
- package/dist/plugins/auth/get-user-permissions.js +1 -1
- package/dist/plugins/auth/index.d.ts.map +1 -1
- package/dist/plugins/auth/index.js +1 -1
- package/dist/plugins/auth/verifyUser.js +1 -1
- package/dist/plugins/dictionary.js +1 -1
- package/dist/plugins/file.js +1 -1
- package/dist/plugins/jwt.js +1 -1
- package/dist/plugins/logger/index.js +1 -1
- package/dist/plugins/logger/transport.js +1 -1
- package/dist/plugins/pg.js +1 -1
- package/dist/plugins/redis.js +1 -1
- package/dist/plugins/resource/resource.js +1 -1
- package/dist/plugins/resource/resource.registry.js +1 -1
- package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
- package/dist/plugins/resource/services/add-file-token.js +1 -1
- package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
- package/dist/plugins/resource/services/create-relation.js +1 -1
- package/dist/plugins/resource/services/create.js +1 -1
- package/dist/plugins/resource/services/delete-relation.js +1 -1
- package/dist/plugins/resource/services/delete.js +1 -1
- package/dist/plugins/resource/services/find-one.js +1 -1
- package/dist/plugins/resource/services/find-relation.js +1 -1
- package/dist/plugins/resource/services/find.js +1 -1
- package/dist/plugins/resource/services/update-relation.js +1 -1
- package/dist/plugins/resource/services/update.js +1 -1
- package/dist/plugins/resource/utils/auto-index.js +1 -1
- package/dist/plugins/resource/utils/fields.js +1 -1
- package/dist/plugins/resource/utils/filters.js +1 -1
- package/dist/plugins/resource/utils/permissions.js +1 -1
- package/dist/plugins/resource/utils/sort.js +1 -1
- package/dist/plugins/resource/utils/sql.js +1 -1
- package/dist/shared/getIP.js +1 -1
- package/migrations/20260905120000_add_user_foreign_keys.sql +42 -42
- package/migrations/20260907090000_core_schema.sql +2 -0
- package/package.json +93 -93
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getSystemSettings}from'./services/get-system-settings.js';import{updateSystemSettings}from'./services/update-system-settings.js';import{getAuditLog}from'./services/get-audit-log.js';import{checkSystem}from'./services/check-system.js';import{getApiList}from'./services/get-api-list.js';import{getSystemLog}from'./services/get-system-log.js';function z
|
|
1
|
+
const n=A;function U(){const r=['user','/api/dictionary/:name','fcore','Get\x20platform\x20dictionary','params','post','Update\x20platform\x20dictionary','Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','body','system','Get\x20access\x20rules','Returns\x20direct\x20and\x20role-based\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','accessTarget','admin','system:settings','Update\x20system\x20settings','settings','get','/api/system/logger','Get\x20system\x20log','Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','List\x20APIs'];U=function(){return r;};return U();}import{getSystemSettings}from'./services/get-system-settings.js';import{updateSystemSettings}from'./services/update-system-settings.js';import{getAuditLog}from'./services/get-audit-log.js';import{checkSystem}from'./services/check-system.js';import{getApiList}from'./services/get-api-list.js';import{getSystemLog}from'./services/get-system-log.js';function A(z,j){z=z-0x1c8;const c=U();let p=c[z];return p;}import{getDictionary}from'./services/get-dictionary.js';import{updateDictionary}from'./services/update-dictionary.js';import{getAccess}from'./services/get-access.js';import{setAccess}from'./services/set-access.js';import{systemSchemas}from'./schema.js';const u=z=>z[n(0x1c8)];export function systemRoutes(z,j=new Map()){return async c=>{const v=A;c['get'](v(0x1c9),{'schema':{'tags':[v(0x1ca),'system'],'summary':v(0x1cb),'description':'Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','access':v(0x1c8),'permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName']}},async M=>({'items':await getDictionary({...M[v(0x1cc)],'user':u(M)},z)})),c[v(0x1cd)]('/api/dictionary/:name',{'schema':{'tags':['fcore','system'],'summary':v(0x1ce),'description':v(0x1cf),'access':'user','permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName'],'body':systemSchemas['dictionaryItems']}},async M=>updateDictionary({...M[v(0x1cc)],...M[v(0x1d0)],'user':u(M)},z));const p=async M=>getAccess({...M['params'],'user':u(M)},z);c['get']('/api/access/:type/:id',{'schema':{'tags':[v(0x1ca),v(0x1d1)],'summary':v(0x1d2),'description':v(0x1d3),'access':'admin','permissions':['system:access'],'params':systemSchemas[v(0x1d4)]}},p),c[v(0x1cd)]('/api/access/:type/:id',{'schema':{'tags':['fcore','system'],'summary':'Set\x20access\x20rules','description':'Replaces\x20direct\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':['system:access'],'params':systemSchemas['accessTarget'],'body':systemSchemas['access']}},async M=>setAccess({...M['params'],...M['body'],'user':u(M)},z)),c['get']('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20settings','description':'Returns\x20system\x20settings\x20as\x20nested\x20JSON.','access':v(0x1d5),'permissions':[v(0x1d6)]}},async M=>getSystemSettings({...M[v(0x1cc)],'user':u(M)},z)),c[v(0x1cd)]('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':v(0x1d7),'description':'Updates\x20system\x20settings\x20using\x20flat\x20dot-notation\x20keys.','access':'admin','permissions':['system:settings'],'body':systemSchemas[v(0x1d8)]}},async M=>updateSystemSettings({...M['params'],'patch':M[v(0x1d0)],'user':u(M)},z)),c[v(0x1d9)](v(0x1da),{'schema':{'tags':['fcore','system'],'summary':v(0x1db),'description':v(0x1dc),'access':v(0x1c8),'permissions':['system:logs'],'querystring':systemSchemas['logger']}},async(M,H)=>{const {contentType:i,body:b}=await getSystemLog({...M['query'],'user':u(M)},z);return H['type'](i)['send'](b);}),c['get']('/api/system/audit',{'schema':{'tags':['fcore',v(0x1d1)],'summary':'Get\x20audit\x20log','description':'Returns\x20the\x20system\x20audit\x20log\x20entries.','access':'user','permissions':['system:audit']}},async M=>getAuditLog({...M['query'],'user':u(M)},z)),c['get']('/api/system/check',{'schema':{'tags':['fcore',v(0x1d1)],'summary':'Check\x20system\x20health','description':'Checks\x20the\x20availability\x20of\x20system\x20dependencies.','access':'user','permissions':['system:check']}},async M=>checkSystem({'user':u(M)},z)),c['get']('/api/system/list',{'schema':{'tags':[v(0x1ca),'system'],'summary':v(0x1dd),'description':'Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','access':'admin','permissions':[],'querystring':systemSchemas['apiListQuery']}},async M=>getApiList({'user':u(M),'apiRoutes':j,...M['query']},z));};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
function A(z,j){z=z-0x110;const c=U();let p=c[z];return p;}function U(){const j=['String','^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$','Object','Union','Literal','user','Array','Unknown','Optional'];U=function(){return j;};return U();}const z=A;import{Type}from'@sinclair/typebox';export const identifier=Type[z(0x110)]({'minLength':0x1,'maxLength':0x80,'pattern':z(0x111)});export const systemSchemas={'dictionaryName':Type['Object']({'name':identifier}),'dictionaryItems':Type[z(0x112)]({'items':Type['Array'](Type[z(0x112)]({'id':Type['Optional'](Type[z(0x113)]([Type['String'](),Type['Number']()])),'code':Type['String']({'minLength':0x1}),'name':Type['String']({'minLength':0x1}),'parentId':Type['Optional'](Type['Union']([Type[z(0x110)](),Type['Number'](),Type['Null']()]))},{'additionalProperties':!![]}))}),'accessTarget':Type[z(0x112)]({'type':Type['Union']([Type[z(0x114)](z(0x115)),Type['Literal']('role')]),'id':identifier}),'access':Type['Object']({'access':Type['Array'](Type[z(0x112)]({'resource':Type['String']({'minLength':0x1,'maxLength':0x80}),'actions':Type[z(0x116)](Type['String']({'minLength':0x1,'maxLength':0x80}),{'minItems':0x1})}))}),'apiListQuery':Type['Object']({'format':Type['Optional'](Type['Union']([Type['Literal']('short'),Type['Literal']('extended')]))}),'settingsEntity':Type['Object']({'entity':Type['Optional'](identifier)}),'settings':Type['Record'](Type['String']({'minLength':0x1}),Type[z(0x117)]()),'logger':Type[z(0x112)]({'path':Type[z(0x118)](Type[z(0x110)]({'maxLength':0x100,'pattern':'^[A-Za-z0-9_.\x5c-/]*$'}))})};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function U(){const H=['fulfilled','degraded'];U=function(){return H;};return U();}function A(z,j){z=z-0x136;const c=U();let p=c[z];return p;}export async function checkSystem(z,j){const M=A,[c,p]=await Promise['allSettled']([j['pg']['query']('SELECT\x201'),j['redis']['ping']()]);return{'status':c['status']===M(0x136)&&p['status']==='fulfilled'?'ok':M(0x137),'pg':c['status'],'redis':p['status']};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export async function getAccess(
|
|
1
|
+
function A(z,j){z=z-0x119;const c=U();let p=c[z];return p;}export async function getAccess(z,j){const M=A,c=z[M(0x119)]===M(0x11a)?M(0x11b):M(0x11c),p=await j['pg']['query'](c,[z['id']]);return{'access':p['rows']};}function U(){const H=['type','user','\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20ur.role_id\x20=\x20ra.role_id\x20AND\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20','\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.role_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20'];U=function(){return H;};return U();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function U(){const
|
|
1
|
+
function U(){const n=['sort','endpoint','format','map'];U=function(){return n;};return U();}function A(z,j){z=z-0x184;const c=U();let p=c[z];return p;}export async function getApiList(z,j){const b=A,c=[...z['apiRoutes']['values']()][b(0x184)]((p,M)=>(p[b(0x185)]+'\x20'+p['method'])['localeCompare'](M['endpoint']+'\x20'+M['method']));if(z[b(0x186)]!=='short')return c;return c[b(0x187)](({method:p,endpoint:M,access:H,permissions:i})=>p+'\x20'+M);}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function z
|
|
1
|
+
function A(z,j){z=z-0x1be;const c=U();let p=c[z];return p;}export async function getAuditLog(z,j){const H=A,c=Math[H(0x1be)](Math[H(0x1bf)](z['limit']??0x32,0x1),0xc8),p=Math['max']((z['page']??0x1)-0x1,0x0)*c,M=await j['pg'][H(0x1c0)]('SELECT\x20*\x20FROM\x20admin.audit_log\x20ORDER\x20BY\x20id\x20DESC\x20LIMIT\x20$1\x20OFFSET\x20$2',[c,p]);return{'rows':M['rows'],'page':z['page']??0x1,'limit':c};}function U(){const i=['min','max','query'];U=function(){return i;};return U();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export async function getDictionary(
|
|
1
|
+
export async function getDictionary(z,j){var c=A;return j['dictionary']['get'](z[c(0x72)]);}function A(z,j){z=z-0x72;var c=U();var p=c[z];return p;}function U(){var p=['name'];U=function(){return p;};return U();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
function U(){const R=['resolve','startsWith','sep','catch','all','join','name','directory','isDirectory','mtime','toISOString','localeCompare','slice','text/plain;\x20charset=utf-8','type','</h1>\x0a<ul>\x0a','&','<','split','stat','min','concat','length'];U=function(){return R;};return U();}function A(z,j){z=z-0x1e1;const c=U();let p=c[z];return p;}const o=A;import z from'node:fs/promises';import j from'node:path';import{NotFoundError,ValidationError}from'../../../errors.js';const LOGS_ROOT=j[o(0x1e1)](process['cwd'](),'logs'),TAIL_LINES=0x64;export async function getSystemLog(c,p){const P=o,M=normalizePath(c['path']),H=j['resolve'](LOGS_ROOT,M);if(H!==LOGS_ROOT&&!H[P(0x1e2)](LOGS_ROOT+j[P(0x1e3)]))throw new ValidationError('Invalid\x20log\x20path');const i=await z['stat'](H)[P(0x1e4)](()=>null);if(!i)throw new NotFoundError('Log\x20path\x20not\x20found');if(i['isDirectory']()){const n=await z['readdir'](H,{'withFileTypes':!![]}),v=await Promise[P(0x1e5)](n['map'](async r=>{const t=P,q=await z['stat'](j[t(0x1e6)](H,r[t(0x1e7)]));return{'name':r[t(0x1e7)],'path':M?M+'/'+r[t(0x1e7)]:r[t(0x1e7)],'type':r['isDirectory']()?t(0x1e8):'file','size':r[t(0x1e9)]()?undefined:q['size'],'modified':q[t(0x1ea)][t(0x1eb)]()};}));v['sort']((r,q)=>r[P(0x1e7)][P(0x1ec)](q['name']));if(M){const r=M['split']('/')[P(0x1ed)](0x0,-0x1)['join']('/');v['unshift']({'name':'..','path':r,'type':'directory'});}return{'contentType':'text/html;\x20charset=utf-8','body':renderDirectory(M,v)};}const b=await tailFile(H,TAIL_LINES);return{'contentType':P(0x1ee),'body':b[P(0x1e6)]('\x0a')};}function renderDirectory(c,p){const y=o,M=p['map'](i=>{const g=A,b='?path='+encodeURIComponent(i['path']),n=i[g(0x1ef)]==='directory'?i[g(0x1e7)]+'/':i['name'];return'<li><a\x20href=\x22'+b+'\x22>'+escapeHtml(n)+'</a></li>';})['join']('\x0a'),H=escapeHtml('logs/'+c);return'<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>'+H+'</title></head>\x0a<body>\x0a<h1>'+H+y(0x1f0)+M+'\x0a</ul>\x0a</body>\x0a</html>';}function escapeHtml(c){const B=o;return c['replace'](/&/g,B(0x1f1))['replace'](/</g,B(0x1f2))['replace'](/>/g,'>')['replace'](/"/g,'"');}function normalizePath(c){const Y=o,p=(c??'')['replace'](/\\/g,'/')['replace'](/^\/+|\/+$/g,'');if(p[Y(0x1f3)]('/')['some'](M=>M==='..'))throw new ValidationError('Invalid\x20log\x20path');return p;}async function tailFile(c,p){const s=o,M=await z['open'](c,'r');try{const {size:H}=await M[s(0x1f4)](),i=0x40*0x400;let b=H,n=Buffer['alloc'](0x0),v=0x0;while(b>0x0&&v<=p){const q=Math[s(0x1f5)](i,b);b-=q;const Z=Buffer['alloc'](q);await M['read'](Z,0x0,q,b),n=Buffer[s(0x1f6)]([Z,n]),v+=countNewlines(Z);}const r=n['toString']('utf8')[s(0x1f3)]('\x0a')['filter'](e=>e[s(0x1f7)]>0x0);return r['slice'](-p)['reverse']();}finally{await M['close']();}}function countNewlines(c){let p=0x0;for(const M of c){if(M===0xa)p++;}return p;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function A(z,j){z=z-0x85;const c=U();let p=c[z];return p;}export async function getSystemSettings(z,j){const n=A,c=await j['pg']['query'](n(0x85));return c['rows']['reduce']((p,M)=>{const v=n,H=String(M[v(0x86)])[v(0x87)]('.');let i=p;for(const b of H['slice'](0x0,-0x1)){i[b]??={},i=i[b];}return i[H['at'](-0x1)]=M['value'],p;},{});}function U(){const r=['\x0a\x20\x20\x20\x20\x20\x20SELECT\x20key,\x20value\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.settings\x0a\x20\x20\x20\x20\x20\x20WHERE\x20resource\x20=\x20\x27system\x27\x20AND\x20resource_id\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20key\x0a\x20\x20\x20\x20','key','split'];U=function(){return r;};return U();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export async function listDictionaries(z,j){return j['dictionary']['list']();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getAccess}from'./get-access.js';function
|
|
1
|
+
import{getAccess}from'./get-access.js';function U(){const i=['user','query','type','COMMIT'];U=function(){return i;};return U();}function A(z,j){z=z-0x1d5;const c=U();let p=c[z];return p;}export async function setAccess(z,j){const H=A,c=await j['pg']['connect']();try{await c['query']('BEGIN');z['type']===H(0x1d5)?await c['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL',[z['id']]):await c[H(0x1d6)]('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL',[z['id']]);for(const p of z['access']){z[H(0x1d7)]==='user'?await c['query']('INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20user_uid,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)',[p['resource'],p['actions'],z['id'],z['user']['id'],z[H(0x1d5)]['id']]):await c['query']('INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20role_id,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)',[p['resource'],p['actions'],z['id'],z['user']['id'],z[H(0x1d5)]['id']]);}await c['query'](H(0x1d8));}catch(M){await c['query']('ROLLBACK');throw M;}finally{c['release']();}return getAccess(z,j);}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export async function updateDictionary(
|
|
1
|
+
function A(z,j){z=z-0xb5;var c=U();var p=c[z];return p;}export async function updateDictionary(z,j){var c=A;return await j['dictionary'][c(0xb5)](z['name'],z['items']),{'success':!![]};}function U(){var p=['put'];U=function(){return p;};return U();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function z
|
|
1
|
+
function A(z,j){z=z-0x120;const c=U();let p=c[z];return p;}import{ValidationError}from'../../../errors.js';export async function updateSystemSettings(z,j){const M=A;if(!Object[M(0x120)](z['patch'])['length'])throw new ValidationError('Settings\x20patch\x20is\x20empty');for(const [c,p]of Object['entries'](z['patch'])){if(!c['trim']()||c[M(0x121)]('..'))throw new ValidationError('Invalid\x20setting\x20key:\x20'+c);await j['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.settings\x20(resource,\x20resource_id,\x20key,\x20value,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20(\x27system\x27,\x20NULL,\x20$1,\x20$2::jsonb,\x20$3)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(resource,\x20resource_id,\x20key)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20DO\x20UPDATE\x20SET\x20value\x20=\x20EXCLUDED.value,\x20updated_by\x20=\x20EXCLUDED.updated_by,\x20updated_at\x20=\x20now()\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[c,JSON[M(0x122)](p),z['user']['id']]);}return{'success':!![]};}function U(){const H=['keys','includes','stringify'];U=function(){return H;};return U();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
function A(z,j){z=z-0x131;var c=U();var p=c[z];return p;}function U(){var p=['User\x20required','admin'];U=function(){return p;};return U();}import{ForbiddenError}from'../../errors.js';export function requireAdmin(z,j){var c=A;if(!z)throw new ForbiddenError(c(0x131));if(z['type']!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(z['type']!==c(0x132)&&j&&!z['permissions']?.['includes'](j))throw new ForbiddenError('Missing\x20permission:\x20'+j);}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function U(){const
|
|
1
|
+
function U(){const H=['password','includes'];U=function(){return H;};return U();}function A(z,j){z=z-0x16e;const c=U();let p=c[z];return p;}export const safeUser=z=>{const M=A,j=[M(0x16e),'salt','secret','credentials'];return Object['fromEntries'](Object['entries'](z)['filter'](([c])=>!j['some'](p=>c['toLowerCase']()[M(0x16f)](p))));};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{UnsupportedError}from'../../errors.js';export function unsupported(
|
|
1
|
+
import{UnsupportedError}from'../../errors.js';export function unsupported(z){throw new UnsupportedError(z+'\x20requires\x20a\x20project/provider\x20implementation');}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{writeAudit}from'./services/write-audit.js';export function createAudit(
|
|
1
|
+
import{writeAudit}from'./services/write-audit.js';export function createAudit(z){const j=writeAudit(z);return{'write':j};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
const secretPattern=/password|token|secret|credential|salt/i;function clean(z){const v=A;if(Array['isArray'](z))return z['map'](clean);if(z&&typeof z==='object')return Object[v(0x10c)](Object['entries'](z)['map'](([j,c])=>[j,secretPattern['test'](j)?'[REDACTED]':clean(c)]));return z;}function U(){const e=['fromEntries','rows','warn','admin.audit_log','Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled','audit','empty\x20pg','query','resourceId','action','field'];U=function(){return e;};return U();}function A(z,j){z=z-0x10c;const c=U();let p=c[z];return p;}export function writeAudit(z){let j,c;async function p(){if(!z['pg'])return![];if(j!==undefined)return j;return c??=z['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20IN\x20(\x27audit_log\x27,\x20\x27audit_log_data\x27)\x0a\x20\x20\x20\x20\x20\x20\x20\x20')['then'](M=>{const r=A,H=new Set(M[r(0x10d)]['map'](i=>i['table_name']));return j=H['has']('audit_log')&&H['has']('audit_log_data'),!j&&z['logger'][r(0x10e)]({'expectedTables':[r(0x10f),'admin.audit_log_data'],'foundTables':[...H]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),j;})['catch'](M=>{const q=A;return j=![],z['logger']['warn']({'err':M},q(0x110)),![];}),c;}return async function M(H){const Z=A;if(!await p())return z['logger']['info']({'auditFallback':!![],'event':clean({...H,'changes':H['changes']?.['map'](n=>({...n,'oldValue':clean(n['oldValue']),'newValue':clean(n['newValue'])}))})},Z(0x111)),0x0;if(!z['pg'])throw new Error(Z(0x112));const i=await z['pg'][Z(0x113)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20user_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20module,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resource,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resource_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fields,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20action,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20request_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ip_address,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20metadata\x0a\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5,\x20$6,\x20$7,\x20$8,\x20$9)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20id\x0a\x20\x20\x20\x20\x20\x20',[H['userId']??null,H['module'],H['resource'],H[Z(0x114)]==null?null:String(H[Z(0x114)]),H['fields']??null,H[Z(0x115)],H['requestId']??null,H['ipAddress']??null,clean(H['metadata']??{})]),b=i['rows'][0x0]['id'];for(const n of H['changes']??[]){if(secretPattern['test'](n[Z(0x116)]))continue;await z['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log_data\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20audit_log_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20field,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20old_value,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20new_value\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[b,n[Z(0x116)],JSON['stringify'](clean(n['oldValue'])),JSON['stringify'](clean(n['newValue']))]);}return b;};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function z
|
|
1
|
+
function A(z,j){z=z-0x1ea;const c=U();let p=c[z];return p;}function U(){const H=['map','permission'];U=function(){return H;};return U();}export async function getUserPermissions(z,j){const M=A,c=await j['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20SELECT\x20DISTINCT\x20ra.resource\x20||\x20\x27:\x27\x20||\x20action\x20AS\x20permission\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x20ON\x20ur.role_id\x20=\x20ra.role_id\x0a\x20\x20\x20\x20\x20\x20CROSS\x20JOIN\x20LATERAL\x20unnest(COALESCE(ra.actions,\x20\x27{}\x27::text[]))\x20AS\x20action\x0a\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20',[z]);return c['rows'][M(0x1ea)](p=>p[M(0x1eb)]);}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAUhC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAI5D,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAE1C,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKpE;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAUhC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAI5D,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAE1C,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKpE;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAalB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,mBAAmB,iBA6CzB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export*from'./auth.types.js';import{randomBytes,scrypt as
|
|
1
|
+
export*from'./auth.types.js';import{randomBytes,scrypt as z,timingSafeEqual}from'node:crypto';import{promisify}from'node:util';const scrypt=promisify(z);import j from'@fastify/cookie';import c from'@fastify/session';import{Authenticator}from'@fastify/passport';import p from'fastify-session-redis-store';function U(){const o=['hex','warn','test','auth','secret','database','register'];U=function(){return o;};return U();}import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();function A(z,j){z=z-0x185;const c=U();let p=c[z];return p;}export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(M){const H=randomBytes(0x10),i=await scrypt(M,H,0x40);return'scrypt$'+H['toString']('hex')+'$'+i['toString']('hex');}export async function verifyPassword(M,H){const Z=A,[i,b,n]=H?.['split']('$')||[];if(i!=='scrypt'||!b||!n)return![];const v=Buffer['from'](b,Z(0x185)),r=Buffer['from'](n,'hex'),q=await scrypt(M,v,r['length']);return timingSafeEqual(q,r);}export async function createSessionStore(M,H){const e=A,{config:i,redis:b}=H;if(!i||!b){console[e(0x186)]('Missing\x20config\x20or\x20redis\x20-\x20skipping\x20session\x20store\x20creation');return;}if(process.env.NODE_ENV===e(0x187)||process.env.VITEST)return;await M['register'](j,{'parseOptions':i[e(0x188)]['cookieOptions']}),await M['register'](c,{'secret':i['auth'][e(0x189)],'cookieName':i['auth']['cookieName'],'cookie':i[e(0x188)]['cookieOptions'],'store':new p({'prefix':i['auth']['cookieName']+':'+(i['pg']?.[e(0x18a)]||'db')+':','client':b})}),await M['register'](fastifyPassport['initialize']()),await M[e(0x18b)](fastifyPassport['secureSession']()),fastifyPassport['registerUserSerializer'](async n=>({'user':n})),fastifyPassport['registerUserDeserializer'](async n=>{const v=n?.['user']||n;return v?.['id']&&(v['permissions']=await getUserPermissions(v['id'],H)),v;});}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{BadRequestError}from'../../errors.js';function z
|
|
1
|
+
function U(){const q=['then','info','Wrong\x20password'];U=function(){return q;};return U();}import{BadRequestError}from'../../errors.js';function A(z,j){z=z-0x168;const c=U();let p=c[z];return p;}import{verifyPassword}from'./index.js';export async function verifyUser({user:z,password:j,ip:c},{pg:p,logger:M}){const r=A;if(!z||z==='')throw new BadRequestError('not\x20enough\x20params:\x20user');if(!j||j==='')throw new BadRequestError('not\x20enough\x20params:\x20password');M['metrics']('user.login');const H='select\x20uid\x20as\x20id,\x20user_type\x20as\x20type,\x20password_hash,\x20twofa\x20from\x20admin.users\x20where\x20$1\x20in\x20(login,email,phone)\x20and\x20enabled\x20limit\x201',i=await p['query'](H,[z])[r(0x168)](n=>n['rows']?.[0x0]);if(!i){const n='user\x20not\x20found';M[r(0x169)]({'file':'auth/warn','error':n,'user':z,'ip':c});throw new BadRequestError(n);}const b=await verifyPassword(j,i['password_hash']);if(!b){const v=r(0x16a);M['info']({'file':'auth/warn','error':v,'user':z,'ip':c});throw new BadRequestError(v);}return delete i['password_hash'],i;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function z
|
|
1
|
+
import{ConflictError,NotFoundError,ValidationError}from'../errors.js';const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;function A(z,j){z=z-0x1c6;const c=U();let p=c[z];return p;}function U(){const u=['empty\x20pg','dictionaries','isArray','Invalid\x20dictionary\x20items:\x20','set','code','get','checked','items','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20di.code,\x20di.name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.dictionary_items\x20di\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20JOIN\x20admin.dictionaries\x20d\x20ON\x20d.id\x20=\x20di.dictionary_id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20d.code\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20di.name\x0a\x20\x20\x20\x20\x20\x20\x20\x20','length','rows','Dictionary\x20not\x20found:\x20','Dictionary\x20table\x20not\x20found','BEGIN','query','fcore','custom','DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.dictionary_items\x20(dictionary_id,\x20code,\x20name,\x20parent_id)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','static'];U=function(){return u;};return U();}export function createDictionary({pg:z,dictionaries:dictionaries=[]}){const j=new Map(),c=new Map();let p,M;async function H(){const R=A;if(p!==undefined)return p;if(!z)throw new Error(R(0x1c6));return M??=z['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20=\x20\x27dictionaries\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20')['then'](o=>{const D=R,P=o['rows'][0x0]?.['table_name'];p=P===D(0x1c7)?P:null;}),await M,p;}function i(o){if(!dictionaryName['test'](o))throw new ValidationError('Invalid\x20dictionary\x20name:\x20'+o);}function b(o){const C=A;for(const P of Array[C(0x1c8)](o)?o:[o]){i(P['code']);if(!Array['isArray'](P['items']))throw new ValidationError(C(0x1c9)+P['code']);if(j['has'](P['code']))throw new ConflictError('Dictionary\x20already\x20registered:\x20'+P['code']);j[C(0x1ca)](P[C(0x1cb)],{...P,'source':'static'});}}function n(o){return j['has'](o);}async function v(o){const I=A;i(o);const P=j[I(0x1cc)](o);if(P&&P[I(0x1cd)])return P[I(0x1ce)];const t=await H();if(!t)throw new NotFoundError('Dictionary\x20table\x20not\x20found');const g=await z?.['query'](I(0x1cf),[o]);if(g?.['rows']?.[I(0x1d0)]){const y=g?.[I(0x1d1)];return j['set'](o,{'code':o,'name':o,'items':y,'source':'database','checked':!![]}),y;}if(!P?.['items'])throw new NotFoundError(I(0x1d2)+o);return P['checked']=!![],P['items'];}async function r(o,P){const l=A;i(o);if(!Array['isArray'](P))throw new ValidationError('Dictionary\x20items\x20must\x20be\x20an\x20array');const t=await H();if(!t)throw new NotFoundError(l(0x1d3));if(!z)throw new Error('empty\x20pg');const g=await z['connect']();try{await g['query'](l(0x1d4));const y=await g[l(0x1d5)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.dictionaries\x20(code,\x20name,\x20module,\x20source,\x20editable)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(code)\x20DO\x20UPDATE\x20SET\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20name\x20=\x20EXCLUDED.name,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20module\x20=\x20EXCLUDED.module,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20source\x20=\x20EXCLUDED.source,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20editable\x20=\x20EXCLUDED.editable,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20updated_at\x20=\x20now()\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20',[o,o,l(0x1d6),l(0x1d7),!![]]),B=y[l(0x1d1)][0x0]['id'];await g[l(0x1d5)](l(0x1d8),[B]);for(const Y of P){await g['query'](l(0x1d9),[B,Y['code'],Y['name'],Y['parentId']??null]);}await g['query']('COMMIT');}catch(s){await g[l(0x1d5)]('ROLLBACK');throw s;}finally{g['release']();}j[l(0x1ca)](o,{'items':P,'code':o,'source':l(0x1da),'checked':!![]}),c[l(0x1ca)](o,(c[l(0x1cc)](o)??0x0)+0x1);}function q(o){const x=A;return i(o),c[x(0x1ca)](o,(c[x(0x1cc)](o)??0x0)+0x1),j['delete'](o);}function Z(o){return c['get'](o)??0x0;}async function e(){const o=[...j['values']()]['map'](({code:g,name:y,source:B})=>({'code':g,'name':y??g,'source':B})),P=await H();if(!P)return o;if(!z)throw new Error('empty\x20pg');const t=await z['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20code,\x20name,\x20\x27database\x27\x20AS\x20source\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.dictionaries\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20name\x0a\x20\x20\x20\x20\x20\x20\x20\x20');for(const g of t['rows']){!j['has'](g['code'])&&o['push'](g);}return o;}return b(dictionaries),{'register':b,'get':v,'put':r,'clear':q,'revision':Z,'list':e,'has':n};}
|
package/dist/plugins/file.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';import z from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function A(z,j){z=z-0x13c;const c=U();let p=c[z];return p;}function keyFor(j,c){const q=A;if(!c||c['startsWith']('/')||c['includes']('..'))throw new ValidationError('Invalid\x20file\x20path');const p=c['replace'](/\\/g,'/')[q(0x13c)](/^\/+/,''),M=(j??'')['replace'](/^\/+|\/+$/g,'');return M?M+'/'+p:p;}function U(){const y=['replace','alloc','from','transformToByteArray','accessKeyId','secretKey','bucket','Body','send','tokenTtl','createHmac','update','split','base64url','length'];U=function(){return y;};return U();}async function bodyToBuffer(j){const Z=A;if(!j)return Buffer[Z(0x13d)](0x0);const c=j;if(typeof c['transformToByteArray']==='function')return Buffer[Z(0x13e)](await c[Z(0x13f)]());const p=[];for await(const M of j){p['push'](Buffer['from'](M));}return Buffer['concat'](p);}export function createFileS3(j){const e=A,c=j['tokenSecret']??process.env.FILE_TOKEN_SECRET??z['randomBytes'](0x20)['toString']('hex'),p=new S3Client({'endpoint':j['endpoint'],'region':j['region']??'us-east-1','forcePathStyle':j['forcePathStyle']??!![],'credentials':j[e(0x140)]||j['accessKey']?{'accessKeyId':j['accessKeyId']??j['accessKey'],'secretAccessKey':j['secretAccessKey']??j[e(0x141)]}:undefined}),M=H=>keyFor(j['folder'],H);return{async 'put'(H,i){await p['send'](new PutObjectCommand({'Bucket':j['bucket'],'Key':M(H),'Body':i}));},async 'get'(H){const o=e,i=await p['send'](new GetObjectCommand({'Bucket':j[o(0x142)],'Key':M(H)}));return bodyToBuffer(i[o(0x143)]);},async 'exists'(H){const P=e;try{return await p[P(0x144)](new HeadObjectCommand({'Bucket':j['bucket'],'Key':M(H)})),!![];}catch(i){const b=i;if(b['$metadata']?.['httpStatusCode']===0x194||b['name']==='NotFound')return![];throw i;}},async 'delete'(H){await p['send'](new DeleteObjectCommand({'Bucket':j['bucket'],'Key':M(H)}));},'create'(H,i=j[e(0x145)]??0xe10){const t=e,b=Buffer['from'](H)['toString']('base64url'),n=z[t(0x146)]('sha256',c)[t(0x147)](b)['digest']('base64url');return b+'.'+n;},'verify'(H){const g=e,[i,b]=H[g(0x148)]('.');if(!i||!b)throw new UnauthorizedError('Invalid\x20file\x20token');const n=z['createHmac']('sha256',c)['update'](i)['digest'](),v=Buffer['from'](b,g(0x149));if(n['length']!==v[g(0x14a)]||!z['timingSafeEqual'](n,v))throw new UnauthorizedError('Invalid\x20file\x20token');const r=Buffer['from'](i,'base64url')['toString']('utf8');return r;}};}
|
package/dist/plugins/jwt.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{SignJWT,jwtVerify}from'jose';function A(z,j){z=z-0x9c;const c=U();let p=c[z];return p;}const secret=new TextEncoder()['encode'](process.env.AUTH_JWT_SECRET);export async function jwtSignToken(z){const H=A;if(!process.env.AUTH_JWT_SECRET)return;const {id:j,type:c,permissions:p}=z,M=await new SignJWT({'id':j,'type':c,'permissions':p})['setProtectedHeader']({'alg':H(0x9c)})['setIssuedAt']()[H(0x9d)]('1h')[H(0x9e)](secret);return M;}export async function jwtVerifyToken(z){const i=A,j=await jwtVerify(z,secret,{'algorithms':['HS256']})[i(0x9f)](c=>{const b=i;console['log'](c[b(0xa0)]);});return j?.['payload'];}function U(){const n=['HS256','setExpirationTime','sign','catch','message'];U=function(){return n;};return U();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function U(){const
|
|
1
|
+
import z from'pino';function U(){const n=['transport','./transport.js','stdTimeFunctions','app','req.headers.authorization','[REDACTED]','info','bind'];U=function(){return n;};return U();}function A(z,j){z=z-0x19e;const c=U();let p=c[z];return p;}export function createLogger(){const b=A,j=z[b(0x19e)]({'target':b(0x19f)}),c=z({'level':'info','timestamp':z[b(0x1a0)]['isoTime'],'base':{'service':b(0x1a1)},'redact':{'paths':[b(0x1a2),'password','token','accessToken','refreshToken'],'censor':b(0x1a3)}},j),p={};function M(H,i){if(H===undefined)return{...p};p[H]=(p[H]??0x0)+(i??0x1);}return Object['assign'](c,{'close':async()=>j['end'](),'metrics':M,'file':()=>c[b(0x1a4)][b(0x1a5)](c)});}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
const b=A;function A(z,j){z=z-0x1d8;const c=U();let p=c[z];return p;}import z from'node:fs';import j from'node:path';import c from'pino-abstract-transport';const LEVELS={0x1e:b(0x1d8),0x28:'warn',0x32:'error',0x3c:'error'},streams=new Map();function getDate(){return new Date()['toISOString']()['slice'](0x0,0xa);}function createStream(p,M){const n=b,H=j['resolve'](n(0x1d9),p);return z['mkdirSync'](H,{'recursive':!![]}),z[n(0x1da)](j[n(0x1db)](H,M+n(0x1dc)),{'flags':'a'});}function getStream(p){const v=b,M=getDate(),H=streams[v(0x1dd)](p);if(H&&H['date']===M)return H['stream'];H?.[v(0x1de)]['end']();const i=createStream(p,M);return streams['set'](p,{'date':M,'stream':i}),i;}function U(){const Z=['info','logs','createWriteStream','join','.log','get','stream','values','level','write'];U=function(){return Z;};return U();}function closeStreams(){const r=b;for(const {stream:p}of streams[r(0x1df)]()){p['end']();}streams['clear']();}export default async function loggerTransport(){return c(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(p){const q=b;for await(const M of p){const H=LEVELS[M[q(0x1e0)]];if(!H)continue;const i=getStream(M['file']||H);delete M['file'],i[q(0x1e1)](JSON['stringify'](M)+'\x0a');}}
|
package/dist/plugins/pg.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import z from'pg';const {Pool}=z;function U(){const Z=['callerStack','stack','query'];U=function(){return Z;};return U();}function A(z,j){z=z-0xaf;const c=U();let p=c[z];return p;}export function createDatabase(j){const q=A,c=new Pool(j),p=c['query']['bind'](c);function M(H,i){const b=new Error();return Error['captureStackTrace']?.(b,M),p(H,i)['catch'](n=>{const r=A,v=n;v['sql']=H,v[r(0xaf)]=b[r(0xb0)];throw v;});}return c[q(0xb1)]=M,c;}
|
package/dist/plugins/redis.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function z
|
|
1
|
+
function A(z,j){z=z-0x8e;const c=U();let p=c[z];return p;}import{Redis}from'ioredis';function U(){const b=['set'];U=function(){return b;};return U();}export function createRedis(z){const j=new Redis(z);return{'get':c=>j['get'](c),'set':(c,p,M,H)=>{const i=A;if(H)return j['set'](c,p,'EX',H);if(typeof M==='number')return j['set'](c,p,'EX',M);return j[i(0x8e)](c,p);},'del':c=>j['del'](c),'delete':c=>j['del'](c),'close':()=>j['quit'](),'ping':()=>j['ping'](),'hincrby':(c,p,M)=>j['hincrby'](c,p,M),'incrby':(c,p)=>j['incrby'](c,p)};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ResourceRegistry}from'./resource.registry.js';import{createFind}from'./services/find.js';import{createFindOne}from'./services/find-one.js';import{createCreate}from'./services/create.js';import{createUpdate}from'./services/update.js';import{createRemove}from'./services/delete.js';import{createFindRelation}from'./services/find-relation.js';import{createCreateRelation}from'./services/create-relation.js';import{createDeleteRelation}from'./services/delete-relation.js';import{createUpdateRelation}from'./services/update-relation.js';export function createResource(
|
|
1
|
+
import{ResourceRegistry}from'./resource.registry.js';import{createFind}from'./services/find.js';function U(){const Z=['has','bind','list'];U=function(){return Z;};return U();}import{createFindOne}from'./services/find-one.js';import{createCreate}from'./services/create.js';import{createUpdate}from'./services/update.js';function A(z,j){z=z-0x15b;const c=U();let p=c[z];return p;}import{createRemove}from'./services/delete.js';import{createFindRelation}from'./services/find-relation.js';import{createCreateRelation}from'./services/create-relation.js';import{createDeleteRelation}from'./services/delete-relation.js';import{createUpdateRelation}from'./services/update-relation.js';export function createResource(z){const q=A,j=new ResourceRegistry(),c=createFind(z,j),p=createFindOne(z,j),M=createCreate(z,j),H=createUpdate(z,j),i=createRemove(z,j),b=createFindRelation(z,j),n=createCreateRelation(z,j),v=createUpdateRelation(z,j),r=createDeleteRelation(z,j);return{'register':j['register']['bind'](j),'has':j[q(0x15b)][q(0x15c)](j),'get':j['get']['bind'](j),'list':j[q(0x15d)]['bind'](j),'find':c,'findOne':p,'create':M,'update':H,'delete':i,'findRelation':b,'createRelation':n,'updateRelation':v,'deleteRelation':r};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const p=A;import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';const ident=/^[a-zA-Z0-9_-]*$/;function A(z,j){z=z-0x193;const c=U();let p=c[z];return p;}function validQualified(z){return z['split']('.')['length']<=0x2&&z['split']('.')['every'](j=>ident['test'](j));}export class ResourceRegistry{['resources']=new Map();[p(0x193)](z){const M=p;for(const j of Array[M(0x194)](z)?z:[z]){this[M(0x195)](j);if(this['resources'][M(0x196)](j['name']))throw new ConflictError('Resource\x20already\x20registered:\x20'+j['name']);this['resources']['set'](j['name'],j);}}['has'](z){const H=p;return this['resources'][H(0x196)](z);}['get'](z){const j=this['resources']['get'](z);if(!j)throw new NotFoundError('Resource\x20not\x20registered:\x20'+z);return j;}['list'](){const i=p;return[...this[i(0x197)]['values']()];}['validate'](z){const b=p;if(z['version']!==0x1||!ident[b(0x198)](z['name'])||!validQualified(z['table'])||!ident['test'](z['key']))throw new ValidationError('Invalid\x20resource\x20contract:\x20'+z['name']);for(const [j,c]of Object['entries'](z[b(0x199)])){if(!ident[b(0x198)](j)||!ident[b(0x198)](c['column']??j))throw new ValidationError(b(0x19a)+j);}}}function U(){const n=['register','isArray','validate','has','resources','test','fields','Invalid\x20resource\x20field:\x20'];U=function(){return n;};return U();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function U(){const
|
|
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 +1 @@
|
|
|
1
|
-
function z
|
|
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 +1 @@
|
|
|
1
|
-
function U(){const
|
|
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 +1 @@
|
|
|
1
|
-
function
|
|
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 +1 @@
|
|
|
1
|
-
import{ValidationError}from'../../../errors.js';
|
|
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 +1 @@
|
|
|
1
|
-
function z
|
|
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 +1 @@
|
|
|
1
|
-
import{assertOperation}from'../utils/permissions.js';import{qt,qi}from'../utils/sql.js';function z
|
|
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 +1 @@
|
|
|
1
|
-
function z
|
|
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;};}
|