@opengis/fcore 0.0.27 → 0.0.29
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/LICENSE +3 -3
- package/README.md +71 -71
- 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/generate-resource-code.js +1 -1
- package/dist/modules/resource/services/get-resource-schema.js +1 -1
- package/dist/modules/resource/services/get-resource.js +1 -1
- package/dist/modules/resource/services/list-resource-as-user.js +1 -1
- package/dist/modules/resource/services/list-resource-list.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-resource-access.js +1 -1
- package/dist/modules/system/services/get-resource-scopes.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/set-resource-access.js +1 -1
- package/dist/modules/system/services/set-resource-scopes.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.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.d.ts.map +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.d.ts.map +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/get-table-columns.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/scope.js +1 -1
- package/dist/plugins/resource/utils/sort.js +1 -1
- package/dist/plugins/resource/utils/sql.js +1 -1
- package/dist/plugins/resource/utils/summary.js +1 -1
- package/dist/shared/getIP.js +1 -1
- package/migrations/20260903130000_move_notes_files_to_admin.sql +17 -17
- package/migrations/20260903140000_settings_nulls_not_distinct.sql +18 -18
- package/migrations/20260905120000_add_user_foreign_keys.sql +15 -0
- package/migrations/20260929120000_allow_user_only_role_scopes.sql +1 -1
- package/package.json +92 -92
|
@@ -1 +1 @@
|
|
|
1
|
-
import{listResources}from'./services/list-resources.js';import{listResourceAsUser}from'./services/list-resource-as-user.js';import{getResource}from'./services/get-resource.js';import{createResource}from'./services/create-resource.js';import{updateResource}from'./services/update-resource.js';import{deleteResource}from'./services/delete-resource.js';import{listResourceRelation}from'./services/list-resource-relation.js';function C(P,G){P=P-0x77;const j=m();let Z=j[P];return Z;}import{createResourceRelation}from'./services/create-resource-relation.js';import{updateResourceRelation}from'./services/update-resource-relation.js';import{deleteResourceRelation}from'./services/delete-resource-relation.js';import{searchResource}from'./services/search-resource.js';import{exportResource}from'./services/export-resource.js';import{suggestResource}from'./services/suggest-resource.js';import{listResourceList}from'./services/list-resource-list.js';function m(){const z=['get','fcore','Searches\x20records\x20in\x20a\x20registered\x20resource.','$resource:read','params','user','config','auth','Get\x20resource\x20schema','Returns\x20the\x20resource\x20variables\x20and\x20nested\x20relation\x20schema.','/api/resource/:resource/code','Generate\x20a\x20resource\x20code','query','/api/resource/:resource/scope/:user','Returns\x20resource\x20records\x20using\x20the\x20specified\x20user\x27s\x20permissions\x20and\x20access\x20scopes.\x20Admin\x20only.','system:access','/api/resource/:resource','$resource:create','Updates\x20a\x20record\x20in\x20a\x20registered\x20resource.','resourceId','post','/api/resource/:resource/:id/upload','resource','$resource:update','value','/api/resource/:resource/:id/file/:fid','Delete\x20resource\x20file','Deletes\x20a\x20file\x20linked\x20to\x20a\x20resource\x20record\x20after\x20validating\x20it\x20belongs\x20to\x20this\x20resource\x20and\x20record.','File\x20not\x20found\x20for\x20this\x20resource\x20and\x20record','rows','file_path','file','/api/resource/:resource/list','List\x20resource\x20items','Returns\x20resource\x20identifiers\x20and\x20display\x20text,\x20optionally\x20filtered\x20by\x20searchable\x20fields.','List\x20resource\x20relations','/api/resource/:resource/:id/:relation','body'];m=function(){return z;};return m();}import{getResourceSchema}from'./services/get-resource-schema.js';import{generateResourceCode}from'./services/generate-resource-code.js';import{resourceSchemas}from'./schema.js';import{uploadFile}from'../file/services/upload-file.js';const user=P=>P['user'];export function resourceRoutes(P){return async G=>{const H=C;G[H(0x77)]('/api/resource/:resource/search',{'schema':{'tags':[H(0x78),'resource'],'summary':'Search\x20resource','description':H(0x79),'access':'user','permissions':[H(0x7a)],'params':resourceSchemas['resource']}},async j=>searchResource({...j['query'],...j[H(0x7b)],'user':user(j)||P['config']?.['auth']?.['user']},P)),G[H(0x77)]('/api/suggest/:resource/:field',{'schema':{'tags':['fcore','resource'],'summary':'Suggest\x20resource\x20values','description':'Returns\x20suggested\x20values\x20for\x20a\x20resource\x20field.','access':H(0x7c),'permissions':['$resource:read'],'params':resourceSchemas['resourceField'],'querystring':resourceSchemas['suggestQuery']}},async j=>suggestResource({...j['query'],...j['params'],'user':user(j)||P[H(0x7d)]?.[H(0x7e)]?.['user']},P)),G['get']('/api/resource/:resource/export',{'schema':{'tags':['fcore','resource'],'summary':'Export\x20resource\x20records','description':'Exports\x20readable\x20records\x20from\x20a\x20registered\x20resource.','access':'user','permissions':[H(0x7a)],'params':resourceSchemas['exportResource'],'querystring':resourceSchemas['exportResourceQuery']}},async j=>exportResource({...j['query'],...j[H(0x7b)],'user':user(j)||P['config']?.['auth']?.['user']},P)),G['get']('/api/resource/:resource/schema',{'schema':{'tags':['fcore','resource'],'summary':H(0x7f),'description':H(0x80),'access':'user','permissions':[H(0x7a)],'params':resourceSchemas['resource']}},async j=>getResourceSchema(j[H(0x7b)],P)),G['get'](H(0x81),{'schema':{'tags':['fcore','resource'],'summary':H(0x82),'description':'Generates\x20a\x20code\x20from\x20an\x20explicit\x20template\x20or\x20a\x20field\x20code_template.','access':'user','permissions':[H(0x7a)],'params':resourceSchemas['resource'],'querystring':resourceSchemas['resourceCodeQuery']}},async j=>generateResourceCode({...j['params'],...j[H(0x83)]},P)),G['get'](H(0x84),{'schema':{'tags':['fcore','resource'],'summary':'List\x20resource\x20as\x20a\x20user\x20for\x20scope\x20testing','description':H(0x85),'access':'admin','permissions':[H(0x86)],'params':resourceSchemas['resourceScopeTarget']}},async j=>listResourceAsUser({...j['params'],...j[H(0x83)],'requester':user(j)},P)),G[H(0x77)](H(0x87),{'schema':{'tags':[H(0x78),'resource'],'summary':'List\x20resource\x20records','description':'Returns\x20records\x20from\x20a\x20registered\x20resource.','access':H(0x7c),'permissions':[H(0x7a)],'params':resourceSchemas['resource']}},async j=>listResources({...j['query'],...j['params'],'user':user(j)||P[H(0x7d)]?.['auth']?.['user']},P)),G['post']('/api/resource/:resource',{'schema':{'tags':['fcore','resource'],'summary':'Create\x20resource\x20record','description':'Creates\x20a\x20record\x20in\x20a\x20registered\x20resource.','access':H(0x7c),'permissions':[H(0x88)],'params':resourceSchemas['resource']}},async j=>createResource({...j['params'],'data':j['body'],'user':user(j)||P['config']?.['auth']?.[H(0x7c)]},P)),G['get']('/api/resource/:resource/:id',{'schema':{'tags':['fcore','resource'],'summary':'Get\x20resource\x20record','description':'Returns\x20one\x20record\x20from\x20a\x20registered\x20resource.','access':H(0x7c),'permissions':[H(0x7a)],'params':resourceSchemas['resourceId'],'querystring':resourceSchemas['resourceIncludeQuery']}},async j=>getResource({...j[H(0x83)],...j[H(0x7b)],'user':user(j)||P['config']?.['auth']?.['user']},P)),G['put']('/api/resource/:resource/:id',{'schema':{'tags':['fcore','resource'],'summary':'Update\x20resource\x20record','description':H(0x89),'access':H(0x7c),'permissions':['$resource:update'],'params':resourceSchemas[H(0x8a)]}},async j=>updateResource({...j['params'],'patch':j['body'],'user':user(j)||P['config']?.['auth']?.['user']},P)),G['delete']('/api/resource/:resource/:id',{'schema':{'tags':['fcore','resource'],'summary':'Delete\x20resource\x20record','description':'Deletes\x20a\x20record\x20from\x20a\x20registered\x20resource.','access':'user','permissions':['$resource:delete'],'params':resourceSchemas['resourceId']}},async j=>deleteResource({...j['params'],'user':user(j)||P['config']?.[H(0x7e)]?.['user']},P)),G[H(0x8b)](H(0x8c),{'schema':{'tags':['fcore',H(0x8d)],'summary':'Upload\x20resource\x20file','description':'Uploads\x20a\x20file\x20to\x20a\x20Resource\x20record\x20and\x20stores\x20its\x20metadata.','access':'user','permissions':[H(0x8e)],'params':resourceSchemas['uploadResourceFile']}},async j=>{const b=H,Z=await j['file']();if(!Z)throw new Error('File\x20is\x20required');const q=j['params'][b(0x8d)],p=j[b(0x7b)]['id'];return uploadFile({'file':Z,'metadata':{'name':Z['filename'],'path':Z['fields']['path']?.[b(0x8f)],'resource':q,'resourceId':p},'user':j[b(0x7c)]},P);}),G['delete'](H(0x90),{'schema':{'tags':['fcore','resource'],'summary':H(0x91),'description':H(0x92),'access':'user','permissions':['$resource:update'],'params':resourceSchemas['resourceIdFileId']}},async j=>{const E=H,{resource:Z,id:q,fid:p}=j[E(0x7b)],X=await P['pg'][E(0x83)]('SELECT\x20file_path\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3\x20LIMIT\x201',[p,Z,String(q)]);if(!X['rowCount'])throw new Error(E(0x93));const F=X[E(0x94)][0x0]?.[E(0x95)],A=await P['pg']['query']('DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[p,Z,String(q)]);return await P[E(0x96)]['delete'](F),{'success':(A['rowCount']??0x0)>0x0,'resource':Z,'resourceId':q,'fileId':p};}),G[H(0x77)](H(0x97),{'schema':{'tags':['fcore',H(0x8d)],'summary':H(0x98),'description':H(0x99),'access':H(0x7c),'permissions':['$resource:read'],'params':resourceSchemas['resource'],'querystring':resourceSchemas['resourceListQuery']}},async j=>listResourceList({...j['params'],...j[H(0x83)],'user':user(j)||P['config']?.[H(0x7e)]?.['user']},P)),G[H(0x77)]('/api/resource/:resource/:id/:relation',{'schema':{'tags':['fcore','resource'],'summary':H(0x9a),'description':'Returns\x20related\x20records\x20for\x20a\x20resource\x20record.','access':'user','params':resourceSchemas['resourceIdRelation'],'permissions':[H(0x7a)]}},async j=>listResourceRelation({...j['query'],...j[H(0x7b)],'user':user(j)||P[H(0x7d)]?.['auth']?.[H(0x7c)]},P)),G['post'](H(0x9b),{'schema':{'tags':['fcore',H(0x8d)],'summary':'Create\x20resource\x20relation','description':'Creates\x20a\x20relation\x20for\x20a\x20resource\x20record.','access':'user','permissions':['$resource:create'],'params':resourceSchemas['resourceIdRelation']}},async j=>createResourceRelation({...j['params'],'data':j['body'],'user':user(j)||P['config']?.['auth']?.['user']},P)),G['delete']('/api/resource/:resource/:id/:relation/:relationId',{'schema':{'tags':['fcore','resource'],'summary':'Delete\x20resource\x20relation','description':'Deletes\x20a\x20relation\x20from\x20a\x20resource\x20record.','access':'user','permissions':['$resource:delete'],'params':resourceSchemas['resourceIdRelationId']}},async j=>deleteResourceRelation({...j[H(0x7b)],'user':user(j)||P[H(0x7d)]?.['auth']?.['user']},P)),G['put']('/api/resource/:resource/:id/:relation/:relationId',{'schema':{'tags':[H(0x78),H(0x8d)],'summary':'Update\x20resource\x20relation','description':'Updates\x20a\x20related\x20resource\x20record.','access':H(0x7c),'permissions':['$resource:update'],'params':resourceSchemas['resourceIdRelationId']}},async j=>updateResourceRelation({...j['params'],'data':j[H(0x9c)],'user':user(j)||P[H(0x7d)]?.['auth']?.[H(0x7c)]},P));};}
|
|
1
|
+
import{listResources}from'./services/list-resources.js';import{listResourceAsUser}from'./services/list-resource-as-user.js';import{getResource}from'./services/get-resource.js';function O(){const j=['fcore','Search\x20resource','resource','config','auth','get','/api/suggest/:resource/:field','$resource:read','params','exportResource','user','Get\x20resource\x20schema','/api/resource/:resource/code','resourceCodeQuery','query','Returns\x20resource\x20records\x20using\x20the\x20specified\x20user\x27s\x20permissions\x20and\x20access\x20scopes.\x20Admin\x20only.','admin','system:access','/api/resource/:resource/:id','Returns\x20one\x20record\x20from\x20a\x20registered\x20resource.','put','body','post','/api/resource/:resource/:id/upload','Upload\x20resource\x20file','Uploads\x20a\x20file\x20to\x20a\x20Resource\x20record\x20and\x20stores\x20its\x20metadata.','$resource:update','File\x20is\x20required','/api/resource/:resource/:id/file/:fid','Delete\x20resource\x20file','Deletes\x20a\x20file\x20linked\x20to\x20a\x20resource\x20record\x20after\x20validating\x20it\x20belongs\x20to\x20this\x20resource\x20and\x20record.','File\x20not\x20found\x20for\x20this\x20resource\x20and\x20record','delete','Returns\x20resource\x20identifiers\x20and\x20display\x20text,\x20optionally\x20filtered\x20by\x20searchable\x20fields.','List\x20resource\x20relations','/api/resource/:resource/:id/:relation','Create\x20resource\x20relation','resourceIdRelation','Deletes\x20a\x20relation\x20from\x20a\x20resource\x20record.','resourceIdRelationId'];O=function(){return j;};return O();}function c(S,Z){S=S-0x105;const h=O();let U=h[S];return U;}import{createResource}from'./services/create-resource.js';import{updateResource}from'./services/update-resource.js';import{deleteResource}from'./services/delete-resource.js';import{listResourceRelation}from'./services/list-resource-relation.js';import{createResourceRelation}from'./services/create-resource-relation.js';import{updateResourceRelation}from'./services/update-resource-relation.js';import{deleteResourceRelation}from'./services/delete-resource-relation.js';import{searchResource}from'./services/search-resource.js';import{exportResource}from'./services/export-resource.js';import{suggestResource}from'./services/suggest-resource.js';import{listResourceList}from'./services/list-resource-list.js';import{getResourceSchema}from'./services/get-resource-schema.js';import{generateResourceCode}from'./services/generate-resource-code.js';import{resourceSchemas}from'./schema.js';import{uploadFile}from'../file/services/upload-file.js';const user=S=>S['user'];export function resourceRoutes(S){return async Z=>{const n=c;Z['get']('/api/resource/:resource/search',{'schema':{'tags':[n(0x105),'resource'],'summary':n(0x106),'description':'Searches\x20records\x20in\x20a\x20registered\x20resource.','access':'user','permissions':['$resource:read'],'params':resourceSchemas[n(0x107)]}},async h=>searchResource({...h['query'],...h['params'],'user':user(h)||S[n(0x108)]?.[n(0x109)]?.['user']},S)),Z[n(0x10a)](n(0x10b),{'schema':{'tags':[n(0x105),'resource'],'summary':'Suggest\x20resource\x20values','description':'Returns\x20suggested\x20values\x20for\x20a\x20resource\x20field.','access':'user','permissions':[n(0x10c)],'params':resourceSchemas['resourceField'],'querystring':resourceSchemas['suggestQuery']}},async h=>suggestResource({...h['query'],...h[n(0x10d)],'user':user(h)||S['config']?.[n(0x109)]?.['user']},S)),Z['get']('/api/resource/:resource/export',{'schema':{'tags':['fcore',n(0x107)],'summary':'Export\x20resource\x20records','description':'Exports\x20readable\x20records\x20from\x20a\x20registered\x20resource.','access':'user','permissions':[n(0x10c)],'params':resourceSchemas[n(0x10e)],'querystring':resourceSchemas['exportResourceQuery']}},async h=>exportResource({...h['query'],...h['params'],'user':user(h)||S[n(0x108)]?.['auth']?.[n(0x10f)]},S)),Z[n(0x10a)]('/api/resource/:resource/schema',{'schema':{'tags':['fcore','resource'],'summary':n(0x110),'description':'Returns\x20the\x20resource\x20variables\x20and\x20nested\x20relation\x20schema.','access':n(0x10f),'permissions':[n(0x10c)],'params':resourceSchemas['resource']}},async h=>getResourceSchema(h[n(0x10d)],S)),Z['get'](n(0x111),{'schema':{'tags':['fcore','resource'],'summary':'Generate\x20a\x20resource\x20code','description':'Generates\x20a\x20code\x20from\x20an\x20explicit\x20template\x20or\x20a\x20field\x20code_template.','access':n(0x10f),'permissions':[n(0x10c)],'params':resourceSchemas['resource'],'querystring':resourceSchemas[n(0x112)]}},async h=>generateResourceCode({...h['params'],...h[n(0x113)]},S)),Z['get']('/api/resource/:resource/scope/:user',{'schema':{'tags':['fcore','resource'],'summary':'List\x20resource\x20as\x20a\x20user\x20for\x20scope\x20testing','description':n(0x114),'access':n(0x115),'permissions':[n(0x116)],'params':resourceSchemas['resourceScopeTarget']}},async h=>listResourceAsUser({...h[n(0x10d)],...h['query'],'requester':user(h)},S)),Z['get']('/api/resource/:resource',{'schema':{'tags':['fcore','resource'],'summary':'List\x20resource\x20records','description':'Returns\x20records\x20from\x20a\x20registered\x20resource.','access':'user','permissions':['$resource:read'],'params':resourceSchemas['resource']}},async h=>listResources({...h['query'],...h[n(0x10d)],'user':user(h)||S['config']?.[n(0x109)]?.['user']},S)),Z['post']('/api/resource/:resource',{'schema':{'tags':['fcore','resource'],'summary':'Create\x20resource\x20record','description':'Creates\x20a\x20record\x20in\x20a\x20registered\x20resource.','access':'user','permissions':['$resource:create'],'params':resourceSchemas['resource']}},async h=>createResource({...h['params'],'data':h['body'],'user':user(h)||S['config']?.['auth']?.['user']},S)),Z['get'](n(0x117),{'schema':{'tags':['fcore','resource'],'summary':'Get\x20resource\x20record','description':n(0x118),'access':'user','permissions':['$resource:read'],'params':resourceSchemas['resourceId'],'querystring':resourceSchemas['resourceIncludeQuery']}},async h=>getResource({...h['query'],...h[n(0x10d)],'user':user(h)||S[n(0x108)]?.[n(0x109)]?.['user']},S)),Z[n(0x119)]('/api/resource/:resource/:id',{'schema':{'tags':['fcore',n(0x107)],'summary':'Update\x20resource\x20record','description':'Updates\x20a\x20record\x20in\x20a\x20registered\x20resource.','access':'user','permissions':['$resource:update'],'params':resourceSchemas['resourceId']}},async h=>updateResource({...h['params'],'patch':h[n(0x11a)],'user':user(h)||S[n(0x108)]?.['auth']?.['user']},S)),Z['delete']('/api/resource/:resource/:id',{'schema':{'tags':['fcore','resource'],'summary':'Delete\x20resource\x20record','description':'Deletes\x20a\x20record\x20from\x20a\x20registered\x20resource.','access':'user','permissions':['$resource:delete'],'params':resourceSchemas['resourceId']}},async h=>deleteResource({...h['params'],'user':user(h)||S['config']?.['auth']?.['user']},S)),Z[n(0x11b)](n(0x11c),{'schema':{'tags':['fcore',n(0x107)],'summary':n(0x11d),'description':n(0x11e),'access':'user','permissions':[n(0x11f)],'params':resourceSchemas['uploadResourceFile']}},async h=>{const N=n,U=await h['file']();if(!U)throw new Error(N(0x120));const D=h['params']['resource'],u=h['params']['id'];return uploadFile({'file':U,'metadata':{'name':U['filename'],'path':U['fields']['path']?.['value'],'resource':D,'resourceId':u},'user':h[N(0x10f)]},S);}),Z['delete'](n(0x121),{'schema':{'tags':['fcore','resource'],'summary':n(0x122),'description':n(0x123),'access':n(0x10f),'permissions':['$resource:update'],'params':resourceSchemas['resourceIdFileId']}},async h=>{const o=n,{resource:U,id:D,fid:u}=h['params'],e=await S['pg']['query']('SELECT\x20file_path\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3\x20LIMIT\x201',[u,U,String(D)]);if(!e['rowCount'])throw new Error(o(0x124));const q=e['rows'][0x0]?.['file_path'],x=await S['pg']['query']('DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[u,U,String(D)]);return await S['file'][o(0x125)](q),{'success':(x['rowCount']??0x0)>0x0,'resource':U,'resourceId':D,'fileId':u};}),Z['get']('/api/resource/:resource/list',{'schema':{'tags':['fcore','resource'],'summary':'List\x20resource\x20items','description':n(0x126),'access':n(0x10f),'permissions':['$resource:read'],'params':resourceSchemas['resource'],'querystring':resourceSchemas['resourceListQuery']}},async h=>listResourceList({...h[n(0x10d)],...h['query'],'user':user(h)||S['config']?.['auth']?.['user']},S)),Z[n(0x10a)]('/api/resource/:resource/:id/:relation',{'schema':{'tags':['fcore',n(0x107)],'summary':n(0x127),'description':'Returns\x20related\x20records\x20for\x20a\x20resource\x20record.','access':'user','params':resourceSchemas['resourceIdRelation'],'permissions':[n(0x10c)]}},async h=>listResourceRelation({...h['query'],...h['params'],'user':user(h)||S['config']?.['auth']?.['user']},S)),Z['post'](n(0x128),{'schema':{'tags':[n(0x105),'resource'],'summary':n(0x129),'description':'Creates\x20a\x20relation\x20for\x20a\x20resource\x20record.','access':'user','permissions':['$resource:create'],'params':resourceSchemas[n(0x12a)]}},async h=>createResourceRelation({...h['params'],'data':h['body'],'user':user(h)||S['config']?.[n(0x109)]?.['user']},S)),Z[n(0x125)]('/api/resource/:resource/:id/:relation/:relationId',{'schema':{'tags':[n(0x105),'resource'],'summary':'Delete\x20resource\x20relation','description':n(0x12b),'access':'user','permissions':['$resource:delete'],'params':resourceSchemas[n(0x12c)]}},async h=>deleteResourceRelation({...h['params'],'user':user(h)||S['config']?.['auth']?.[n(0x10f)]},S)),Z['put']('/api/resource/:resource/:id/:relation/:relationId',{'schema':{'tags':['fcore','resource'],'summary':'Update\x20resource\x20relation','description':'Updates\x20a\x20related\x20resource\x20record.','access':n(0x10f),'permissions':['$resource:update'],'params':resourceSchemas[n(0x12c)]}},async h=>updateResourceRelation({...h['params'],'data':h['body'],'user':user(h)||S['config']?.['auth']?.[n(0x10f)]},S));};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const S=c;import{Type}from'@sinclair/typebox';function c(S,Z){S=S-0x12d;const h=O();let U=h[S];return U;}export const identifier=Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':'^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$'});function O(){const Z=['Object','Optional','String','Integer','Array'];O=function(){return Z;};return O();}export const resourceSchemas={'dictionaryName':Type['Object']({'name':identifier}),'resource':Type[S(0x12d)]({'resource':identifier}),'resourceScopeTarget':Type['Object']({'resource':identifier,'user':identifier}),'exportResource':Type[S(0x12d)]({'resource':identifier}),'resourceField':Type['Object']({'resource':identifier,'field':identifier}),'suggestQuery':Type['Object']({'q':Type[S(0x12e)](Type['String']()),'search':Type['Optional'](Type[S(0x12f)]()),'limit':Type['Optional'](Type['Integer']({'minimum':0x1,'maximum':0xc8}))}),'resourceListQuery':Type[S(0x12d)]({'search':Type[S(0x12e)](Type[S(0x12f)]()),'limit':Type[S(0x12e)](Type[S(0x130)]({'minimum':0x1,'maximum':0xc8}))}),'resourceCodeQuery':Type['Object']({'id':Type[S(0x12e)](Type['String']({'minLength':0x1,'maxLength':0x80})),'field':Type[S(0x12e)](identifier),'template':Type['Optional'](Type['String']({'maxLength':0x3e8}))}),'resourceId':Type['Object']({'resource':identifier,'id':identifier}),'resourceIncludeQuery':Type['Object']({'include':Type['Optional'](Type[S(0x12f)]({'minLength':0x1}))}),'resourceIdRelation':Type[S(0x12d)]({'resource':identifier,'id':identifier,'relation':identifier}),'resourceIdRelationId':Type['Object']({'resource':identifier,'id':identifier,'relation':identifier,'relationId':identifier}),'resourceIdFileId':Type['Object']({'resource':identifier,'id':identifier,'fid':identifier}),'uploadResourceFile':Type['Object']({'resource':identifier,'id':identifier}),'uploadResourceFileBody':Type['Object']({'file':Type['Any'](),'fileName':Type['String']({'minLength':0x1,'maxLength':0xff})}),'exportResourceQuery':Type[S(0x12d)]({'filter':Type['Optional'](Type['Record'](Type[S(0x12f)](),Type['Unknown']())),'sort':Type['Optional'](Type['Array'](Type['String']({'minLength':0x1}))),'search':Type['Optional'](Type['String']()),'scope':Type['Optional'](Type['String']()),'limit':Type[S(0x12e)](Type['Integer']({'minimum':0x1,'maximum':0xc8})),'offset':Type['Optional'](Type['Integer']({'minimum':0x0})),'fields':Type['Optional'](Type[S(0x131)](identifier))})};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function c(S,Z){S=S-0x145;const h=O();let U=h[S];return U;}export async function addNote(S,Z){const U=c,h=await Z['pg'][U(0x145)]('INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*',[S['resource'],String(S['id']),S['body']]);return h['rows'][0x0];}function O(){const D=['query'];O=function(){return D;};return O();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export async function addResourceFile(S,Z){const U=c,h=await Z['pg'][U(0x84)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*\x0a\x20\x20\x20\x20\x20\x20',[S['resource'],String(S['id']),S['filePath'],S[U(0x85)]??null]);return h[U(0x86)][0x0];}function c(S,Z){S=S-0x84;const h=O();let U=h[S];return U;}function O(){const D=['query','size','rows'];O=function(){return D;};return O();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function O(){const x=['createRelation'];O=function(){return x;};return O();}function c(S,Z){S=S-0x1b9;const h=O();let U=h[S];return U;}export async function createResourceRelation(S,Z){const q=c,{resource:h,id:U,relation:D,data:u,user:e}=S;return Z['resource'][q(0x1b9)]({'name':h,'id':U,'relation':D,'data':u,'user':e});}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function c(S,Z){S=S-0x179;var h=O();var U=h[S];return U;}export async function createResource(S,Z){var h=c;return Z[h(0x179)]['create']({'name':S['resource'],'data':S[h(0x17a)],'user':S['user']});}function O(){var U=['resource','data'];O=function(){return U;};return O();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export async function deleteResourceRelation(
|
|
1
|
+
export async function deleteResourceRelation(S,Z){const {resource:h,id:U,relation:D,relationId:u}=S;return Z['resource']['deleteRelation']({'name':h,'id':U,'relation':D,'relationId':u});}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function c(S,Z){S=S-0x165;var h=O();var U=h[S];return U;}function O(){var U=['resource','user'];O=function(){return U;};return O();}export async function deleteResource(S,Z){var h=c;return Z[h(0x165)]['delete']({'name':S['resource'],'id':S['id'],'user':S[h(0x166)]});}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function c(S,Z){S=S-0x1ba;const h=O();let U=h[S];return U;}function O(){const D=['sort','search'];O=function(){return D;};return O();}import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';export async function exportResource(S,Z){const U=c,h=await Z['resource']['find']({'name':S['resource'],'query':{'filter':parseFilterQuery(S),'sort':S[U(0x1ba)],'search':S[U(0x1bb)],'limit':S['limit'],'offset':S['offset'],'fields':S['fields']},'user':S['user']});return h['rows'];}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ValidationError}from'../../../errors.js';import{qi,qt}from'../../../plugins/resource/utils/sql.js';function
|
|
1
|
+
function c(S,Z){S=S-0x11f;const h=O();let U=h[S];return U;}import{ValidationError}from'../../../errors.js';import{qi,qt}from'../../../plugins/resource/utils/sql.js';function O(){const L=['split','length','resource','localKey','key','rows','column','getMonth','SELECT\x20count(*)::int\x20+\x201\x20AS\x20num,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20count(*)\x20FILTER\x20(WHERE\x20',')::int\x20+\x201\x20AS\x20mnum\x0a\x20\x20\x20\x20\x20\x20\x20FROM\x20','\x20t\x20','num','field','fields','where','\x0a\x20\x20\x20\x20\x20\x20\x20LIMIT\x201','matchAll','has','ynum','mnum','yyyy','getFullYear','slice','padStart','replace','name'];O=function(){return L;};return O();}function relationValue(S,Z,h){const U=Z['fields'][h]?.['column']??h;return S[U]??S[h];}async function resolvePath(S,Z,h,U){const Y=c,[D,...u]=S[Y(0x11f)]('.');if(!D)return undefined;const e=h['relations']?.[D];if(!e||!u[Y(0x120)]||!e['resource'])return relationValue(Z,h,S);const q=U['resource']['get'](e[Y(0x121)]),x=q['key'];let n,N;if(e[Y(0x122)])n=relationValue(Z,h,e['localKey']),N=x;else{if(e['foreignKey'])n=relationValue(Z,h,h[Y(0x123)]),N=e['foreignKey'];else return undefined;}if(n===null||n===undefined)return undefined;const o=q['fields'][N]?.['column']??N,j=await U['pg']['query']('SELECT\x20*\x20FROM\x20'+qt(q['table'])+'\x20t\x20WHERE\x20t.'+qi(o)+'\x20=\x20$1'+(e['where']?'\x20AND\x20('+e['where']+')':'')+'\x20LIMIT\x201',[n]),X=j[Y(0x124)][0x0];if(!X)return undefined;const i=u[0x0];if(!i)return undefined;if(u['length']===0x1)return relationValue(X,q,i);return resolvePath(u['join']('.'),X,q,U);}async function countValues(S,Z,h,U){const r=c,D=[],u=S['where']?['('+S['where']+')']:[];Z!==undefined&&(D['push'](Z),u['push']('t.'+qi(S['key'])+'\x20<>\x20$'+D[r(0x120)]));const e=u['length']?'WHERE\x20'+u['join']('\x20AND\x20'):'',q=S['fields']['created_at'],x=q?'t.'+qi(q[r(0x125)]??'created_at'):undefined,n=new Date(U['getFullYear'](),0x0,0x1),N=new Date(U['getFullYear'](),U[r(0x126)](),0x1);if(x){D['push'](n,N);const X='$'+(D['length']-0x1),i='$'+D['length'],l=await h['pg']['query'](r(0x127)+x+'\x20>=\x20'+X+')::int\x20+\x201\x20AS\x20ynum,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20count(*)\x20FILTER\x20(WHERE\x20'+x+'\x20>=\x20'+i+r(0x128)+qt(S['table'])+'\x20t\x20'+e,D),b=l[r(0x124)][0x0];return{'num':Number(b?.['num']??0x1),'ynum':Number(b?.['ynum']??0x1),'mnum':Number(b?.['mnum']??0x1)};}const o=await h['pg']['query']('SELECT\x20count(*)::int\x20+\x201\x20AS\x20num\x20FROM\x20'+qt(S['table'])+r(0x129)+e,D),j=Number(o['rows'][0x0]?.[r(0x12a)]??0x1);return{'num':j,'ynum':j,'mnum':j};}export async function generateResourceCode(S,Z){const E=c,h=Z['resource']['get'](S[E(0x121)]);if(S['field']&&!h['fields'][S['field']])throw new ValidationError('Unknown\x20resource\x20field:\x20'+S['field']);const U=S['template']??(S[E(0x12b)]?h[E(0x12c)][S[E(0x12b)]]?.['code_template']:undefined);if(!U)return{'resource':h['name'],...S['id']!==undefined?{'id':S['id']}:{},...S[E(0x12b)]?{'field':S['field']}:{},'template':null,'code':null};const D=new Date(),u=await countValues(h,S['id'],Z,D);let e={};if(S['id']!==undefined){const N=await Z['pg']['query']('SELECT\x20*\x20FROM\x20'+qt(h['table'])+'\x20t\x0a\x20\x20\x20\x20\x20\x20\x20WHERE\x20t.'+qi(h[E(0x123)])+'\x20=\x20$1'+(h['where']?'\x20AND\x20('+h[E(0x12d)]+')':'')+E(0x12e),[S['id']]);e=N[E(0x124)][0x0]??{};}const q=[...U[E(0x12f)](/\{([A-Za-z_][A-Za-z0-9_.]*)(?::(\d+))?\}/g)],x=new Map();for(const o of q){const j=o[0x1];if(!j||x[E(0x130)](o[0x0]))continue;const X=Number(o[0x2]??0x0);let i;switch(j){case E(0x12a):i=u['num'];break;case E(0x131):i=u['ynum'];break;case E(0x132):i=u[E(0x132)];break;case E(0x133):i=String(D[E(0x134)]());break;case'yy':i=String(D['getFullYear']())[E(0x135)](-0x2);break;case'mm':i=String(D['getMonth']()+0x1)['padStart'](0x2,'0');break;case'dd':i=String(D['getDate']())['padStart'](0x2,'0');break;case'resource':i=h['name'];break;case'resource_id':i=S['id'];break;default:i=S['id']===undefined?undefined:await resolvePath(j,e,h,Z);}if(i===null||i===undefined||i==='')throw new ValidationError('Cannot\x20resolve\x20code\x20template\x20variable:\x20{'+j+'}');const l=String(i);x['set'](o[0x0],X&&/^\d+$/['test'](l)?l[E(0x136)](X,'0'):l);}const n=U[E(0x137)](/\{([A-Za-z_][A-Za-z0-9_.]*)(?::(\d+))?\}/g,b=>x['get'](b)??b);return{'resource':h[E(0x138)],...S['id']!==undefined?{'id':S['id']}:{},...S['field']?{'field':S['field']}:{},'template':U,'code':n};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function variableType(
|
|
1
|
+
function O(){const Y=['integer','number','boolean','object','add','read','type','relations','resource','has','push'];O=function(){return Y;};return O();}function variableType(S){const i=c;switch(S){case'number':case i(0x1d0):return i(0x1d1);case i(0x1d2):return'boolean';case'json':case'geometry':case'geom':return i(0x1d3);default:return'string';}}function c(S,Z){S=S-0x1d0;const h=O();let U=h[S];return U;}function buildVariables(S,Z,h='',U=new Set()){const l=c,D=new Set(U)[l(0x1d4)](S['name']),u=[];for(const [e,q]of Object['entries'](S['fields'])){if(q[l(0x1d5)]===![]||q['readable']===![])continue;u['push']({'key':e,'path':h?h+'.'+e:e,'type':variableType(q[l(0x1d6)])});}for(const [x,n]of Object['entries'](S[l(0x1d7)]??{})){if(!n[l(0x1d8)]||!Z['resource']['has'](n[l(0x1d8)]))continue;const N=Z['resource']['get'](n[l(0x1d8)]),o=h?h+'.'+x:x,j=n[l(0x1d6)]==='many',X={'key':x,'path':o,'type':j?'array':'object','resource':n['resource'],'variables':D[l(0x1d9)](N['name'])?[]:buildVariables(N,Z,o,D)};u[l(0x1da)](X);}return u;}export function getResourceSchema(S,Z){const b=c,h=Z['resource']['get'](S[b(0x1d8)]);return{'resource':h['name'],...h['title']?{'title':h['title']}:{},'variables':buildVariables(h,Z)};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export async function getResource(
|
|
1
|
+
function O(){var U=['findOne','resource','include','user'];O=function(){return U;};return O();}function c(S,Z){S=S-0x1a5;var h=O();var U=h[S];return U;}export async function getResource(S,Z){var h=c;return Z['resource'][h(0x1a5)]({'name':S[h(0x1a6)],'id':S['id'],'query':{'include':S[h(0x1a7)]},'user':S[h(0x1a8)]});}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{ForbiddenError,NotFoundError}from'../../../errors.js';import{getUserPermissions}from'../../../plugins/auth/get-user-permissions.js';import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function c(S,Z){S=S-0x13f;const h=O();let U=h[S];return U;}import{getUserResourceScopes}from'../../../plugins/resource/utils/scope.js';function O(){const x=['type','uid','find','search','page','max','resource'];O=function(){return x;};return O();}export async function listResourceAsUser(S,Z){const q=c;if(S['requester']?.[q(0x13f)]!=='admin')throw new ForbiddenError('Only\x20admins\x20can\x20test\x20resource\x20scopes\x20for\x20another\x20user');const h=await Z['pg']['query']('SELECT\x20uid,\x20user_type\x20AS\x20type\x20FROM\x20admin.users\x20WHERE\x20uid\x20=\x20$1\x20OR\x20login\x20=\x20$1\x20LIMIT\x201',[S['user']]),U=h['rows'][0x0];if(!U)throw new NotFoundError('User\x20not\x20found:\x20'+S['user']);const D={'id':U[q(0x140)],'type':U['type'],'permissions':await getUserPermissions(U['uid'],Z)},[u,e]=await Promise['all']([Z['resource'][q(0x141)]({'name':S['resource'],'query':{'filter':parseFilterQuery(S),'sort':S['sort'],'search':S[q(0x142)],'include':S['include'],'scope':S['scope'],'limit':S['limit'],'offset':S['offset']??(S[q(0x143)]?Math[q(0x144)](Number(S['page'])-0x1,0x0):0x0)*Number(S['limit']??0x14)},'user':D}),getUserResourceScopes(D['id'],S[q(0x145)],Z['pg'])]);return{...u,'scopes':e};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ValidationError}from'../../../errors.js';import{assertOperation}from'../../../plugins/resource/utils/permissions.js';
|
|
1
|
+
import{ValidationError}from'../../../errors.js';import{assertOperation}from'../../../plugins/resource/utils/permissions.js';import{quoteIdentifier,quoteTable}from'../../../plugins/resource/utils/sql.js';function columnExpression(S,Z){const l=c;if(Z!==S['key']&&!S[l(0x110)][Z])throw new ValidationError(l(0x111)+Z);const h=S[l(0x110)][Z]?.['column']??Z;return h['split']('.')['map'](U=>quoteIdentifier(U))['join']('.');}function displayExpression(S){const b=c,Z=S['display'];if(!Z||Array[b(0x112)](Z)&&Z[b(0x113)]===0x0)throw new ValidationError(b(0x114)+S[b(0x115)]);if(Array[b(0x112)](Z))return b(0x116)+Z['map'](u=>'COALESCE('+columnExpression(S,u)+b(0x117))['join'](',\x20')+')';const h=[],U=/\{([^{}]+)\}/g;let D=0x0;for(const u of Z['matchAll'](U)){const e=u['index']??0x0,q=u[0x1];if(!q)throw new ValidationError('Invalid\x20display\x20template\x20for\x20resource:\x20'+S['name']);e>D&&h['push']('\x27'+Z[b(0x118)](D,e)['replace'](/'/g,'\x27\x27')+'\x27'),h['push'](b(0x119)+columnExpression(S,q)+'::text,\x20\x27\x27)'),D=e+u[0x0]['length'];}D<Z['length']&&h['push']('\x27'+Z['slice'](D)['replace'](/'/g,'\x27\x27')+'\x27');if(h['length']===0x0)throw new ValidationError('Invalid\x20display\x20template\x20for\x20resource:\x20'+S['name']);return'concat('+h['join'](',\x20')+')';}function c(S,Z){S=S-0x110;const h=O();let U=h[S];return U;}export async function listResourceList(S,Z){const Y=c,h=Date['now'](),U=Z['resource'][Y(0x11a)](S['resource']);assertOperation(U,'read',S['user']);const D=S[Y(0x11b)]??'',u=Math['min'](Math[Y(0x11c)](Number(S['limit']??0x14),0x1),0xc8),e=U['searchable']??Object['entries'](U[Y(0x110)])[Y(0x11d)](([,X])=>X[Y(0x11e)])[Y(0x11f)](([X])=>X);if(D&&e['length']===0x0)throw new ValidationError('Resource\x20has\x20no\x20searchable\x20fields:\x20'+U['name']);const q=displayExpression(U),x=[],n=[];if(U['where'])x[Y(0x120)]('('+U['where']+')');if(D){const X=e['map'](i=>columnExpression(U,i)+'::text\x20ILIKE\x20$1');x[Y(0x120)]('('+X['join'](Y(0x121))+')'),n['push']('%'+D+'%');}n['push'](u);const N=x['length']?'WHERE\x20'+x['join'](Y(0x122)):'',o=U['joins']?.[Y(0x11f)](i=>i['sql'])['join']('\x20')??'',j=await Z['pg']['query']('SELECT\x20'+quoteIdentifier(U[Y(0x123)])+'\x20AS\x20id,\x20'+q+'\x20AS\x20text\x0a\x20\x20\x20\x20\x20FROM\x20'+quoteTable(U['table'])+'\x20t\x20'+o+'\x0a\x20\x20\x20\x20\x20'+N+Y(0x124)+n['length'],n);return{'search':D,'limit':u,'count':j['rows']['length'],'time':Date[Y(0x125)]()-h,'data':j['rows']};}function O(){const r=['fields','Unknown\x20display/search\x20field:\x20','isArray','length','Resource\x20has\x20no\x20display\x20fields:\x20','name','concat_ws(\x27\x20\x27,\x20','::text,\x20\x27\x27)','slice','COALESCE(','get','search','max','filter','searchable','map','push','\x20OR\x20','\x20AND\x20','key','\x0a\x20\x20\x20\x20\x20LIMIT\x20$','now'];O=function(){return r;};return O();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export async function listResourceRelation(
|
|
1
|
+
export async function listResourceRelation(S,Z){const {resource:h,id:U,relation:D,query:u,user:e}=S;return Z['resource']['findRelation']({'name':h,'id':U,'relation':D,'query':u,'user':e});}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function
|
|
1
|
+
import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function c(S,Z){S=S-0x120;const h=O();let U=h[S];return U;}export async function listResources(S,Z){const U=c,h=S[U(0x120)];return Z['resource']['find']({'name':S['resource'],'query':{'filter':parseFilterQuery(S),'sort':S['sort'],'search':S['search'],'include':S['include'],'scope':S['scope'],'limit':S['limit'],'offset':S['offset']??(S[U(0x121)]?Math['max'](S['page']-0x1,0x0):0x0)*(S['limit']??0x14)},'user':h});}function O(){const D=['user','page'];O=function(){return D;};return O();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function c(S,Z){S=S-0x1d8;var h=O();var U=h[S];return U;}export async function searchResource(S,Z){var h=c;return Z['resource']['find']({'name':S['resource'],'query':{...S,'filter':parseFilterQuery(S)},'user':S[h(0x1d8)]});}function O(){var U=['user'];O=function(){return U;};return O();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ValidationError}from'../../../errors.js';import{autoIndex}from'../../../plugins/resource/utils/auto-index.js';
|
|
1
|
+
function c(S,Z){S=S-0x178;const h=O();let U=h[S];return U;}import{ValidationError}from'../../../errors.js';import{autoIndex}from'../../../plugins/resource/utils/auto-index.js';export async function suggestResource(S,Z){const l=c,h=Z[l(0x178)]['get'](S['resource']),U=String(S['search']??S['q']??'')[l(0x179)](),D=Math[l(0x17a)](Math['max'](Number(S[l(0x17b)]??0x14),0x1),0xc8),u=Date[l(0x17c)](),e=h['fields'][S[l(0x17d)]],q=e?.['dictionary'],x=e?.[l(0x17e)]?.['table'];if(x){const o=e['lookup']?.['text']??'name',j=e[l(0x17e)]?.['value']??'id';autoIndex(x,o,'text',Z['pg']);const X=await Z['pg']['query']('SELECT\x20'+j+'\x20as\x20id,\x20'+o+l(0x17f)+x+'\x20WHERE\x20lower('+o+l(0x180),[''+U['toLowerCase'](),D])['then'](i=>i['rows']);return{'limit':D,'count':X['length'],'search':U,'time':Date['now']()-u,'data':X};}if(!q)throw new ValidationError(l(0x181)+S[l(0x17d)]);const n=await Z['dictionary']['get'](q),N=n['filter'](i=>!U||i['code'][l(0x182)](U)||i['name']['startsWith'](U))['slice'](0x0,D)['map'](i=>({'id':i['code']||i['id'],'text':i[l(0x183)]||i['text']}));return{'search':U,'limit':D,'count':N['length'],'time':Date[l(0x17c)]()-u,'data':N};}function O(){const b=['resource','toLowerCase','min','limit','now','field','lookup','\x20as\x20text\x20FROM\x20',')\x20~\x20$1\x20LIMIT\x20$2','Field\x20has\x20no\x20lookup\x20dictionary:\x20','startsWith','name'];O=function(){return b;};return O();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export async function updateResourceRelation(S,Z){const {resource:h,id:U,relation:D,relationId:u,data:e,user:q}=S;return Z['resource']['updateRelation']({'name':h,'id':U,'relation':D,'relationId':u,'data':e,'user':q});}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function c(S,Z){S=S-0x1db;var h=O();var U=h[S];return U;}export async function updateResource(S,Z){var h=c;return Z[h(0x1db)][h(0x1dc)]({'name':S[h(0x1db)],'id':S['id'],'data':S[h(0x1dd)],'user':S[h(0x1de)]});}function O(){var U=['resource','update','patch','user'];O=function(){return U;};return O();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ForbiddenError,NotFoundError,ValidationError}from'../../../errors.js';export async function uploadResourceFile(
|
|
1
|
+
function O(){const q=['get','admin','type','user','isBuffer','File\x20is\x20required','fileName','File\x20name\x20is\x20required','files/','put','file','Uploaded\x20file\x20not\x20found','rows'];O=function(){return q;};return O();}function c(S,Z){S=S-0x114;const h=O();let U=h[S];return U;}import{ForbiddenError,NotFoundError,ValidationError}from'../../../errors.js';export async function uploadResourceFile(S,Z){const e=c,h=Z['resource'][e(0x114)](S['resource']);if(h['access']===e(0x115)&&S['user']?.[e(0x116)]!==e(0x115))throw new ForbiddenError('Admin\x20access\x20required');if(S['user']?.['type']!==e(0x115)&&!S[e(0x117)]?.['permissions']?.['includes']((h['permission']??h['name'])+':update'))throw new ForbiddenError('Missing\x20permission:\x20'+(h['permission']??h['name'])+':update');if(!Buffer[e(0x118)](S['file'])||S['file']['length']===0x0)throw new ValidationError(e(0x119));const U=S[e(0x11a)]['replace'](/[^A-Za-z0-9._-]/g,'_');if(!U)throw new ValidationError(e(0x11b));const D=e(0x11c)+S['resource']+'/'+String(S['id'])+'/'+U;await Z['file'][e(0x11d)](D,S[e(0x11e)]);if(!await Z['file']['exists'](D))throw new NotFoundError(e(0x11f));const u=await Z['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*\x0a\x20\x20\x20\x20',[S['resource'],String(S['id']),D,S['file']['length']]);return u[e(0x120)][0x0];}
|
|
@@ -1 +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';import{getDictionary}from'./services/get-dictionary.js';import{updateDictionary}from'./services/update-dictionary.js';import{getAccess}from'./services/get-access.js';import{getResourceAccess}from'./services/get-resource-access.js';function O(){const N=['/api/dictionary/:name','fcore','user','dictionaryName','params','Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','dictionaryItems','body','resourceScope','system','/api/access/resource/:resource','admin','system:access','post','Set\x20user\x20access\x20for\x20a\x20resource','/api/access/:type/:id','Replaces\x20direct\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','Update\x20system\x20settings','Updates\x20system\x20settings\x20using\x20flat\x20dot-notation\x20keys.','system:settings','Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','/api/system/audit','get','Checks\x20the\x20availability\x20of\x20system\x20dependencies.','/api/system/list'];O=function(){return N;};return O();}import{setAccess}from'./services/set-access.js';import{setResourceAccess}from'./services/set-resource-access.js';function c(S,Z){S=S-0x75;const h=O();let U=h[S];return U;}import{getResourceScopes}from'./services/get-resource-scopes.js';import{setResourceScopes}from'./services/set-resource-scopes.js';import{systemSchemas}from'./schema.js';const u=S=>S['user'];export function systemRoutes(S,Z=new Map()){return async h=>{const n=c;h['get'](n(0x75),{'schema':{'tags':[n(0x76),'system'],'summary':'Get\x20platform\x20dictionary','description':'Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','access':n(0x77),'permissions':['system:dictionaries'],'params':systemSchemas[n(0x78)]}},async D=>({'items':await getDictionary({...D[n(0x79)],'user':u(D)},S)})),h['post']('/api/dictionary/:name',{'schema':{'tags':['fcore','system'],'summary':'Update\x20platform\x20dictionary','description':n(0x7a),'access':'user','permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName'],'body':systemSchemas[n(0x7b)]}},async D=>updateDictionary({...D['params'],...D[n(0x7c)],'user':u(D)},S));const U=async D=>getAccess({...D['params'],'user':u(D)},S);h['get']('/api/access/scope/:resource',{'schema':{'tags':[n(0x76),'system'],'summary':'Get\x20resource\x20access\x20scopes','description':'Returns\x20user-specific\x20and\x20role-level\x20scopes\x20for\x20a\x20resource.','access':'admin','permissions':['system:access'],'params':systemSchemas[n(0x7d)]}},async D=>getResourceScopes(D[n(0x79)],S)),h['post']('/api/access/scope/:resource',{'schema':{'tags':['fcore',n(0x7e)],'summary':'Set\x20resource\x20access\x20scopes','description':'Replaces\x20scopes\x20for\x20a\x20role,\x20optionally\x20for\x20a\x20specific\x20user.','access':'admin','permissions':['system:access'],'params':systemSchemas['resourceScope'],'body':systemSchemas['resourceScopeBody']}},async D=>setResourceScopes({...D[n(0x79)],...D['body'],'user':u(D)},S)),h['get'](n(0x7f),{'schema':{'tags':[n(0x76),n(0x7e)],'summary':'Get\x20user\x20access\x20for\x20a\x20resource','description':'Returns\x20direct\x20user\x20access\x20rules\x20for\x20the\x20specified\x20resource.','access':n(0x80),'permissions':[n(0x81)],'params':systemSchemas['accessResourceParams']}},async D=>getResourceAccess(D['params'],S)),h[n(0x82)]('/api/access/resource/:resource',{'schema':{'tags':['fcore',n(0x7e)],'summary':n(0x83),'description':'Replaces\x20direct\x20user\x20access\x20rules\x20for\x20the\x20specified\x20resource.','access':'admin','permissions':['system:access'],'params':systemSchemas['accessResourceParams'],'body':systemSchemas['resourceAccess']}},async D=>setResourceAccess({...D['params'],...D['body'],'user':u(D)},S)),h['get']('/api/access/:type/:id',{'schema':{'tags':['fcore',n(0x7e)],'summary':'Get\x20access\x20rules','description':'Returns\x20direct\x20and\x20role-based\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':['system:access'],'params':systemSchemas['accessTarget']}},U),h['post'](n(0x84),{'schema':{'tags':[n(0x76),n(0x7e)],'summary':'Set\x20access\x20rules','description':n(0x85),'access':n(0x80),'permissions':['system:access'],'params':systemSchemas['accessTarget'],'body':systemSchemas['access']}},async D=>setAccess({...D[n(0x79)],...D[n(0x7c)],'user':u(D)},S)),h['get']('/api/system/settings',{'schema':{'tags':['fcore',n(0x7e)],'summary':'Get\x20system\x20settings','description':'Returns\x20system\x20settings\x20as\x20nested\x20JSON.','access':'admin','permissions':['system:settings']}},async D=>getSystemSettings({...D[n(0x79)],'user':u(D)},S)),h[n(0x82)]('/api/system/settings',{'schema':{'tags':['fcore',n(0x7e)],'summary':n(0x86),'description':n(0x87),'access':'admin','permissions':[n(0x88)],'body':systemSchemas['settings']}},async D=>updateSystemSettings({...D['params'],'patch':D['body'],'user':u(D)},S)),h['get']('/api/system/logger',{'schema':{'tags':['fcore',n(0x7e)],'summary':'Get\x20system\x20log','description':n(0x89),'access':n(0x77),'permissions':['system:logs'],'querystring':systemSchemas['logger']}},async(D,e)=>{const {contentType:q,body:x}=await getSystemLog({...D['query'],'user':u(D)},S);return e['type'](q)['send'](x);}),h['get'](n(0x8a),{'schema':{'tags':['fcore','system'],'summary':'Get\x20audit\x20log','description':'Returns\x20the\x20system\x20audit\x20log\x20entries.','access':'user','permissions':['system:audit']}},async D=>getAuditLog({...D['query'],'user':u(D)},S)),h[n(0x8b)]('/api/system/check',{'schema':{'tags':['fcore',n(0x7e)],'summary':'Check\x20system\x20health','description':n(0x8c),'access':n(0x77),'permissions':['system:check']}},async D=>checkSystem({'user':u(D)},S)),h['get'](n(0x8d),{'schema':{'tags':['fcore','system'],'summary':'List\x20APIs','description':'Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','access':'admin','permissions':[],'querystring':systemSchemas['apiListQuery']}},async D=>getApiList({'user':u(D),'apiRoutes':Z,...D['query']},S));};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
function c(S,Z){S=S-0x7f;const h=O();let U=h[S];return U;}const S=c;import{Type}from'@sinclair/typebox';function O(){const Z=['String','Object','Optional','Union','Number','Unknown','Null','Array','short','Record','^[A-Za-z0-9_.\x5c-/]*$'];O=function(){return Z;};return O();}export const identifier=Type[S(0x7f)]({'minLength':0x1,'maxLength':0x80,'pattern':'^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$'});export const systemSchemas={'dictionaryName':Type['Object']({'name':identifier}),'dictionaryItems':Type[S(0x80)]({'items':Type['Array'](Type['Object']({'id':Type[S(0x81)](Type[S(0x82)]([Type['String'](),Type[S(0x83)]()])),'code':Type['String']({'minLength':0x1}),'name':Type[S(0x7f)]({'minLength':0x1}),'parentId':Type['Optional'](Type['Union']([Type['String'](),Type['Number'](),Type['Null']()]))},{'additionalProperties':!![]}))}),'accessTarget':Type['Object']({'type':Type[S(0x82)]([Type['Literal']('user'),Type['Literal']('role')]),'id':identifier}),'accessResourceParams':Type[S(0x80)]({'resource':identifier}),'resourceScope':Type['Object']({'resource':identifier}),'resourceScopeBody':Type[S(0x80)]({'user_id':Type['Optional'](identifier),'role_id':Type['Optional'](identifier),'scopes':Type['Record'](identifier,Type[S(0x82)]([Type['Array'](Type[S(0x84)]()),Type[S(0x7f)](),Type['Number'](),Type['Boolean'](),Type[S(0x85)]()]))}),'resourceAccess':Type['Object']({'users':Type['Optional'](Type[S(0x86)](Type[S(0x80)]({'uid':identifier,'actions':Type['Array'](Type['String']({'minLength':0x1,'maxLength':0x80}))}))),'roles':Type[S(0x81)](Type['Array'](Type[S(0x80)]({'role_id':identifier,'actions':Type['Array'](Type['String']({'minLength':0x1,'maxLength':0x80}))})))},{'minProperties':0x1}),'access':Type['Object']({'roles':Type['Optional'](Type['Array'](identifier)),'permissions':Type['Optional'](Type['Array'](Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':'^[A-Za-z0-9_-]+(?::[A-Za-z0-9_-]+)?$'}))),'access':Type['Optional'](Type['Array'](Type['Object']({'resource':Type['String']({'minLength':0x1,'maxLength':0x80}),'actions':Type[S(0x86)](Type['String']({'minLength':0x1,'maxLength':0x80}),{'minItems':0x1})})))}),'apiListQuery':Type['Object']({'format':Type['Optional'](Type[S(0x82)]([Type['Literal'](S(0x87)),Type['Literal']('extended')]))}),'settingsEntity':Type[S(0x80)]({'entity':Type[S(0x81)](identifier)}),'settings':Type[S(0x88)](Type[S(0x7f)]({'minLength':0x1}),Type[S(0x84)]()),'logger':Type[S(0x80)]({'path':Type[S(0x81)](Type['String']({'maxLength':0x100,'pattern':S(0x89)}))})};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export async function checkSystem(
|
|
1
|
+
export async function checkSystem(S,Z){const D=c,[h,U]=await Promise['allSettled']([Z['pg']['query']('SELECT\x201'),Z['redis']['ping']()]);return{'status':h[D(0x1b4)]==='fulfilled'&&U['status']==='fulfilled'?'ok':'degraded','pg':h[D(0x1b4)],'redis':U[D(0x1b4)]};}function c(S,Z){S=S-0x1b4;const h=O();let U=h[S];return U;}function O(){const u=['status'];O=function(){return u;};return O();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export async function getAccess(
|
|
1
|
+
export async function getAccess(S,Z){const e=c,h=S['type']==='user'?'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20ur.role_id\x20=\x20ra.role_id\x20AND\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20':e(0x103),U=await Z['pg'][e(0x104)](h,[S['id']]),D=[...new Set(U[e(0x105)]['map'](u=>u['resource'])['filter'](u=>u!==null))];return{'access':U['rows'],'resources':D};}function c(S,Z){S=S-0x103;const h=O();let U=h[S];return U;}function O(){const q=['\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.role_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20','query','rows'];O=function(){return q;};return O();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export async function getApiList(S,Z){const q=c,h=[...S['apiRoutes']['values']()]['sort']((U,D)=>(U['endpoint']+'\x20'+U[q(0x106)])['localeCompare'](D['endpoint']+'\x20'+D['method']));if(S[q(0x107)]!=='short')return h;return h['map'](({method:U,endpoint:D,access:u,permissions:e})=>U+'\x20'+D);}function c(S,Z){S=S-0x106;const h=O();let U=h[S];return U;}function O(){const x=['method','format'];O=function(){return x;};return O();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export async function getAuditLog(
|
|
1
|
+
function O(){const e=['max'];O=function(){return e;};return O();}function c(S,Z){S=S-0xda;const h=O();let U=h[S];return U;}export async function getAuditLog(S,Z){const u=c,h=Math['min'](Math[u(0xda)](S['limit']??0x32,0x1),0xc8),U=Math['max']((S['page']??0x1)-0x1,0x0)*h,D=await Z['pg']['query']('SELECT\x0a\x20\x20\x20\x20\x20\x20l.*,\x0a\x20\x20\x20\x20\x20\x20case\x20when\x20u.first_name\x20is\x20not\x20null\x20then\x20coalesce(u.last_name,\x27\x27)||coalesce(\x27\x20\x27||u.first_name,\x27\x27)\x20else\x20coalesce(u.login,\x20u.email,\x27\x27)\x20end\x20as\x20user_id_text\x0a\x20\x20\x20\x20FROM\x20admin.audit_log\x20l\x0a\x20\x20\x20\x20JOIN\x20admin.users\x20u\x20ON\x20l.user_id=u.uid\x0a\x20\x20\x20\x20ORDER\x20BY\x20id\x20DESC\x20LIMIT\x20$1\x20OFFSET\x20$2',[h,U]);return{'rows':D['rows'],'page':S['page']??0x1,'limit':h};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export async function getDictionary(
|
|
1
|
+
function c(S,Z){S=S-0x1c1;var h=O();var U=h[S];return U;}function O(){var U=['dictionary'];O=function(){return U;};return O();}export async function getDictionary(S,Z){var h=c;return Z[h(0x1c1)]['get'](S['name']);}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export async function getResourceAccess(S,Z){const Y=c,[h,U,D]=await Promise['all']([Z['pg']['query']('SELECT\x20\x27user\x27::text\x20AS\x20type,\x20user_uid\x20AS\x20uid,\x20actions\x0a\x20\x20\x20\x20\x20FROM\x20admin.role_access\x0a\x20\x20\x20\x20\x20WHERE\x20resource\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NOT\x20NULL\x20AND\x20role_id\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20ORDER\x20BY\x20user_uid',[S['resource']]),Z['pg']['query'](Y(0x197),[S['resource']]),Z['pg']['query']('SELECT\x20user_id,\x20role_id,\x20scope,\x20value\x0a\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access_scope\x0a\x20\x20\x20\x20\x20\x20\x20WHERE\x20resource\x20=\x20$1\x20AND\x20enabled\x20=\x20TRUE',[S['resource']])]),u=new Map(),e=new Map();for(const n of D[Y(0x198)]){if(n['user_id']!==null){const N=u['get'](n['user_id'])??{};N[n[Y(0x199)]]=n[Y(0x19a)],u['set'](n[Y(0x19b)],N);}else{if(n['role_id']!==null){const o=e['get'](n[Y(0x19c)])??{};o[n['scope']]=n[Y(0x19a)],e[Y(0x19d)](n['role_id'],o);}}}const q=h[Y(0x198)][Y(0x19e)](j=>({...j,...u['has'](j[Y(0x19f)])?{'scopes':u['get'](j['uid'])}:{}}));for(const [j,X]of u){!q[Y(0x1a0)](i=>i['uid']===j)&&q['push']({'type':Y(0x1a1),'uid':j,'actions':[],'scopes':X});}const x=U[Y(0x198)]['map'](i=>({...i,...e[Y(0x1a2)](i['role_id'])?{'scopes':e['get'](i['role_id'])}:{}}));for(const [i,l]of e){!x[Y(0x1a0)](b=>b[Y(0x19c)]===i)&&x['push']({'type':'role','role_id':i,'name':null,'actions':[],'users_count':0x0,'scopes':l});}return{'resource':S[Y(0x1a3)],'users':q,'roles':x};}function c(S,Z){S=S-0x197;const h=O();let U=h[S];return U;}function O(){const r=['SELECT\x20\x27role\x27::text\x20AS\x20type,\x20ra.role_id,\x20r.name,\x20ra.actions,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20count(DISTINCT\x20ur.user_uid)::int\x20AS\x20users_count\x0a\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.roles\x20r\x20ON\x20r.role_id\x20=\x20ra.role_id\x0a\x20\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\x20\x20WHERE\x20ra.resource\x20=\x20$1\x20AND\x20ra.role_id\x20IS\x20NOT\x20NULL\x20AND\x20ra.user_uid\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20\x20\x20GROUP\x20BY\x20ra.role_id,\x20r.name,\x20ra.actions\x0a\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20r.name,\x20ra.role_id','rows','scope','value','user_id','role_id','set','map','uid','some','user','has','resource'];O=function(){return r;};return O();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export async function getResourceScopes(S,Z){const n=c,{rows:h}=await Z['pg'][n(0x15b)](n(0x15c),[S['resource']]),U=new Map(),D=new Map();for(const u of h){if(u[n(0x15d)]!==null){const e=u['user_id']+':'+(u['role_id']??''),q=U['get'](e)??{'user_id':u[n(0x15d)],'role_id':u['role_id'],'scopes':{}};q['scopes'][u[n(0x15e)]]=u['value'],U[n(0x15f)](e,q);continue;}if(u['role_id']!==null){const x=D[n(0x160)](u['role_id'])??{'role_id':u['role_id'],'scopes':{}};x['scopes'][u[n(0x15e)]]=u[n(0x161)],D['set'](u['role_id'],x);}}return{'resource':S['resource'],'users':[...U['values']()],'roles':[...D[n(0x162)]()]};}function c(S,Z){S=S-0x15b;const h=O();let U=h[S];return U;}function O(){const N=['query','SELECT\x20user_id,\x20role_id,\x20scope,\x20value\x0a\x20\x20\x20\x20\x20FROM\x20admin.role_access_scope\x0a\x20\x20\x20\x20\x20WHERE\x20resource\x20=\x20$1\x20AND\x20enabled\x20=\x20TRUE\x0a\x20\x20\x20\x20\x20ORDER\x20BY\x20role_id,\x20user_id\x20NULLS\x20FIRST,\x20scope','user_id','scope','set','get','value','values'];O=function(){return N;};return O();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
const i=c;import S from'node:fs/promises';import Z from'node:path';import{NotFoundError,ValidationError}from'../../../errors.js';const LOGS_ROOT=Z['resolve'](process[i(0x1f0)](),'logs'),TAIL_LINES=0x64;function c(S,Z){S=S-0x1f0;const h=O();let U=h[S];return U;}function O(){const k=['cwd','Invalid\x20log\x20path','all','directory','sort','name','split','join','unshift','?path=','logs/','replace','<','>','"','open','alloc','min','utf8','length'];O=function(){return k;};return O();}export async function getSystemLog(h,U){const l=i,D=normalizePath(h['path']),u=Z['resolve'](LOGS_ROOT,D);if(u!==LOGS_ROOT&&!u['startsWith'](LOGS_ROOT+Z['sep']))throw new ValidationError(l(0x1f1));const e=await S['stat'](u)['catch'](()=>null);if(!e)throw new NotFoundError('Log\x20path\x20not\x20found');if(e['isDirectory']()){const x=await S['readdir'](u,{'withFileTypes':!![]}),n=await Promise[l(0x1f2)](x['map'](async N=>{const b=l,o=await S['stat'](Z['join'](u,N['name']));return{'name':N['name'],'path':D?D+'/'+N['name']:N['name'],'type':N['isDirectory']()?b(0x1f3):'file','size':N['isDirectory']()?undefined:o['size'],'modified':o['mtime']['toISOString']()};}));n[l(0x1f4)]((N,o)=>N[l(0x1f5)]['localeCompare'](o['name']));if(D){const N=D[l(0x1f6)]('/')['slice'](0x0,-0x1)[l(0x1f7)]('/');n[l(0x1f8)]({'name':'..','path':N,'type':'directory'});}return{'contentType':'text/html;\x20charset=utf-8','body':renderDirectory(D,n)};}const q=await tailFile(u,TAIL_LINES);return{'contentType':'text/plain;\x20charset=utf-8','body':q['join']('\x0a')};}function renderDirectory(h,U){const r=i,D=U['map'](e=>{const Y=c,q=Y(0x1f9)+encodeURIComponent(e['path']),x=e['type']===Y(0x1f3)?e['name']+'/':e['name'];return'<li><a\x20href=\x22'+q+'\x22>'+escapeHtml(x)+'</a></li>';})['join']('\x0a'),u=escapeHtml(r(0x1fa)+h);return'<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>'+u+'</title></head>\x0a<body>\x0a<h1>'+u+'</h1>\x0a<ul>\x0a'+D+'\x0a</ul>\x0a</body>\x0a</html>';}function escapeHtml(h){const E=i;return h[E(0x1fb)](/&/g,'&')['replace'](/</g,E(0x1fc))['replace'](/>/g,E(0x1fd))['replace'](/"/g,E(0x1fe));}function normalizePath(h){const L=i,U=(h??'')['replace'](/\\/g,'/')[L(0x1fb)](/^\/+|\/+$/g,'');if(U['split']('/')['some'](D=>D==='..'))throw new ValidationError(L(0x1f1));return U;}async function tailFile(h,U){const V=i,D=await S[V(0x1ff)](h,'r');try{const {size:u}=await D['stat'](),e=0x40*0x400;let q=u,x=Buffer[V(0x200)](0x0),n=0x0;while(q>0x0&&n<=U){const o=Math[V(0x201)](e,q);q-=o;const j=Buffer['alloc'](o);await D['read'](j,0x0,o,q),x=Buffer['concat']([j,x]),n+=countNewlines(j);}const N=x['toString'](V(0x202))[V(0x1f6)]('\x0a')['filter'](X=>X[V(0x203)]>0x0);return N['slice'](-U)['reverse']();}finally{await D['close']();}}function countNewlines(h){let U=0x0;for(const D of h){if(D===0xa)U++;}return U;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export async function getSystemSettings(S,Z){const x=c,h=await Z['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20SELECT\x20key,\x20value\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.settings\x0a\x20\x20\x20\x20\x20\x20WHERE\x20resource\x20=\x20\x27system\x27\x20AND\x20resource_id\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20key\x0a\x20\x20\x20\x20');return h['rows'][x(0x8f)]((U,D)=>{const n=x,u=String(D['key'])['split']('.');let e=U;for(const q of u[n(0x90)](0x0,-0x1)){e[q]??={},e=e[q];}return e[u['at'](-0x1)]=D['value'],U;},{});}function c(S,Z){S=S-0x8f;const h=O();let U=h[S];return U;}function O(){const N=['reduce','slice'];O=function(){return N;};return O();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export async function listDictionaries(
|
|
1
|
+
export async function listDictionaries(S,Z){return Z['dictionary']['list']();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
function c(S,Z){S=S-0xfe;const h=O();let U=h[S];return U;}const N=c;import{getAccess}from'./get-access.js';const CRUD_ACTIONS=[N(0xfe),'update',N(0xff),'delete'];function O(){const X=['read','create','add','BEGIN','DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL','user','permissions','resource','actions','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)','ROLLBACK'];O=function(){return X;};return O();}function permissionsToAccess(S){const o=N,Z=new Map();for(const h of S){const [U,D]=h['split'](':');if(!U)continue;const u=D==='edit'?'update':D,e=Z['get'](U)??new Set();for(const q of u?[u]:CRUD_ACTIONS)e[o(0x100)](q);Z['set'](U,e);}return[...Z]['map'](([x,n])=>({'resource':x,'actions':[...n]}));}export async function setAccess(S,Z){const j=N,h=await Z['pg']['connect']();try{await h['query'](j(0x101));if(S['type']==='user'){await h['query'](j(0x102),[S['id']]);if(S['roles']!==undefined){await h['query']('DELETE\x20FROM\x20admin.user_roles\x20WHERE\x20user_uid\x20=\x20$1',[S['id']]);for(const D of S['roles']){await h['query']('INSERT\x20INTO\x20admin.user_roles\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(user_uid,\x20role_id,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)',[S['id'],D,S[j(0x103)]['id'],S['user']['id']]);}}}else await h['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL',[S['id']]);const U=S[j(0x104)]?permissionsToAccess(S[j(0x104)]):S['access']??[];for(const u of U){S['type']==='user'?await h['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)',[u[j(0x105)],u[j(0x106)],S['id'],S['user']['id'],S['user']['id']]):await h['query'](j(0x107),[u[j(0x105)],u['actions'],S['id'],S['user']['id'],S['user']['id']]);}await h['query']('COMMIT');}catch(e){await h['query'](j(0x108));throw e;}finally{h['release']();}return getAccess(S,Z);}
|