@andrewcaires/api 4.0.3 → 4.1.0
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/index.cjs.js +2 -2
- package/dist/index.d.ts +78 -70
- package/dist/index.esm.js +2 -2
- package/package.json +13 -11
package/dist/index.cjs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/api v4.0
|
|
2
|
+
* @andrewcaires/api v4.1.0
|
|
3
3
|
* Simple api for small applications using express, jsonwebtoken, sequelize and websocket
|
|
4
4
|
* (c) 2024 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
6
6
|
*/
|
|
7
|
-
"use strict";var e=require("@andrewcaires/express"),t=require("@andrewcaires/node"),r=require("@andrewcaires/utils.js"),o=require("ws"),s=require("@andrewcaires/sequelize"),i=require("dotenv"),n=require("fs"),d=require("express-session"),a=require("sequelize"),p=require("jsonwebtoken"),u=require("path");function l(e,t,r,o){var s,i=arguments.length,n=i<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,o);else for(var d=e.length-1;d>=0;d--)(s=e[d])&&(n=(i<3?s(n):i>3?s(t,r,n):s(t,r))||n);return i>3&&n&&Object.defineProperty(t,r,n),n}function c(e,t){return function(r,o){t(r,o,e)}}function g(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function y(e,t,r,o){return new(r||(r=Promise))((function(s,i){function n(e){try{a(o.next(e))}catch(e){i(e)}}function d(e){try{a(o.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?s(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(n,d)}a((o=o.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,i.config();class x{static getBool(e,t){return r.toBool(x.getString(e,t.toString()))}static getInt(e,t){return parseInt(x.getString(e,t.toString()))}static getMs(e,t){return r.parseMs(x.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}x.API_CONSOLE_ERROR=x.getBool("API_CONSOLE_ERROR",!1),x.API_DEFAULT_PATH=x.getString("API_DEFAULT_PATH","/api"),x.API_DB_DATABASE=x.getString("API_DB_DATABASE",""),x.API_DB_HOST=x.getString("API_DB_HOST","127.0.0.1"),x.API_DB_PASSWORD=x.getString("API_DB_PASSWORD",""),x.API_DB_PORT=x.getInt("API_DB_PORT",3306),x.API_DB_TYPE=x.getString("API_DB_TYPE",""),x.API_DB_USERNAME=x.getString("API_DB_USERNAME","root"),x.API_DB_LOG=x.getBool("API_DB_LOG",!1),x.API_DB_AUDIT=x.getBool("API_DB_AUDIT",!0),x.API_DB_PREFIX=x.getString("API_DB_PREFIX",""),x.API_DB_TIMEZONE=x.getString("API_DB_TIMEZONE","+00:00"),x.API_HTTP_CRT=x.getString("API_HTTP_CRT",""),x.API_HTTP_KEY=x.getString("API_HTTP_KEY",""),x.API_HTTP_PORT=x.getInt("API_HTTP_PORT",3e3),x.API_HTTP_PUBLIC=x.getString("API_HTTP_PUBLIC",""),x.API_HTTP_CROSS=x.getBool("API_HTTP_CROSS",!1),x.API_HTTP_HYBRID=x.getBool("API_HTTP_HYBRID",!1),x.API_HTTP_REDIRECT=x.getString("API_HTTP_REDIRECT",""),x.API_KEY_HASH=x.getString("API_KEY_HASH",""),x.API_KEY_HEADER=x.getString("API_KEY_HEADER","api_key"),x.API_MODEL_LIMIT=x.getInt("API_MODEL_LIMIT",10),x.API_MODEL_LIMIT_MAX=x.getInt("API_MODEL_LIMIT_MAX",500),x.API_NOTFOUND_REDIRECT=x.getString("API_NOTFOUND_REDIRECT",""),x.API_SLEEP_AUTH=x.getMs("API_SLEEP_AUTH","2s"),x.API_SLEEP_FORGOT=x.getMs("API_SLEEP_FORGOT","5s"),x.API_SLEEP_REGISTRY=x.getMs("API_SLEEP_REGISTRY","5s"),x.API_SESSION_NAME=x.getString("API_SESSION_NAME","session.id"),x.API_SESSION_LIFETIME=x.getMs("API_SESSION_LIFETIME","1d"),x.API_SESSION_SECRET=x.getString("API_SESSION_SECRET","yoursecret"),x.API_TOKEN_CRT=x.getString("API_TOKEN_CRT",""),x.API_TOKEN_KEY=x.getString("API_TOKEN_KEY",""),x.API_TOKEN_FORGOT=x.getMs("API_TOKEN_LIFETIME","1d"),x.API_TOKEN_HEADER=x.getString("API_TOKEN_HEADER","authorization"),x.API_TOKEN_LIFETIME=x.getMs("API_TOKEN_LIFETIME","1d"),x.API_TOKEN_RENEW=x.getMs("API_TOKEN_RENEW","1d"),x.API_UPLOAD_COUNT=x.getInt("API_UPLOAD_COUNT",1),x.API_UPLOAD_FIELD=x.getString("API_UPLOAD_FIELD","upload"),x.API_UPLOAD_SIZE=x.getInt("API_UPLOAD_SIZE",2),x.API_UPLOAD_TEMP=x.getString("API_UPLOAD_TEMP","./temp"),x.API_WEBSOCKET_START=x.getBool("API_WEBSOCKET_START",!1);const h=new s.Connection({type:x.API_DB_TYPE,database:x.API_DB_DATABASE,username:x.API_DB_USERNAME,password:x.API_DB_PASSWORD,hostname:x.API_DB_HOST,hostport:x.API_DB_PORT,logging:x.API_DB_LOG,prefix:x.API_DB_PREFIX});class v extends s.Model{}const _={afterCreate:(e,t)=>y(void 0,void 0,void 0,(function*(){var o,s,i;if(!x.API_DB_AUDIT)return;const n=r.isObject(e)?e.constructor:null,d=null!==(o=null==n?void 0:n.primaryKeyAttribute)&&void 0!==o?o:null;yield exports.Audit.create({type:"CREATE",model:null!==(s=null==n?void 0:n.getTableName())&&void 0!==s?s:null,record:d?e.getDataValue(d):null,data:JSON.stringify(e.toJSON()),state:!0,user_id:null!==(i=null==t?void 0:t.user_id)&&void 0!==i?i:null}).catch(r.noop)})),afterUpdate:(e,t)=>y(void 0,void 0,void 0,(function*(){var o,s,i;if(!x.API_DB_AUDIT)return;const n=r.isObject(e)?e.constructor:null,d=null!==(o=null==n?void 0:n.primaryKeyAttribute)&&void 0!==o?o:null,a={},p=e.changed();p&&p.forEach((t=>a[t]=e.getDataValue(t))),yield exports.Audit.create({type:"UPDATE",model:null!==(s=null==n?void 0:n.getTableName())&&void 0!==s?s:null,record:d?e.getDataValue(d):null,data:JSON.stringify({before:e.previous(),after:a}),state:!0,user_id:null!==(i=null==t?void 0:t.user_id)&&void 0!==i?i:null}).catch(r.noop)})),afterDestroy:(e,t)=>y(void 0,void 0,void 0,(function*(){var o,s,i;if(!x.API_DB_AUDIT)return;const n=r.isObject(e)?e.constructor:null,d=null!==(o=null==n?void 0:n.primaryKeyAttribute)&&void 0!==o?o:null;yield exports.Audit.create({type:"DELETE",model:null!==(s=null==n?void 0:n.getTableName())&&void 0!==s?s:null,record:d?e.getDataValue(d):null,data:JSON.stringify(e.toJSON()),state:!0,user_id:null!==(i=null==t?void 0:t.user_id)&&void 0!==i?i:null}).catch(r.noop)}))};exports.Auth=class extends v{},l([s.Id(),g("design:type",Number)],exports.Auth.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.Auth.prototype,"secret",void 0),l([s.FullDate(),g("design:type",Date)],exports.Auth.prototype,"logout",void 0),l([s.String(),g("design:type",s.String)],exports.Auth.prototype,"useragent",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Auth.prototype,"created_at",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Auth.prototype,"updated_at",void 0),l([s.DeletedAt,g("design:type",Date)],exports.Auth.prototype,"deleted_at",void 0),l([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Auth.prototype,"user_id",void 0),exports.Auth=l([s.Database(h),s.ModelName("auth")],exports.Auth),exports.Register=class extends v{},l([s.Id(),g("design:type",Number)],exports.Register.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.Register.prototype,"token",void 0),l([s.Boolean(),g("design:type",s.Boolean)],exports.Register.prototype,"state",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Register.prototype,"created_at",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Register.prototype,"updated_at",void 0),l([s.DeletedAt,g("design:type",Date)],exports.Register.prototype,"deleted_at",void 0),l([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Register.prototype,"user_id",void 0),exports.Register=l([s.Database(h),s.ModelName("register")],exports.Register),exports.Group=class extends v{},l([s.Id(),g("design:type",Number)],exports.Group.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.Group.prototype,"name",void 0),l([s.Text(),g("design:type",s.String)],exports.Group.prototype,"description",void 0),l([s.Boolean(),g("design:type",s.Boolean)],exports.Group.prototype,"state",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Group.prototype,"created_at",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Group.prototype,"updated_at",void 0),l([s.DeletedAt,g("design:type",Date)],exports.Group.prototype,"deleted_at",void 0),l([s.HasMany((()=>exports.UserGroup),"group_id"),g("design:type",Array)],exports.Group.prototype,"groups_routes",void 0),l([s.HasMany((()=>exports.UserGroup),"group_id"),g("design:type",Array)],exports.Group.prototype,"users_groups",void 0),exports.Group=l([s.Database(h),s.ModelName("group"),s.Hooks(_)],exports.Group),exports.UserGroup=class extends v{},l([s.CreatedAt,g("design:type",Date)],exports.UserGroup.prototype,"created_at",void 0),l([s.BelongsTo((()=>exports.Group)),g("design:type",Number)],exports.UserGroup.prototype,"group_id",void 0),l([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.UserGroup.prototype,"user_id",void 0),exports.UserGroup=l([s.Database(h),s.ModelName("users_groups"),s.Hooks(_)],exports.UserGroup),exports.User=class extends v{},l([s.Id(),g("design:type",Number)],exports.User.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.User.prototype,"name",void 0),l([s.String(),g("design:type",s.String)],exports.User.prototype,"email",void 0),l([s.String(),g("design:type",s.String)],exports.User.prototype,"username",void 0),l([s.String(),g("design:type",s.String)],exports.User.prototype,"password",void 0),l([s.String(),g("design:type",s.String)],exports.User.prototype,"salt",void 0),l([s.String(),g("design:type",s.String)],exports.User.prototype,"token",void 0),l([s.String(),g("design:type",s.String)],exports.User.prototype,"avatar",void 0),l([s.DateOnly(),g("design:type",s.String)],exports.User.prototype,"date",void 0),l([s.Text(),g("design:type",s.String)],exports.User.prototype,"description",void 0),l([s.Boolean(),g("design:type",s.Boolean)],exports.User.prototype,"state",void 0),l([s.CreatedAt,g("design:type",Date)],exports.User.prototype,"created_at",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.User.prototype,"updated_at",void 0),l([s.DeletedAt,g("design:type",Date)],exports.User.prototype,"deleted_at",void 0),l([s.HasMany((()=>exports.Audit),"user_id"),g("design:type",Array)],exports.User.prototype,"audits",void 0),l([s.HasMany((()=>exports.Auth),"user_id"),g("design:type",Array)],exports.User.prototype,"auths",void 0),l([s.HasMany((()=>exports.Register),"user_id"),g("design:type",Array)],exports.User.prototype,"registers",void 0),l([s.HasMany((()=>exports.UserGroup),"user_id"),g("design:type",Array)],exports.User.prototype,"users_groups",void 0),exports.User=l([s.Database(h),s.ModelName("user"),s.DefaultScope({attributes:{exclude:["password","salt","token"]}}),s.Scopes({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),s.Hooks(_)],exports.User),exports.Audit=class extends v{},l([s.Id(),g("design:type",Number)],exports.Audit.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.Audit.prototype,"type",void 0),l([s.String(),g("design:type",s.String)],exports.Audit.prototype,"model",void 0),l([s.Integer(),g("design:type",s.String)],exports.Audit.prototype,"record",void 0),l([s.Text(),g("design:type",s.String)],exports.Audit.prototype,"data",void 0),l([s.Boolean(),g("design:type",s.Boolean)],exports.Audit.prototype,"state",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Audit.prototype,"created_at",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Audit.prototype,"updated_at",void 0),l([s.DeletedAt,g("design:type",Date)],exports.Audit.prototype,"deleted_at",void 0),l([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Audit.prototype,"user_id",void 0),exports.Audit=l([s.Database(h),s.ModelName("audit")],exports.Audit),exports.Configs=class extends v{},l([s.String(),g("design:type",s.String)],exports.Configs.prototype,"key",void 0),l([s.String(),g("design:type",s.String)],exports.Configs.prototype,"value",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Configs.prototype,"created_at",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Configs.prototype,"updated_at",void 0),exports.Configs=l([s.Database(h),s.ModelName("configs"),s.Hooks(_)],exports.Configs),exports.Forgot=class extends v{},l([s.Id(),g("design:type",Number)],exports.Forgot.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.Forgot.prototype,"token",void 0),l([s.BigInt(),g("design:type",Number)],exports.Forgot.prototype,"timestamp",void 0),l([s.Boolean(),g("design:type",s.Boolean)],exports.Forgot.prototype,"state",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Forgot.prototype,"created_at",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Forgot.prototype,"updated_at",void 0),l([s.DeletedAt,g("design:type",Date)],exports.Forgot.prototype,"deleted_at",void 0),l([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Forgot.prototype,"user_id",void 0),exports.Forgot=l([s.Database(h),s.ModelName("forgot")],exports.Forgot),exports.Route=class extends v{},l([s.Id(),g("design:type",Number)],exports.Route.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.Route.prototype,"name",void 0),l([s.Text(),g("design:type",s.String)],exports.Route.prototype,"description",void 0),l([s.Boolean(),g("design:type",s.Boolean)],exports.Route.prototype,"state",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Route.prototype,"created_at",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Route.prototype,"updated_at",void 0),l([s.DeletedAt,g("design:type",Date)],exports.Route.prototype,"deleted_at",void 0),l([s.HasMany((()=>exports.GroupRoute),"route_id"),g("design:type",Array)],exports.Route.prototype,"groups_routes",void 0),exports.Route=l([s.Database(h),s.ModelName("route"),s.Hooks(_)],exports.Route),exports.GroupRoute=class extends v{},l([s.CreatedAt,g("design:type",Date)],exports.GroupRoute.prototype,"created_at",void 0),l([s.BelongsTo((()=>exports.Group)),g("design:type",Number)],exports.GroupRoute.prototype,"group_id",void 0),l([s.BelongsTo((()=>exports.Route)),g("design:type",Number)],exports.GroupRoute.prototype,"route_id",void 0),exports.GroupRoute=l([s.Database(h),s.ModelName("groups_routes"),s.Hooks(_)],exports.GroupRoute),exports.Log=class extends v{},l([s.Id(),g("design:type",Number)],exports.Log.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.Log.prototype,"type",void 0),l([s.String(),g("design:type",s.String)],exports.Log.prototype,"source",void 0),l([s.Text(),g("design:type",s.String)],exports.Log.prototype,"message",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Log.prototype,"created_at",void 0),exports.Log=l([s.Database(h),s.ModelName("log")],exports.Log),exports.Session=class extends v{},l([s.String(),g("design:type",s.String)],exports.Session.prototype,"session",void 0),l([s.Text(),g("design:type",s.String)],exports.Session.prototype,"json",void 0),l([s.BigInt(),g("design:type",Number)],exports.Session.prototype,"expired",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Session.prototype,"created_at",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Session.prototype,"updated_at",void 0),exports.Session=l([s.Database(h),s.ModelName("session")],exports.Session);class m{static write(e,r,o){return y(this,void 0,void 0,(function*(){yield m.writeRaw(t.LogColor.White,"",e,r,o)}))}static error(e,r,o){return y(this,void 0,void 0,(function*(){yield m.writeRaw(t.LogColor.Red,"error",e,r,o)}))}static info(e,r,o){return y(this,void 0,void 0,(function*(){yield m.writeRaw(t.LogColor.Cyan,"info",e,r,o)}))}static success(e,r,o){return y(this,void 0,void 0,(function*(){yield m.writeRaw(t.LogColor.Green,"success",e,r,o)}))}static warning(e,r,o){return y(this,void 0,void 0,(function*(){yield m.writeRaw(t.LogColor.Yellow,"warning",e,r,o)}))}static writeRaw(e,r,o,s,i){return y(this,void 0,void 0,(function*(){i&&t.Log.console(e,r,o),h&&(yield exports.Log.create({type:r,source:s,message:o}).catch((()=>null)))}))}}const f=e=>n.existsSync(e)?n.readFileSync(e):void 0,A={http:f(x.API_HTTP_CRT),token:f(x.API_TOKEN_CRT)},C={http:f(x.API_HTTP_KEY),token:f(x.API_TOKEN_KEY)};class S extends d.Store{constructor(){super(),this.all=e=>y(this,void 0,void 0,(function*(){e=e||r.noop;const t=yield exports.Session.findAll({attributes:["session"],where:{expired:{[a.Op.gte]:Date.now()}}}).catch((t=>(e(t),null)));t&&e(null,t.map((e=>e.session))),e()})),this.clear=e=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy().catch(r.noop),e&&e()})),this.destroy=(e,t)=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy({where:{session:e}}).catch(r.noop),t&&t()})),this.expired=()=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy({where:{expired:{[a.Op.lt]:Date.now()}}}).catch(r.noop)})),this.get=(e,t)=>y(this,void 0,void 0,(function*(){t=t||r.noop;const o=yield exports.Session.findOne({where:{session:e,expired:{[a.Op.gte]:Date.now()}}}).catch((e=>(t(e),null)));if(o){const e=JSON.parse(o.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield o.destroy().catch(r.noop),void t(null)}t(null,e)}else t(null)})),this.length=e=>y(this,void 0,void 0,(function*(){e&&e(null,(yield exports.Session.count().catch(r.noop))||0)})),this.set=(e,t,o)=>y(this,void 0,void 0,(function*(){o=o||r.noop;const s=Date.now()+x.API_SESSION_LIFETIME,i=JSON.stringify(t),[n,d]=(yield exports.Session.findOrCreate({where:{session:e},defaults:{session:e,json:i,expired:s}}).catch(r.noop))||[];n&&(d||(n.json=i,n.expired=s,yield n.save().catch(r.noop))),o()})),this.loop=r.loop(this.expired,3e4),this.loop.start()}}class P{static create(e){return y(this,void 0,void 0,(function*(){if(!C.token)return{error:"Key not found"};const{id:t}=e,o=r.uuidv4(),s=yield exports.Auth.create({secret:o,user_id:t}).catch(P.error);if(!s)return{error:"Internal Server Error"};return{auth:s,token:p.sign({id:t,secret:o},C.token,P.options())}}))}static destroy(e){return y(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){m.error(e.message,"api.token",x.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:x.API_TOKEN_LIFETIME+"ms"}}static renew(e){return y(this,void 0,void 0,(function*(){if(!C.token)return{error:"Key not found"};const{error:t,decode:o}=P.verify(e,x.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(o){const{id:e,secret:t}=o;if(e&&t){const o=yield exports.User.findOne({where:{id:e,state:!0}}).catch(P.error);if(o){const s=yield exports.Auth.findOne({where:{secret:t,user_id:o.id}}).catch(P.error);if(s&&!s.logout){s.secret=r.uuidv4(),yield s.save().catch(P.error);return{auth:s,token:p.sign({id:e,secret:s.secret},C.token,P.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e,t,r){return y(this,void 0,void 0,(function*(){if(e){t=r.hash.encrypt(e);const o=yield exports.User.findOne({where:{token:t,state:!0}}).catch(P.error);if(o){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield exports.Auth.findOrCreate({where:{secret:t,user_id:o.id},defaults:{secret:t,user_id:o.id}}).catch(P.error))||[];if(r)return{auth:r,user:o}}return{error:"Access denied"}}const{error:o,decode:s}=P.verify(t);if(o)return{error:o};if(s){const{id:e,secret:t}=s;if(e&&t){const r=yield exports.User.findOne({where:{id:e,state:!0}}).catch(P.error);if(r){const e=yield exports.Auth.findOne({where:{secret:t,user_id:r.id}}).catch(P.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!A.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:p.verify(e,A.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class I extends e.Application{constructor(e){super(e,{cert:A.http,cross:x.API_HTTP_CROSS,hybrid:x.API_HTTP_HYBRID,key:C.http,notfound:x.API_NOTFOUND_REDIRECT,path:x.API_DEFAULT_PATH,port:x.API_HTTP_PORT,public:x.API_HTTP_PUBLIC,redirect:x.API_HTTP_REDIRECT,session:{store:new S,name:x.API_SESSION_NAME,secret:x.API_SESSION_SECRET,cookie:{maxAge:x.API_SESSION_LIFETIME},genid:r.uuidv4}}),this.hash=new t.Hash(x.API_KEY_HASH)}error(e,t){m.error(e.message,t,x.API_CONSOLE_ERROR)}log(e,t){m.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return y(this,void 0,void 0,(function*(){yield h.sync(),yield e.listen.call(this),x.API_WEBSOCKET_START&&this.server&&(this._webSocket=new o.Server({server:this.server,verifyClient:(e,t)=>t(x.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>y(this,void 0,void 0,(function*(){t.url||(t.url="");const o=t.url.length<=1?"":t.url.replace(/\//g,".");let s;e.on("message",(r=>y(this,void 0,void 0,(function*(){if(s)try{const i=JSON.parse(r);this.emit("ws.message"+o,{data:i,message:r,req:t,user:s,ws:e})}catch(i){this.emit("ws.message"+o,{message:r,req:t,user:s,ws:e})}else{const{user:i}=yield P.user("",r.toString(),this);i&&(s=i,this.emit("ws.connection"+o,{req:t,user:s,ws:e}))}s||e.close()})))),e.on("close",(()=>{s&&this.emit("ws.close"+o,{user:s,ws:e})})),yield r.sleep(2e3),s||e.close()})))))}))}websocket(){return this._webSocket}}class O{static all(){return y(this,void 0,void 0,(function*(){const e=yield exports.Configs.findAll().catch(O.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e,t){return y(this,void 0,void 0,(function*(){var r;const o=null!==(r=null==t?void 0:t.id)&&void 0!==r?r:null;return((yield exports.Configs.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:o})).catch(O.error))||0)>0}))}static error(e){m.error(e.message,"api.config",x.API_CONSOLE_ERROR)}static get(e){return y(this,arguments,void 0,(function*(e,t=""){const[r]=(yield exports.Configs.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(O.error))||[];return r?r.value:t}))}static set(e,t,r){return y(this,void 0,void 0,(function*(){var o;const s=null!==(o=null==r?void 0:r.id)&&void 0!==o?o:null,[i]=(yield exports.Configs.findOrCreate(Object.assign({where:{key:e}},{user_id:s})).catch(O.error))||[];i&&(i.value=t,yield i.save().catch(O.error))}))}}const w=e.parameterFactory((({ctx:e})=>{var t,r,o;return{user_id:null!==(o=null===(r=null===(t=e.req)||void 0===t?void 0:t.user)||void 0===r?void 0:r.id)&&void 0!==o?o:null}})),E=e.parameterFactory((({ctx:e})=>e.req.auth)),R=e.parameterFactory((({ctx:e})=>e.req.user));class T{static all(e,t){return y(this,void 0,void 0,(function*(){return yield exports.Route.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:exports.GroupRoute,required:!0,include:[{model:exports.Group,required:!0,where:{state:!0},include:[{model:exports.UserGroup,required:!0,where:{user_id:e.id}}]}]}]}).catch((e=>{m.error(e.message,"api.permission",x.API_CONSOLE_ERROR)}))}))}static get(e){return y(this,void 0,void 0,(function*(){const t=yield T.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return y(this,void 0,void 0,(function*(){const r=yield T.all(e,{name:t});return!!r&&r.length>0}))}}class D extends r.EventEmitter{auth(e,t,r,o,s){return y(this,void 0,void 0,(function*(){const{auth:i,error:n,user:d}=yield P.user(t,r,s);return n?e.error(n):i&&d?i.useragent&&i.useragent!=o?e.error("Invalid token"):(e.req.auth=i,e.req.user=d,void e.next()):e.error("Internal Server Error")}))}session(e,t,o){return y(this,void 0,void 0,(function*(){o.auth&&o.user&&(o.useragent?o.useragent!=t&&o.regenerate(r.noop):(o.useragent=t,o.save(r.noop))),e.next()}))}error(e){m.error(e.message,"api.controller",x.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r){return y(this,void 0,void 0,(function*(){return r?(yield T.is(r,t))?e.next():void e.unauthorized("Access denied"):e.unauthorized("Access denied")}))}read(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".read",r)}))}upload(t,r){r.path||(r.path=x.API_UPLOAD_TEMP),r.size||(r.size=x.API_UPLOAD_SIZE),r.field||(r.field=x.API_UPLOAD_FIELD),e.Upload.middleware(t,r)}validation(e,t){return y(this,void 0,void 0,(function*(){const{error:o,value:s}=yield r.Validation.object(t).parse().validateAsync(e.req.body);if(o)return e.validation(o);e.req.body=s,e.next()}))}write(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".write",r)}))}}l([c(0,e.Ctx()),c(1,e.Headers(x.API_KEY_HEADER)),c(2,e.Headers(x.API_TOKEN_HEADER)),c(3,e.Headers("user-agent")),c(4,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,String,I]),g("design:returntype",Promise)],D.prototype,"auth",null),l([c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Session()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object]),g("design:returntype",Promise)],D.prototype,"session",null),l([c(0,e.Ctx()),c(1,e.Argument()),c(2,R()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],D.prototype,"permission",null),l([c(0,e.Ctx()),c(1,e.Argument()),c(2,R()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],D.prototype,"read",null),l([c(0,e.Ctx()),c(1,e.Argument()),g("design:type",Function),g("design:paramtypes",[e.Context,Object]),g("design:returntype",void 0)],D.prototype,"upload",null),l([c(0,e.Ctx()),c(1,e.Argument()),g("design:type",Function),g("design:paramtypes",[e.Context,Object]),g("design:returntype",Promise)],D.prototype,"validation",null),l([c(0,e.Ctx()),c(1,e.Argument()),c(2,R()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],D.prototype,"write",null),exports.ModelController=class extends D{constructor(){super(...arguments),this._columns=[]}_add(t){return y(this,arguments,void 0,(function*({ctx:t,options:r,body:o,user:s}){var i;const n=null!==(i=null==s?void 0:s.id)&&void 0!==i?i:null,d=yield this.model().create(Object.assign(Object.assign({},t.req.body),o||{}),Object.assign(Object.assign({},r||{}),{user_id:n})).catch(this.error);if(d){const r=this.key();return t.prepare(e.Status.OK,{[r]:d.getDataValue(r)}),d}t.error("Internal Server Error")}))}_all(t){return y(this,arguments,void 0,(function*({ctx:t,options:o,callback:s,scope:i}){var n,d,p,u,l,c;const g=this.scope(i),y=Object.assign({},o||{});y.where=Object.assign({},y.where||{});const h=t.req.query.limit,v=r.isString(h)?parseInt(h):x.API_MODEL_LIMIT;y.limit=v>=0?Math.min(v,x.API_MODEL_LIMIT_MAX):void 0;const _=t.req.query.offset;if(r.isString(_)){const e=_?parseInt(_):0;y.offset=e>0?e:void 0}const m=[],f=this.columns(),A=e=>f.indexOf(e)>=0,C=null===(n=t.req.query.asc)||void 0===n?void 0:n.toString();C&&C.length&&m.push(...C.split(",").filter(A).map((e=>[e,"ASC"])));const S=null===(d=t.req.query.desc)||void 0===d?void 0:d.toString();S&&S.length&&m.push(...S.split(",").filter(A).map((e=>[e,"DESC"]))),m.length&&(y.order=m);const P=[],I=null===(p=t.req.query.search)||void 0===p?void 0:p.toString();(r.isArray(y.attributes)?y.attributes:f).filter(r.isString).forEach((e=>{var r;if(I&&I.length&&P.push({[e]:{[a.Op.like]:`%${I}%`}}),"search_"+e in t.req.query){const o=null===(r=t.req.query["search_"+e])||void 0===r?void 0:r.toString();o&&o.length&&P.push({[e]:{[a.Op.like]:`%${o}%`}})}})),P.length&&(y.where=Object.assign(Object.assign({},y.where),{[a.Op.or]:[...P]}));const O=null!==(u=yield g.count(Object.assign(Object.assign({},y),{col:f[0]})).catch(this.error))&&void 0!==u?u:0,w=yield g.findAll(y).catch(this.error),E={count:O,limit:null!==(l=y.limit)&&void 0!==l?l:-1,offset:null!==(c=y.offset)&&void 0!==c?c:0};return w?(t.prepare(e.Status.OK,Object.assign(Object.assign({},E),{records:s?yield s(w):w})),Object.assign(Object.assign({},E),{records:w})):(t.error("Internal Server Error"),Object.assign(Object.assign({},E),{records:[]}))}))}columns(){return 0==this._columns.length&&(this._columns=Object.keys(this.model().getAttributes())),this._columns}_del(e){return y(this,arguments,void 0,(function*({ctx:e,options:t,user:r}){var o;const s=this.key(),{[s]:i}=e.req.params;if(!i)return e.error("Internal Server Error"),0;const n=null!==(o=null==r?void 0:r.id)&&void 0!==o?o:null,d=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[s]:i}),individualHooks:!0}),{user_id:n})).catch(this.error);return d?(e.success("OK"),d):(e.notFound("Record not found"),0)}))}error(e){e.sql?m.error(e.message+"\n"+e.sql,"api.controller.sql",x.API_CONSOLE_ERROR):super.error(e)}_get(t){return y(this,arguments,void 0,(function*({ctx:t,options:r,callback:o,scope:s}){const i=this.key(),{[i]:n}=t.req.params,d=yield this.scope(s).findOne(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[i]:n})})).catch(this.error);return d?(t.prepare(e.Status.OK,o?yield o(d):d.toJSON()),d):null===d?t.notFound("Record not found"):void t.error("Internal Server Error")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}_set(e){return y(this,arguments,void 0,(function*({ctx:e,options:t,body:r,user:o}){var s,i;const n=this.key(),{[n]:d}=e.req.params,a=null!==(s=null==o?void 0:o.id)&&void 0!==s?s:null,[p]=null!==(i=yield this.model().update(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[n]:d}),individualHooks:!0}),{user_id:a})).catch(this.error))&&void 0!==i?i:[];return p?(e.success("OK"),!0):(e.success("Record not changed"),!1)}))}},exports.ModelController=l([e.Extends(D)],exports.ModelController),exports.AuditsController=class extends exports.ModelController{model(){return exports.Audit}all(e,t,r){return y(this,void 0,void 0,(function*(){const o={};t&&(o.type=t),r&&(o.table=r),yield this._all({ctx:e,options:{attributes:{exclude:["data"]},where:o,order:[["created_at","DESC"]]}})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}},l([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),c(1,e.Query("type")),c(2,e.Query("table")),g("design:type",Function),g("design:paramtypes",[e.Context,String,String]),g("design:returntype",Promise)],exports.AuditsController.prototype,"all",null),l([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.AuditsController.prototype,"get",null),exports.AuditsController=l([e.Controller("/audits"),e.Extends(exports.ModelController)],exports.AuditsController),exports.AuthController=class extends D{login(e,o,s,i,n){return y(this,void 0,void 0,(function*(){var d;yield r.sleep(x.API_SLEEP_AUTH);const p=yield exports.User.scope("password").findOne({where:{[a.Op.or]:[{email:s},{username:s}]}}).catch(this.error);if(i+=null!==(d=null==p?void 0:p.salt)&&void 0!==d?d:"",!p||p.password!=t.sha256(i))return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const u=yield exports.Register.findOne({where:{state:!0,user_id:p.id}}).catch(this.error);if(u)return e.error("Activation required"),n.emit("auth.activation",{ctx:e,register:u,user:p}),void this.emit("auth.activation",{ctx:e,register:u,user:p});if(!p.state)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e,user:p}),void this.emit("auth.failure",{ctx:e,user:p});const{auth:l,error:c,token:g}=yield P.create(p);return c?(e.error(c),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):l&&g?(l.useragent=o,yield l.save().catch(this.error),e.json({token:g}),n.emit("auth.login",{auth:l,ctx:e,user:p}),void this.emit("auth.login",{auth:l,ctx:e,user:p})):(e.error("Internal Server Error"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,r,o){return y(this,void 0,void 0,(function*(){if(yield P.destroy(t))return e.success("Disconcerted"),o.emit("auth.logout",{auth:t,ctx:e,user:r}),void this.emit("auth.logout",{auth:t,ctx:e,user:r});e.unauthorized("Access denied")}))}renew(e,t,r,o){return y(this,void 0,void 0,(function*(){const{auth:s,error:i,token:n}=yield P.renew(r);return i?e.error(i):s?(s.useragent=t,yield s.save().catch(this.error),e.json({token:n}),o.emit("auth.renew",{auth:s,ctx:e}),void this.emit("auth.renew",{auth:s,ctx:e})):e.error("Internal Server Error")}))}user(e,t){return y(this,void 0,void 0,(function*(){const r=yield T.all(t);if(!r)return e.error("Internal Server Error");e.json(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))}))}))}},l([e.Post("/login"),e.Middleware("validation",{username:r.Validation.string().min(3).required(),password:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Body("username")),c(3,e.Body("password")),c(4,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,String,I]),g("design:returntype",Promise)],exports.AuthController.prototype,"login",null),l([e.Get("/logout"),e.Middleware("auth"),c(0,e.Ctx()),c(1,E()),c(2,R()),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.Auth,exports.User,I]),g("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),l([e.Post("/renew"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Body("token")),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,I]),g("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),l([e.Get(),e.Middleware("auth"),c(0,e.Ctx()),c(1,R()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=l([e.Controller("/auth"),e.Extends(D)],exports.AuthController),exports.FilesController=class extends D{directory(){return x.API_HTTP_PUBLIC||"./"}files(e){return y(this,void 0,void 0,(function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const o=u.join(this.directory(),t);if(!n.existsSync(o)||!n.statSync(o).isDirectory())return e.notFound("Path not Found");let s=[];return s=n.readdirSync(o),s=s.map((e=>this.info(u.join(o,e)))),s=s.filter(r.isDef),Object.assign(Object.assign({},this.info(o)),{files:s})}))}access(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,this.name()+"."+t,r)}))}info(e){if(!n.existsSync(e))return null;const t=n.statSync(e),r=e.split("/").pop();e=e.replace(this.directory(),"/").replace(/^\/\//,"/");const o=t.isDirectory();return{name:r,path:e.replace(/^\/\//,"/"),size:t.size,extension:o?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:o,symlink:t.isSymbolicLink()}}name(){return"files"}},l([e.Get("/path/?*"),e.Middleware("auth"),e.Middleware("access","list"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.FilesController.prototype,"files",null),l([c(0,e.Ctx()),c(1,e.Argument()),c(2,R()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],exports.FilesController.prototype,"access",null),exports.FilesController=l([e.Controller("/files"),e.Extends(D)],exports.FilesController),exports.ForgotController=class extends D{check(e,t){return y(this,void 0,void 0,(function*(){const o=yield this.find(t);if(!o||!o.user)return e.notFound("User not found");o.token=r.uniqueID(),yield o.save(),e.json({token:o.token})}))}forgot(e,t,o){return y(this,void 0,void 0,(function*(){yield r.sleep(x.API_SLEEP_FORGOT);const s=t,i=yield exports.User.findOne({where:{[a.Op.or]:[{email:s},{username:t}]}}).catch(this.error);if(!i)return e.notFound("User not found");const n=r.uniqueID(),d=Date.now()+6e4*x.API_TOKEN_FORGOT,p=yield exports.Forgot.create({token:n,timestamp:d,state:!0,user_id:i.id});e.success("OK"),o.emit("forgot.send",{ctx:e,forgot:p,user:i}),this.emit("forgot.send",{ctx:e,forgot:p,user:i})}))}reset(e,r,o,s){return y(this,void 0,void 0,(function*(){const i=yield this.find(r);if(!i)return e.notFound("User not found");i.state=!1,yield i.save().catch(this.error),i.user.password=t.sha256(o),yield i.user.save().catch(this.error),e.success("OK"),s.emit("forgot.reset",{ctx:e,user:i.user}),this.emit("forgot.reset",{ctx:e,user:i.user})}))}find(e){return y(this,void 0,void 0,(function*(){return yield exports.Forgot.findOne({where:{token:e,state:!0},include:[{model:exports.User,required:!0}]}).catch(this.error)}))}},l([e.Get("/check"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Body("token")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),l([e.Post(),e.Middleware("validation",{username:r.Validation.string().min(4).required()}),c(0,e.Ctx()),c(1,e.Body("username")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,I]),g("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),l([e.Post("/reset"),e.Middleware("validation",{token:r.Validation.string().required(),password:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Body("token")),c(2,e.Body("password")),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,I]),g("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=l([e.Controller("/forgot"),e.Extends(D)],exports.ForgotController),exports.CrudController=class extends exports.ModelController{constructor(){super(...arguments),this._crud={}}add(e,t){return y(this,void 0,void 0,(function*(){yield this._add({ctx:e,user:t})}))}all(e){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}create(){return this._crud}del(e,t){return y(this,void 0,void 0,(function*(){yield this._del({ctx:e,user:t})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,t){return y(this,void 0,void 0,(function*(){yield this._set({ctx:e,user:t})}))}update(){return this._crud}validationAdd(e){return y(this,void 0,void 0,(function*(){const t=this.create();if(t==this._crud)return e.error("Internal Server Error");yield this.validation(e,t)}))}validationSet(e){return y(this,void 0,void 0,(function*(){const t=this.update();if(t==this._crud)return e.error("Internal Server Error");yield this.validation(e,t)}))}},l([e.Post(),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationAdd"),c(0,e.Ctx()),c(1,R()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.CrudController.prototype,"add",null),l([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"all",null),l([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,R()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.CrudController.prototype,"del",null),l([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"get",null),l([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationSet"),c(0,e.Ctx()),c(1,R()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.CrudController.prototype,"set",null),l([c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"validationAdd",null),l([c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"validationSet",null),exports.CrudController=l([e.Extends(exports.ModelController)],exports.CrudController),exports.GroupsController=class extends exports.CrudController{model(){return exports.Group}create(){return{name:r.Validation.string().required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}}update(){return{name:r.Validation.string().empty(),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}}},exports.GroupsController=l([e.Controller("/groups"),e.Extends(exports.CrudController)],exports.GroupsController),exports.GroupsRoutesController=class extends exports.ModelController{model(){return exports.GroupRoute}all(e,t){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{group_id:t},include:[{model:exports.Route,required:!0}]},callback:e=>e.map((e=>e.route))})}))}set(e,t,o,s){return y(this,void 0,void 0,(function*(){const i=yield exports.Group.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield exports.GroupRoute.destroy(Object.assign({where:{group_id:t},individualHooks:!0},s)),o){let e=0;yield r.sleep(1e3);for(let r=0;r<o.length;r++)e=yield exports.Route.count({where:{id:o[r]}}),e&&(yield exports.GroupRoute.create({group_id:t,route_id:o[r]},Object.assign({},s)))}return e.success("OK")}if(r.isNull(i))return e.notFound("Record not found");e.error("Internal Server Error")}))}},l([e.Get("/:id/routes"),e.Middleware("auth"),e.Middleware("read","groups"),c(0,e.Ctx()),c(1,e.Params("id")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"all",null),l([e.Put("/:id/routes"),e.Middleware("auth"),e.Middleware("write","groups"),e.Middleware("validation",{routes:r.Validation.array(r.Validation.number().parse())}),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.Body("routes")),c(3,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Array,Object]),g("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"set",null),exports.GroupsRoutesController=l([e.Controller("/groups"),e.Extends(exports.ModelController)],exports.GroupsRoutesController),exports.LogsController=class extends exports.ModelController{model(){return exports.Log}all(e,t,r){return y(this,void 0,void 0,(function*(){const o={};t&&(o.type=t),r&&(o.source=r),yield this._all({ctx:e,options:{where:o,order:[["created_at","DESC"]]}})}))}},l([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),c(1,e.Query("type")),c(2,e.Query("source")),g("design:type",Function),g("design:paramtypes",[e.Context,String,String]),g("design:returntype",Promise)],exports.LogsController.prototype,"all",null),exports.LogsController=l([e.Controller("/logs"),e.Extends(exports.ModelController)],exports.LogsController),exports.RegisterController=class extends D{register(e,o,s){return y(this,void 0,void 0,(function*(){yield r.sleep(x.API_SLEEP_REGISTRY);const{name:i,date:n,email:d,username:p,password:u,confirm:l}=o,c=p||d,g=t.sha256(u);if(yield exports.User.count({where:{[a.Op.or]:[{email:d},{username:c}]}}).catch(this.error))return e.validation("Invalid email or username");if(g!=t.sha256(l))return e.error("Invalid password");const y=yield exports.User.create({name:i,email:d,username:c,password:g,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!y)return e.error("Internal Server Error");const h=yield exports.Register.create({token:yield this.getId(),user_id:y.id,state:!0}).catch(this.error);if(!h)return yield y.destroy().catch(this.error),e.error("Internal Server Error");e.success("OK"),s.emit("register.user",{ctx:e,register:h,user:y}),this.emit("register.user",{ctx:e,register:h,user:y})}))}confirm(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield exports.Register.findOne({where:{token:t,state:!0},include:[{model:exports.User,required:!0}]}).catch(this.error);if(!o)return e.notFound("User not found");o.state=!1,yield o.save().catch(this.error),o.user.state=!0,yield o.user.save().catch(this.error),e.success("OK"),r.emit("register.confirm",{ctx:e,register:o,user:o.user}),this.emit("register.confirm",{ctx:e,register:o,user:o.user})}))}send(e,t,r){return y(this,void 0,void 0,(function*(){const o=t,s=yield exports.Register.findOne({where:{state:!0},include:[{model:exports.User,required:!0,where:{[a.Op.or]:[{email:o},{username:t}]}}]}).catch(this.error);if(!s)return e.notFound("User not found");e.success("OK"),r.emit("register.send",{ctx:e,register:s,user:s.user}),this.emit("register.send",{ctx:e,register:s,user:s.user})}))}getId(){return y(this,void 0,void 0,(function*(){const e=r.uuidv4();return(yield exports.Register.count({where:{token:e}}))?this.getId():e}))}},l([e.Post(),e.Middleware("validation",{name:r.Validation.string().required(),date:r.Validation.date().required(),email:r.Validation.string().email().required(),username:r.Validation.string().min(4).empty(),password:r.Validation.string().min(5).required(),confirm:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Body()),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,Object,I]),g("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),l([e.Post("/confirm"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Body("token")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,I]),g("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),l([e.Post("/send"),e.Middleware("validation",{username:r.Validation.string().min(4).required()}),c(0,e.Ctx()),c(1,e.Body("username")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,I]),g("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=l([e.Controller("/register"),e.Extends(D)],exports.RegisterController),exports.RoutesController=class extends exports.CrudController{model(){return exports.Route}create(){return{name:r.Validation.string().required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}}update(){return{name:r.Validation.string().empty(),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}}},exports.RoutesController=l([e.Controller("/routes"),e.Extends(exports.CrudController)],exports.RoutesController),exports.SetupController=class extends D{setup(e){return y(this,void 0,void 0,(function*(){if(0==(yield exports.User.count())){const e=r.uniqueID(),o=yield exports.User.create({name:"Admin",email:"admin@localhost",username:"admin",password:t.sha256("admin"+e),salt:e,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0}),s={description:"API CORE",state:!0},i=yield exports.Group.create(Object.assign({name:"admin"},s));yield exports.UserGroup.create({user_id:o.id,group_id:i.id});const n=["read","write"],d=["audits","users","groups","routes"];yield r.forEachSeries(d,(e=>y(this,void 0,void 0,(function*(){yield r.forEachSeries(n,(t=>y(this,void 0,void 0,(function*(){const r=yield exports.Route.create(Object.assign({name:`${e}.${t}`},s));yield exports.GroupRoute.create({group_id:i.id,route_id:r.id})}))))}))));const a=["delete","list","read","rename","upload","write"];yield r.forEachSeries(a,(e=>y(this,void 0,void 0,(function*(){const t=yield exports.Route.create(Object.assign({name:`files.${e}`},s));yield exports.GroupRoute.create({group_id:i.id,route_id:t.id})}))));const p=["logs"];yield r.forEachSeries(p,(e=>y(this,void 0,void 0,(function*(){const t=yield exports.Route.create(Object.assign({name:`${e}.read`},s));yield exports.GroupRoute.create({group_id:i.id,route_id:t.id})}))))}e.success("OK")}))}},l([e.Get(),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=l([e.Controller("/setup"),e.Extends(D)],exports.SetupController),exports.UsersController=class extends exports.ModelController{model(){return exports.User}constructor(){super(),this.dir=x.API_HTTP_PUBLIC+"/avatar",x.API_HTTP_PUBLIC&&n.existsSync(x.API_HTTP_PUBLIC)&&!n.existsSync(this.dir)&&n.mkdirSync(this.dir)}avatar(e,t,r,o){return y(this,void 0,void 0,(function*(){if(t.length){const s=t[0].filename||"";if(s){const t=this.dir+"/"+r.avatar;if(n.existsSync(t)&&n.lstatSync(t).isFile()&&n.rmSync(t),r.avatar=s,yield r.save(Object.assign({},o)).catch(this.error))return e.success("OK")}}e.success("Record not changed")}))}avatar_remove(e,t,r){return y(this,void 0,void 0,(function*(){const o=this.dir+"/"+t.avatar;t.avatar="",(yield t.save(Object.assign({},r)).catch(this.error))&&n.existsSync(o)&&n.rmSync(o),e.success("OK")}))}password(e,o,s,i,n){return y(this,void 0,void 0,(function*(){var d;const a=yield this.scope("password").findOne({where:{id:i.id,state:!0}}).catch(this.error);return o+=null!==(d=null==a?void 0:a.salt)&&void 0!==d?d:"",a&&a.password==t.sha256(o)?(a.salt=r.uniqueID(),a.password=t.sha256(s+a.salt),(yield a.save(Object.assign({},n)).catch(this.error))?e.success("OK"):void e.success("Record not changed")):e.error("Record not changed")}))}token(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.model().findOne({attributes:["token"],where:{id:t.id}}).catch(this.error);if(o)return e.json({token:r.hash.decrypt(o.token)});e.notFound("Record not found")}))}token_get(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.scope("token").findOne({where:{id:t}}).catch(this.error);if(o)return e.json({token:r.hash.decrypt(o.token)});e.notFound("Record not found")}))}token_remove(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(o)return o.token="",yield o.save(Object.assign({},r)).catch(this.error),e.success("OK");e.notFound("Record not found")}))}token_renew(e,t,r,o){return y(this,void 0,void 0,(function*(){const s=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(s){const t=yield this.token_new();return s.token=o.hash.encrypt(t),yield s.save(Object.assign({},r)).catch(this.error),e.json({token:t})}e.notFound("Record not found")}))}token_new(){return y(this,void 0,void 0,(function*(){var e;const t=r.uuidv4();return(null!==(e=yield this.model().count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t}))}add(e,o,s){return y(this,void 0,void 0,(function*(){const i=r.uniqueID();yield this._add({ctx:e,body:{password:t.sha256(o+i),salt:i},user:s})}))}all(e){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}del(e,t,r){return y(this,void 0,void 0,(function*(){if(r.id.toString()==t)return e.notFound("Record not found");yield this._del({ctx:e,user:r})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,o,s){return y(this,void 0,void 0,(function*(){const i=r.uniqueID();yield this._set({ctx:e,body:o?{password:t.sha256(o+i),salt:i}:{},user:s})}))}},l([e.Post("/avatar"),e.Middleware("auth"),e.Middleware("upload",(e=>({count:1,field:"file",path:e.controller.dir,types:["image/bmp","image/jpeg","image/png"],size:32}))),c(0,e.Ctx()),c(1,e.Files()),c(2,R()),c(3,w()),g("design:type",Function),g("design:paramtypes",[e.Context,Array,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),l([e.Get("/avatar/remove"),e.Middleware("auth"),c(0,e.Ctx()),c(1,R()),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"avatar_remove",null),l([e.Post("/password"),e.Middleware("auth"),e.Middleware("validation",{oldPassword:r.Validation.string().min(5).required(),newPassword:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Body("oldPassword")),c(2,e.Body("newPassword")),c(3,R()),c(4,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"password",null),l([e.Get("/token"),e.Middleware("auth"),c(0,e.Ctx()),c(1,R()),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User,I]),g("design:returntype",Promise)],exports.UsersController.prototype,"token",null),l([e.Get("/token/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,I]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_get",null),l([e.Get("/token/remove/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_remove",null),l([e.Get("/token/renew/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,w()),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object,I]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_renew",null),l([e.Post(),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validation",{name:r.Validation.string().required(),email:r.Validation.string().email().required(),username:r.Validation.string().min(4).required(),password:r.Validation.string().min(5).required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}),c(0,e.Ctx()),c(1,e.Body("password")),c(2,R()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],exports.UsersController.prototype,"add",null),l([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.UsersController.prototype,"all",null),l([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,R()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],exports.UsersController.prototype,"del",null),l([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.UsersController.prototype,"get",null),l([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validation",{name:r.Validation.string().empty(),email:r.Validation.string().email().empty(),username:r.Validation.string().min(4).empty(),password:r.Validation.string().min(5).empty().filter(""),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}),c(0,e.Ctx()),c(1,e.Body("password")),c(2,R()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=l([e.Controller("/users"),e.Extends(exports.ModelController),g("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class extends exports.ModelController{model(){return exports.UserGroup}groups(e,t){return y(this,void 0,void 0,(function*(){yield this.all(e,t.id.toString())}))}all(e,t){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{user_id:t},include:[{model:exports.Group,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,o,s){return y(this,void 0,void 0,(function*(){const i=yield exports.User.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){if(yield exports.UserGroup.destroy(Object.assign({where:{user_id:i.id},individualHooks:!0},s)),o){let e=0;yield r.sleep(1e3);for(let t=0;t<o.length;t++)e=yield exports.Group.count({where:{id:o[t]}}),e&&(yield exports.UserGroup.create({user_id:i.id,group_id:o[t]},Object.assign({},s)))}return e.success("OK")}if(r.isNull(i))return e.notFound("Record not found");e.error("Internal Server Error")}))}},l([e.Get("/groups"),e.Middleware("auth"),c(0,e.Ctx()),c(1,R()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"groups",null),l([e.Get("/:id/groups"),e.Middleware("auth"),e.Middleware("read","users"),c(0,e.Ctx()),c(1,e.Params("id")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),l([e.Put("/:id/groups"),e.Middleware("auth"),e.Middleware("write","users"),e.Middleware("validation",{groups:r.Validation.array(r.Validation.number().parse())}),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.Body("groups")),c(3,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Array,Object]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=l([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersGroupsController),exports.Application=I,exports.Config=O,exports.ControllerBase=D,exports.Env=x,exports.Logs=m,exports.Model=v,exports.Permission=T,exports.ReqAudit=w,exports.ReqAuth=E,exports.ReqUser=R,exports.Token=P,exports.audit=_,exports.conn=h,exports.crt=A,exports.key=C;
|
|
7
|
+
"use strict";var e=require("@andrewcaires/express"),t=require("@andrewcaires/node"),r=require("@andrewcaires/utils.js"),o=require("ws"),s=require("@andrewcaires/sequelize"),i=require("dotenv"),n=require("fs"),d=require("express-session"),a=require("sequelize"),p=require("jsonwebtoken"),l=require("path");function u(e,t,r,o){var s,i=arguments.length,n=i<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,o);else for(var d=e.length-1;d>=0;d--)(s=e[d])&&(n=(i<3?s(n):i>3?s(t,r,n):s(t,r))||n);return i>3&&n&&Object.defineProperty(t,r,n),n}function c(e,t){return function(r,o){t(r,o,e)}}function g(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function y(e,t,r,o){return new(r||(r=Promise))((function(s,i){function n(e){try{a(o.next(e))}catch(e){i(e)}}function d(e){try{a(o.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?s(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(n,d)}a((o=o.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,i.config();class x{static getBool(e,t){return r.toBool(x.getString(e,t.toString()))}static getInt(e,t){return parseInt(x.getString(e,t.toString()))}static getMs(e,t){return r.parseMs(x.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}x.API_CONSOLE_ERROR=x.getBool("API_CONSOLE_ERROR",!1),x.API_DB_DATABASE=x.getString("API_DB_DATABASE",""),x.API_DB_HOST=x.getString("API_DB_HOST","127.0.0.1"),x.API_DB_PASSWORD=x.getString("API_DB_PASSWORD",""),x.API_DB_PORT=x.getInt("API_DB_PORT",3306),x.API_DB_TYPE=x.getString("API_DB_TYPE",""),x.API_DB_USERNAME=x.getString("API_DB_USERNAME","root"),x.API_DB_LOG=x.getBool("API_DB_LOG",!1),x.API_DB_AUDIT=x.getBool("API_DB_AUDIT",!0),x.API_DB_PREFIX=x.getString("API_DB_PREFIX",""),x.API_DB_TIMEZONE=x.getString("API_DB_TIMEZONE","+00:00"),x.API_HTTP_CRT=x.getString("API_HTTP_CRT",""),x.API_HTTP_KEY=x.getString("API_HTTP_KEY",""),x.API_HTTP_PORT=x.getInt("API_HTTP_PORT",3e3),x.API_HTTP_PUBLIC=x.getString("API_HTTP_PUBLIC",""),x.API_HTTP_CROSS=x.getBool("API_HTTP_CROSS",!1),x.API_HTTP_HYBRID=x.getBool("API_HTTP_HYBRID",!1),x.API_HTTP_NOTFOUND=x.getString("API_HTTP_NOTFOUND",""),x.API_HTTP_PATH=x.getString("API_HTTP_PATH","/api"),x.API_HTTP_REDIRECT=x.getString("API_HTTP_REDIRECT",""),x.API_KEY_HASH=x.getString("API_KEY_HASH",""),x.API_KEY_HEADER=x.getString("API_KEY_HEADER","api_key"),x.API_MODEL_LIMIT=x.getInt("API_MODEL_LIMIT",10),x.API_MODEL_LIMIT_MAX=x.getInt("API_MODEL_LIMIT_MAX",500),x.API_SLEEP_AUTH=x.getMs("API_SLEEP_AUTH","2s"),x.API_SLEEP_FORGOT=x.getMs("API_SLEEP_FORGOT","5s"),x.API_SLEEP_REGISTRY=x.getMs("API_SLEEP_REGISTRY","5s"),x.API_SESSION_NAME=x.getString("API_SESSION_NAME","session.id"),x.API_SESSION_LIFETIME=x.getMs("API_SESSION_LIFETIME","1d"),x.API_SESSION_SECRET=x.getString("API_SESSION_SECRET","yoursecret"),x.API_TOKEN_CRT=x.getString("API_TOKEN_CRT",""),x.API_TOKEN_KEY=x.getString("API_TOKEN_KEY",""),x.API_TOKEN_FORGOT=x.getMs("API_TOKEN_LIFETIME","1d"),x.API_TOKEN_HEADER=x.getString("API_TOKEN_HEADER","authorization"),x.API_TOKEN_LIFETIME=x.getMs("API_TOKEN_LIFETIME","1d"),x.API_TOKEN_RENEW=x.getMs("API_TOKEN_RENEW","1d"),x.API_UPLOAD_COUNT=x.getInt("API_UPLOAD_COUNT",1),x.API_UPLOAD_FIELD=x.getString("API_UPLOAD_FIELD","upload"),x.API_UPLOAD_SIZE=x.getInt("API_UPLOAD_SIZE",2),x.API_UPLOAD_TEMP=x.getString("API_UPLOAD_TEMP","./temp"),x.API_USER_HISTORY=x.getBool("API_USER_HISTORY",!0),x.API_WEBSOCKET_START=x.getBool("API_WEBSOCKET_START",!1);const h=new s.Connection({type:x.API_DB_TYPE,database:x.API_DB_DATABASE,username:x.API_DB_USERNAME,password:x.API_DB_PASSWORD,hostname:x.API_DB_HOST,hostport:x.API_DB_PORT,logging:x.API_DB_LOG,prefix:x.API_DB_PREFIX});class v extends s.Model{}const m=(e,t,r)=>{var o,s,i,n,d;return{type:e,model:null!==(o=null==t?void 0:t.getTableName())&&void 0!==o?o:null,client:null!==(s=null==r?void 0:r.audit_client)&&void 0!==s?s:null,href:null!==(i=null==r?void 0:r.audit_href)&&void 0!==i?i:null,user_agent:null!==(n=null==r?void 0:r.audit_user_agent)&&void 0!==n?n:null,user_id:null!==(d=null==r?void 0:r.audit_user_id)&&void 0!==d?d:null,state:!0}},_={afterCreate:(e,t)=>y(void 0,void 0,void 0,(function*(){var o;if(!x.API_DB_AUDIT)return;const s=r.isObject(e)?e.constructor:null,i=null!==(o=null==s?void 0:s.primaryKeyAttribute)&&void 0!==o?o:null;yield exports.Audit.create(Object.assign(Object.assign({},m("CREATE",s,t)),{record:i?e.getDataValue(i):null,data:e.toJSON()})).catch(r.noop)})),afterUpdate:(e,t)=>y(void 0,void 0,void 0,(function*(){var o;if(!x.API_DB_AUDIT)return;const s=r.isObject(e)?e.constructor:null,i=null!==(o=null==s?void 0:s.primaryKeyAttribute)&&void 0!==o?o:null,n={},d=e.changed();d&&d.forEach((t=>n[t]=e.getDataValue(t))),yield exports.Audit.create(Object.assign(Object.assign({},m("UPDATE",s,t)),{record:i?e.getDataValue(i):null,data:n,previously:e.previous()})).catch(r.noop)})),afterDestroy:(e,t)=>y(void 0,void 0,void 0,(function*(){var o;if(!x.API_DB_AUDIT)return;const s=r.isObject(e)?e.constructor:null,i=null!==(o=null==s?void 0:s.primaryKeyAttribute)&&void 0!==o?o:null;yield exports.Audit.create(Object.assign(Object.assign({},m("DELETE",s,t)),{record:i?e.getDataValue(i):null,data:e.toJSON()})).catch(r.noop)}))};exports.Auth=class extends v{},u([s.Id(),g("design:type",Number)],exports.Auth.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Auth.prototype,"secret",void 0),u([s.FullDate(),g("design:type",Date)],exports.Auth.prototype,"logout",void 0),u([s.String(),g("design:type",s.String)],exports.Auth.prototype,"user_agent",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Auth.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Auth.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Auth.prototype,"deleted_at",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Auth.prototype,"user_id",void 0),exports.Auth=u([s.Database(h),s.ModelName("auth")],exports.Auth),exports.Register=class extends v{},u([s.Id(),g("design:type",Number)],exports.Register.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Register.prototype,"token",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Register.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Register.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Register.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Register.prototype,"deleted_at",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Register.prototype,"user_id",void 0),exports.Register=u([s.Database(h),s.ModelName("register")],exports.Register),exports.Group=class extends v{},u([s.Id(),g("design:type",Number)],exports.Group.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Group.prototype,"name",void 0),u([s.Text(),g("design:type",s.String)],exports.Group.prototype,"description",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Group.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Group.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Group.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Group.prototype,"deleted_at",void 0),u([s.HasMany((()=>exports.UserGroup),"group_id"),g("design:type",Array)],exports.Group.prototype,"groups_routes",void 0),u([s.HasMany((()=>exports.UserGroup),"group_id"),g("design:type",Array)],exports.Group.prototype,"users_groups",void 0),exports.Group=u([s.Database(h),s.ModelName("group"),s.Hooks(_)],exports.Group),exports.UserGroup=class extends v{},u([s.CreatedAt,g("design:type",Date)],exports.UserGroup.prototype,"created_at",void 0),u([s.BelongsTo((()=>exports.Group)),g("design:type",Number)],exports.UserGroup.prototype,"group_id",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.UserGroup.prototype,"user_id",void 0),exports.UserGroup=u([s.Database(h),s.ModelName("users_groups"),s.Hooks(_)],exports.UserGroup),exports.UserHistory=class extends v{},u([s.String(),g("design:type",s.String)],exports.UserHistory.prototype,"password",void 0),u([s.CreatedAt,g("design:type",Date)],exports.UserHistory.prototype,"created_at",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.UserHistory.prototype,"user_id",void 0),exports.UserHistory=u([s.Database(h),s.ModelName("users_histories")],exports.UserHistory),exports.User=class extends v{},u([s.Id(),g("design:type",Number)],exports.User.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"name",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"email",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"username",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"password",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"salt",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"token",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"avatar",void 0),u([s.DateOnly(),g("design:type",s.String)],exports.User.prototype,"date",void 0),u([s.Text(),g("design:type",s.String)],exports.User.prototype,"description",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.User.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.User.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.User.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.User.prototype,"deleted_at",void 0),u([s.HasMany((()=>exports.Audit),"user_id"),g("design:type",Array)],exports.User.prototype,"audits",void 0),u([s.HasMany((()=>exports.Auth),"user_id"),g("design:type",Array)],exports.User.prototype,"auths",void 0),u([s.HasMany((()=>exports.Register),"user_id"),g("design:type",Array)],exports.User.prototype,"registers",void 0),u([s.HasMany((()=>exports.UserGroup),"user_id"),g("design:type",Array)],exports.User.prototype,"users_groups",void 0),u([s.HasMany((()=>exports.UserHistory),"user_id"),g("design:type",Array)],exports.User.prototype,"users_histories",void 0),exports.User=u([s.Database(h),s.ModelName("user"),s.DefaultScope({attributes:{exclude:["password","salt","token"]}}),s.Scopes({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),s.Hooks(_)],exports.User),exports.Audit=class extends v{},u([s.Id(),g("design:type",Number)],exports.Audit.prototype,"id",void 0),u([s.Enum("CREATE","DELETE","UPDATE"),g("design:type",s.String)],exports.Audit.prototype,"type",void 0),u([s.String(),g("design:type",s.String)],exports.Audit.prototype,"model",void 0),u([s.String(),g("design:type",s.String)],exports.Audit.prototype,"record",void 0),u([s.Json(),g("design:type",Object)],exports.Audit.prototype,"data",void 0),u([s.Json(),g("design:type",Object)],exports.Audit.prototype,"previously",void 0),u([s.String(),g("design:type",s.String)],exports.Audit.prototype,"client",void 0),u([s.Text(),g("design:type",s.String)],exports.Audit.prototype,"href",void 0),u([s.String(),g("design:type",s.String)],exports.Audit.prototype,"user_agent",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Audit.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Audit.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Audit.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Audit.prototype,"deleted_at",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Audit.prototype,"user_id",void 0),exports.Audit=u([s.Database(h),s.ModelName("audit")],exports.Audit),exports.Configs=class extends v{},u([s.String(),g("design:type",s.String)],exports.Configs.prototype,"key",void 0),u([s.String(),g("design:type",s.String)],exports.Configs.prototype,"value",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Configs.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Configs.prototype,"updated_at",void 0),exports.Configs=u([s.Database(h),s.ModelName("configs"),s.Hooks(_)],exports.Configs),exports.Forgot=class extends v{},u([s.Id(),g("design:type",Number)],exports.Forgot.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Forgot.prototype,"token",void 0),u([s.BigInt(),g("design:type",Number)],exports.Forgot.prototype,"timestamp",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Forgot.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Forgot.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Forgot.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Forgot.prototype,"deleted_at",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Forgot.prototype,"user_id",void 0),exports.Forgot=u([s.Database(h),s.ModelName("forgot")],exports.Forgot),exports.Permission=class extends v{},u([s.Id(),g("design:type",Number)],exports.Permission.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Permission.prototype,"name",void 0),u([s.String(),s.Unique(!0),g("design:type",s.String)],exports.Permission.prototype,"route",void 0),u([s.Text(),g("design:type",s.String)],exports.Permission.prototype,"description",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Permission.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Permission.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Permission.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Permission.prototype,"deleted_at",void 0),u([s.HasMany((()=>exports.GroupPermission),"permission_id"),g("design:type",Array)],exports.Permission.prototype,"groups_permissions",void 0),exports.Permission=u([s.Database(h),s.ModelName("permission"),s.Hooks(_)],exports.Permission),exports.GroupPermission=class extends v{},u([s.CreatedAt,g("design:type",Date)],exports.GroupPermission.prototype,"created_at",void 0),u([s.BelongsTo((()=>exports.Group)),g("design:type",Number)],exports.GroupPermission.prototype,"group_id",void 0),u([s.BelongsTo((()=>exports.Permission)),g("design:type",Number)],exports.GroupPermission.prototype,"permission_id",void 0),exports.GroupPermission=u([s.Database(h),s.ModelName("groups_permissions"),s.Hooks(_)],exports.GroupPermission),exports.Log=class extends v{},u([s.Id(),g("design:type",Number)],exports.Log.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Log.prototype,"type",void 0),u([s.String(),g("design:type",s.String)],exports.Log.prototype,"source",void 0),u([s.Text(),g("design:type",s.String)],exports.Log.prototype,"message",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Log.prototype,"created_at",void 0),exports.Log=u([s.Database(h),s.ModelName("log")],exports.Log),exports.Session=class extends v{},u([s.String(),g("design:type",s.String)],exports.Session.prototype,"session",void 0),u([s.Text(),g("design:type",s.String)],exports.Session.prototype,"json",void 0),u([s.BigInt(),g("design:type",Number)],exports.Session.prototype,"expired",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Session.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Session.prototype,"updated_at",void 0),exports.Session=u([s.Database(h),s.ModelName("session")],exports.Session);class A{static write(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.White,"",e,r,o)}))}static error(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.Red,"error",e,r,o)}))}static info(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.Cyan,"info",e,r,o)}))}static success(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.Green,"success",e,r,o)}))}static warning(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.Yellow,"warning",e,r,o)}))}static writeRaw(e,r,o,s,i){return y(this,void 0,void 0,(function*(){i&&t.Log.console(e,r,o),h&&(yield exports.Log.create({type:r,source:s,message:o}).catch((()=>null)))}))}}const O=e=>n.existsSync(e)?n.readFileSync(e):void 0,P={http:O(x.API_HTTP_CRT),token:O(x.API_TOKEN_CRT)},C={http:O(x.API_HTTP_KEY),token:O(x.API_TOKEN_KEY)};class S extends d.Store{constructor(){super(),this.all=e=>y(this,void 0,void 0,(function*(){e=e||r.noop;const t=yield exports.Session.findAll({attributes:["session"],where:{expired:{[a.Op.gte]:Date.now()}}}).catch((t=>(e(t),null)));t&&e(null,t.map((e=>e.session))),e()})),this.clear=e=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy().catch(r.noop),e&&e()})),this.destroy=(e,t)=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy({where:{session:e}}).catch(r.noop),t&&t()})),this.expired=()=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy({where:{expired:{[a.Op.lt]:Date.now()}}}).catch(r.noop)})),this.get=(e,t)=>y(this,void 0,void 0,(function*(){t=t||r.noop;const o=yield exports.Session.findOne({where:{session:e,expired:{[a.Op.gte]:Date.now()}}}).catch((e=>(t(e),null)));if(o){const e=JSON.parse(o.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield o.destroy().catch(r.noop),void t(null)}t(null,e)}else t(null)})),this.length=e=>y(this,void 0,void 0,(function*(){e&&e(null,(yield exports.Session.count().catch(r.noop))||0)})),this.set=(e,t,o)=>y(this,void 0,void 0,(function*(){o=o||r.noop;const s=Date.now()+x.API_SESSION_LIFETIME,i=JSON.stringify(t),[n,d]=(yield exports.Session.findOrCreate({where:{session:e},defaults:{session:e,json:i,expired:s}}).catch(r.noop))||[];n&&(d||(n.json=i,n.expired=s,yield n.save().catch(r.noop))),o()})),this.loop=r.loop(this.expired,3e4),this.loop.start()}}class E{static create(e){return y(this,void 0,void 0,(function*(){if(!C.token)return{error:"KEY NOT FOUND"};const{id:t}=e,o=r.uuidv4(),s=yield exports.Auth.create({secret:o,user_id:t}).catch(E.error);if(!s)return{error:"INTERNAL SERVER ERROR"};return{auth:s,token:p.sign({id:t,secret:o},C.token,E.options())}}))}static destroy(e){return y(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){A.error(e.message,"api.token",x.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:x.API_TOKEN_LIFETIME+"ms"}}static renew(e){return y(this,void 0,void 0,(function*(){if(!C.token)return{error:"KEY NOT FOUND"};const{error:t,decode:o}=E.verify(e,x.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(o){const{id:e,secret:t}=o;if(e&&t){const o=yield exports.User.findOne({where:{id:e,state:!0}}).catch(E.error);if(o){const s=yield exports.Auth.findOne({where:{secret:t,user_id:o.id}}).catch(E.error);if(s&&!s.logout){s.secret=r.uuidv4(),yield s.save().catch(E.error);return{auth:s,token:p.sign({id:e,secret:s.secret},C.token,E.options())}}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}}))}static user(e,t,r){return y(this,void 0,void 0,(function*(){if(e){t=r.hash.encrypt(e);const o=yield exports.User.findOne({where:{token:t,state:!0}}).catch(E.error);if(o){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield exports.Auth.findOrCreate({where:{secret:t,user_id:o.id},defaults:{secret:t,user_id:o.id}}).catch(E.error))||[];if(r)return{auth:r,user:o}}return{error:"ACCESS DENIED"}}const{error:o,decode:s}=E.verify(t);if(o)return{error:o};if(s){const{id:e,secret:t}=s;if(e&&t){const r=yield exports.User.findOne({where:{id:e,state:!0}}).catch(E.error);if(r){const e=yield exports.Auth.findOne({where:{secret:t,user_id:r.id}}).catch(E.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}}))}static verify(e,t){if(!P.token)return{error:"CERT NOT FOUND"};if(!e||e.split(".").length<3)return{error:"INVALID TOKEN"};try{return{decode:p.verify(e,P.token,{clockTolerance:t})}}catch(e){return{error:"INVALID TOKEN"}}}}class f extends e.Application{constructor(e){super(e,{cert:P.http,cross:x.API_HTTP_CROSS,hybrid:x.API_HTTP_HYBRID,key:C.http,notfound:x.API_HTTP_NOTFOUND,path:x.API_HTTP_PATH,port:x.API_HTTP_PORT,public:x.API_HTTP_PUBLIC,redirect:x.API_HTTP_REDIRECT,session:{store:new S,name:x.API_SESSION_NAME,secret:x.API_SESSION_SECRET,cookie:{maxAge:x.API_SESSION_LIFETIME},genid:r.uuidv4}}),this.hash=new t.Hash(x.API_KEY_HASH)}error(e,t){A.error(e.message,t,x.API_CONSOLE_ERROR)}log(e,t){A.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return y(this,void 0,void 0,(function*(){yield h.sync(),yield e.listen.call(this),x.API_WEBSOCKET_START&&this.server&&(this._webSocket=new o.WebSocketServer({server:this.server,verifyClient:(e,t)=>t(x.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>y(this,void 0,void 0,(function*(){t.url||(t.url="");const o=t.url.length<=1?"":t.url.replace(/\//g,".");let s;e.on("message",(r=>y(this,void 0,void 0,(function*(){if(s)try{const i=JSON.parse(r);this.emit("ws.message"+o,{data:i,message:r,req:t,user:s,ws:e})}catch(i){this.emit("ws.message"+o,{message:r,req:t,user:s,ws:e})}else{const{user:i}=yield E.user("",r.toString(),this);i&&(s=i,this.emit("ws.connection"+o,{req:t,user:s,ws:e}))}s||e.close()})))),e.on("close",(()=>{s&&this.emit("ws.close"+o,{user:s,ws:e})})),yield r.sleep(2e3),s||e.close()})))))}))}websocket(){return this._webSocket}}const I=e=>{var t,r,o,s,i,n,d,a,p;return{audit_client:null!==(t=e.ip())&&void 0!==t?t:"0.0.0.0",audit_href:(null===(r=null==e?void 0:e.req)||void 0===r?void 0:r.protocol)+"://"+(null===(o=null==e?void 0:e.req)||void 0===o?void 0:o.get("host"))+(null===(s=null==e?void 0:e.req)||void 0===s?void 0:s.originalUrl),audit_user_agent:null!==(n=null===(i=e.req)||void 0===i?void 0:i.headers["user-agent"])&&void 0!==n?n:"",audit_user_id:null!==(p=null===(a=null===(d=null==e?void 0:e.req)||void 0===d?void 0:d.user)||void 0===a?void 0:a.id)&&void 0!==p?p:null}};class R{static all(){return y(this,void 0,void 0,(function*(){const e=yield exports.Configs.findAll().catch(R.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e,t){return y(this,void 0,void 0,(function*(){var r;const o=null!==(r=null==t?void 0:t.id)&&void 0!==r?r:null;return((yield exports.Configs.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:o})).catch(R.error))||0)>0}))}static error(e){A.error(e.message,"api.config",x.API_CONSOLE_ERROR)}static get(e){return y(this,arguments,void 0,(function*(e,t=""){const[r]=(yield exports.Configs.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(R.error))||[];return r?r.value:t}))}static set(e,t,r){return y(this,void 0,void 0,(function*(){var o;const s=null!==(o=null==r?void 0:r.id)&&void 0!==o?o:null,[i]=(yield exports.Configs.findOrCreate(Object.assign({where:{key:e}},{user_id:s})).catch(R.error))||[];i&&(i.value=t,yield i.save().catch(R.error))}))}}const T=e.parameterFactory((({ctx:e})=>I(e))),D=e.parameterFactory((({ctx:e})=>e.req.auth)),w=e.parameterFactory((({ctx:e})=>e.req.user));class N extends r.EventEmitter{auth(e,t,r,o,s){return y(this,void 0,void 0,(function*(){const{auth:i,error:n,user:d}=yield E.user(t,r,s);return n?e.error(n):i&&d?i.user_agent&&i.user_agent!=o?e.error("INVALID TOKEN"):(e.req.auth=i,e.req.user=d,void e.next()):e.error("INTERNAL SERVER ERROR")}))}create(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".create",r)}))}delete(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".delete",r)}))}error(e){A.error(e.message,"api.controller",x.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r){return y(this,void 0,void 0,(function*(){if(r){const o=yield this.permissions(r,{route:t});if(o&&o.length>0)return e.next()}e.unauthorized("ACCESS DENIED")}))}permissions(e,t){return y(this,void 0,void 0,(function*(){return yield exports.Permission.findAll({where:Object.assign(Object.assign({},null!=t?t:{}),{state:!0}),include:[{model:exports.GroupPermission,required:!0,include:[{model:exports.Group,required:!0,where:{state:!0},include:[{model:exports.UserGroup,required:!0,where:{user_id:e.id}}]}]}]}).catch(this.error)}))}read(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".read",r)}))}session(e,t,o){return y(this,void 0,void 0,(function*(){o.auth&&o.user&&(o.user_agent?o.user_agent!=t&&o.regenerate(r.noop):(o.user_agent=t,o.save(r.noop))),e.next()}))}upload(t,r){r.path||(r.path=x.API_UPLOAD_TEMP),r.size||(r.size=x.API_UPLOAD_SIZE),r.field||(r.field=x.API_UPLOAD_FIELD),e.Upload.middleware(t,r)}update(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".update",r)}))}validation(e,t){return y(this,void 0,void 0,(function*(){const{error:o,value:s}=yield r.Validation.object(t).parse().validateAsync(e.req.body);if(o)return e.validation(o);e.req.body=s,e.next()}))}}u([c(0,e.Ctx()),c(1,e.Headers(x.API_KEY_HEADER)),c(2,e.Headers(x.API_TOKEN_HEADER)),c(3,e.Headers("user-agent")),c(4,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,String,f]),g("design:returntype",Promise)],N.prototype,"auth",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],N.prototype,"create",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],N.prototype,"delete",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],N.prototype,"permission",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],N.prototype,"read",null),u([c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Session()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object]),g("design:returntype",Promise)],N.prototype,"session",null),u([c(0,e.Ctx()),c(1,e.Argument()),g("design:type",Function),g("design:paramtypes",[e.Context,Object]),g("design:returntype",void 0)],N.prototype,"upload",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],N.prototype,"update",null),u([c(0,e.Ctx()),c(1,e.Argument()),g("design:type",Function),g("design:paramtypes",[e.Context,Object]),g("design:returntype",Promise)],N.prototype,"validation",null),exports.ModelController=class extends N{constructor(){super(...arguments),this._columns=[]}_add(t){return y(this,arguments,void 0,(function*({ctx:t,options:r,body:o}){const s=yield this.model().create(Object.assign(Object.assign({},t.req.body),o||{}),Object.assign(Object.assign({},r||{}),I(t))).catch(this.error);if(s){const r=this.key();return t.prepare(e.Status.OK,{[r]:s.getDataValue(r)}),s}t.error("INTERNAL SERVER ERROR")}))}_all(t){return y(this,arguments,void 0,(function*({ctx:t,options:o,callback:s,scope:i}){var n,d,p,l;const u=this.scope(i),c=Object.assign({},o||{});c.where=Object.assign({},c.where||{});const g=t.req.query.limit,y=r.isString(g)?parseInt(g):x.API_MODEL_LIMIT;c.limit=y>=0?Math.min(y,x.API_MODEL_LIMIT_MAX):void 0;const h=t.req.query.offset;if(r.isString(h)){const e=h?parseInt(h):0;c.offset=e>0?e:void 0}const v=[],m=this.columns(),_=e=>m.indexOf(e)>=0,A=null===(n=t.req.query.asc)||void 0===n?void 0:n.toString();A&&A.length&&v.push(...A.split(",").filter(_).map((e=>[e,"ASC"])));const O=null===(d=t.req.query.desc)||void 0===d?void 0:d.toString();O&&O.length&&v.push(...O.split(",").filter(_).map((e=>[e,"DESC"]))),v.length&&(c.order=v);const P=[],C=null===(p=t.req.query.search)||void 0===p?void 0:p.toString();(r.isArray(c.attributes)?c.attributes:m).filter(r.isString).forEach((e=>{var r;if(C&&C.length&&P.push({[e]:{[a.Op.like]:`%${C}%`}}),"search_"+e in t.req.query){const o=null===(r=t.req.query["search_"+e])||void 0===r?void 0:r.toString();o&&o.length&&P.push({[e]:{[a.Op.like]:`%${o}%`}})}})),P.length&&(c.where=Object.assign(Object.assign({},c.where),{[a.Op.or]:[...P]}));const S=null!==(l=yield u.count(Object.assign(Object.assign({},c),{col:m[0]})).catch(this.error))&&void 0!==l?l:0,E=yield u.findAll(c).catch(this.error),f={count:S};return E?(t.prepare(e.Status.OK,Object.assign(Object.assign({},f),{records:s?yield s(E):E})),Object.assign(Object.assign({},f),{records:E})):(t.error("INTERNAL SERVER ERROR"),Object.assign(Object.assign({},f),{records:[]}))}))}columns(){return 0==this._columns.length&&(this._columns=Object.keys(this.model().getAttributes())),this._columns}_del(e){return y(this,arguments,void 0,(function*({ctx:e,options:t}){const r=this.key(),{[r]:o}=e.req.params;if(!o)return e.error("INTERNAL SERVER ERROR"),0;const s=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[r]:o}),individualHooks:!0}),I(e))).catch(this.error);return s?(e.success("OK"),s):(e.notFound("RECORD NOT FOUND"),0)}))}error(e){e.sql?A.error(e.message+"\n"+e.sql,"api.controller.sql",x.API_CONSOLE_ERROR):super.error(e)}_get(t){return y(this,arguments,void 0,(function*({ctx:t,options:r,callback:o,scope:s}){const i=this.key(),{[i]:n}=t.req.params,d=yield this.scope(s).findOne(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[i]:n})})).catch(this.error);return d?(t.prepare(e.Status.OK,o?yield o(d):d.toJSON()),d):null===d?t.notFound("RECORD NOT FOUND"):void t.error("INTERNAL SERVER ERROR")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}_set(e){return y(this,arguments,void 0,(function*({ctx:e,options:t,body:r}){var o;const s=this.key(),{[s]:i}=e.req.params,[n]=null!==(o=yield this.model().update(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[s]:i}),individualHooks:!0}),I(e))).catch(this.error))&&void 0!==o?o:[];return n?(e.success("OK"),!0):(e.success("RECORD NOT CHANGED"),!1)}))}},exports.ModelController=u([e.Extends(N)],exports.ModelController),exports.AuditsController=class extends exports.ModelController{model(){return exports.Audit}all(e,t,r){return y(this,void 0,void 0,(function*(){const o={};t&&(o.type=t),r&&(o.table=r),yield this._all({ctx:e,options:{attributes:{exclude:["data","previously"]},where:o,order:[["created_at","DESC"]]}})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}},u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),c(1,e.Query("type")),c(2,e.Query("table")),g("design:type",Function),g("design:paramtypes",[e.Context,String,String]),g("design:returntype",Promise)],exports.AuditsController.prototype,"all",null),u([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.AuditsController.prototype,"get",null),exports.AuditsController=u([e.Controller("/audits"),e.Extends(exports.ModelController)],exports.AuditsController),exports.AuthController=class extends N{login(e,o,s,i,n){return y(this,void 0,void 0,(function*(){var d;yield r.sleep(x.API_SLEEP_AUTH);const p=yield exports.User.scope("password").findOne({where:{[a.Op.or]:[{email:s},{username:s}]}}).catch(this.error);if(i+=null!==(d=null==p?void 0:p.salt)&&void 0!==d?d:"",!p||p.password!=t.sha256(i))return e.notFound("INVALID USERNAME OR PASSWORD"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const l=yield exports.Register.findOne({where:{state:!0,user_id:p.id}}).catch(this.error);if(l)return e.error("ACTIVATION REQUIRED"),n.emit("auth.activation",{ctx:e,register:l,user:p}),void this.emit("auth.activation",{ctx:e,register:l,user:p});if(!p.state)return e.notFound("INVALID USERNAME OR PASSWORD"),n.emit("auth.failure",{ctx:e,user:p}),void this.emit("auth.failure",{ctx:e,user:p});const{auth:u,error:c,token:g}=yield E.create(p);return c?(e.error(c),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):u&&g?(u.user_agent=o,yield u.save().catch(this.error),e.json({token:g}),n.emit("auth.login",{auth:u,ctx:e,user:p}),void this.emit("auth.login",{auth:u,ctx:e,user:p})):(e.error("INTERNAL SERVER ERROR"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,r,o){return y(this,void 0,void 0,(function*(){if(yield E.destroy(t))return e.success("OK"),o.emit("auth.logout",{auth:t,ctx:e,user:r}),void this.emit("auth.logout",{auth:t,ctx:e,user:r});e.unauthorized("ACCESS DENIED")}))}renew(e,t,r,o){return y(this,void 0,void 0,(function*(){const{auth:s,error:i,token:n}=yield E.renew(r);return i?e.error(i):s?(s.user_agent=t,yield s.save().catch(this.error),e.json({token:n}),o.emit("auth.renew",{auth:s,ctx:e}),void this.emit("auth.renew",{auth:s,ctx:e})):e.error("INTERNAL SERVER ERROR")}))}user(e,t){return y(this,void 0,void 0,(function*(){const r=yield this.permissions(t);if(!r)return e.error("INTERNAL SERVER ERROR");e.json(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.route))}))}))}},u([e.Post("/login"),e.Middleware("validation",{username:r.Validation.string().min(3).required(),password:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Body("username")),c(3,e.Body("password")),c(4,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,String,f]),g("design:returntype",Promise)],exports.AuthController.prototype,"login",null),u([e.Get("/logout"),e.Middleware("auth"),c(0,e.Ctx()),c(1,D()),c(2,w()),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.Auth,exports.User,f]),g("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),u([e.Post("/renew"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Body("token")),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,f]),g("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),u([e.Get(),e.Middleware("auth"),c(0,e.Ctx()),c(1,w()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=u([e.Controller("/auth"),e.Extends(N)],exports.AuthController),exports.FilesController=class extends N{directory(){return x.API_HTTP_PUBLIC||"./"}files(e){return y(this,void 0,void 0,(function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const o=l.join(this.directory(),t);if(!n.existsSync(o)||!n.statSync(o).isDirectory())return e.notFound("RECORD NOT FOUND");let s=[];return s=n.readdirSync(o),s=s.map((e=>this.info(l.join(o,e)))),s=s.filter(r.isDef),Object.assign(Object.assign({},this.info(o)),{files:s})}))}access(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,this.name()+"."+t,r)}))}info(e){if(!n.existsSync(e))return null;const t=n.statSync(e),r=e.split("/").pop();e=e.replace(this.directory(),"/").replace(/^\/\//,"/");const o=t.isDirectory();return{name:r,path:e.replace(/^\/\//,"/"),size:t.size,extension:o?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:o,symlink:t.isSymbolicLink()}}name(){return"files"}},u([e.Get("/path/?*"),e.Middleware("auth"),e.Middleware("access","list"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.FilesController.prototype,"files",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],exports.FilesController.prototype,"access",null),exports.FilesController=u([e.Controller("/files"),e.Extends(N)],exports.FilesController),exports.ForgotController=class extends N{check(e,t){return y(this,void 0,void 0,(function*(){const o=yield this.find(t);if(!o||!o.user)return e.notFound("RECORD NOT FOUND");o.token=r.uniqueID(),yield o.save(),e.json({token:o.token})}))}forgot(e,t,o){return y(this,void 0,void 0,(function*(){yield r.sleep(x.API_SLEEP_FORGOT);const s=t,i=yield exports.User.findOne({where:{[a.Op.or]:[{email:s},{username:t}]}}).catch(this.error);if(!i)return e.notFound("RECORD NOT FOUND");const n=r.uniqueID(),d=Date.now()+6e4*x.API_TOKEN_FORGOT,p=yield exports.Forgot.create({token:n,timestamp:d,state:!0,user_id:i.id});e.success("OK"),o.emit("forgot.send",{ctx:e,forgot:p,user:i}),this.emit("forgot.send",{ctx:e,forgot:p,user:i})}))}reset(e,r,o,s){return y(this,void 0,void 0,(function*(){const i=yield this.find(r);if(!i)return e.notFound("RECORD NOT FOUND");i.state=!1,yield i.save().catch(this.error),i.user.password=t.sha256(o),yield i.user.save().catch(this.error),e.success("OK"),s.emit("forgot.reset",{ctx:e,user:i.user}),this.emit("forgot.reset",{ctx:e,user:i.user})}))}find(e){return y(this,void 0,void 0,(function*(){return yield exports.Forgot.findOne({where:{token:e,state:!0},include:[{model:exports.User,required:!0}]}).catch(this.error)}))}},u([e.Get("/check"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Body("token")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),u([e.Post(),e.Middleware("validation",{username:r.Validation.string().min(4).required()}),c(0,e.Ctx()),c(1,e.Body("username")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,f]),g("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),u([e.Post("/reset"),e.Middleware("validation",{token:r.Validation.string().required(),password:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Body("token")),c(2,e.Body("password")),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,f]),g("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=u([e.Controller("/forgot"),e.Extends(N)],exports.ForgotController),exports.CrudController=class extends exports.ModelController{constructor(){super(...arguments),this._crud={}}add(e){return y(this,void 0,void 0,(function*(){yield this._add({ctx:e})}))}all(e){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}CrudCreate(){return this._crud}del(e){return y(this,void 0,void 0,(function*(){yield this._del({ctx:e})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e){return y(this,void 0,void 0,(function*(){yield this._set({ctx:e})}))}CrudUpdate(){return this._crud}validationAdd(e){return y(this,void 0,void 0,(function*(){const t=this.CrudCreate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)}))}validationSet(e){return y(this,void 0,void 0,(function*(){const t=this.CrudUpdate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)}))}},u([e.Post(),e.Middleware("auth"),e.Middleware("create"),e.Middleware("validationAdd"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"add",null),u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"all",null),u([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("delete"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"del",null),u([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"get",null),u([e.Put("/:id"),e.Middleware("auth"),e.Middleware("update"),e.Middleware("validationSet"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"set",null),u([c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"validationAdd",null),u([c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"validationSet",null),exports.CrudController=u([e.Extends(exports.ModelController)],exports.CrudController),exports.GroupsController=class extends exports.CrudController{model(){return exports.Group}CrudCreate(){return{name:r.Validation.string().required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}}CrudUpdate(){return{name:r.Validation.string().empty(),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}}},exports.GroupsController=u([e.Controller("/groups"),e.Extends(exports.CrudController)],exports.GroupsController),exports.GroupsPermissionsController=class extends exports.ModelController{model(){return exports.GroupPermission}all(e,t){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{group_id:t},include:[{model:exports.Permission,required:!0}]},callback:e=>e.map((e=>e.permission))})}))}set(e,t,o,s){return y(this,void 0,void 0,(function*(){const i=yield exports.Group.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield exports.GroupPermission.destroy(Object.assign({where:{group_id:t},individualHooks:!0},s)),o){let e=0;yield r.sleep(1e3);for(let r=0;r<o.length;r++)e=yield exports.Permission.count({where:{id:o[r]}}),e&&(yield exports.GroupPermission.create({group_id:t,permission_id:o[r]},Object.assign({},s)))}return e.success("OK")}if(r.isNull(i))return e.notFound("RECORD NOT FOUND");e.error("INTERNAL SERVER ERROR")}))}},u([e.Get("/:id/routes"),e.Middleware("auth"),e.Middleware("read","groups"),c(0,e.Ctx()),c(1,e.Params("id")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"all",null),u([e.Put("/:id/permissions"),e.Middleware("auth"),e.Middleware("update","groups"),e.Middleware("validation",{permissions:r.Validation.array(r.Validation.number().parse())}),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.Body("permissions")),c(3,T()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Array,Object]),g("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"set",null),exports.GroupsPermissionsController=u([e.Controller("/groups"),e.Extends(exports.ModelController)],exports.GroupsPermissionsController),exports.LogsController=class extends exports.ModelController{model(){return exports.Log}all(e,t,r){return y(this,void 0,void 0,(function*(){const o={};t&&(o.type=t),r&&(o.source=r),yield this._all({ctx:e,options:{where:o,order:[["created_at","DESC"]]}})}))}},u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),c(1,e.Query("type")),c(2,e.Query("source")),g("design:type",Function),g("design:paramtypes",[e.Context,String,String]),g("design:returntype",Promise)],exports.LogsController.prototype,"all",null),exports.LogsController=u([e.Controller("/logs"),e.Extends(exports.ModelController)],exports.LogsController),exports.PermissionsController=class extends exports.CrudController{model(){return exports.Permission}CrudCreate(){return{name:r.Validation.string().required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}}CrudUpdate(){return{name:r.Validation.string().empty(),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}}},exports.PermissionsController=u([e.Controller("/permissions"),e.Extends(exports.CrudController)],exports.PermissionsController),exports.RegisterController=class extends N{register(e,o,s){return y(this,void 0,void 0,(function*(){yield r.sleep(x.API_SLEEP_REGISTRY);const{name:i,date:n,email:d,username:p,password:l,confirm:u}=o,c=p||d,g=t.sha256(l);if(yield exports.User.count({where:{[a.Op.or]:[{email:d},{username:c}]}}).catch(this.error))return e.validation("INVALID EMAIL OR USERNAME");if(g!=t.sha256(u))return e.error("INVALID PASSWORD");const y=yield exports.User.create({name:i,email:d,username:c,password:g,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!y)return e.error("INTERNAL SERVER ERROR");const h=yield exports.Register.create({token:yield this.getId(),user_id:y.id,state:!0}).catch(this.error);if(!h)return yield y.destroy().catch(this.error),e.error("INTERNAL SERVER ERROR");e.success("OK"),s.emit("register.user",{ctx:e,register:h,user:y}),this.emit("register.user",{ctx:e,register:h,user:y})}))}confirm(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield exports.Register.findOne({where:{token:t,state:!0},include:[{model:exports.User,required:!0}]}).catch(this.error);if(!o)return e.notFound("RECORD NOT FOUND");o.state=!1,yield o.save().catch(this.error),o.user.state=!0,yield o.user.save().catch(this.error),e.success("OK"),r.emit("register.confirm",{ctx:e,register:o,user:o.user}),this.emit("register.confirm",{ctx:e,register:o,user:o.user})}))}send(e,t,r){return y(this,void 0,void 0,(function*(){const o=t,s=yield exports.Register.findOne({where:{state:!0},include:[{model:exports.User,required:!0,where:{[a.Op.or]:[{email:o},{username:t}]}}]}).catch(this.error);if(!s)return e.notFound("RECORD NOT FOUND");e.success("OK"),r.emit("register.send",{ctx:e,register:s,user:s.user}),this.emit("register.send",{ctx:e,register:s,user:s.user})}))}getId(){return y(this,void 0,void 0,(function*(){const e=r.uuidv4();return(yield exports.Register.count({where:{token:e}}))?this.getId():e}))}},u([e.Post(),e.Middleware("validation",{name:r.Validation.string().required(),date:r.Validation.date().required(),email:r.Validation.string().email().required(),username:r.Validation.string().min(4).empty(),password:r.Validation.string().min(5).required(),confirm:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Body()),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,Object,f]),g("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),u([e.Post("/confirm"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Body("token")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,f]),g("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),u([e.Post("/send"),e.Middleware("validation",{username:r.Validation.string().min(4).required()}),c(0,e.Ctx()),c(1,e.Body("username")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,f]),g("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=u([e.Controller("/register"),e.Extends(N)],exports.RegisterController),exports.SetupController=class extends N{setup(e,o){return y(this,void 0,void 0,(function*(){if(0==(yield exports.User.count())){const e=r.uniqueID(),s=yield exports.User.create({name:"Admin",email:"admin@localhost",username:"admin",password:t.sha256("admin"+e),salt:e,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0},Object.assign({},o)),i={description:"API CORE",state:!0},n=yield exports.Group.create(Object.assign({name:"admin"},i),Object.assign({},o));yield exports.UserGroup.create({user_id:s.id,group_id:n.id},Object.assign({},o));const d=["audits","users","groups","routes"],a=["create","read","update","delete"];yield r.forEachSeries(d,(e=>y(this,void 0,void 0,(function*(){yield r.forEachSeries(a,(t=>y(this,void 0,void 0,(function*(){const r=yield exports.Permission.create(Object.assign({name:`${e} ${t}`,route:`${e}.${t}`},i),Object.assign({},o));yield exports.GroupPermission.create({group_id:n.id,permission_id:r.id},Object.assign({},o))}))))}))));const p=["delete","list","read","rename","upload","write"];yield r.forEachSeries(p,(e=>y(this,void 0,void 0,(function*(){const t=yield exports.Permission.create(Object.assign({name:`files ${e}`,route:`files.${e}`},i),Object.assign({},o));yield exports.GroupPermission.create({group_id:n.id,permission_id:t.id},Object.assign({},o))}))));const l=["logs"];yield r.forEachSeries(l,(e=>y(this,void 0,void 0,(function*(){const t=yield exports.Permission.create(Object.assign({name:`${e} files`,route:`${e}.read`},i),Object.assign({},o));yield exports.GroupPermission.create({group_id:n.id,permission_id:t.id},Object.assign({},o))}))))}e.success("OK")}))}},u([e.Get(),c(0,e.Ctx()),c(1,T()),g("design:type",Function),g("design:paramtypes",[e.Context,Object]),g("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=u([e.Controller("/setup"),e.Extends(N)],exports.SetupController),exports.UsersController=class extends exports.ModelController{model(){return exports.User}constructor(){super(),this.path=x.API_HTTP_PUBLIC+"/avatar",x.API_HTTP_PUBLIC&&n.existsSync(x.API_HTTP_PUBLIC)&&!n.existsSync(this.path)&&n.mkdirSync(this.path)}avatar(e,t,r,o){return y(this,void 0,void 0,(function*(){if(t.length){const s=t[0].filename||"";if(s){const t=this.path+"/"+r.avatar;if(n.existsSync(t)&&n.lstatSync(t).isFile()&&n.rmSync(t),r.avatar=s,yield r.save(Object.assign({},o)).catch(this.error))return e.success("OK")}}e.success("RECORD NOT CHANGED")}))}avatar_delete(e,t,r){return y(this,void 0,void 0,(function*(){const o=this.path+"/"+t.avatar;t.avatar="",(yield t.save(Object.assign({},r)).catch(this.error))&&n.existsSync(o)&&n.rmSync(o),e.success("OK")}))}password(e,o,s,i,n){return y(this,void 0,void 0,(function*(){var d;if(x.API_USER_HISTORY){if(yield exports.UserHistory.count({where:{password:t.sha256(s+i.id)}}).catch(this.error))return e.error("PASSWORD PREVIOUSLY REGISTERED")}const a=yield this.scope("password").findOne({where:{id:i.id,state:!0}}).catch(this.error);return o+=null!==(d=null==a?void 0:a.salt)&&void 0!==d?d:"",a&&a.password==t.sha256(o)?(a.salt=r.uniqueID(),a.password=t.sha256(s+a.salt),(yield a.save(Object.assign({},n)).catch(this.error))?e.success("OK"):void e.success("RECORD NOT CHANGED")):e.error("INVALID PASSWORD")}))}token(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.model().findOne({attributes:["token"],where:{id:t.id}}).catch(this.error);if(o)return e.json({token:r.hash.decrypt(o.token)});e.notFound("RECORD NOT FOUND")}))}token_get(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.scope("token").findOne({where:{id:t}}).catch(this.error);if(o)return e.json({token:r.hash.decrypt(o.token)});e.notFound("RECORD NOT FOUND")}))}token_delete(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(o)return o.token="",yield o.save(Object.assign({},r)).catch(this.error),e.success("OK");e.notFound("RECORD NOT FOUND")}))}token_renew(e,t,r,o){return y(this,void 0,void 0,(function*(){const s=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(s){const t=yield this.token_new();return s.token=o.hash.encrypt(t),yield s.save(Object.assign({},r)).catch(this.error),e.json({token:t})}e.notFound("RECORD NOT FOUND")}))}token_new(){return y(this,void 0,void 0,(function*(){var e;const t=r.uuidv4();return(null!==(e=yield this.model().count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t}))}add(e,o){return y(this,void 0,void 0,(function*(){const s=r.uniqueID(),i=yield this._add({ctx:e,body:{password:t.sha256(o+s),salt:s}});x.API_USER_HISTORY&&i&&(yield exports.UserHistory.create({password:t.sha256(o+i.id),user_id:i.id}))}))}all(e){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}del(e,t,r){return y(this,void 0,void 0,(function*(){if(r.id.toString()==t)return e.notFound("RECORD NOT FOUND");yield this._del({ctx:e})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,o,s){return y(this,void 0,void 0,(function*(){if(x.API_USER_HISTORY&&s){const r=t.sha256(s+o);if(yield exports.UserHistory.count({where:{password:r}}).catch(this.error))return e.error("PASSWORD PREVIOUSLY REGISTERED");yield exports.UserHistory.create({password:r,user_id:o}).catch(this.error)}const i=s?r.uniqueID():"";yield this._set({ctx:e,body:s?{password:t.sha256(s+i),salt:i}:{}})}))}},u([e.Post("/avatar"),e.Middleware("auth"),e.Middleware("upload",(e=>({count:1,field:"file",path:e.controller.path,types:["image/bmp","image/jpeg","image/png"],size:32}))),c(0,e.Ctx()),c(1,e.Files()),c(2,w()),c(3,T()),g("design:type",Function),g("design:paramtypes",[e.Context,Array,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),u([e.Delete("/avatar"),e.Middleware("auth"),c(0,e.Ctx()),c(1,w()),c(2,T()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"avatar_delete",null),u([e.Post("/password"),e.Middleware("auth"),e.Middleware("validation",{oldPassword:r.Validation.string().min(5).required(),newPassword:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Body("oldPassword")),c(2,e.Body("newPassword")),c(3,w()),c(4,T()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"password",null),u([e.Get("/token"),e.Middleware("auth"),c(0,e.Ctx()),c(1,w()),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User,f]),g("design:returntype",Promise)],exports.UsersController.prototype,"token",null),u([e.Get("/token/:id"),e.Middleware("auth"),e.Middleware("create"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,f]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_get",null),u([e.Delete("/token/:id"),e.Middleware("auth"),e.Middleware("delete"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,T()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_delete",null),u([e.Get("/token/renew/:id"),e.Middleware("auth"),e.Middleware("update"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,T()),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object,f]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_renew",null),u([e.Post(),e.Middleware("auth"),e.Middleware("create"),e.Middleware("validation",{name:r.Validation.string().required(),email:r.Validation.string().email().required(),username:r.Validation.string().min(4).required(),password:r.Validation.string().min(5).required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}),c(0,e.Ctx()),c(1,e.Body("password")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.UsersController.prototype,"add",null),u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.UsersController.prototype,"all",null),u([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("delete"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],exports.UsersController.prototype,"del",null),u([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.UsersController.prototype,"get",null),u([e.Put("/:id"),e.Middleware("auth"),e.Middleware("update"),e.Middleware("validation",{name:r.Validation.string().empty(),email:r.Validation.string().email().empty(),username:r.Validation.string().min(4).empty(),password:r.Validation.string().min(5).empty().filter(""),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.Body("password")),g("design:type",Function),g("design:paramtypes",[e.Context,String,String]),g("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=u([e.Controller("/users"),e.Extends(exports.ModelController),g("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class extends exports.ModelController{model(){return exports.UserGroup}groups(e,t){return y(this,void 0,void 0,(function*(){yield this.all(e,t.id.toString())}))}all(e,t){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{user_id:t},include:[{model:exports.Group,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,o,s){return y(this,void 0,void 0,(function*(){const i=yield exports.User.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){if(yield exports.UserGroup.destroy(Object.assign({where:{user_id:i.id},individualHooks:!0},s)),o){let e=0;yield r.sleep(1e3);for(let t=0;t<o.length;t++)e=yield exports.Group.count({where:{id:o[t]}}),e&&(yield exports.UserGroup.create({user_id:i.id,group_id:o[t]},Object.assign({},s)))}return e.success("OK")}if(r.isNull(i))return e.notFound("RECORD NOT FOUND");e.error("INTERNAL SERVER ERROR")}))}},u([e.Get("/groups"),e.Middleware("auth"),e.Middleware("read","users"),c(0,e.Ctx()),c(1,w()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"groups",null),u([e.Get("/:id/groups"),e.Middleware("auth"),e.Middleware("read","users"),c(0,e.Ctx()),c(1,e.Params("id")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),u([e.Put("/:id/groups"),e.Middleware("auth"),e.Middleware("update","users"),e.Middleware("validation",{groups:r.Validation.array(r.Validation.number().parse())}),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.Body("groups")),c(3,T()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Array,Object]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=u([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersGroupsController),exports.Application=f,exports.Config=R,exports.ControllerBase=N,exports.Env=x,exports.Logs=A,exports.Model=v,exports.ReqAudit=T,exports.ReqAuth=D,exports.ReqUser=w,exports.Token=E,exports.audit=I,exports.crt=P,exports.database=h,exports.hooks=_,exports.key=C;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/api v4.0
|
|
2
|
+
* @andrewcaires/api v4.1.0
|
|
3
3
|
* Simple api for small applications using express, jsonwebtoken, sequelize and websocket
|
|
4
4
|
* (c) 2024 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
6
6
|
*/
|
|
7
7
|
import { Context, IStore, IUpload, Application as Application$1, IFile } from '@andrewcaires/express';
|
|
8
8
|
import { Hash } from '@andrewcaires/node';
|
|
9
|
-
import
|
|
10
|
-
import { EventEmitter, TypeObject, ValidationBase,
|
|
9
|
+
import { WebSocketServer } from 'ws';
|
|
10
|
+
import { TypeObjectAny, EventEmitter, TypeObject, ValidationBase, TypeObjectString } from '@andrewcaires/utils.js';
|
|
11
|
+
import { WhereOptions, Model as Model$2, CreateOptions, Attributes, FindOptions, UpdateOptions, ModelStatic } from 'sequelize';
|
|
11
12
|
import { Model as Model$1, Connection } from '@andrewcaires/sequelize';
|
|
12
|
-
import { Model as Model$2, CreateOptions, Attributes, FindOptions, UpdateOptions, ModelStatic, WhereOptions } from 'sequelize';
|
|
13
13
|
|
|
14
14
|
declare class Model extends Model$1 {
|
|
15
15
|
}
|
|
@@ -18,7 +18,7 @@ declare class Auth extends Model {
|
|
|
18
18
|
id: number;
|
|
19
19
|
secret: string;
|
|
20
20
|
logout: Date;
|
|
21
|
-
|
|
21
|
+
user_agent: string;
|
|
22
22
|
created_at: Date;
|
|
23
23
|
updated_at: Date;
|
|
24
24
|
deleted_at: Date;
|
|
@@ -37,23 +37,24 @@ declare class Register extends Model {
|
|
|
37
37
|
user: User;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
declare class
|
|
40
|
+
declare class Permission extends Model {
|
|
41
41
|
id: number;
|
|
42
42
|
name: string;
|
|
43
|
+
route: string;
|
|
43
44
|
description: string;
|
|
44
45
|
state: boolean;
|
|
45
46
|
created_at: Date;
|
|
46
47
|
updated_at: Date;
|
|
47
48
|
deleted_at: Date;
|
|
48
|
-
|
|
49
|
+
groups_permissions: Array<GroupPermission>;
|
|
49
50
|
}
|
|
50
51
|
|
|
51
|
-
declare class
|
|
52
|
+
declare class GroupPermission extends Model {
|
|
52
53
|
created_at: Date;
|
|
53
54
|
group_id: number;
|
|
54
55
|
group: Group;
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
permission_id: number;
|
|
57
|
+
permission: Permission;
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
declare class Group extends Model {
|
|
@@ -64,7 +65,7 @@ declare class Group extends Model {
|
|
|
64
65
|
created_at: Date;
|
|
65
66
|
updated_at: Date;
|
|
66
67
|
deleted_at: Date;
|
|
67
|
-
groups_routes: Array<
|
|
68
|
+
groups_routes: Array<GroupPermission>;
|
|
68
69
|
users_groups: Array<UserGroup>;
|
|
69
70
|
}
|
|
70
71
|
|
|
@@ -76,6 +77,13 @@ declare class UserGroup extends Model {
|
|
|
76
77
|
user: User;
|
|
77
78
|
}
|
|
78
79
|
|
|
80
|
+
declare class UserHistory extends Model {
|
|
81
|
+
password: string;
|
|
82
|
+
created_at: Date;
|
|
83
|
+
user_id: number;
|
|
84
|
+
user: User;
|
|
85
|
+
}
|
|
86
|
+
|
|
79
87
|
declare class User extends Model {
|
|
80
88
|
id: number;
|
|
81
89
|
name: string;
|
|
@@ -95,6 +103,7 @@ declare class User extends Model {
|
|
|
95
103
|
auths: Array<Auth>;
|
|
96
104
|
registers: Array<Register>;
|
|
97
105
|
users_groups: Array<UserGroup>;
|
|
106
|
+
users_histories: Array<UserHistory>;
|
|
98
107
|
}
|
|
99
108
|
|
|
100
109
|
declare class Audit extends Model {
|
|
@@ -102,7 +111,11 @@ declare class Audit extends Model {
|
|
|
102
111
|
type: string;
|
|
103
112
|
model: string;
|
|
104
113
|
record: string;
|
|
105
|
-
data:
|
|
114
|
+
data: TypeObjectAny;
|
|
115
|
+
previously: TypeObjectAny;
|
|
116
|
+
client: string;
|
|
117
|
+
href: string;
|
|
118
|
+
user_agent: string;
|
|
106
119
|
state: boolean;
|
|
107
120
|
created_at: Date;
|
|
108
121
|
updated_at: Date;
|
|
@@ -147,15 +160,18 @@ declare class Session extends Model {
|
|
|
147
160
|
}
|
|
148
161
|
|
|
149
162
|
declare abstract class ControllerBase extends EventEmitter {
|
|
150
|
-
auth(ctx: Context, key: string, token: string,
|
|
151
|
-
|
|
163
|
+
auth(ctx: Context, key: string, token: string, user_agent: string, app: Application): Promise<void>;
|
|
164
|
+
create(ctx: Context, name: string, user: User): Promise<void>;
|
|
165
|
+
delete(ctx: Context, name: string, user: User): Promise<void>;
|
|
152
166
|
error(error: any): void;
|
|
153
167
|
name(): string;
|
|
154
|
-
permission(ctx: Context,
|
|
168
|
+
permission(ctx: Context, route: string, user: User): Promise<void>;
|
|
169
|
+
permissions(user: User, where?: WhereOptions): Promise<void | Array<Permission>>;
|
|
155
170
|
read(ctx: Context, name: string, user: User): Promise<void>;
|
|
171
|
+
session(ctx: Context, user_agent: string, store: IStore): Promise<void>;
|
|
156
172
|
upload(ctx: Context, options: IUpload): void;
|
|
173
|
+
update(ctx: Context, name: string, user: User): Promise<void>;
|
|
157
174
|
validation(ctx: Context, options: TypeObject<ValidationBase>): Promise<void>;
|
|
158
|
-
write(ctx: Context, name: string, user: User): Promise<void>;
|
|
159
175
|
}
|
|
160
176
|
|
|
161
177
|
declare class Application extends Application$1 {
|
|
@@ -165,14 +181,10 @@ declare class Application extends Application$1 {
|
|
|
165
181
|
error(error: any, source?: string): void;
|
|
166
182
|
log(message: string, source?: string): void;
|
|
167
183
|
listen(): Promise<void>;
|
|
168
|
-
websocket():
|
|
184
|
+
websocket(): WebSocketServer | undefined;
|
|
169
185
|
}
|
|
170
186
|
|
|
171
|
-
declare const audit:
|
|
172
|
-
afterCreate: (record: Model, options: TypeObjectAny) => Promise<void>;
|
|
173
|
-
afterUpdate: (record: Model, options: TypeObjectAny) => Promise<void>;
|
|
174
|
-
afterDestroy: (record: Model, options: TypeObjectAny) => Promise<void>;
|
|
175
|
-
};
|
|
187
|
+
declare const audit: (ctx: Context) => TypeObjectAny;
|
|
176
188
|
|
|
177
189
|
declare class Config {
|
|
178
190
|
static all(): Promise<TypeObjectString>;
|
|
@@ -182,13 +194,10 @@ declare class Config {
|
|
|
182
194
|
static set(key: string, value: string, user?: User): Promise<void>;
|
|
183
195
|
}
|
|
184
196
|
|
|
185
|
-
declare const conn: Connection;
|
|
186
|
-
|
|
187
197
|
interface ArgumentsModelAdd<M extends Model$2<M>> {
|
|
188
198
|
ctx: Context;
|
|
189
199
|
options?: CreateOptions<Attributes<M>>;
|
|
190
200
|
body?: TypeObjectAny;
|
|
191
|
-
user?: User;
|
|
192
201
|
}
|
|
193
202
|
|
|
194
203
|
type CallbackModelAll<M> = (records: Array<M>) => Array<any> | Promise<Array<any>>;
|
|
@@ -203,7 +212,6 @@ interface ArgumentsModelAll<M extends Model$2<M>> {
|
|
|
203
212
|
interface ArgumentsModelDel<M extends Model$2<M>> {
|
|
204
213
|
ctx: Context;
|
|
205
214
|
options?: FindOptions<Attributes<M>>;
|
|
206
|
-
user?: User;
|
|
207
215
|
}
|
|
208
216
|
|
|
209
217
|
type CallbackModelGet<M> = (records: M) => any | Promise<any>;
|
|
@@ -219,7 +227,6 @@ interface ArgumentsModelSet<M extends Model$2<M>> {
|
|
|
219
227
|
ctx: Context;
|
|
220
228
|
options?: UpdateOptions<Attributes<M>>;
|
|
221
229
|
body?: TypeObjectAny;
|
|
222
|
-
user?: User;
|
|
223
230
|
}
|
|
224
231
|
|
|
225
232
|
interface IDatabaseOptions {
|
|
@@ -241,24 +248,22 @@ interface ITokenParameters {
|
|
|
241
248
|
|
|
242
249
|
interface ResultModelAll<M extends Model$2<M>> {
|
|
243
250
|
count: number;
|
|
244
|
-
limit: number;
|
|
245
|
-
offset: number;
|
|
246
251
|
records: Array<M>;
|
|
247
252
|
}
|
|
248
253
|
|
|
249
254
|
declare abstract class ModelController<M extends Model$2<M>> extends ControllerBase {
|
|
250
255
|
private _columns;
|
|
251
|
-
protected _add({ ctx, options, body
|
|
256
|
+
protected _add({ ctx, options, body }: ArgumentsModelAdd<M>): Promise<M | void>;
|
|
252
257
|
protected _all({ ctx, options, callback, scope }: ArgumentsModelAll<M>): Promise<ResultModelAll<M>>;
|
|
253
258
|
protected columns(): Array<string>;
|
|
254
|
-
protected _del({ ctx, options
|
|
259
|
+
protected _del({ ctx, options }: ArgumentsModelDel<M>): Promise<number>;
|
|
255
260
|
error(error: any): void;
|
|
256
261
|
protected _get({ ctx, options, callback, scope }: ArgumentsModelGet<M>): Promise<M | void>;
|
|
257
262
|
key(): string;
|
|
258
263
|
abstract model(): ModelStatic<M>;
|
|
259
264
|
name(): string;
|
|
260
265
|
scope(name?: string): ModelStatic<M>;
|
|
261
|
-
protected _set({ ctx, options, body
|
|
266
|
+
protected _set({ ctx, options, body }: ArgumentsModelSet<M>): Promise<boolean>;
|
|
262
267
|
}
|
|
263
268
|
|
|
264
269
|
declare class AuditsController extends ModelController<Audit> {
|
|
@@ -268,9 +273,9 @@ declare class AuditsController extends ModelController<Audit> {
|
|
|
268
273
|
}
|
|
269
274
|
|
|
270
275
|
declare class AuthController extends ControllerBase {
|
|
271
|
-
protected login(ctx: Context,
|
|
276
|
+
protected login(ctx: Context, user_agent: string, username: string, password: string, app: Application): Promise<void>;
|
|
272
277
|
protected logout(ctx: Context, auth: Auth, user: User, app: Application): Promise<void>;
|
|
273
|
-
protected renew(ctx: Context,
|
|
278
|
+
protected renew(ctx: Context, user_agent: string, old: string, app: Application): Promise<void>;
|
|
274
279
|
protected user(ctx: Context, user: User): Promise<void>;
|
|
275
280
|
}
|
|
276
281
|
|
|
@@ -291,27 +296,27 @@ declare class ForgotController extends ControllerBase {
|
|
|
291
296
|
|
|
292
297
|
declare abstract class CrudController<M extends Model$2<M>> extends ModelController<M> {
|
|
293
298
|
private _crud;
|
|
294
|
-
protected add(ctx: Context
|
|
299
|
+
protected add(ctx: Context): Promise<void>;
|
|
295
300
|
protected all(ctx: Context): Promise<void>;
|
|
296
|
-
|
|
297
|
-
protected del(ctx: Context
|
|
301
|
+
CrudCreate(): TypeObject<ValidationBase>;
|
|
302
|
+
protected del(ctx: Context): Promise<void>;
|
|
298
303
|
protected get(ctx: Context): Promise<void>;
|
|
299
|
-
protected set(ctx: Context
|
|
300
|
-
|
|
304
|
+
protected set(ctx: Context): Promise<void>;
|
|
305
|
+
CrudUpdate(): TypeObject<ValidationBase>;
|
|
301
306
|
protected validationAdd(ctx: Context): Promise<void>;
|
|
302
307
|
protected validationSet(ctx: Context): Promise<void>;
|
|
303
308
|
}
|
|
304
309
|
|
|
305
310
|
declare class GroupsController extends CrudController<Group> {
|
|
306
311
|
model(): typeof Group;
|
|
307
|
-
|
|
308
|
-
|
|
312
|
+
CrudCreate(): TypeObject<ValidationBase>;
|
|
313
|
+
CrudUpdate(): TypeObject<ValidationBase>;
|
|
309
314
|
}
|
|
310
315
|
|
|
311
|
-
declare class
|
|
312
|
-
model(): typeof
|
|
316
|
+
declare class GroupsPermissionsController extends ModelController<GroupPermission> {
|
|
317
|
+
model(): typeof GroupPermission;
|
|
313
318
|
protected all(ctx: Context, group_id: string): Promise<void>;
|
|
314
|
-
protected set(ctx: Context, id: string,
|
|
319
|
+
protected set(ctx: Context, id: string, permissions: Array<number>, audit: TypeObjectAny): Promise<void>;
|
|
315
320
|
}
|
|
316
321
|
|
|
317
322
|
declare class LogsController extends ModelController<Log> {
|
|
@@ -319,6 +324,12 @@ declare class LogsController extends ModelController<Log> {
|
|
|
319
324
|
protected all(ctx: Context, type: string, source: string): Promise<void>;
|
|
320
325
|
}
|
|
321
326
|
|
|
327
|
+
declare class PermissionsController extends CrudController<Permission> {
|
|
328
|
+
model(): typeof Permission;
|
|
329
|
+
CrudCreate(): TypeObject<ValidationBase>;
|
|
330
|
+
CrudUpdate(): TypeObject<ValidationBase>;
|
|
331
|
+
}
|
|
332
|
+
|
|
322
333
|
declare class RegisterController extends ControllerBase {
|
|
323
334
|
protected register(ctx: Context, body: TypeObjectAny, app: Application): Promise<void>;
|
|
324
335
|
protected confirm(ctx: Context, token: string, app: Application): Promise<void>;
|
|
@@ -326,33 +337,27 @@ declare class RegisterController extends ControllerBase {
|
|
|
326
337
|
private getId;
|
|
327
338
|
}
|
|
328
339
|
|
|
329
|
-
declare class RoutesController extends CrudController<Route> {
|
|
330
|
-
model(): typeof Route;
|
|
331
|
-
create(): TypeObject<ValidationBase>;
|
|
332
|
-
update(): TypeObject<ValidationBase>;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
340
|
declare class SetupController extends ControllerBase {
|
|
336
|
-
protected setup(ctx: Context): Promise<void>;
|
|
341
|
+
protected setup(ctx: Context, audit: TypeObjectAny): Promise<void>;
|
|
337
342
|
}
|
|
338
343
|
|
|
339
344
|
declare class UsersController extends ModelController<User> {
|
|
340
|
-
|
|
345
|
+
path: string;
|
|
341
346
|
model(): typeof User;
|
|
342
347
|
constructor();
|
|
343
348
|
protected avatar(ctx: Context, files: Array<IFile>, user: User, audit: TypeObjectAny): Promise<void>;
|
|
344
|
-
protected
|
|
349
|
+
protected avatar_delete(ctx: Context, user: User, audit: TypeObjectAny): Promise<void>;
|
|
345
350
|
protected password(ctx: Context, oldPassword: string, newPassword: string, user: User, audit: TypeObjectAny): Promise<void>;
|
|
346
351
|
protected token(ctx: Context, user: User, app: Application): Promise<void>;
|
|
347
352
|
protected token_get(ctx: Context, id: string, app: Application): Promise<void>;
|
|
348
|
-
protected
|
|
353
|
+
protected token_delete(ctx: Context, id: string, audit: TypeObjectAny): Promise<void>;
|
|
349
354
|
protected token_renew(ctx: Context, id: string, audit: TypeObjectAny, app: Application): Promise<void>;
|
|
350
355
|
private token_new;
|
|
351
|
-
protected add(ctx: Context, password: string
|
|
356
|
+
protected add(ctx: Context, password: string): Promise<void>;
|
|
352
357
|
protected all(ctx: Context): Promise<void>;
|
|
353
358
|
protected del(ctx: Context, id: string, user: User): Promise<void>;
|
|
354
359
|
protected get(ctx: Context): Promise<void>;
|
|
355
|
-
protected set(ctx: Context,
|
|
360
|
+
protected set(ctx: Context, id: string, password: string): Promise<void>;
|
|
356
361
|
}
|
|
357
362
|
|
|
358
363
|
declare class UsersGroupsController extends ModelController<UserGroup> {
|
|
@@ -362,9 +367,10 @@ declare class UsersGroupsController extends ModelController<UserGroup> {
|
|
|
362
367
|
protected set(ctx: Context, id: string, groups: Array<number>, audit: TypeObjectAny): Promise<void>;
|
|
363
368
|
}
|
|
364
369
|
|
|
370
|
+
declare const database: Connection;
|
|
371
|
+
|
|
365
372
|
declare class Env {
|
|
366
373
|
static readonly API_CONSOLE_ERROR: boolean;
|
|
367
|
-
static readonly API_DEFAULT_PATH: string;
|
|
368
374
|
static readonly API_DB_DATABASE: string;
|
|
369
375
|
static readonly API_DB_HOST: string;
|
|
370
376
|
static readonly API_DB_PASSWORD: string;
|
|
@@ -381,12 +387,13 @@ declare class Env {
|
|
|
381
387
|
static readonly API_HTTP_PUBLIC: string;
|
|
382
388
|
static readonly API_HTTP_CROSS: boolean;
|
|
383
389
|
static readonly API_HTTP_HYBRID: boolean;
|
|
390
|
+
static readonly API_HTTP_NOTFOUND: string;
|
|
391
|
+
static readonly API_HTTP_PATH: string;
|
|
384
392
|
static readonly API_HTTP_REDIRECT: string;
|
|
385
393
|
static readonly API_KEY_HASH: string;
|
|
386
394
|
static readonly API_KEY_HEADER: string;
|
|
387
395
|
static readonly API_MODEL_LIMIT: number;
|
|
388
396
|
static readonly API_MODEL_LIMIT_MAX: number;
|
|
389
|
-
static readonly API_NOTFOUND_REDIRECT: string;
|
|
390
397
|
static readonly API_SLEEP_AUTH: number;
|
|
391
398
|
static readonly API_SLEEP_FORGOT: number;
|
|
392
399
|
static readonly API_SLEEP_REGISTRY: number;
|
|
@@ -403,6 +410,7 @@ declare class Env {
|
|
|
403
410
|
static readonly API_UPLOAD_FIELD: string;
|
|
404
411
|
static readonly API_UPLOAD_SIZE: number;
|
|
405
412
|
static readonly API_UPLOAD_TEMP: string;
|
|
413
|
+
static readonly API_USER_HISTORY: boolean;
|
|
406
414
|
static readonly API_WEBSOCKET_START: boolean;
|
|
407
415
|
protected static getBool(key: string, value: boolean): boolean;
|
|
408
416
|
protected static getInt(key: string, value: number): number;
|
|
@@ -425,21 +433,21 @@ declare global {
|
|
|
425
433
|
}
|
|
426
434
|
}
|
|
427
435
|
|
|
436
|
+
declare const hooks: {
|
|
437
|
+
afterCreate: (record: Model, options: TypeObjectAny) => Promise<void>;
|
|
438
|
+
afterUpdate: (record: Model, options: TypeObjectAny) => Promise<void>;
|
|
439
|
+
afterDestroy: (record: Model, options: TypeObjectAny) => Promise<void>;
|
|
440
|
+
};
|
|
441
|
+
|
|
428
442
|
declare class Logs {
|
|
429
|
-
static write(message: string, source?: string,
|
|
430
|
-
static error(message: string, source?: string,
|
|
431
|
-
static info(message: string, source?: string,
|
|
432
|
-
static success(message: string, source?: string,
|
|
433
|
-
static warning(message: string, source?: string,
|
|
443
|
+
static write(message: string, source?: string, show?: boolean): Promise<void>;
|
|
444
|
+
static error(message: string, source?: string, show?: boolean): Promise<void>;
|
|
445
|
+
static info(message: string, source?: string, show?: boolean): Promise<void>;
|
|
446
|
+
static success(message: string, source?: string, show?: boolean): Promise<void>;
|
|
447
|
+
static warning(message: string, source?: string, show?: boolean): Promise<void>;
|
|
434
448
|
private static writeRaw;
|
|
435
449
|
}
|
|
436
450
|
|
|
437
|
-
declare class Permission {
|
|
438
|
-
static all(user: User, where?: WhereOptions): Promise<void | Array<Route>>;
|
|
439
|
-
static get(user: User): Promise<Array<string>>;
|
|
440
|
-
static is(user: User, name: string): Promise<boolean>;
|
|
441
|
-
}
|
|
442
|
-
|
|
443
451
|
declare const crt: {
|
|
444
452
|
http: Buffer | undefined;
|
|
445
453
|
token: Buffer | undefined;
|
|
@@ -459,4 +467,4 @@ declare class Token {
|
|
|
459
467
|
private static verify;
|
|
460
468
|
}
|
|
461
469
|
|
|
462
|
-
export { Application, type ArgumentsModelAdd, type ArgumentsModelAll, type ArgumentsModelDel, type ArgumentsModelGet, type ArgumentsModelSet, Audit, AuditsController, Auth, AuthController, type CallbackModelAll, type CallbackModelGet, Config, Configs, ControllerBase, CrudController, Env, FilesController, Forgot, ForgotController, Group,
|
|
470
|
+
export { Application, type ArgumentsModelAdd, type ArgumentsModelAll, type ArgumentsModelDel, type ArgumentsModelGet, type ArgumentsModelSet, Audit, AuditsController, Auth, AuthController, type CallbackModelAll, type CallbackModelGet, Config, Configs, ControllerBase, CrudController, Env, FilesController, Forgot, ForgotController, Group, GroupPermission, GroupsController, GroupsPermissionsController, type IDatabaseOptions, type ITokenParameters, Log, Logs, LogsController, Model, ModelController, Permission, PermissionsController, Register, RegisterController, ReqAudit, ReqAuth, ReqUser, type ResultModelAll, Session, SetupController, Token, User, UserGroup, UserHistory, UsersController, UsersGroupsController, audit, crt, database, hooks, key };
|
package/dist/index.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/api v4.0
|
|
2
|
+
* @andrewcaires/api v4.1.0
|
|
3
3
|
* Simple api for small applications using express, jsonwebtoken, sequelize and websocket
|
|
4
4
|
* (c) 2024 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
6
6
|
*/
|
|
7
|
-
import{Application as e,parameterFactory as t,Ctx as r,Headers as i,App as n,Session as o,Argument as s,Upload as d,Context as a,Extends as u,Status as c,Get as l,Middleware as p,Query as y,Controller as g,Post as h,Body as v,Delete as _,Put as m,Params as f,Files as P}from"@andrewcaires/express";import{LogColor as I,Log as A,Hash as O,sha256 as E}from"@andrewcaires/node";import{toBool as S,parseMs as w,isObject as T,noop as b,loop as D,uuidv4 as R,sleep as k,EventEmitter as x,Validation as F,isString as N,isArray as j,isDef as q,uniqueID as L,isNull as B,forEachSeries as K}from"@andrewcaires/utils.js";import H from"ws";import{Connection as C,Model as U,Id as M,String as Y,FullDate as G,CreatedAt as z,UpdatedAt as W,DeletedAt as J,BelongsTo as X,Database as $,ModelName as V,Boolean as Z,Text as Q,HasMany as ee,Hooks as te,DateOnly as re,DefaultScope as ie,Scopes as ne,Integer as oe,BigInt as se}from"@andrewcaires/sequelize";import{config as de}from"dotenv";import{existsSync as ae,readFileSync as ue,statSync as ce,readdirSync as le,mkdirSync as pe,lstatSync as ye,rmSync as ge}from"fs";import{Store as he}from"express-session";import{Op as ve}from"sequelize";import{verify as _e,sign as me}from"jsonwebtoken";import{join as fe}from"path";function Pe(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s}function Ie(e,t){return function(r,i){t(r,i,e)}}function Ae(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function Oe(e,t,r,i){return new(r||(r=Promise))((function(n,o){function s(e){try{a(i.next(e))}catch(e){o(e)}}function d(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,d)}a((i=i.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,de();class Ee{static getBool(e,t){return S(Ee.getString(e,t.toString()))}static getInt(e,t){return parseInt(Ee.getString(e,t.toString()))}static getMs(e,t){return w(Ee.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}Ee.API_CONSOLE_ERROR=Ee.getBool("API_CONSOLE_ERROR",!1),Ee.API_DEFAULT_PATH=Ee.getString("API_DEFAULT_PATH","/api"),Ee.API_DB_DATABASE=Ee.getString("API_DB_DATABASE",""),Ee.API_DB_HOST=Ee.getString("API_DB_HOST","127.0.0.1"),Ee.API_DB_PASSWORD=Ee.getString("API_DB_PASSWORD",""),Ee.API_DB_PORT=Ee.getInt("API_DB_PORT",3306),Ee.API_DB_TYPE=Ee.getString("API_DB_TYPE",""),Ee.API_DB_USERNAME=Ee.getString("API_DB_USERNAME","root"),Ee.API_DB_LOG=Ee.getBool("API_DB_LOG",!1),Ee.API_DB_AUDIT=Ee.getBool("API_DB_AUDIT",!0),Ee.API_DB_PREFIX=Ee.getString("API_DB_PREFIX",""),Ee.API_DB_TIMEZONE=Ee.getString("API_DB_TIMEZONE","+00:00"),Ee.API_HTTP_CRT=Ee.getString("API_HTTP_CRT",""),Ee.API_HTTP_KEY=Ee.getString("API_HTTP_KEY",""),Ee.API_HTTP_PORT=Ee.getInt("API_HTTP_PORT",3e3),Ee.API_HTTP_PUBLIC=Ee.getString("API_HTTP_PUBLIC",""),Ee.API_HTTP_CROSS=Ee.getBool("API_HTTP_CROSS",!1),Ee.API_HTTP_HYBRID=Ee.getBool("API_HTTP_HYBRID",!1),Ee.API_HTTP_REDIRECT=Ee.getString("API_HTTP_REDIRECT",""),Ee.API_KEY_HASH=Ee.getString("API_KEY_HASH",""),Ee.API_KEY_HEADER=Ee.getString("API_KEY_HEADER","api_key"),Ee.API_MODEL_LIMIT=Ee.getInt("API_MODEL_LIMIT",10),Ee.API_MODEL_LIMIT_MAX=Ee.getInt("API_MODEL_LIMIT_MAX",500),Ee.API_NOTFOUND_REDIRECT=Ee.getString("API_NOTFOUND_REDIRECT",""),Ee.API_SLEEP_AUTH=Ee.getMs("API_SLEEP_AUTH","2s"),Ee.API_SLEEP_FORGOT=Ee.getMs("API_SLEEP_FORGOT","5s"),Ee.API_SLEEP_REGISTRY=Ee.getMs("API_SLEEP_REGISTRY","5s"),Ee.API_SESSION_NAME=Ee.getString("API_SESSION_NAME","session.id"),Ee.API_SESSION_LIFETIME=Ee.getMs("API_SESSION_LIFETIME","1d"),Ee.API_SESSION_SECRET=Ee.getString("API_SESSION_SECRET","yoursecret"),Ee.API_TOKEN_CRT=Ee.getString("API_TOKEN_CRT",""),Ee.API_TOKEN_KEY=Ee.getString("API_TOKEN_KEY",""),Ee.API_TOKEN_FORGOT=Ee.getMs("API_TOKEN_LIFETIME","1d"),Ee.API_TOKEN_HEADER=Ee.getString("API_TOKEN_HEADER","authorization"),Ee.API_TOKEN_LIFETIME=Ee.getMs("API_TOKEN_LIFETIME","1d"),Ee.API_TOKEN_RENEW=Ee.getMs("API_TOKEN_RENEW","1d"),Ee.API_UPLOAD_COUNT=Ee.getInt("API_UPLOAD_COUNT",1),Ee.API_UPLOAD_FIELD=Ee.getString("API_UPLOAD_FIELD","upload"),Ee.API_UPLOAD_SIZE=Ee.getInt("API_UPLOAD_SIZE",2),Ee.API_UPLOAD_TEMP=Ee.getString("API_UPLOAD_TEMP","./temp"),Ee.API_WEBSOCKET_START=Ee.getBool("API_WEBSOCKET_START",!1);const Se=new C({type:Ee.API_DB_TYPE,database:Ee.API_DB_DATABASE,username:Ee.API_DB_USERNAME,password:Ee.API_DB_PASSWORD,hostname:Ee.API_DB_HOST,hostport:Ee.API_DB_PORT,logging:Ee.API_DB_LOG,prefix:Ee.API_DB_PREFIX});class we extends U{}const Te={afterCreate:(e,t)=>Oe(void 0,void 0,void 0,(function*(){var r,i,n;if(!Ee.API_DB_AUDIT)return;const o=T(e)?e.constructor:null,s=null!==(r=null==o?void 0:o.primaryKeyAttribute)&&void 0!==r?r:null;yield Fe.create({type:"CREATE",model:null!==(i=null==o?void 0:o.getTableName())&&void 0!==i?i:null,record:s?e.getDataValue(s):null,data:JSON.stringify(e.toJSON()),state:!0,user_id:null!==(n=null==t?void 0:t.user_id)&&void 0!==n?n:null}).catch(b)})),afterUpdate:(e,t)=>Oe(void 0,void 0,void 0,(function*(){var r,i,n;if(!Ee.API_DB_AUDIT)return;const o=T(e)?e.constructor:null,s=null!==(r=null==o?void 0:o.primaryKeyAttribute)&&void 0!==r?r:null,d={},a=e.changed();a&&a.forEach((t=>d[t]=e.getDataValue(t))),yield Fe.create({type:"UPDATE",model:null!==(i=null==o?void 0:o.getTableName())&&void 0!==i?i:null,record:s?e.getDataValue(s):null,data:JSON.stringify({before:e.previous(),after:d}),state:!0,user_id:null!==(n=null==t?void 0:t.user_id)&&void 0!==n?n:null}).catch(b)})),afterDestroy:(e,t)=>Oe(void 0,void 0,void 0,(function*(){var r,i,n;if(!Ee.API_DB_AUDIT)return;const o=T(e)?e.constructor:null,s=null!==(r=null==o?void 0:o.primaryKeyAttribute)&&void 0!==r?r:null;yield Fe.create({type:"DELETE",model:null!==(i=null==o?void 0:o.getTableName())&&void 0!==i?i:null,record:s?e.getDataValue(s):null,data:JSON.stringify(e.toJSON()),state:!0,user_id:null!==(n=null==t?void 0:t.user_id)&&void 0!==n?n:null}).catch(b)}))};let be=class extends we{};Pe([M(),Ae("design:type",Number)],be.prototype,"id",void 0),Pe([Y(),Ae("design:type",Y)],be.prototype,"secret",void 0),Pe([G(),Ae("design:type",Date)],be.prototype,"logout",void 0),Pe([Y(),Ae("design:type",Y)],be.prototype,"useragent",void 0),Pe([z,Ae("design:type",Date)],be.prototype,"created_at",void 0),Pe([W,Ae("design:type",Date)],be.prototype,"updated_at",void 0),Pe([J,Ae("design:type",Date)],be.prototype,"deleted_at",void 0),Pe([X((()=>xe)),Ae("design:type",Number)],be.prototype,"user_id",void 0),be=Pe([$(Se),V("auth")],be);let De=class extends we{};Pe([M(),Ae("design:type",Number)],De.prototype,"id",void 0),Pe([Y(),Ae("design:type",Y)],De.prototype,"token",void 0),Pe([Z(),Ae("design:type",Z)],De.prototype,"state",void 0),Pe([z,Ae("design:type",Date)],De.prototype,"created_at",void 0),Pe([W,Ae("design:type",Date)],De.prototype,"updated_at",void 0),Pe([J,Ae("design:type",Date)],De.prototype,"deleted_at",void 0),Pe([X((()=>xe)),Ae("design:type",Number)],De.prototype,"user_id",void 0),De=Pe([$(Se),V("register")],De);let Re=class extends we{};Pe([M(),Ae("design:type",Number)],Re.prototype,"id",void 0),Pe([Y(),Ae("design:type",Y)],Re.prototype,"name",void 0),Pe([Q(),Ae("design:type",Y)],Re.prototype,"description",void 0),Pe([Z(),Ae("design:type",Z)],Re.prototype,"state",void 0),Pe([z,Ae("design:type",Date)],Re.prototype,"created_at",void 0),Pe([W,Ae("design:type",Date)],Re.prototype,"updated_at",void 0),Pe([J,Ae("design:type",Date)],Re.prototype,"deleted_at",void 0),Pe([ee((()=>ke),"group_id"),Ae("design:type",Array)],Re.prototype,"groups_routes",void 0),Pe([ee((()=>ke),"group_id"),Ae("design:type",Array)],Re.prototype,"users_groups",void 0),Re=Pe([$(Se),V("group"),te(Te)],Re);let ke=class extends we{};Pe([z,Ae("design:type",Date)],ke.prototype,"created_at",void 0),Pe([X((()=>Re)),Ae("design:type",Number)],ke.prototype,"group_id",void 0),Pe([X((()=>xe)),Ae("design:type",Number)],ke.prototype,"user_id",void 0),ke=Pe([$(Se),V("users_groups"),te(Te)],ke);let xe=class extends we{};Pe([M(),Ae("design:type",Number)],xe.prototype,"id",void 0),Pe([Y(),Ae("design:type",Y)],xe.prototype,"name",void 0),Pe([Y(),Ae("design:type",Y)],xe.prototype,"email",void 0),Pe([Y(),Ae("design:type",Y)],xe.prototype,"username",void 0),Pe([Y(),Ae("design:type",Y)],xe.prototype,"password",void 0),Pe([Y(),Ae("design:type",Y)],xe.prototype,"salt",void 0),Pe([Y(),Ae("design:type",Y)],xe.prototype,"token",void 0),Pe([Y(),Ae("design:type",Y)],xe.prototype,"avatar",void 0),Pe([re(),Ae("design:type",Y)],xe.prototype,"date",void 0),Pe([Q(),Ae("design:type",Y)],xe.prototype,"description",void 0),Pe([Z(),Ae("design:type",Z)],xe.prototype,"state",void 0),Pe([z,Ae("design:type",Date)],xe.prototype,"created_at",void 0),Pe([W,Ae("design:type",Date)],xe.prototype,"updated_at",void 0),Pe([J,Ae("design:type",Date)],xe.prototype,"deleted_at",void 0),Pe([ee((()=>Fe),"user_id"),Ae("design:type",Array)],xe.prototype,"audits",void 0),Pe([ee((()=>be),"user_id"),Ae("design:type",Array)],xe.prototype,"auths",void 0),Pe([ee((()=>De),"user_id"),Ae("design:type",Array)],xe.prototype,"registers",void 0),Pe([ee((()=>ke),"user_id"),Ae("design:type",Array)],xe.prototype,"users_groups",void 0),xe=Pe([$(Se),V("user"),ie({attributes:{exclude:["password","salt","token"]}}),ne({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),te(Te)],xe);let Fe=class extends we{};Pe([M(),Ae("design:type",Number)],Fe.prototype,"id",void 0),Pe([Y(),Ae("design:type",Y)],Fe.prototype,"type",void 0),Pe([Y(),Ae("design:type",Y)],Fe.prototype,"model",void 0),Pe([oe(),Ae("design:type",Y)],Fe.prototype,"record",void 0),Pe([Q(),Ae("design:type",Y)],Fe.prototype,"data",void 0),Pe([Z(),Ae("design:type",Z)],Fe.prototype,"state",void 0),Pe([z,Ae("design:type",Date)],Fe.prototype,"created_at",void 0),Pe([W,Ae("design:type",Date)],Fe.prototype,"updated_at",void 0),Pe([J,Ae("design:type",Date)],Fe.prototype,"deleted_at",void 0),Pe([X((()=>xe)),Ae("design:type",Number)],Fe.prototype,"user_id",void 0),Fe=Pe([$(Se),V("audit")],Fe);let Ne=class extends we{};Pe([Y(),Ae("design:type",Y)],Ne.prototype,"key",void 0),Pe([Y(),Ae("design:type",Y)],Ne.prototype,"value",void 0),Pe([z,Ae("design:type",Date)],Ne.prototype,"created_at",void 0),Pe([W,Ae("design:type",Date)],Ne.prototype,"updated_at",void 0),Ne=Pe([$(Se),V("configs"),te(Te)],Ne);let je=class extends we{};Pe([M(),Ae("design:type",Number)],je.prototype,"id",void 0),Pe([Y(),Ae("design:type",Y)],je.prototype,"token",void 0),Pe([se(),Ae("design:type",Number)],je.prototype,"timestamp",void 0),Pe([Z(),Ae("design:type",Z)],je.prototype,"state",void 0),Pe([z,Ae("design:type",Date)],je.prototype,"created_at",void 0),Pe([W,Ae("design:type",Date)],je.prototype,"updated_at",void 0),Pe([J,Ae("design:type",Date)],je.prototype,"deleted_at",void 0),Pe([X((()=>xe)),Ae("design:type",Number)],je.prototype,"user_id",void 0),je=Pe([$(Se),V("forgot")],je);let qe=class extends we{};Pe([M(),Ae("design:type",Number)],qe.prototype,"id",void 0),Pe([Y(),Ae("design:type",Y)],qe.prototype,"name",void 0),Pe([Q(),Ae("design:type",Y)],qe.prototype,"description",void 0),Pe([Z(),Ae("design:type",Z)],qe.prototype,"state",void 0),Pe([z,Ae("design:type",Date)],qe.prototype,"created_at",void 0),Pe([W,Ae("design:type",Date)],qe.prototype,"updated_at",void 0),Pe([J,Ae("design:type",Date)],qe.prototype,"deleted_at",void 0),Pe([ee((()=>Le),"route_id"),Ae("design:type",Array)],qe.prototype,"groups_routes",void 0),qe=Pe([$(Se),V("route"),te(Te)],qe);let Le=class extends we{};Pe([z,Ae("design:type",Date)],Le.prototype,"created_at",void 0),Pe([X((()=>Re)),Ae("design:type",Number)],Le.prototype,"group_id",void 0),Pe([X((()=>qe)),Ae("design:type",Number)],Le.prototype,"route_id",void 0),Le=Pe([$(Se),V("groups_routes"),te(Te)],Le);let Be=class extends we{};Pe([M(),Ae("design:type",Number)],Be.prototype,"id",void 0),Pe([Y(),Ae("design:type",Y)],Be.prototype,"type",void 0),Pe([Y(),Ae("design:type",Y)],Be.prototype,"source",void 0),Pe([Q(),Ae("design:type",Y)],Be.prototype,"message",void 0),Pe([z,Ae("design:type",Date)],Be.prototype,"created_at",void 0),Be=Pe([$(Se),V("log")],Be);let Ke=class extends we{};Pe([Y(),Ae("design:type",Y)],Ke.prototype,"session",void 0),Pe([Q(),Ae("design:type",Y)],Ke.prototype,"json",void 0),Pe([se(),Ae("design:type",Number)],Ke.prototype,"expired",void 0),Pe([z,Ae("design:type",Date)],Ke.prototype,"created_at",void 0),Pe([W,Ae("design:type",Date)],Ke.prototype,"updated_at",void 0),Ke=Pe([$(Se),V("session")],Ke);class He{static write(e,t,r){return Oe(this,void 0,void 0,(function*(){yield He.writeRaw(I.White,"",e,t,r)}))}static error(e,t,r){return Oe(this,void 0,void 0,(function*(){yield He.writeRaw(I.Red,"error",e,t,r)}))}static info(e,t,r){return Oe(this,void 0,void 0,(function*(){yield He.writeRaw(I.Cyan,"info",e,t,r)}))}static success(e,t,r){return Oe(this,void 0,void 0,(function*(){yield He.writeRaw(I.Green,"success",e,t,r)}))}static warning(e,t,r){return Oe(this,void 0,void 0,(function*(){yield He.writeRaw(I.Yellow,"warning",e,t,r)}))}static writeRaw(e,t,r,i,n){return Oe(this,void 0,void 0,(function*(){n&&A.console(e,t,r),Se&&(yield Be.create({type:t,source:i,message:r}).catch((()=>null)))}))}}const Ce=e=>ae(e)?ue(e):void 0,Ue={http:Ce(Ee.API_HTTP_CRT),token:Ce(Ee.API_TOKEN_CRT)},Me={http:Ce(Ee.API_HTTP_KEY),token:Ce(Ee.API_TOKEN_KEY)};class Ye extends he{constructor(){super(),this.all=e=>Oe(this,void 0,void 0,(function*(){e=e||b;const t=yield Ke.findAll({attributes:["session"],where:{expired:{[ve.gte]:Date.now()}}}).catch((t=>(e(t),null)));t&&e(null,t.map((e=>e.session))),e()})),this.clear=e=>Oe(this,void 0,void 0,(function*(){yield Ke.destroy().catch(b),e&&e()})),this.destroy=(e,t)=>Oe(this,void 0,void 0,(function*(){yield Ke.destroy({where:{session:e}}).catch(b),t&&t()})),this.expired=()=>Oe(this,void 0,void 0,(function*(){yield Ke.destroy({where:{expired:{[ve.lt]:Date.now()}}}).catch(b)})),this.get=(e,t)=>Oe(this,void 0,void 0,(function*(){t=t||b;const r=yield Ke.findOne({where:{session:e,expired:{[ve.gte]:Date.now()}}}).catch((e=>(t(e),null)));if(r){const e=JSON.parse(r.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield r.destroy().catch(b),void t(null)}t(null,e)}else t(null)})),this.length=e=>Oe(this,void 0,void 0,(function*(){e&&e(null,(yield Ke.count().catch(b))||0)})),this.set=(e,t,r)=>Oe(this,void 0,void 0,(function*(){r=r||b;const i=Date.now()+Ee.API_SESSION_LIFETIME,n=JSON.stringify(t),[o,s]=(yield Ke.findOrCreate({where:{session:e},defaults:{session:e,json:n,expired:i}}).catch(b))||[];o&&(s||(o.json=n,o.expired=i,yield o.save().catch(b))),r()})),this.loop=D(this.expired,3e4),this.loop.start()}}class Ge{static create(e){return Oe(this,void 0,void 0,(function*(){if(!Me.token)return{error:"Key not found"};const{id:t}=e,r=R(),i=yield be.create({secret:r,user_id:t}).catch(Ge.error);if(!i)return{error:"Internal Server Error"};return{auth:i,token:me({id:t,secret:r},Me.token,Ge.options())}}))}static destroy(e){return Oe(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){He.error(e.message,"api.token",Ee.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:Ee.API_TOKEN_LIFETIME+"ms"}}static renew(e){return Oe(this,void 0,void 0,(function*(){if(!Me.token)return{error:"Key not found"};const{error:t,decode:r}=Ge.verify(e,Ee.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield xe.findOne({where:{id:e,state:!0}}).catch(Ge.error);if(r){const i=yield be.findOne({where:{secret:t,user_id:r.id}}).catch(Ge.error);if(i&&!i.logout){i.secret=R(),yield i.save().catch(Ge.error);return{auth:i,token:me({id:e,secret:i.secret},Me.token,Ge.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e,t,r){return Oe(this,void 0,void 0,(function*(){if(e){t=r.hash.encrypt(e);const i=yield xe.findOne({where:{token:t,state:!0}}).catch(Ge.error);if(i){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield be.findOrCreate({where:{secret:t,user_id:i.id},defaults:{secret:t,user_id:i.id}}).catch(Ge.error))||[];if(r)return{auth:r,user:i}}return{error:"Access denied"}}const{error:i,decode:n}=Ge.verify(t);if(i)return{error:i};if(n){const{id:e,secret:t}=n;if(e&&t){const r=yield xe.findOne({where:{id:e,state:!0}}).catch(Ge.error);if(r){const e=yield be.findOne({where:{secret:t,user_id:r.id}}).catch(Ge.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!Ue.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:_e(e,Ue.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class ze extends e{constructor(e){super(e,{cert:Ue.http,cross:Ee.API_HTTP_CROSS,hybrid:Ee.API_HTTP_HYBRID,key:Me.http,notfound:Ee.API_NOTFOUND_REDIRECT,path:Ee.API_DEFAULT_PATH,port:Ee.API_HTTP_PORT,public:Ee.API_HTTP_PUBLIC,redirect:Ee.API_HTTP_REDIRECT,session:{store:new Ye,name:Ee.API_SESSION_NAME,secret:Ee.API_SESSION_SECRET,cookie:{maxAge:Ee.API_SESSION_LIFETIME},genid:R}}),this.hash=new O(Ee.API_KEY_HASH)}error(e,t){He.error(e.message,t,Ee.API_CONSOLE_ERROR)}log(e,t){He.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return Oe(this,void 0,void 0,(function*(){yield Se.sync(),yield e.listen.call(this),Ee.API_WEBSOCKET_START&&this.server&&(this._webSocket=new H.Server({server:this.server,verifyClient:(e,t)=>t(Ee.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>Oe(this,void 0,void 0,(function*(){t.url||(t.url="");const r=t.url.length<=1?"":t.url.replace(/\//g,".");let i;e.on("message",(n=>Oe(this,void 0,void 0,(function*(){if(i)try{const o=JSON.parse(n);this.emit("ws.message"+r,{data:o,message:n,req:t,user:i,ws:e})}catch(o){this.emit("ws.message"+r,{message:n,req:t,user:i,ws:e})}else{const{user:o}=yield Ge.user("",n.toString(),this);o&&(i=o,this.emit("ws.connection"+r,{req:t,user:i,ws:e}))}i||e.close()})))),e.on("close",(()=>{i&&this.emit("ws.close"+r,{user:i,ws:e})})),yield k(2e3),i||e.close()})))))}))}websocket(){return this._webSocket}}class We{static all(){return Oe(this,void 0,void 0,(function*(){const e=yield Ne.findAll().catch(We.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e,t){return Oe(this,void 0,void 0,(function*(){var r;const i=null!==(r=null==t?void 0:t.id)&&void 0!==r?r:null;return((yield Ne.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:i})).catch(We.error))||0)>0}))}static error(e){He.error(e.message,"api.config",Ee.API_CONSOLE_ERROR)}static get(e){return Oe(this,arguments,void 0,(function*(e,t=""){const[r]=(yield Ne.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(We.error))||[];return r?r.value:t}))}static set(e,t,r){return Oe(this,void 0,void 0,(function*(){var i;const n=null!==(i=null==r?void 0:r.id)&&void 0!==i?i:null,[o]=(yield Ne.findOrCreate(Object.assign({where:{key:e}},{user_id:n})).catch(We.error))||[];o&&(o.value=t,yield o.save().catch(We.error))}))}}const Je=t((({ctx:e})=>{var t,r,i;return{user_id:null!==(i=null===(r=null===(t=e.req)||void 0===t?void 0:t.user)||void 0===r?void 0:r.id)&&void 0!==i?i:null}})),Xe=t((({ctx:e})=>e.req.auth)),$e=t((({ctx:e})=>e.req.user));class Ve{static all(e,t){return Oe(this,void 0,void 0,(function*(){return yield qe.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:Le,required:!0,include:[{model:Re,required:!0,where:{state:!0},include:[{model:ke,required:!0,where:{user_id:e.id}}]}]}]}).catch((e=>{He.error(e.message,"api.permission",Ee.API_CONSOLE_ERROR)}))}))}static get(e){return Oe(this,void 0,void 0,(function*(){const t=yield Ve.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return Oe(this,void 0,void 0,(function*(){const r=yield Ve.all(e,{name:t});return!!r&&r.length>0}))}}class Ze extends x{auth(e,t,r,i,n){return Oe(this,void 0,void 0,(function*(){const{auth:o,error:s,user:d}=yield Ge.user(t,r,n);return s?e.error(s):o&&d?o.useragent&&o.useragent!=i?e.error("Invalid token"):(e.req.auth=o,e.req.user=d,void e.next()):e.error("Internal Server Error")}))}session(e,t,r){return Oe(this,void 0,void 0,(function*(){r.auth&&r.user&&(r.useragent?r.useragent!=t&&r.regenerate(b):(r.useragent=t,r.save(b))),e.next()}))}error(e){He.error(e.message,"api.controller",Ee.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r){return Oe(this,void 0,void 0,(function*(){return r?(yield Ve.is(r,t))?e.next():void e.unauthorized("Access denied"):e.unauthorized("Access denied")}))}read(e,t,r){return Oe(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".read",r)}))}upload(e,t){t.path||(t.path=Ee.API_UPLOAD_TEMP),t.size||(t.size=Ee.API_UPLOAD_SIZE),t.field||(t.field=Ee.API_UPLOAD_FIELD),d.middleware(e,t)}validation(e,t){return Oe(this,void 0,void 0,(function*(){const{error:r,value:i}=yield F.object(t).parse().validateAsync(e.req.body);if(r)return e.validation(r);e.req.body=i,e.next()}))}write(e,t,r){return Oe(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".write",r)}))}}Pe([Ie(0,r()),Ie(1,i(Ee.API_KEY_HEADER)),Ie(2,i(Ee.API_TOKEN_HEADER)),Ie(3,i("user-agent")),Ie(4,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,String,String,ze]),Ae("design:returntype",Promise)],Ze.prototype,"auth",null),Pe([Ie(0,r()),Ie(1,i("user-agent")),Ie(2,o()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Object]),Ae("design:returntype",Promise)],Ze.prototype,"session",null),Pe([Ie(0,r()),Ie(1,s()),Ie(2,$e()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,xe]),Ae("design:returntype",Promise)],Ze.prototype,"permission",null),Pe([Ie(0,r()),Ie(1,s()),Ie(2,$e()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,xe]),Ae("design:returntype",Promise)],Ze.prototype,"read",null),Pe([Ie(0,r()),Ie(1,s()),Ae("design:type",Function),Ae("design:paramtypes",[a,Object]),Ae("design:returntype",void 0)],Ze.prototype,"upload",null),Pe([Ie(0,r()),Ie(1,s()),Ae("design:type",Function),Ae("design:paramtypes",[a,Object]),Ae("design:returntype",Promise)],Ze.prototype,"validation",null),Pe([Ie(0,r()),Ie(1,s()),Ie(2,$e()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,xe]),Ae("design:returntype",Promise)],Ze.prototype,"write",null);let Qe=class extends Ze{constructor(){super(...arguments),this._columns=[]}_add(e){return Oe(this,arguments,void 0,(function*({ctx:e,options:t,body:r,user:i}){var n;const o=null!==(n=null==i?void 0:i.id)&&void 0!==n?n:null,s=yield this.model().create(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign({},t||{}),{user_id:o})).catch(this.error);if(s){const t=this.key();return e.prepare(c.OK,{[t]:s.getDataValue(t)}),s}e.error("Internal Server Error")}))}_all(e){return Oe(this,arguments,void 0,(function*({ctx:e,options:t,callback:r,scope:i}){var n,o,s,d,a,u;const l=this.scope(i),p=Object.assign({},t||{});p.where=Object.assign({},p.where||{});const y=e.req.query.limit,g=N(y)?parseInt(y):Ee.API_MODEL_LIMIT;p.limit=g>=0?Math.min(g,Ee.API_MODEL_LIMIT_MAX):void 0;const h=e.req.query.offset;if(N(h)){const e=h?parseInt(h):0;p.offset=e>0?e:void 0}const v=[],_=this.columns(),m=e=>_.indexOf(e)>=0,f=null===(n=e.req.query.asc)||void 0===n?void 0:n.toString();f&&f.length&&v.push(...f.split(",").filter(m).map((e=>[e,"ASC"])));const P=null===(o=e.req.query.desc)||void 0===o?void 0:o.toString();P&&P.length&&v.push(...P.split(",").filter(m).map((e=>[e,"DESC"]))),v.length&&(p.order=v);const I=[],A=null===(s=e.req.query.search)||void 0===s?void 0:s.toString();(j(p.attributes)?p.attributes:_).filter(N).forEach((t=>{var r;if(A&&A.length&&I.push({[t]:{[ve.like]:`%${A}%`}}),"search_"+t in e.req.query){const i=null===(r=e.req.query["search_"+t])||void 0===r?void 0:r.toString();i&&i.length&&I.push({[t]:{[ve.like]:`%${i}%`}})}})),I.length&&(p.where=Object.assign(Object.assign({},p.where),{[ve.or]:[...I]}));const O=null!==(d=yield l.count(Object.assign(Object.assign({},p),{col:_[0]})).catch(this.error))&&void 0!==d?d:0,E=yield l.findAll(p).catch(this.error),S={count:O,limit:null!==(a=p.limit)&&void 0!==a?a:-1,offset:null!==(u=p.offset)&&void 0!==u?u:0};return E?(e.prepare(c.OK,Object.assign(Object.assign({},S),{records:r?yield r(E):E})),Object.assign(Object.assign({},S),{records:E})):(e.error("Internal Server Error"),Object.assign(Object.assign({},S),{records:[]}))}))}columns(){return 0==this._columns.length&&(this._columns=Object.keys(this.model().getAttributes())),this._columns}_del(e){return Oe(this,arguments,void 0,(function*({ctx:e,options:t,user:r}){var i;const n=this.key(),{[n]:o}=e.req.params;if(!o)return e.error("Internal Server Error"),0;const s=null!==(i=null==r?void 0:r.id)&&void 0!==i?i:null,d=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[n]:o}),individualHooks:!0}),{user_id:s})).catch(this.error);return d?(e.success("OK"),d):(e.notFound("Record not found"),0)}))}error(e){e.sql?He.error(e.message+"\n"+e.sql,"api.controller.sql",Ee.API_CONSOLE_ERROR):super.error(e)}_get(e){return Oe(this,arguments,void 0,(function*({ctx:e,options:t,callback:r,scope:i}){const n=this.key(),{[n]:o}=e.req.params,s=yield this.scope(i).findOne(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[n]:o})})).catch(this.error);return s?(e.prepare(c.OK,r?yield r(s):s.toJSON()),s):null===s?e.notFound("Record not found"):void e.error("Internal Server Error")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}_set(e){return Oe(this,arguments,void 0,(function*({ctx:e,options:t,body:r,user:i}){var n,o;const s=this.key(),{[s]:d}=e.req.params,a=null!==(n=null==i?void 0:i.id)&&void 0!==n?n:null,[u]=null!==(o=yield this.model().update(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[s]:d}),individualHooks:!0}),{user_id:a})).catch(this.error))&&void 0!==o?o:[];return u?(e.success("OK"),!0):(e.success("Record not changed"),!1)}))}};Qe=Pe([u(Ze)],Qe);let et=class extends Qe{model(){return Fe}all(e,t,r){return Oe(this,void 0,void 0,(function*(){const i={};t&&(i.type=t),r&&(i.table=r),yield this._all({ctx:e,options:{attributes:{exclude:["data"]},where:i,order:[["created_at","DESC"]]}})}))}get(e){return Oe(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}};Pe([l(),p("auth"),p("read"),Ie(0,r()),Ie(1,y("type")),Ie(2,y("table")),Ae("design:type",Function),Ae("design:paramtypes",[a,String,String]),Ae("design:returntype",Promise)],et.prototype,"all",null),Pe([l("/:id"),p("auth"),p("read"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],et.prototype,"get",null),et=Pe([g("/audits"),u(Qe)],et);let tt=class extends Ze{login(e,t,r,i,n){return Oe(this,void 0,void 0,(function*(){var o;yield k(Ee.API_SLEEP_AUTH);const s=yield xe.scope("password").findOne({where:{[ve.or]:[{email:r},{username:r}]}}).catch(this.error);if(i+=null!==(o=null==s?void 0:s.salt)&&void 0!==o?o:"",!s||s.password!=E(i))return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const d=yield De.findOne({where:{state:!0,user_id:s.id}}).catch(this.error);if(d)return e.error("Activation required"),n.emit("auth.activation",{ctx:e,register:d,user:s}),void this.emit("auth.activation",{ctx:e,register:d,user:s});if(!s.state)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e,user:s}),void this.emit("auth.failure",{ctx:e,user:s});const{auth:a,error:u,token:c}=yield Ge.create(s);return u?(e.error(u),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):a&&c?(a.useragent=t,yield a.save().catch(this.error),e.json({token:c}),n.emit("auth.login",{auth:a,ctx:e,user:s}),void this.emit("auth.login",{auth:a,ctx:e,user:s})):(e.error("Internal Server Error"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,r,i){return Oe(this,void 0,void 0,(function*(){if(yield Ge.destroy(t))return e.success("Disconcerted"),i.emit("auth.logout",{auth:t,ctx:e,user:r}),void this.emit("auth.logout",{auth:t,ctx:e,user:r});e.unauthorized("Access denied")}))}renew(e,t,r,i){return Oe(this,void 0,void 0,(function*(){const{auth:n,error:o,token:s}=yield Ge.renew(r);return o?e.error(o):n?(n.useragent=t,yield n.save().catch(this.error),e.json({token:s}),i.emit("auth.renew",{auth:n,ctx:e}),void this.emit("auth.renew",{auth:n,ctx:e})):e.error("Internal Server Error")}))}user(e,t){return Oe(this,void 0,void 0,(function*(){const r=yield Ve.all(t);if(!r)return e.error("Internal Server Error");e.json(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))}))}))}};Pe([h("/login"),p("validation",{username:F.string().min(3).required(),password:F.string().min(5).required()}),Ie(0,r()),Ie(1,i("user-agent")),Ie(2,v("username")),Ie(3,v("password")),Ie(4,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,String,String,ze]),Ae("design:returntype",Promise)],tt.prototype,"login",null),Pe([l("/logout"),p("auth"),Ie(0,r()),Ie(1,Xe()),Ie(2,$e()),Ie(3,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,be,xe,ze]),Ae("design:returntype",Promise)],tt.prototype,"logout",null),Pe([h("/renew"),p("validation",{token:F.string().required()}),Ie(0,r()),Ie(1,i("user-agent")),Ie(2,v("token")),Ie(3,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,String,ze]),Ae("design:returntype",Promise)],tt.prototype,"renew",null),Pe([l(),p("auth"),Ie(0,r()),Ie(1,$e()),Ae("design:type",Function),Ae("design:paramtypes",[a,xe]),Ae("design:returntype",Promise)],tt.prototype,"user",null),tt=Pe([g("/auth"),u(Ze)],tt);let rt=class extends Ze{directory(){return Ee.API_HTTP_PUBLIC||"./"}files(e){return Oe(this,void 0,void 0,(function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const r=fe(this.directory(),t);if(!ae(r)||!ce(r).isDirectory())return e.notFound("Path not Found");let i=[];return i=le(r),i=i.map((e=>this.info(fe(r,e)))),i=i.filter(q),Object.assign(Object.assign({},this.info(r)),{files:i})}))}access(e,t,r){return Oe(this,void 0,void 0,(function*(){yield this.permission(e,this.name()+"."+t,r)}))}info(e){if(!ae(e))return null;const t=ce(e),r=e.split("/").pop();e=e.replace(this.directory(),"/").replace(/^\/\//,"/");const i=t.isDirectory();return{name:r,path:e.replace(/^\/\//,"/"),size:t.size,extension:i?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:i,symlink:t.isSymbolicLink()}}name(){return"files"}};Pe([l("/path/?*"),p("auth"),p("access","list"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],rt.prototype,"files",null),Pe([Ie(0,r()),Ie(1,s()),Ie(2,$e()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,xe]),Ae("design:returntype",Promise)],rt.prototype,"access",null),rt=Pe([g("/files"),u(Ze)],rt);let it=class extends Ze{check(e,t){return Oe(this,void 0,void 0,(function*(){const r=yield this.find(t);if(!r||!r.user)return e.notFound("User not found");r.token=L(),yield r.save(),e.json({token:r.token})}))}forgot(e,t,r){return Oe(this,void 0,void 0,(function*(){yield k(Ee.API_SLEEP_FORGOT);const i=t,n=yield xe.findOne({where:{[ve.or]:[{email:i},{username:t}]}}).catch(this.error);if(!n)return e.notFound("User not found");const o=L(),s=Date.now()+6e4*Ee.API_TOKEN_FORGOT,d=yield je.create({token:o,timestamp:s,state:!0,user_id:n.id});e.success("OK"),r.emit("forgot.send",{ctx:e,forgot:d,user:n}),this.emit("forgot.send",{ctx:e,forgot:d,user:n})}))}reset(e,t,r,i){return Oe(this,void 0,void 0,(function*(){const n=yield this.find(t);if(!n)return e.notFound("User not found");n.state=!1,yield n.save().catch(this.error),n.user.password=E(r),yield n.user.save().catch(this.error),e.success("OK"),i.emit("forgot.reset",{ctx:e,user:n.user}),this.emit("forgot.reset",{ctx:e,user:n.user})}))}find(e){return Oe(this,void 0,void 0,(function*(){return yield je.findOne({where:{token:e,state:!0},include:[{model:xe,required:!0}]}).catch(this.error)}))}};Pe([l("/check"),p("validation",{token:F.string().required()}),Ie(0,r()),Ie(1,v("token")),Ae("design:type",Function),Ae("design:paramtypes",[a,String]),Ae("design:returntype",Promise)],it.prototype,"check",null),Pe([h(),p("validation",{username:F.string().min(4).required()}),Ie(0,r()),Ie(1,v("username")),Ie(2,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,ze]),Ae("design:returntype",Promise)],it.prototype,"forgot",null),Pe([h("/reset"),p("validation",{token:F.string().required(),password:F.string().min(5).required()}),Ie(0,r()),Ie(1,v("token")),Ie(2,v("password")),Ie(3,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,String,ze]),Ae("design:returntype",Promise)],it.prototype,"reset",null),it=Pe([g("/forgot"),u(Ze)],it);let nt=class extends Qe{constructor(){super(...arguments),this._crud={}}add(e,t){return Oe(this,void 0,void 0,(function*(){yield this._add({ctx:e,user:t})}))}all(e){return Oe(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}create(){return this._crud}del(e,t){return Oe(this,void 0,void 0,(function*(){yield this._del({ctx:e,user:t})}))}get(e){return Oe(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,t){return Oe(this,void 0,void 0,(function*(){yield this._set({ctx:e,user:t})}))}update(){return this._crud}validationAdd(e){return Oe(this,void 0,void 0,(function*(){const t=this.create();if(t==this._crud)return e.error("Internal Server Error");yield this.validation(e,t)}))}validationSet(e){return Oe(this,void 0,void 0,(function*(){const t=this.update();if(t==this._crud)return e.error("Internal Server Error");yield this.validation(e,t)}))}};Pe([h(),p("auth"),p("write"),p("validationAdd"),Ie(0,r()),Ie(1,$e()),Ae("design:type",Function),Ae("design:paramtypes",[a,xe]),Ae("design:returntype",Promise)],nt.prototype,"add",null),Pe([l(),p("auth"),p("read"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],nt.prototype,"all",null),Pe([_("/:id"),p("auth"),p("write"),Ie(0,r()),Ie(1,$e()),Ae("design:type",Function),Ae("design:paramtypes",[a,xe]),Ae("design:returntype",Promise)],nt.prototype,"del",null),Pe([l("/:id"),p("auth"),p("read"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],nt.prototype,"get",null),Pe([m("/:id"),p("auth"),p("write"),p("validationSet"),Ie(0,r()),Ie(1,$e()),Ae("design:type",Function),Ae("design:paramtypes",[a,xe]),Ae("design:returntype",Promise)],nt.prototype,"set",null),Pe([Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],nt.prototype,"validationAdd",null),Pe([Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],nt.prototype,"validationSet",null),nt=Pe([u(Qe)],nt);let ot=class extends nt{model(){return Re}create(){return{name:F.string().required(),description:F.string().empty(""),state:F.boolean().parse().required()}}update(){return{name:F.string().empty(),description:F.string().empty(),state:F.boolean().parse().empty()}}};ot=Pe([g("/groups"),u(nt)],ot);let st=class extends Qe{model(){return Le}all(e,t){return Oe(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{group_id:t},include:[{model:qe,required:!0}]},callback:e=>e.map((e=>e.route))})}))}set(e,t,r,i){return Oe(this,void 0,void 0,(function*(){const n=yield Re.findByPk(t,{attributes:["id"]}).catch(this.error);if(n){const t=n.id;if(yield Le.destroy(Object.assign({where:{group_id:t},individualHooks:!0},i)),r){let e=0;yield k(1e3);for(let n=0;n<r.length;n++)e=yield qe.count({where:{id:r[n]}}),e&&(yield Le.create({group_id:t,route_id:r[n]},Object.assign({},i)))}return e.success("OK")}if(B(n))return e.notFound("Record not found");e.error("Internal Server Error")}))}};Pe([l("/:id/routes"),p("auth"),p("read","groups"),Ie(0,r()),Ie(1,f("id")),Ae("design:type",Function),Ae("design:paramtypes",[a,String]),Ae("design:returntype",Promise)],st.prototype,"all",null),Pe([m("/:id/routes"),p("auth"),p("write","groups"),p("validation",{routes:F.array(F.number().parse())}),Ie(0,r()),Ie(1,f("id")),Ie(2,v("routes")),Ie(3,Je()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Array,Object]),Ae("design:returntype",Promise)],st.prototype,"set",null),st=Pe([g("/groups"),u(Qe)],st);let dt=class extends Qe{model(){return Be}all(e,t,r){return Oe(this,void 0,void 0,(function*(){const i={};t&&(i.type=t),r&&(i.source=r),yield this._all({ctx:e,options:{where:i,order:[["created_at","DESC"]]}})}))}};Pe([l(),p("auth"),p("read"),Ie(0,r()),Ie(1,y("type")),Ie(2,y("source")),Ae("design:type",Function),Ae("design:paramtypes",[a,String,String]),Ae("design:returntype",Promise)],dt.prototype,"all",null),dt=Pe([g("/logs"),u(Qe)],dt);let at=class extends Ze{register(e,t,r){return Oe(this,void 0,void 0,(function*(){yield k(Ee.API_SLEEP_REGISTRY);const{name:i,date:n,email:o,username:s,password:d,confirm:a}=t,u=s||o,c=E(d);if(yield xe.count({where:{[ve.or]:[{email:o},{username:u}]}}).catch(this.error))return e.validation("Invalid email or username");if(c!=E(a))return e.error("Invalid password");const l=yield xe.create({name:i,email:o,username:u,password:c,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!l)return e.error("Internal Server Error");const p=yield De.create({token:yield this.getId(),user_id:l.id,state:!0}).catch(this.error);if(!p)return yield l.destroy().catch(this.error),e.error("Internal Server Error");e.success("OK"),r.emit("register.user",{ctx:e,register:p,user:l}),this.emit("register.user",{ctx:e,register:p,user:l})}))}confirm(e,t,r){return Oe(this,void 0,void 0,(function*(){const i=yield De.findOne({where:{token:t,state:!0},include:[{model:xe,required:!0}]}).catch(this.error);if(!i)return e.notFound("User not found");i.state=!1,yield i.save().catch(this.error),i.user.state=!0,yield i.user.save().catch(this.error),e.success("OK"),r.emit("register.confirm",{ctx:e,register:i,user:i.user}),this.emit("register.confirm",{ctx:e,register:i,user:i.user})}))}send(e,t,r){return Oe(this,void 0,void 0,(function*(){const i=t,n=yield De.findOne({where:{state:!0},include:[{model:xe,required:!0,where:{[ve.or]:[{email:i},{username:t}]}}]}).catch(this.error);if(!n)return e.notFound("User not found");e.success("OK"),r.emit("register.send",{ctx:e,register:n,user:n.user}),this.emit("register.send",{ctx:e,register:n,user:n.user})}))}getId(){return Oe(this,void 0,void 0,(function*(){const e=R();return(yield De.count({where:{token:e}}))?this.getId():e}))}};Pe([h(),p("validation",{name:F.string().required(),date:F.date().required(),email:F.string().email().required(),username:F.string().min(4).empty(),password:F.string().min(5).required(),confirm:F.string().min(5).required()}),Ie(0,r()),Ie(1,v()),Ie(2,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,Object,ze]),Ae("design:returntype",Promise)],at.prototype,"register",null),Pe([h("/confirm"),p("validation",{token:F.string().required()}),Ie(0,r()),Ie(1,v("token")),Ie(2,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,ze]),Ae("design:returntype",Promise)],at.prototype,"confirm",null),Pe([h("/send"),p("validation",{username:F.string().min(4).required()}),Ie(0,r()),Ie(1,v("username")),Ie(2,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,ze]),Ae("design:returntype",Promise)],at.prototype,"send",null),at=Pe([g("/register"),u(Ze)],at);let ut=class extends nt{model(){return qe}create(){return{name:F.string().required(),description:F.string().empty(""),state:F.boolean().parse().required()}}update(){return{name:F.string().empty(),description:F.string().empty(),state:F.boolean().parse().empty()}}};ut=Pe([g("/routes"),u(nt)],ut);let ct=class extends Ze{setup(e){return Oe(this,void 0,void 0,(function*(){if(0==(yield xe.count())){const e=L(),t=yield xe.create({name:"Admin",email:"admin@localhost",username:"admin",password:E("admin"+e),salt:e,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0}),r={description:"API CORE",state:!0},i=yield Re.create(Object.assign({name:"admin"},r));yield ke.create({user_id:t.id,group_id:i.id});const n=["read","write"],o=["audits","users","groups","routes"];yield K(o,(e=>Oe(this,void 0,void 0,(function*(){yield K(n,(t=>Oe(this,void 0,void 0,(function*(){const n=yield qe.create(Object.assign({name:`${e}.${t}`},r));yield Le.create({group_id:i.id,route_id:n.id})}))))}))));const s=["delete","list","read","rename","upload","write"];yield K(s,(e=>Oe(this,void 0,void 0,(function*(){const t=yield qe.create(Object.assign({name:`files.${e}`},r));yield Le.create({group_id:i.id,route_id:t.id})}))));const d=["logs"];yield K(d,(e=>Oe(this,void 0,void 0,(function*(){const t=yield qe.create(Object.assign({name:`${e}.read`},r));yield Le.create({group_id:i.id,route_id:t.id})}))))}e.success("OK")}))}};Pe([l(),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],ct.prototype,"setup",null),ct=Pe([g("/setup"),u(Ze)],ct);let lt=class extends Qe{model(){return xe}constructor(){super(),this.dir=Ee.API_HTTP_PUBLIC+"/avatar",Ee.API_HTTP_PUBLIC&&ae(Ee.API_HTTP_PUBLIC)&&!ae(this.dir)&&pe(this.dir)}avatar(e,t,r,i){return Oe(this,void 0,void 0,(function*(){if(t.length){const n=t[0].filename||"";if(n){const t=this.dir+"/"+r.avatar;if(ae(t)&&ye(t).isFile()&&ge(t),r.avatar=n,yield r.save(Object.assign({},i)).catch(this.error))return e.success("OK")}}e.success("Record not changed")}))}avatar_remove(e,t,r){return Oe(this,void 0,void 0,(function*(){const i=this.dir+"/"+t.avatar;t.avatar="",(yield t.save(Object.assign({},r)).catch(this.error))&&ae(i)&&ge(i),e.success("OK")}))}password(e,t,r,i,n){return Oe(this,void 0,void 0,(function*(){var o;const s=yield this.scope("password").findOne({where:{id:i.id,state:!0}}).catch(this.error);return t+=null!==(o=null==s?void 0:s.salt)&&void 0!==o?o:"",s&&s.password==E(t)?(s.salt=L(),s.password=E(r+s.salt),(yield s.save(Object.assign({},n)).catch(this.error))?e.success("OK"):void e.success("Record not changed")):e.error("Record not changed")}))}token(e,t,r){return Oe(this,void 0,void 0,(function*(){const i=yield this.model().findOne({attributes:["token"],where:{id:t.id}}).catch(this.error);if(i)return e.json({token:r.hash.decrypt(i.token)});e.notFound("Record not found")}))}token_get(e,t,r){return Oe(this,void 0,void 0,(function*(){const i=yield this.scope("token").findOne({where:{id:t}}).catch(this.error);if(i)return e.json({token:r.hash.decrypt(i.token)});e.notFound("Record not found")}))}token_remove(e,t,r){return Oe(this,void 0,void 0,(function*(){const i=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(i)return i.token="",yield i.save(Object.assign({},r)).catch(this.error),e.success("OK");e.notFound("Record not found")}))}token_renew(e,t,r,i){return Oe(this,void 0,void 0,(function*(){const n=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(n){const t=yield this.token_new();return n.token=i.hash.encrypt(t),yield n.save(Object.assign({},r)).catch(this.error),e.json({token:t})}e.notFound("Record not found")}))}token_new(){return Oe(this,void 0,void 0,(function*(){var e;const t=R();return(null!==(e=yield this.model().count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t}))}add(e,t,r){return Oe(this,void 0,void 0,(function*(){const i=L();yield this._add({ctx:e,body:{password:E(t+i),salt:i},user:r})}))}all(e){return Oe(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}del(e,t,r){return Oe(this,void 0,void 0,(function*(){if(r.id.toString()==t)return e.notFound("Record not found");yield this._del({ctx:e,user:r})}))}get(e){return Oe(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,t,r){return Oe(this,void 0,void 0,(function*(){const i=L();yield this._set({ctx:e,body:t?{password:E(t+i),salt:i}:{},user:r})}))}};Pe([h("/avatar"),p("auth"),p("upload",(e=>({count:1,field:"file",path:e.controller.dir,types:["image/bmp","image/jpeg","image/png"],size:32}))),Ie(0,r()),Ie(1,P()),Ie(2,$e()),Ie(3,Je()),Ae("design:type",Function),Ae("design:paramtypes",[a,Array,xe,Object]),Ae("design:returntype",Promise)],lt.prototype,"avatar",null),Pe([l("/avatar/remove"),p("auth"),Ie(0,r()),Ie(1,$e()),Ie(2,Je()),Ae("design:type",Function),Ae("design:paramtypes",[a,xe,Object]),Ae("design:returntype",Promise)],lt.prototype,"avatar_remove",null),Pe([h("/password"),p("auth"),p("validation",{oldPassword:F.string().min(5).required(),newPassword:F.string().min(5).required()}),Ie(0,r()),Ie(1,v("oldPassword")),Ie(2,v("newPassword")),Ie(3,$e()),Ie(4,Je()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,String,xe,Object]),Ae("design:returntype",Promise)],lt.prototype,"password",null),Pe([l("/token"),p("auth"),Ie(0,r()),Ie(1,$e()),Ie(2,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,xe,ze]),Ae("design:returntype",Promise)],lt.prototype,"token",null),Pe([l("/token/:id"),p("auth"),p("write"),Ie(0,r()),Ie(1,f("id")),Ie(2,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,ze]),Ae("design:returntype",Promise)],lt.prototype,"token_get",null),Pe([l("/token/remove/:id"),p("auth"),p("write"),Ie(0,r()),Ie(1,f("id")),Ie(2,Je()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Object]),Ae("design:returntype",Promise)],lt.prototype,"token_remove",null),Pe([l("/token/renew/:id"),p("auth"),p("write"),Ie(0,r()),Ie(1,f("id")),Ie(2,Je()),Ie(3,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Object,ze]),Ae("design:returntype",Promise)],lt.prototype,"token_renew",null),Pe([h(),p("auth"),p("write"),p("validation",{name:F.string().required(),email:F.string().email().required(),username:F.string().min(4).required(),password:F.string().min(5).required(),description:F.string().empty(""),state:F.boolean().parse().required()}),Ie(0,r()),Ie(1,v("password")),Ie(2,$e()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,xe]),Ae("design:returntype",Promise)],lt.prototype,"add",null),Pe([l(),p("auth"),p("read"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],lt.prototype,"all",null),Pe([_("/:id"),p("auth"),p("write"),Ie(0,r()),Ie(1,f("id")),Ie(2,$e()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,xe]),Ae("design:returntype",Promise)],lt.prototype,"del",null),Pe([l("/:id"),p("auth"),p("read"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],lt.prototype,"get",null),Pe([m("/:id"),p("auth"),p("write"),p("validation",{name:F.string().empty(),email:F.string().email().empty(),username:F.string().min(4).empty(),password:F.string().min(5).empty().filter(""),description:F.string().empty(),state:F.boolean().parse().empty()}),Ie(0,r()),Ie(1,v("password")),Ie(2,$e()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,xe]),Ae("design:returntype",Promise)],lt.prototype,"set",null),lt=Pe([g("/users"),u(Qe),Ae("design:paramtypes",[])],lt);let pt=class extends Qe{model(){return ke}groups(e,t){return Oe(this,void 0,void 0,(function*(){yield this.all(e,t.id.toString())}))}all(e,t){return Oe(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{user_id:t},include:[{model:Re,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,r,i){return Oe(this,void 0,void 0,(function*(){const n=yield xe.findByPk(t,{attributes:["id"]}).catch(this.error);if(n){if(yield ke.destroy(Object.assign({where:{user_id:n.id},individualHooks:!0},i)),r){let e=0;yield k(1e3);for(let t=0;t<r.length;t++)e=yield Re.count({where:{id:r[t]}}),e&&(yield ke.create({user_id:n.id,group_id:r[t]},Object.assign({},i)))}return e.success("OK")}if(B(n))return e.notFound("Record not found");e.error("Internal Server Error")}))}};Pe([l("/groups"),p("auth"),Ie(0,r()),Ie(1,$e()),Ae("design:type",Function),Ae("design:paramtypes",[a,xe]),Ae("design:returntype",Promise)],pt.prototype,"groups",null),Pe([l("/:id/groups"),p("auth"),p("read","users"),Ie(0,r()),Ie(1,f("id")),Ae("design:type",Function),Ae("design:paramtypes",[a,String]),Ae("design:returntype",Promise)],pt.prototype,"all",null),Pe([m("/:id/groups"),p("auth"),p("write","users"),p("validation",{groups:F.array(F.number().parse())}),Ie(0,r()),Ie(1,f("id")),Ie(2,v("groups")),Ie(3,Je()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Array,Object]),Ae("design:returntype",Promise)],pt.prototype,"set",null),pt=Pe([g("/users"),u(Qe)],pt);export{ze as Application,Fe as Audit,et as AuditsController,be as Auth,tt as AuthController,We as Config,Ne as Configs,Ze as ControllerBase,nt as CrudController,Ee as Env,rt as FilesController,je as Forgot,it as ForgotController,Re as Group,Le as GroupRoute,ot as GroupsController,st as GroupsRoutesController,Be as Log,He as Logs,dt as LogsController,we as Model,Qe as ModelController,Ve as Permission,De as Register,at as RegisterController,Je as ReqAudit,Xe as ReqAuth,$e as ReqUser,qe as Route,ut as RoutesController,Ke as Session,ct as SetupController,Ge as Token,xe as User,ke as UserGroup,lt as UsersController,pt as UsersGroupsController,Te as audit,Se as conn,Ue as crt,Me as key};
|
|
7
|
+
import{Application as e,parameterFactory as t,Ctx as i,Headers as r,App as s,Argument as n,Session as o,Upload as d,Context as a,Extends as u,Status as p,Get as c,Middleware as l,Query as y,Controller as g,Post as h,Body as v,Delete as _,Put as m,Params as O,Files as E}from"@andrewcaires/express";import{LogColor as f,Log as P,Hash as I,sha256 as A}from"@andrewcaires/node";import{toBool as R,parseMs as S,isObject as T,noop as D,loop as N,uuidv4 as b,sleep as w,EventEmitter as F,Validation as k,isString as x,isArray as j,isDef as C,uniqueID as L,isNull as q,forEachSeries as U}from"@andrewcaires/utils.js";import{WebSocketServer as H}from"ws";import{Connection as K,Model as B,Id as M,String as V,FullDate as Y,CreatedAt as G,UpdatedAt as W,DeletedAt as z,BelongsTo as $,Database as J,ModelName as X,Boolean as Z,Text as Q,HasMany as ee,Hooks as te,DateOnly as ie,DefaultScope as re,Scopes as se,Enum as ne,Json as oe,BigInt as de,Unique as ae}from"@andrewcaires/sequelize";import{config as ue}from"dotenv";import{existsSync as pe,readFileSync as ce,statSync as le,readdirSync as ye,mkdirSync as ge,lstatSync as he,rmSync as ve}from"fs";import{Store as _e}from"express-session";import{Op as me}from"sequelize";import Oe from"jsonwebtoken";import{join as Ee}from"path";function fe(e,t,i,r){var s,n=arguments.length,o=n<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,r);else for(var d=e.length-1;d>=0;d--)(s=e[d])&&(o=(n<3?s(o):n>3?s(t,i,o):s(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o}function Pe(e,t){return function(i,r){t(i,r,e)}}function Ie(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function Ae(e,t,i,r){return new(i||(i=Promise))((function(s,n){function o(e){try{a(r.next(e))}catch(e){n(e)}}function d(e){try{a(r.throw(e))}catch(e){n(e)}}function a(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,d)}a((r=r.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,ue();class Re{static getBool(e,t){return R(Re.getString(e,t.toString()))}static getInt(e,t){return parseInt(Re.getString(e,t.toString()))}static getMs(e,t){return S(Re.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}Re.API_CONSOLE_ERROR=Re.getBool("API_CONSOLE_ERROR",!1),Re.API_DB_DATABASE=Re.getString("API_DB_DATABASE",""),Re.API_DB_HOST=Re.getString("API_DB_HOST","127.0.0.1"),Re.API_DB_PASSWORD=Re.getString("API_DB_PASSWORD",""),Re.API_DB_PORT=Re.getInt("API_DB_PORT",3306),Re.API_DB_TYPE=Re.getString("API_DB_TYPE",""),Re.API_DB_USERNAME=Re.getString("API_DB_USERNAME","root"),Re.API_DB_LOG=Re.getBool("API_DB_LOG",!1),Re.API_DB_AUDIT=Re.getBool("API_DB_AUDIT",!0),Re.API_DB_PREFIX=Re.getString("API_DB_PREFIX",""),Re.API_DB_TIMEZONE=Re.getString("API_DB_TIMEZONE","+00:00"),Re.API_HTTP_CRT=Re.getString("API_HTTP_CRT",""),Re.API_HTTP_KEY=Re.getString("API_HTTP_KEY",""),Re.API_HTTP_PORT=Re.getInt("API_HTTP_PORT",3e3),Re.API_HTTP_PUBLIC=Re.getString("API_HTTP_PUBLIC",""),Re.API_HTTP_CROSS=Re.getBool("API_HTTP_CROSS",!1),Re.API_HTTP_HYBRID=Re.getBool("API_HTTP_HYBRID",!1),Re.API_HTTP_NOTFOUND=Re.getString("API_HTTP_NOTFOUND",""),Re.API_HTTP_PATH=Re.getString("API_HTTP_PATH","/api"),Re.API_HTTP_REDIRECT=Re.getString("API_HTTP_REDIRECT",""),Re.API_KEY_HASH=Re.getString("API_KEY_HASH",""),Re.API_KEY_HEADER=Re.getString("API_KEY_HEADER","api_key"),Re.API_MODEL_LIMIT=Re.getInt("API_MODEL_LIMIT",10),Re.API_MODEL_LIMIT_MAX=Re.getInt("API_MODEL_LIMIT_MAX",500),Re.API_SLEEP_AUTH=Re.getMs("API_SLEEP_AUTH","2s"),Re.API_SLEEP_FORGOT=Re.getMs("API_SLEEP_FORGOT","5s"),Re.API_SLEEP_REGISTRY=Re.getMs("API_SLEEP_REGISTRY","5s"),Re.API_SESSION_NAME=Re.getString("API_SESSION_NAME","session.id"),Re.API_SESSION_LIFETIME=Re.getMs("API_SESSION_LIFETIME","1d"),Re.API_SESSION_SECRET=Re.getString("API_SESSION_SECRET","yoursecret"),Re.API_TOKEN_CRT=Re.getString("API_TOKEN_CRT",""),Re.API_TOKEN_KEY=Re.getString("API_TOKEN_KEY",""),Re.API_TOKEN_FORGOT=Re.getMs("API_TOKEN_LIFETIME","1d"),Re.API_TOKEN_HEADER=Re.getString("API_TOKEN_HEADER","authorization"),Re.API_TOKEN_LIFETIME=Re.getMs("API_TOKEN_LIFETIME","1d"),Re.API_TOKEN_RENEW=Re.getMs("API_TOKEN_RENEW","1d"),Re.API_UPLOAD_COUNT=Re.getInt("API_UPLOAD_COUNT",1),Re.API_UPLOAD_FIELD=Re.getString("API_UPLOAD_FIELD","upload"),Re.API_UPLOAD_SIZE=Re.getInt("API_UPLOAD_SIZE",2),Re.API_UPLOAD_TEMP=Re.getString("API_UPLOAD_TEMP","./temp"),Re.API_USER_HISTORY=Re.getBool("API_USER_HISTORY",!0),Re.API_WEBSOCKET_START=Re.getBool("API_WEBSOCKET_START",!1);const Se=new K({type:Re.API_DB_TYPE,database:Re.API_DB_DATABASE,username:Re.API_DB_USERNAME,password:Re.API_DB_PASSWORD,hostname:Re.API_DB_HOST,hostport:Re.API_DB_PORT,logging:Re.API_DB_LOG,prefix:Re.API_DB_PREFIX});class Te extends B{}const De=(e,t,i)=>{var r,s,n,o,d;return{type:e,model:null!==(r=null==t?void 0:t.getTableName())&&void 0!==r?r:null,client:null!==(s=null==i?void 0:i.audit_client)&&void 0!==s?s:null,href:null!==(n=null==i?void 0:i.audit_href)&&void 0!==n?n:null,user_agent:null!==(o=null==i?void 0:i.audit_user_agent)&&void 0!==o?o:null,user_id:null!==(d=null==i?void 0:i.audit_user_id)&&void 0!==d?d:null,state:!0}},Ne={afterCreate:(e,t)=>Ae(void 0,void 0,void 0,(function*(){var i;if(!Re.API_DB_AUDIT)return;const r=T(e)?e.constructor:null,s=null!==(i=null==r?void 0:r.primaryKeyAttribute)&&void 0!==i?i:null;yield Ce.create(Object.assign(Object.assign({},De("CREATE",r,t)),{record:s?e.getDataValue(s):null,data:e.toJSON()})).catch(D)})),afterUpdate:(e,t)=>Ae(void 0,void 0,void 0,(function*(){var i;if(!Re.API_DB_AUDIT)return;const r=T(e)?e.constructor:null,s=null!==(i=null==r?void 0:r.primaryKeyAttribute)&&void 0!==i?i:null,n={},o=e.changed();o&&o.forEach((t=>n[t]=e.getDataValue(t))),yield Ce.create(Object.assign(Object.assign({},De("UPDATE",r,t)),{record:s?e.getDataValue(s):null,data:n,previously:e.previous()})).catch(D)})),afterDestroy:(e,t)=>Ae(void 0,void 0,void 0,(function*(){var i;if(!Re.API_DB_AUDIT)return;const r=T(e)?e.constructor:null,s=null!==(i=null==r?void 0:r.primaryKeyAttribute)&&void 0!==i?i:null;yield Ce.create(Object.assign(Object.assign({},De("DELETE",r,t)),{record:s?e.getDataValue(s):null,data:e.toJSON()})).catch(D)}))};let be=class extends Te{};fe([M(),Ie("design:type",Number)],be.prototype,"id",void 0),fe([V(),Ie("design:type",V)],be.prototype,"secret",void 0),fe([Y(),Ie("design:type",Date)],be.prototype,"logout",void 0),fe([V(),Ie("design:type",V)],be.prototype,"user_agent",void 0),fe([G,Ie("design:type",Date)],be.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],be.prototype,"updated_at",void 0),fe([z,Ie("design:type",Date)],be.prototype,"deleted_at",void 0),fe([$((()=>je)),Ie("design:type",Number)],be.prototype,"user_id",void 0),be=fe([J(Se),X("auth")],be);let we=class extends Te{};fe([M(),Ie("design:type",Number)],we.prototype,"id",void 0),fe([V(),Ie("design:type",V)],we.prototype,"token",void 0),fe([Z(),Ie("design:type",Z)],we.prototype,"state",void 0),fe([G,Ie("design:type",Date)],we.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],we.prototype,"updated_at",void 0),fe([z,Ie("design:type",Date)],we.prototype,"deleted_at",void 0),fe([$((()=>je)),Ie("design:type",Number)],we.prototype,"user_id",void 0),we=fe([J(Se),X("register")],we);let Fe=class extends Te{};fe([M(),Ie("design:type",Number)],Fe.prototype,"id",void 0),fe([V(),Ie("design:type",V)],Fe.prototype,"name",void 0),fe([Q(),Ie("design:type",V)],Fe.prototype,"description",void 0),fe([Z(),Ie("design:type",Z)],Fe.prototype,"state",void 0),fe([G,Ie("design:type",Date)],Fe.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],Fe.prototype,"updated_at",void 0),fe([z,Ie("design:type",Date)],Fe.prototype,"deleted_at",void 0),fe([ee((()=>ke),"group_id"),Ie("design:type",Array)],Fe.prototype,"groups_routes",void 0),fe([ee((()=>ke),"group_id"),Ie("design:type",Array)],Fe.prototype,"users_groups",void 0),Fe=fe([J(Se),X("group"),te(Ne)],Fe);let ke=class extends Te{};fe([G,Ie("design:type",Date)],ke.prototype,"created_at",void 0),fe([$((()=>Fe)),Ie("design:type",Number)],ke.prototype,"group_id",void 0),fe([$((()=>je)),Ie("design:type",Number)],ke.prototype,"user_id",void 0),ke=fe([J(Se),X("users_groups"),te(Ne)],ke);let xe=class extends Te{};fe([V(),Ie("design:type",V)],xe.prototype,"password",void 0),fe([G,Ie("design:type",Date)],xe.prototype,"created_at",void 0),fe([$((()=>je)),Ie("design:type",Number)],xe.prototype,"user_id",void 0),xe=fe([J(Se),X("users_histories")],xe);let je=class extends Te{};fe([M(),Ie("design:type",Number)],je.prototype,"id",void 0),fe([V(),Ie("design:type",V)],je.prototype,"name",void 0),fe([V(),Ie("design:type",V)],je.prototype,"email",void 0),fe([V(),Ie("design:type",V)],je.prototype,"username",void 0),fe([V(),Ie("design:type",V)],je.prototype,"password",void 0),fe([V(),Ie("design:type",V)],je.prototype,"salt",void 0),fe([V(),Ie("design:type",V)],je.prototype,"token",void 0),fe([V(),Ie("design:type",V)],je.prototype,"avatar",void 0),fe([ie(),Ie("design:type",V)],je.prototype,"date",void 0),fe([Q(),Ie("design:type",V)],je.prototype,"description",void 0),fe([Z(),Ie("design:type",Z)],je.prototype,"state",void 0),fe([G,Ie("design:type",Date)],je.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],je.prototype,"updated_at",void 0),fe([z,Ie("design:type",Date)],je.prototype,"deleted_at",void 0),fe([ee((()=>Ce),"user_id"),Ie("design:type",Array)],je.prototype,"audits",void 0),fe([ee((()=>be),"user_id"),Ie("design:type",Array)],je.prototype,"auths",void 0),fe([ee((()=>we),"user_id"),Ie("design:type",Array)],je.prototype,"registers",void 0),fe([ee((()=>ke),"user_id"),Ie("design:type",Array)],je.prototype,"users_groups",void 0),fe([ee((()=>xe),"user_id"),Ie("design:type",Array)],je.prototype,"users_histories",void 0),je=fe([J(Se),X("user"),re({attributes:{exclude:["password","salt","token"]}}),se({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),te(Ne)],je);let Ce=class extends Te{};fe([M(),Ie("design:type",Number)],Ce.prototype,"id",void 0),fe([ne("CREATE","DELETE","UPDATE"),Ie("design:type",V)],Ce.prototype,"type",void 0),fe([V(),Ie("design:type",V)],Ce.prototype,"model",void 0),fe([V(),Ie("design:type",V)],Ce.prototype,"record",void 0),fe([oe(),Ie("design:type",Object)],Ce.prototype,"data",void 0),fe([oe(),Ie("design:type",Object)],Ce.prototype,"previously",void 0),fe([V(),Ie("design:type",V)],Ce.prototype,"client",void 0),fe([Q(),Ie("design:type",V)],Ce.prototype,"href",void 0),fe([V(),Ie("design:type",V)],Ce.prototype,"user_agent",void 0),fe([Z(),Ie("design:type",Z)],Ce.prototype,"state",void 0),fe([G,Ie("design:type",Date)],Ce.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],Ce.prototype,"updated_at",void 0),fe([z,Ie("design:type",Date)],Ce.prototype,"deleted_at",void 0),fe([$((()=>je)),Ie("design:type",Number)],Ce.prototype,"user_id",void 0),Ce=fe([J(Se),X("audit")],Ce);let Le=class extends Te{};fe([V(),Ie("design:type",V)],Le.prototype,"key",void 0),fe([V(),Ie("design:type",V)],Le.prototype,"value",void 0),fe([G,Ie("design:type",Date)],Le.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],Le.prototype,"updated_at",void 0),Le=fe([J(Se),X("configs"),te(Ne)],Le);let qe=class extends Te{};fe([M(),Ie("design:type",Number)],qe.prototype,"id",void 0),fe([V(),Ie("design:type",V)],qe.prototype,"token",void 0),fe([de(),Ie("design:type",Number)],qe.prototype,"timestamp",void 0),fe([Z(),Ie("design:type",Z)],qe.prototype,"state",void 0),fe([G,Ie("design:type",Date)],qe.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],qe.prototype,"updated_at",void 0),fe([z,Ie("design:type",Date)],qe.prototype,"deleted_at",void 0),fe([$((()=>je)),Ie("design:type",Number)],qe.prototype,"user_id",void 0),qe=fe([J(Se),X("forgot")],qe);let Ue=class extends Te{};fe([M(),Ie("design:type",Number)],Ue.prototype,"id",void 0),fe([V(),Ie("design:type",V)],Ue.prototype,"name",void 0),fe([V(),ae(!0),Ie("design:type",V)],Ue.prototype,"route",void 0),fe([Q(),Ie("design:type",V)],Ue.prototype,"description",void 0),fe([Z(),Ie("design:type",Z)],Ue.prototype,"state",void 0),fe([G,Ie("design:type",Date)],Ue.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],Ue.prototype,"updated_at",void 0),fe([z,Ie("design:type",Date)],Ue.prototype,"deleted_at",void 0),fe([ee((()=>He),"permission_id"),Ie("design:type",Array)],Ue.prototype,"groups_permissions",void 0),Ue=fe([J(Se),X("permission"),te(Ne)],Ue);let He=class extends Te{};fe([G,Ie("design:type",Date)],He.prototype,"created_at",void 0),fe([$((()=>Fe)),Ie("design:type",Number)],He.prototype,"group_id",void 0),fe([$((()=>Ue)),Ie("design:type",Number)],He.prototype,"permission_id",void 0),He=fe([J(Se),X("groups_permissions"),te(Ne)],He);let Ke=class extends Te{};fe([M(),Ie("design:type",Number)],Ke.prototype,"id",void 0),fe([V(),Ie("design:type",V)],Ke.prototype,"type",void 0),fe([V(),Ie("design:type",V)],Ke.prototype,"source",void 0),fe([Q(),Ie("design:type",V)],Ke.prototype,"message",void 0),fe([G,Ie("design:type",Date)],Ke.prototype,"created_at",void 0),Ke=fe([J(Se),X("log")],Ke);let Be=class extends Te{};fe([V(),Ie("design:type",V)],Be.prototype,"session",void 0),fe([Q(),Ie("design:type",V)],Be.prototype,"json",void 0),fe([de(),Ie("design:type",Number)],Be.prototype,"expired",void 0),fe([G,Ie("design:type",Date)],Be.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],Be.prototype,"updated_at",void 0),Be=fe([J(Se),X("session")],Be);class Me{static write(e,t,i){return Ae(this,void 0,void 0,(function*(){yield Me.writeRaw(f.White,"",e,t,i)}))}static error(e,t,i){return Ae(this,void 0,void 0,(function*(){yield Me.writeRaw(f.Red,"error",e,t,i)}))}static info(e,t,i){return Ae(this,void 0,void 0,(function*(){yield Me.writeRaw(f.Cyan,"info",e,t,i)}))}static success(e,t,i){return Ae(this,void 0,void 0,(function*(){yield Me.writeRaw(f.Green,"success",e,t,i)}))}static warning(e,t,i){return Ae(this,void 0,void 0,(function*(){yield Me.writeRaw(f.Yellow,"warning",e,t,i)}))}static writeRaw(e,t,i,r,s){return Ae(this,void 0,void 0,(function*(){s&&P.console(e,t,i),Se&&(yield Ke.create({type:t,source:r,message:i}).catch((()=>null)))}))}}const Ve=e=>pe(e)?ce(e):void 0,Ye={http:Ve(Re.API_HTTP_CRT),token:Ve(Re.API_TOKEN_CRT)},Ge={http:Ve(Re.API_HTTP_KEY),token:Ve(Re.API_TOKEN_KEY)};class We extends _e{constructor(){super(),this.all=e=>Ae(this,void 0,void 0,(function*(){e=e||D;const t=yield Be.findAll({attributes:["session"],where:{expired:{[me.gte]:Date.now()}}}).catch((t=>(e(t),null)));t&&e(null,t.map((e=>e.session))),e()})),this.clear=e=>Ae(this,void 0,void 0,(function*(){yield Be.destroy().catch(D),e&&e()})),this.destroy=(e,t)=>Ae(this,void 0,void 0,(function*(){yield Be.destroy({where:{session:e}}).catch(D),t&&t()})),this.expired=()=>Ae(this,void 0,void 0,(function*(){yield Be.destroy({where:{expired:{[me.lt]:Date.now()}}}).catch(D)})),this.get=(e,t)=>Ae(this,void 0,void 0,(function*(){t=t||D;const i=yield Be.findOne({where:{session:e,expired:{[me.gte]:Date.now()}}}).catch((e=>(t(e),null)));if(i){const e=JSON.parse(i.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield i.destroy().catch(D),void t(null)}t(null,e)}else t(null)})),this.length=e=>Ae(this,void 0,void 0,(function*(){e&&e(null,(yield Be.count().catch(D))||0)})),this.set=(e,t,i)=>Ae(this,void 0,void 0,(function*(){i=i||D;const r=Date.now()+Re.API_SESSION_LIFETIME,s=JSON.stringify(t),[n,o]=(yield Be.findOrCreate({where:{session:e},defaults:{session:e,json:s,expired:r}}).catch(D))||[];n&&(o||(n.json=s,n.expired=r,yield n.save().catch(D))),i()})),this.loop=N(this.expired,3e4),this.loop.start()}}class ze{static create(e){return Ae(this,void 0,void 0,(function*(){if(!Ge.token)return{error:"KEY NOT FOUND"};const{id:t}=e,i=b(),r=yield be.create({secret:i,user_id:t}).catch(ze.error);if(!r)return{error:"INTERNAL SERVER ERROR"};return{auth:r,token:Oe.sign({id:t,secret:i},Ge.token,ze.options())}}))}static destroy(e){return Ae(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){Me.error(e.message,"api.token",Re.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:Re.API_TOKEN_LIFETIME+"ms"}}static renew(e){return Ae(this,void 0,void 0,(function*(){if(!Ge.token)return{error:"KEY NOT FOUND"};const{error:t,decode:i}=ze.verify(e,Re.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(i){const{id:e,secret:t}=i;if(e&&t){const i=yield je.findOne({where:{id:e,state:!0}}).catch(ze.error);if(i){const r=yield be.findOne({where:{secret:t,user_id:i.id}}).catch(ze.error);if(r&&!r.logout){r.secret=b(),yield r.save().catch(ze.error);return{auth:r,token:Oe.sign({id:e,secret:r.secret},Ge.token,ze.options())}}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}}))}static user(e,t,i){return Ae(this,void 0,void 0,(function*(){if(e){t=i.hash.encrypt(e);const r=yield je.findOne({where:{token:t,state:!0}}).catch(ze.error);if(r){const t=e.replace(/(-[\w]{4})/g,"-****"),[i]=(yield be.findOrCreate({where:{secret:t,user_id:r.id},defaults:{secret:t,user_id:r.id}}).catch(ze.error))||[];if(i)return{auth:i,user:r}}return{error:"ACCESS DENIED"}}const{error:r,decode:s}=ze.verify(t);if(r)return{error:r};if(s){const{id:e,secret:t}=s;if(e&&t){const i=yield je.findOne({where:{id:e,state:!0}}).catch(ze.error);if(i){const e=yield be.findOne({where:{secret:t,user_id:i.id}}).catch(ze.error);if(e&&!e.logout)return{auth:e,user:i}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}}))}static verify(e,t){if(!Ye.token)return{error:"CERT NOT FOUND"};if(!e||e.split(".").length<3)return{error:"INVALID TOKEN"};try{return{decode:Oe.verify(e,Ye.token,{clockTolerance:t})}}catch(e){return{error:"INVALID TOKEN"}}}}class $e extends e{constructor(e){super(e,{cert:Ye.http,cross:Re.API_HTTP_CROSS,hybrid:Re.API_HTTP_HYBRID,key:Ge.http,notfound:Re.API_HTTP_NOTFOUND,path:Re.API_HTTP_PATH,port:Re.API_HTTP_PORT,public:Re.API_HTTP_PUBLIC,redirect:Re.API_HTTP_REDIRECT,session:{store:new We,name:Re.API_SESSION_NAME,secret:Re.API_SESSION_SECRET,cookie:{maxAge:Re.API_SESSION_LIFETIME},genid:b}}),this.hash=new I(Re.API_KEY_HASH)}error(e,t){Me.error(e.message,t,Re.API_CONSOLE_ERROR)}log(e,t){Me.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return Ae(this,void 0,void 0,(function*(){yield Se.sync(),yield e.listen.call(this),Re.API_WEBSOCKET_START&&this.server&&(this._webSocket=new H({server:this.server,verifyClient:(e,t)=>t(Re.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>Ae(this,void 0,void 0,(function*(){t.url||(t.url="");const i=t.url.length<=1?"":t.url.replace(/\//g,".");let r;e.on("message",(s=>Ae(this,void 0,void 0,(function*(){if(r)try{const n=JSON.parse(s);this.emit("ws.message"+i,{data:n,message:s,req:t,user:r,ws:e})}catch(n){this.emit("ws.message"+i,{message:s,req:t,user:r,ws:e})}else{const{user:n}=yield ze.user("",s.toString(),this);n&&(r=n,this.emit("ws.connection"+i,{req:t,user:r,ws:e}))}r||e.close()})))),e.on("close",(()=>{r&&this.emit("ws.close"+i,{user:r,ws:e})})),yield w(2e3),r||e.close()})))))}))}websocket(){return this._webSocket}}const Je=e=>{var t,i,r,s,n,o,d,a,u;return{audit_client:null!==(t=e.ip())&&void 0!==t?t:"0.0.0.0",audit_href:(null===(i=null==e?void 0:e.req)||void 0===i?void 0:i.protocol)+"://"+(null===(r=null==e?void 0:e.req)||void 0===r?void 0:r.get("host"))+(null===(s=null==e?void 0:e.req)||void 0===s?void 0:s.originalUrl),audit_user_agent:null!==(o=null===(n=e.req)||void 0===n?void 0:n.headers["user-agent"])&&void 0!==o?o:"",audit_user_id:null!==(u=null===(a=null===(d=null==e?void 0:e.req)||void 0===d?void 0:d.user)||void 0===a?void 0:a.id)&&void 0!==u?u:null}};class Xe{static all(){return Ae(this,void 0,void 0,(function*(){const e=yield Le.findAll().catch(Xe.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e,t){return Ae(this,void 0,void 0,(function*(){var i;const r=null!==(i=null==t?void 0:t.id)&&void 0!==i?i:null;return((yield Le.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:r})).catch(Xe.error))||0)>0}))}static error(e){Me.error(e.message,"api.config",Re.API_CONSOLE_ERROR)}static get(e){return Ae(this,arguments,void 0,(function*(e,t=""){const[i]=(yield Le.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(Xe.error))||[];return i?i.value:t}))}static set(e,t,i){return Ae(this,void 0,void 0,(function*(){var r;const s=null!==(r=null==i?void 0:i.id)&&void 0!==r?r:null,[n]=(yield Le.findOrCreate(Object.assign({where:{key:e}},{user_id:s})).catch(Xe.error))||[];n&&(n.value=t,yield n.save().catch(Xe.error))}))}}const Ze=t((({ctx:e})=>Je(e))),Qe=t((({ctx:e})=>e.req.auth)),et=t((({ctx:e})=>e.req.user));class tt extends F{auth(e,t,i,r,s){return Ae(this,void 0,void 0,(function*(){const{auth:n,error:o,user:d}=yield ze.user(t,i,s);return o?e.error(o):n&&d?n.user_agent&&n.user_agent!=r?e.error("INVALID TOKEN"):(e.req.auth=n,e.req.user=d,void e.next()):e.error("INTERNAL SERVER ERROR")}))}create(e,t,i){return Ae(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".create",i)}))}delete(e,t,i){return Ae(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".delete",i)}))}error(e){Me.error(e.message,"api.controller",Re.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,i){return Ae(this,void 0,void 0,(function*(){if(i){const r=yield this.permissions(i,{route:t});if(r&&r.length>0)return e.next()}e.unauthorized("ACCESS DENIED")}))}permissions(e,t){return Ae(this,void 0,void 0,(function*(){return yield Ue.findAll({where:Object.assign(Object.assign({},null!=t?t:{}),{state:!0}),include:[{model:He,required:!0,include:[{model:Fe,required:!0,where:{state:!0},include:[{model:ke,required:!0,where:{user_id:e.id}}]}]}]}).catch(this.error)}))}read(e,t,i){return Ae(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".read",i)}))}session(e,t,i){return Ae(this,void 0,void 0,(function*(){i.auth&&i.user&&(i.user_agent?i.user_agent!=t&&i.regenerate(D):(i.user_agent=t,i.save(D))),e.next()}))}upload(e,t){t.path||(t.path=Re.API_UPLOAD_TEMP),t.size||(t.size=Re.API_UPLOAD_SIZE),t.field||(t.field=Re.API_UPLOAD_FIELD),d.middleware(e,t)}update(e,t,i){return Ae(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".update",i)}))}validation(e,t){return Ae(this,void 0,void 0,(function*(){const{error:i,value:r}=yield k.object(t).parse().validateAsync(e.req.body);if(i)return e.validation(i);e.req.body=r,e.next()}))}}fe([Pe(0,i()),Pe(1,r(Re.API_KEY_HEADER)),Pe(2,r(Re.API_TOKEN_HEADER)),Pe(3,r("user-agent")),Pe(4,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String,String,$e]),Ie("design:returntype",Promise)],tt.prototype,"auth",null),fe([Pe(0,i()),Pe(1,n()),Pe(2,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,je]),Ie("design:returntype",Promise)],tt.prototype,"create",null),fe([Pe(0,i()),Pe(1,n()),Pe(2,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,je]),Ie("design:returntype",Promise)],tt.prototype,"delete",null),fe([Pe(0,i()),Pe(1,n()),Pe(2,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,je]),Ie("design:returntype",Promise)],tt.prototype,"permission",null),fe([Pe(0,i()),Pe(1,n()),Pe(2,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,je]),Ie("design:returntype",Promise)],tt.prototype,"read",null),fe([Pe(0,i()),Pe(1,r("user-agent")),Pe(2,o()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,Object]),Ie("design:returntype",Promise)],tt.prototype,"session",null),fe([Pe(0,i()),Pe(1,n()),Ie("design:type",Function),Ie("design:paramtypes",[a,Object]),Ie("design:returntype",void 0)],tt.prototype,"upload",null),fe([Pe(0,i()),Pe(1,n()),Pe(2,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,je]),Ie("design:returntype",Promise)],tt.prototype,"update",null),fe([Pe(0,i()),Pe(1,n()),Ie("design:type",Function),Ie("design:paramtypes",[a,Object]),Ie("design:returntype",Promise)],tt.prototype,"validation",null);let it=class extends tt{constructor(){super(...arguments),this._columns=[]}_add(e){return Ae(this,arguments,void 0,(function*({ctx:e,options:t,body:i}){const r=yield this.model().create(Object.assign(Object.assign({},e.req.body),i||{}),Object.assign(Object.assign({},t||{}),Je(e))).catch(this.error);if(r){const t=this.key();return e.prepare(p.OK,{[t]:r.getDataValue(t)}),r}e.error("INTERNAL SERVER ERROR")}))}_all(e){return Ae(this,arguments,void 0,(function*({ctx:e,options:t,callback:i,scope:r}){var s,n,o,d;const a=this.scope(r),u=Object.assign({},t||{});u.where=Object.assign({},u.where||{});const c=e.req.query.limit,l=x(c)?parseInt(c):Re.API_MODEL_LIMIT;u.limit=l>=0?Math.min(l,Re.API_MODEL_LIMIT_MAX):void 0;const y=e.req.query.offset;if(x(y)){const e=y?parseInt(y):0;u.offset=e>0?e:void 0}const g=[],h=this.columns(),v=e=>h.indexOf(e)>=0,_=null===(s=e.req.query.asc)||void 0===s?void 0:s.toString();_&&_.length&&g.push(..._.split(",").filter(v).map((e=>[e,"ASC"])));const m=null===(n=e.req.query.desc)||void 0===n?void 0:n.toString();m&&m.length&&g.push(...m.split(",").filter(v).map((e=>[e,"DESC"]))),g.length&&(u.order=g);const O=[],E=null===(o=e.req.query.search)||void 0===o?void 0:o.toString();(j(u.attributes)?u.attributes:h).filter(x).forEach((t=>{var i;if(E&&E.length&&O.push({[t]:{[me.like]:`%${E}%`}}),"search_"+t in e.req.query){const r=null===(i=e.req.query["search_"+t])||void 0===i?void 0:i.toString();r&&r.length&&O.push({[t]:{[me.like]:`%${r}%`}})}})),O.length&&(u.where=Object.assign(Object.assign({},u.where),{[me.or]:[...O]}));const f=null!==(d=yield a.count(Object.assign(Object.assign({},u),{col:h[0]})).catch(this.error))&&void 0!==d?d:0,P=yield a.findAll(u).catch(this.error),I={count:f};return P?(e.prepare(p.OK,Object.assign(Object.assign({},I),{records:i?yield i(P):P})),Object.assign(Object.assign({},I),{records:P})):(e.error("INTERNAL SERVER ERROR"),Object.assign(Object.assign({},I),{records:[]}))}))}columns(){return 0==this._columns.length&&(this._columns=Object.keys(this.model().getAttributes())),this._columns}_del(e){return Ae(this,arguments,void 0,(function*({ctx:e,options:t}){const i=this.key(),{[i]:r}=e.req.params;if(!r)return e.error("INTERNAL SERVER ERROR"),0;const s=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[i]:r}),individualHooks:!0}),Je(e))).catch(this.error);return s?(e.success("OK"),s):(e.notFound("RECORD NOT FOUND"),0)}))}error(e){e.sql?Me.error(e.message+"\n"+e.sql,"api.controller.sql",Re.API_CONSOLE_ERROR):super.error(e)}_get(e){return Ae(this,arguments,void 0,(function*({ctx:e,options:t,callback:i,scope:r}){const s=this.key(),{[s]:n}=e.req.params,o=yield this.scope(r).findOne(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[s]:n})})).catch(this.error);return o?(e.prepare(p.OK,i?yield i(o):o.toJSON()),o):null===o?e.notFound("RECORD NOT FOUND"):void e.error("INTERNAL SERVER ERROR")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}_set(e){return Ae(this,arguments,void 0,(function*({ctx:e,options:t,body:i}){var r;const s=this.key(),{[s]:n}=e.req.params,[o]=null!==(r=yield this.model().update(Object.assign(Object.assign({},e.req.body),i||{}),Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[s]:n}),individualHooks:!0}),Je(e))).catch(this.error))&&void 0!==r?r:[];return o?(e.success("OK"),!0):(e.success("RECORD NOT CHANGED"),!1)}))}};it=fe([u(tt)],it);let rt=class extends it{model(){return Ce}all(e,t,i){return Ae(this,void 0,void 0,(function*(){const r={};t&&(r.type=t),i&&(r.table=i),yield this._all({ctx:e,options:{attributes:{exclude:["data","previously"]},where:r,order:[["created_at","DESC"]]}})}))}get(e){return Ae(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}};fe([c(),l("auth"),l("read"),Pe(0,i()),Pe(1,y("type")),Pe(2,y("table")),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String]),Ie("design:returntype",Promise)],rt.prototype,"all",null),fe([c("/:id"),l("auth"),l("read"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],rt.prototype,"get",null),rt=fe([g("/audits"),u(it)],rt);let st=class extends tt{login(e,t,i,r,s){return Ae(this,void 0,void 0,(function*(){var n;yield w(Re.API_SLEEP_AUTH);const o=yield je.scope("password").findOne({where:{[me.or]:[{email:i},{username:i}]}}).catch(this.error);if(r+=null!==(n=null==o?void 0:o.salt)&&void 0!==n?n:"",!o||o.password!=A(r))return e.notFound("INVALID USERNAME OR PASSWORD"),s.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const d=yield we.findOne({where:{state:!0,user_id:o.id}}).catch(this.error);if(d)return e.error("ACTIVATION REQUIRED"),s.emit("auth.activation",{ctx:e,register:d,user:o}),void this.emit("auth.activation",{ctx:e,register:d,user:o});if(!o.state)return e.notFound("INVALID USERNAME OR PASSWORD"),s.emit("auth.failure",{ctx:e,user:o}),void this.emit("auth.failure",{ctx:e,user:o});const{auth:a,error:u,token:p}=yield ze.create(o);return u?(e.error(u),s.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):a&&p?(a.user_agent=t,yield a.save().catch(this.error),e.json({token:p}),s.emit("auth.login",{auth:a,ctx:e,user:o}),void this.emit("auth.login",{auth:a,ctx:e,user:o})):(e.error("INTERNAL SERVER ERROR"),s.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,i,r){return Ae(this,void 0,void 0,(function*(){if(yield ze.destroy(t))return e.success("OK"),r.emit("auth.logout",{auth:t,ctx:e,user:i}),void this.emit("auth.logout",{auth:t,ctx:e,user:i});e.unauthorized("ACCESS DENIED")}))}renew(e,t,i,r){return Ae(this,void 0,void 0,(function*(){const{auth:s,error:n,token:o}=yield ze.renew(i);return n?e.error(n):s?(s.user_agent=t,yield s.save().catch(this.error),e.json({token:o}),r.emit("auth.renew",{auth:s,ctx:e}),void this.emit("auth.renew",{auth:s,ctx:e})):e.error("INTERNAL SERVER ERROR")}))}user(e,t){return Ae(this,void 0,void 0,(function*(){const i=yield this.permissions(t);if(!i)return e.error("INTERNAL SERVER ERROR");e.json(Object.assign(Object.assign({},t.toJSON()),{permissions:i.map((e=>e.route))}))}))}};fe([h("/login"),l("validation",{username:k.string().min(3).required(),password:k.string().min(5).required()}),Pe(0,i()),Pe(1,r("user-agent")),Pe(2,v("username")),Pe(3,v("password")),Pe(4,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String,String,$e]),Ie("design:returntype",Promise)],st.prototype,"login",null),fe([c("/logout"),l("auth"),Pe(0,i()),Pe(1,Qe()),Pe(2,et()),Pe(3,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,be,je,$e]),Ie("design:returntype",Promise)],st.prototype,"logout",null),fe([h("/renew"),l("validation",{token:k.string().required()}),Pe(0,i()),Pe(1,r("user-agent")),Pe(2,v("token")),Pe(3,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String,$e]),Ie("design:returntype",Promise)],st.prototype,"renew",null),fe([c(),l("auth"),Pe(0,i()),Pe(1,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,je]),Ie("design:returntype",Promise)],st.prototype,"user",null),st=fe([g("/auth"),u(tt)],st);let nt=class extends tt{directory(){return Re.API_HTTP_PUBLIC||"./"}files(e){return Ae(this,void 0,void 0,(function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const i=Ee(this.directory(),t);if(!pe(i)||!le(i).isDirectory())return e.notFound("RECORD NOT FOUND");let r=[];return r=ye(i),r=r.map((e=>this.info(Ee(i,e)))),r=r.filter(C),Object.assign(Object.assign({},this.info(i)),{files:r})}))}access(e,t,i){return Ae(this,void 0,void 0,(function*(){yield this.permission(e,this.name()+"."+t,i)}))}info(e){if(!pe(e))return null;const t=le(e),i=e.split("/").pop();e=e.replace(this.directory(),"/").replace(/^\/\//,"/");const r=t.isDirectory();return{name:i,path:e.replace(/^\/\//,"/"),size:t.size,extension:r?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:r,symlink:t.isSymbolicLink()}}name(){return"files"}};fe([c("/path/?*"),l("auth"),l("access","list"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],nt.prototype,"files",null),fe([Pe(0,i()),Pe(1,n()),Pe(2,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,je]),Ie("design:returntype",Promise)],nt.prototype,"access",null),nt=fe([g("/files"),u(tt)],nt);let ot=class extends tt{check(e,t){return Ae(this,void 0,void 0,(function*(){const i=yield this.find(t);if(!i||!i.user)return e.notFound("RECORD NOT FOUND");i.token=L(),yield i.save(),e.json({token:i.token})}))}forgot(e,t,i){return Ae(this,void 0,void 0,(function*(){yield w(Re.API_SLEEP_FORGOT);const r=t,s=yield je.findOne({where:{[me.or]:[{email:r},{username:t}]}}).catch(this.error);if(!s)return e.notFound("RECORD NOT FOUND");const n=L(),o=Date.now()+6e4*Re.API_TOKEN_FORGOT,d=yield qe.create({token:n,timestamp:o,state:!0,user_id:s.id});e.success("OK"),i.emit("forgot.send",{ctx:e,forgot:d,user:s}),this.emit("forgot.send",{ctx:e,forgot:d,user:s})}))}reset(e,t,i,r){return Ae(this,void 0,void 0,(function*(){const s=yield this.find(t);if(!s)return e.notFound("RECORD NOT FOUND");s.state=!1,yield s.save().catch(this.error),s.user.password=A(i),yield s.user.save().catch(this.error),e.success("OK"),r.emit("forgot.reset",{ctx:e,user:s.user}),this.emit("forgot.reset",{ctx:e,user:s.user})}))}find(e){return Ae(this,void 0,void 0,(function*(){return yield qe.findOne({where:{token:e,state:!0},include:[{model:je,required:!0}]}).catch(this.error)}))}};fe([c("/check"),l("validation",{token:k.string().required()}),Pe(0,i()),Pe(1,v("token")),Ie("design:type",Function),Ie("design:paramtypes",[a,String]),Ie("design:returntype",Promise)],ot.prototype,"check",null),fe([h(),l("validation",{username:k.string().min(4).required()}),Pe(0,i()),Pe(1,v("username")),Pe(2,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,$e]),Ie("design:returntype",Promise)],ot.prototype,"forgot",null),fe([h("/reset"),l("validation",{token:k.string().required(),password:k.string().min(5).required()}),Pe(0,i()),Pe(1,v("token")),Pe(2,v("password")),Pe(3,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String,$e]),Ie("design:returntype",Promise)],ot.prototype,"reset",null),ot=fe([g("/forgot"),u(tt)],ot);let dt=class extends it{constructor(){super(...arguments),this._crud={}}add(e){return Ae(this,void 0,void 0,(function*(){yield this._add({ctx:e})}))}all(e){return Ae(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}CrudCreate(){return this._crud}del(e){return Ae(this,void 0,void 0,(function*(){yield this._del({ctx:e})}))}get(e){return Ae(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e){return Ae(this,void 0,void 0,(function*(){yield this._set({ctx:e})}))}CrudUpdate(){return this._crud}validationAdd(e){return Ae(this,void 0,void 0,(function*(){const t=this.CrudCreate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)}))}validationSet(e){return Ae(this,void 0,void 0,(function*(){const t=this.CrudUpdate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)}))}};fe([h(),l("auth"),l("create"),l("validationAdd"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],dt.prototype,"add",null),fe([c(),l("auth"),l("read"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],dt.prototype,"all",null),fe([_("/:id"),l("auth"),l("delete"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],dt.prototype,"del",null),fe([c("/:id"),l("auth"),l("read"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],dt.prototype,"get",null),fe([m("/:id"),l("auth"),l("update"),l("validationSet"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],dt.prototype,"set",null),fe([Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],dt.prototype,"validationAdd",null),fe([Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],dt.prototype,"validationSet",null),dt=fe([u(it)],dt);let at=class extends dt{model(){return Fe}CrudCreate(){return{name:k.string().required(),description:k.string().empty(""),state:k.boolean().parse().required()}}CrudUpdate(){return{name:k.string().empty(),description:k.string().empty(),state:k.boolean().parse().empty()}}};at=fe([g("/groups"),u(dt)],at);let ut=class extends it{model(){return He}all(e,t){return Ae(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{group_id:t},include:[{model:Ue,required:!0}]},callback:e=>e.map((e=>e.permission))})}))}set(e,t,i,r){return Ae(this,void 0,void 0,(function*(){const s=yield Fe.findByPk(t,{attributes:["id"]}).catch(this.error);if(s){const t=s.id;if(yield He.destroy(Object.assign({where:{group_id:t},individualHooks:!0},r)),i){let e=0;yield w(1e3);for(let s=0;s<i.length;s++)e=yield Ue.count({where:{id:i[s]}}),e&&(yield He.create({group_id:t,permission_id:i[s]},Object.assign({},r)))}return e.success("OK")}if(q(s))return e.notFound("RECORD NOT FOUND");e.error("INTERNAL SERVER ERROR")}))}};fe([c("/:id/routes"),l("auth"),l("read","groups"),Pe(0,i()),Pe(1,O("id")),Ie("design:type",Function),Ie("design:paramtypes",[a,String]),Ie("design:returntype",Promise)],ut.prototype,"all",null),fe([m("/:id/permissions"),l("auth"),l("update","groups"),l("validation",{permissions:k.array(k.number().parse())}),Pe(0,i()),Pe(1,O("id")),Pe(2,v("permissions")),Pe(3,Ze()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,Array,Object]),Ie("design:returntype",Promise)],ut.prototype,"set",null),ut=fe([g("/groups"),u(it)],ut);let pt=class extends it{model(){return Ke}all(e,t,i){return Ae(this,void 0,void 0,(function*(){const r={};t&&(r.type=t),i&&(r.source=i),yield this._all({ctx:e,options:{where:r,order:[["created_at","DESC"]]}})}))}};fe([c(),l("auth"),l("read"),Pe(0,i()),Pe(1,y("type")),Pe(2,y("source")),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String]),Ie("design:returntype",Promise)],pt.prototype,"all",null),pt=fe([g("/logs"),u(it)],pt);let ct=class extends dt{model(){return Ue}CrudCreate(){return{name:k.string().required(),description:k.string().empty(""),state:k.boolean().parse().required()}}CrudUpdate(){return{name:k.string().empty(),description:k.string().empty(),state:k.boolean().parse().empty()}}};ct=fe([g("/permissions"),u(dt)],ct);let lt=class extends tt{register(e,t,i){return Ae(this,void 0,void 0,(function*(){yield w(Re.API_SLEEP_REGISTRY);const{name:r,date:s,email:n,username:o,password:d,confirm:a}=t,u=o||n,p=A(d);if(yield je.count({where:{[me.or]:[{email:n},{username:u}]}}).catch(this.error))return e.validation("INVALID EMAIL OR USERNAME");if(p!=A(a))return e.error("INVALID PASSWORD");const c=yield je.create({name:r,email:n,username:u,password:p,avatar:"",date:s,description:"",state:!1}).catch(this.error);if(!c)return e.error("INTERNAL SERVER ERROR");const l=yield we.create({token:yield this.getId(),user_id:c.id,state:!0}).catch(this.error);if(!l)return yield c.destroy().catch(this.error),e.error("INTERNAL SERVER ERROR");e.success("OK"),i.emit("register.user",{ctx:e,register:l,user:c}),this.emit("register.user",{ctx:e,register:l,user:c})}))}confirm(e,t,i){return Ae(this,void 0,void 0,(function*(){const r=yield we.findOne({where:{token:t,state:!0},include:[{model:je,required:!0}]}).catch(this.error);if(!r)return e.notFound("RECORD NOT FOUND");r.state=!1,yield r.save().catch(this.error),r.user.state=!0,yield r.user.save().catch(this.error),e.success("OK"),i.emit("register.confirm",{ctx:e,register:r,user:r.user}),this.emit("register.confirm",{ctx:e,register:r,user:r.user})}))}send(e,t,i){return Ae(this,void 0,void 0,(function*(){const r=t,s=yield we.findOne({where:{state:!0},include:[{model:je,required:!0,where:{[me.or]:[{email:r},{username:t}]}}]}).catch(this.error);if(!s)return e.notFound("RECORD NOT FOUND");e.success("OK"),i.emit("register.send",{ctx:e,register:s,user:s.user}),this.emit("register.send",{ctx:e,register:s,user:s.user})}))}getId(){return Ae(this,void 0,void 0,(function*(){const e=b();return(yield we.count({where:{token:e}}))?this.getId():e}))}};fe([h(),l("validation",{name:k.string().required(),date:k.date().required(),email:k.string().email().required(),username:k.string().min(4).empty(),password:k.string().min(5).required(),confirm:k.string().min(5).required()}),Pe(0,i()),Pe(1,v()),Pe(2,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,Object,$e]),Ie("design:returntype",Promise)],lt.prototype,"register",null),fe([h("/confirm"),l("validation",{token:k.string().required()}),Pe(0,i()),Pe(1,v("token")),Pe(2,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,$e]),Ie("design:returntype",Promise)],lt.prototype,"confirm",null),fe([h("/send"),l("validation",{username:k.string().min(4).required()}),Pe(0,i()),Pe(1,v("username")),Pe(2,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,$e]),Ie("design:returntype",Promise)],lt.prototype,"send",null),lt=fe([g("/register"),u(tt)],lt);let yt=class extends tt{setup(e,t){return Ae(this,void 0,void 0,(function*(){if(0==(yield je.count())){const e=L(),i=yield je.create({name:"Admin",email:"admin@localhost",username:"admin",password:A("admin"+e),salt:e,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0},Object.assign({},t)),r={description:"API CORE",state:!0},s=yield Fe.create(Object.assign({name:"admin"},r),Object.assign({},t));yield ke.create({user_id:i.id,group_id:s.id},Object.assign({},t));const n=["audits","users","groups","routes"],o=["create","read","update","delete"];yield U(n,(e=>Ae(this,void 0,void 0,(function*(){yield U(o,(i=>Ae(this,void 0,void 0,(function*(){const n=yield Ue.create(Object.assign({name:`${e} ${i}`,route:`${e}.${i}`},r),Object.assign({},t));yield He.create({group_id:s.id,permission_id:n.id},Object.assign({},t))}))))}))));const d=["delete","list","read","rename","upload","write"];yield U(d,(e=>Ae(this,void 0,void 0,(function*(){const i=yield Ue.create(Object.assign({name:`files ${e}`,route:`files.${e}`},r),Object.assign({},t));yield He.create({group_id:s.id,permission_id:i.id},Object.assign({},t))}))));const a=["logs"];yield U(a,(e=>Ae(this,void 0,void 0,(function*(){const i=yield Ue.create(Object.assign({name:`${e} files`,route:`${e}.read`},r),Object.assign({},t));yield He.create({group_id:s.id,permission_id:i.id},Object.assign({},t))}))))}e.success("OK")}))}};fe([c(),Pe(0,i()),Pe(1,Ze()),Ie("design:type",Function),Ie("design:paramtypes",[a,Object]),Ie("design:returntype",Promise)],yt.prototype,"setup",null),yt=fe([g("/setup"),u(tt)],yt);let gt=class extends it{model(){return je}constructor(){super(),this.path=Re.API_HTTP_PUBLIC+"/avatar",Re.API_HTTP_PUBLIC&&pe(Re.API_HTTP_PUBLIC)&&!pe(this.path)&&ge(this.path)}avatar(e,t,i,r){return Ae(this,void 0,void 0,(function*(){if(t.length){const s=t[0].filename||"";if(s){const t=this.path+"/"+i.avatar;if(pe(t)&&he(t).isFile()&&ve(t),i.avatar=s,yield i.save(Object.assign({},r)).catch(this.error))return e.success("OK")}}e.success("RECORD NOT CHANGED")}))}avatar_delete(e,t,i){return Ae(this,void 0,void 0,(function*(){const r=this.path+"/"+t.avatar;t.avatar="",(yield t.save(Object.assign({},i)).catch(this.error))&&pe(r)&&ve(r),e.success("OK")}))}password(e,t,i,r,s){return Ae(this,void 0,void 0,(function*(){var n;if(Re.API_USER_HISTORY){if(yield xe.count({where:{password:A(i+r.id)}}).catch(this.error))return e.error("PASSWORD PREVIOUSLY REGISTERED")}const o=yield this.scope("password").findOne({where:{id:r.id,state:!0}}).catch(this.error);return t+=null!==(n=null==o?void 0:o.salt)&&void 0!==n?n:"",o&&o.password==A(t)?(o.salt=L(),o.password=A(i+o.salt),(yield o.save(Object.assign({},s)).catch(this.error))?e.success("OK"):void e.success("RECORD NOT CHANGED")):e.error("INVALID PASSWORD")}))}token(e,t,i){return Ae(this,void 0,void 0,(function*(){const r=yield this.model().findOne({attributes:["token"],where:{id:t.id}}).catch(this.error);if(r)return e.json({token:i.hash.decrypt(r.token)});e.notFound("RECORD NOT FOUND")}))}token_get(e,t,i){return Ae(this,void 0,void 0,(function*(){const r=yield this.scope("token").findOne({where:{id:t}}).catch(this.error);if(r)return e.json({token:i.hash.decrypt(r.token)});e.notFound("RECORD NOT FOUND")}))}token_delete(e,t,i){return Ae(this,void 0,void 0,(function*(){const r=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(r)return r.token="",yield r.save(Object.assign({},i)).catch(this.error),e.success("OK");e.notFound("RECORD NOT FOUND")}))}token_renew(e,t,i,r){return Ae(this,void 0,void 0,(function*(){const s=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(s){const t=yield this.token_new();return s.token=r.hash.encrypt(t),yield s.save(Object.assign({},i)).catch(this.error),e.json({token:t})}e.notFound("RECORD NOT FOUND")}))}token_new(){return Ae(this,void 0,void 0,(function*(){var e;const t=b();return(null!==(e=yield this.model().count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t}))}add(e,t){return Ae(this,void 0,void 0,(function*(){const i=L(),r=yield this._add({ctx:e,body:{password:A(t+i),salt:i}});Re.API_USER_HISTORY&&r&&(yield xe.create({password:A(t+r.id),user_id:r.id}))}))}all(e){return Ae(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}del(e,t,i){return Ae(this,void 0,void 0,(function*(){if(i.id.toString()==t)return e.notFound("RECORD NOT FOUND");yield this._del({ctx:e})}))}get(e){return Ae(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,t,i){return Ae(this,void 0,void 0,(function*(){if(Re.API_USER_HISTORY&&i){const r=A(i+t);if(yield xe.count({where:{password:r}}).catch(this.error))return e.error("PASSWORD PREVIOUSLY REGISTERED");yield xe.create({password:r,user_id:t}).catch(this.error)}const r=i?L():"";yield this._set({ctx:e,body:i?{password:A(i+r),salt:r}:{}})}))}};fe([h("/avatar"),l("auth"),l("upload",(e=>({count:1,field:"file",path:e.controller.path,types:["image/bmp","image/jpeg","image/png"],size:32}))),Pe(0,i()),Pe(1,E()),Pe(2,et()),Pe(3,Ze()),Ie("design:type",Function),Ie("design:paramtypes",[a,Array,je,Object]),Ie("design:returntype",Promise)],gt.prototype,"avatar",null),fe([_("/avatar"),l("auth"),Pe(0,i()),Pe(1,et()),Pe(2,Ze()),Ie("design:type",Function),Ie("design:paramtypes",[a,je,Object]),Ie("design:returntype",Promise)],gt.prototype,"avatar_delete",null),fe([h("/password"),l("auth"),l("validation",{oldPassword:k.string().min(5).required(),newPassword:k.string().min(5).required()}),Pe(0,i()),Pe(1,v("oldPassword")),Pe(2,v("newPassword")),Pe(3,et()),Pe(4,Ze()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String,je,Object]),Ie("design:returntype",Promise)],gt.prototype,"password",null),fe([c("/token"),l("auth"),Pe(0,i()),Pe(1,et()),Pe(2,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,je,$e]),Ie("design:returntype",Promise)],gt.prototype,"token",null),fe([c("/token/:id"),l("auth"),l("create"),Pe(0,i()),Pe(1,O("id")),Pe(2,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,$e]),Ie("design:returntype",Promise)],gt.prototype,"token_get",null),fe([_("/token/:id"),l("auth"),l("delete"),Pe(0,i()),Pe(1,O("id")),Pe(2,Ze()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,Object]),Ie("design:returntype",Promise)],gt.prototype,"token_delete",null),fe([c("/token/renew/:id"),l("auth"),l("update"),Pe(0,i()),Pe(1,O("id")),Pe(2,Ze()),Pe(3,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,Object,$e]),Ie("design:returntype",Promise)],gt.prototype,"token_renew",null),fe([h(),l("auth"),l("create"),l("validation",{name:k.string().required(),email:k.string().email().required(),username:k.string().min(4).required(),password:k.string().min(5).required(),description:k.string().empty(""),state:k.boolean().parse().required()}),Pe(0,i()),Pe(1,v("password")),Ie("design:type",Function),Ie("design:paramtypes",[a,String]),Ie("design:returntype",Promise)],gt.prototype,"add",null),fe([c(),l("auth"),l("read"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],gt.prototype,"all",null),fe([_("/:id"),l("auth"),l("delete"),Pe(0,i()),Pe(1,O("id")),Pe(2,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,je]),Ie("design:returntype",Promise)],gt.prototype,"del",null),fe([c("/:id"),l("auth"),l("read"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],gt.prototype,"get",null),fe([m("/:id"),l("auth"),l("update"),l("validation",{name:k.string().empty(),email:k.string().email().empty(),username:k.string().min(4).empty(),password:k.string().min(5).empty().filter(""),description:k.string().empty(),state:k.boolean().parse().empty()}),Pe(0,i()),Pe(1,O("id")),Pe(2,v("password")),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String]),Ie("design:returntype",Promise)],gt.prototype,"set",null),gt=fe([g("/users"),u(it),Ie("design:paramtypes",[])],gt);let ht=class extends it{model(){return ke}groups(e,t){return Ae(this,void 0,void 0,(function*(){yield this.all(e,t.id.toString())}))}all(e,t){return Ae(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{user_id:t},include:[{model:Fe,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,i,r){return Ae(this,void 0,void 0,(function*(){const s=yield je.findByPk(t,{attributes:["id"]}).catch(this.error);if(s){if(yield ke.destroy(Object.assign({where:{user_id:s.id},individualHooks:!0},r)),i){let e=0;yield w(1e3);for(let t=0;t<i.length;t++)e=yield Fe.count({where:{id:i[t]}}),e&&(yield ke.create({user_id:s.id,group_id:i[t]},Object.assign({},r)))}return e.success("OK")}if(q(s))return e.notFound("RECORD NOT FOUND");e.error("INTERNAL SERVER ERROR")}))}};fe([c("/groups"),l("auth"),l("read","users"),Pe(0,i()),Pe(1,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,je]),Ie("design:returntype",Promise)],ht.prototype,"groups",null),fe([c("/:id/groups"),l("auth"),l("read","users"),Pe(0,i()),Pe(1,O("id")),Ie("design:type",Function),Ie("design:paramtypes",[a,String]),Ie("design:returntype",Promise)],ht.prototype,"all",null),fe([m("/:id/groups"),l("auth"),l("update","users"),l("validation",{groups:k.array(k.number().parse())}),Pe(0,i()),Pe(1,O("id")),Pe(2,v("groups")),Pe(3,Ze()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,Array,Object]),Ie("design:returntype",Promise)],ht.prototype,"set",null),ht=fe([g("/users"),u(it)],ht);export{$e as Application,Ce as Audit,rt as AuditsController,be as Auth,st as AuthController,Xe as Config,Le as Configs,tt as ControllerBase,dt as CrudController,Re as Env,nt as FilesController,qe as Forgot,ot as ForgotController,Fe as Group,He as GroupPermission,at as GroupsController,ut as GroupsPermissionsController,Ke as Log,Me as Logs,pt as LogsController,Te as Model,it as ModelController,Ue as Permission,ct as PermissionsController,we as Register,lt as RegisterController,Ze as ReqAudit,Qe as ReqAuth,et as ReqUser,Be as Session,yt as SetupController,ze as Token,je as User,ke as UserGroup,xe as UserHistory,gt as UsersController,ht as UsersGroupsController,Je as audit,Ye as crt,Se as database,Ne as hooks,Ge as key};
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andrewcaires/api",
|
|
3
|
-
"version": "4.0
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"description": "Simple api for small applications using express, jsonwebtoken, sequelize and websocket",
|
|
5
|
+
"type": "module",
|
|
5
6
|
"main": "./dist/index.cjs.js",
|
|
6
7
|
"types": "./dist/index.d.ts",
|
|
7
8
|
"module": "./dist/index.esm.js",
|
|
@@ -18,8 +19,8 @@
|
|
|
18
19
|
"dist"
|
|
19
20
|
],
|
|
20
21
|
"scripts": {
|
|
21
|
-
"
|
|
22
|
-
"
|
|
22
|
+
"dev": "tsx-dev --watch --clear ./src/dev.ts",
|
|
23
|
+
"build": "rollup --bundleConfigAsCjs -c rollup.config.js"
|
|
23
24
|
},
|
|
24
25
|
"repository": {
|
|
25
26
|
"type": "git",
|
|
@@ -45,14 +46,15 @@
|
|
|
45
46
|
},
|
|
46
47
|
"homepage": "https://github.com/andrewcaires/npm/tree/main/api#readme",
|
|
47
48
|
"dependencies": {
|
|
48
|
-
"@andrewcaires/express": "^1.1
|
|
49
|
-
"@andrewcaires/node": "^1.
|
|
50
|
-
"@andrewcaires/sequelize": "^1.
|
|
51
|
-
"@andrewcaires/utils.js": "^0.
|
|
49
|
+
"@andrewcaires/express": "^1.2.1",
|
|
50
|
+
"@andrewcaires/node": "^1.2.0",
|
|
51
|
+
"@andrewcaires/sequelize": "^1.1.2",
|
|
52
|
+
"@andrewcaires/utils.js": "^0.4.0",
|
|
52
53
|
"cors": "^2.8.5",
|
|
53
54
|
"dotenv": "^16.4.5",
|
|
54
|
-
"express-session": "^1.18.
|
|
55
|
+
"express-session": "^1.18.1",
|
|
55
56
|
"jsonwebtoken": "^9.0.2",
|
|
57
|
+
"tsx": "^4.19.1",
|
|
56
58
|
"ws": "^8.18.0"
|
|
57
59
|
},
|
|
58
60
|
"devDependencies": {
|
|
@@ -62,13 +64,13 @@
|
|
|
62
64
|
"@types/cors": "^2.8.17",
|
|
63
65
|
"@types/express-session": "^1.18.0",
|
|
64
66
|
"@types/jsonwebtoken": "^9.0.7",
|
|
65
|
-
"@types/node": "^22.7.
|
|
67
|
+
"@types/node": "^22.7.5",
|
|
66
68
|
"@types/ws": "^8.5.12",
|
|
67
|
-
"eslint": "^9.
|
|
69
|
+
"eslint": "^9.12.0",
|
|
68
70
|
"mariadb": "^3.3.2",
|
|
69
71
|
"rollup": "^4.24.0",
|
|
70
72
|
"rollup-plugin-dts": "^6.1.1",
|
|
71
73
|
"tslib": "^2.7.0",
|
|
72
|
-
"typescript-eslint": "^8.
|
|
74
|
+
"typescript-eslint": "^8.9.0"
|
|
73
75
|
}
|
|
74
76
|
}
|