@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 CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/api v4.0.3
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.3
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 WebSocket from 'ws';
10
- import { EventEmitter, TypeObject, ValidationBase, TypeObjectAny, TypeObjectString } from '@andrewcaires/utils.js';
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
- useragent: string;
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 Route extends Model {
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
- groups_routes: Array<GroupRoute>;
49
+ groups_permissions: Array<GroupPermission>;
49
50
  }
50
51
 
51
- declare class GroupRoute extends Model {
52
+ declare class GroupPermission extends Model {
52
53
  created_at: Date;
53
54
  group_id: number;
54
55
  group: Group;
55
- route_id: number;
56
- route: Route;
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<GroupRoute>;
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: string;
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, useragent: string, app: Application): Promise<void>;
151
- session(ctx: Context, useragent: string, store: IStore): Promise<void>;
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, name: string, user: User): Promise<void>;
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(): WebSocket.Server | undefined;
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, user }: ArgumentsModelAdd<M>): Promise<M | void>;
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, user }: ArgumentsModelDel<M>): Promise<number>;
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, user }: ArgumentsModelSet<M>): Promise<boolean>;
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, useragent: string, username: string, password: string, app: Application): Promise<void>;
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, useragent: string, old: string, app: Application): Promise<void>;
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, user: User): Promise<void>;
299
+ protected add(ctx: Context): Promise<void>;
295
300
  protected all(ctx: Context): Promise<void>;
296
- create(): TypeObject<ValidationBase>;
297
- protected del(ctx: Context, user: User): Promise<void>;
301
+ CrudCreate(): TypeObject<ValidationBase>;
302
+ protected del(ctx: Context): Promise<void>;
298
303
  protected get(ctx: Context): Promise<void>;
299
- protected set(ctx: Context, user: User): Promise<void>;
300
- update(): TypeObject<ValidationBase>;
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
- create(): TypeObject<ValidationBase>;
308
- update(): TypeObject<ValidationBase>;
312
+ CrudCreate(): TypeObject<ValidationBase>;
313
+ CrudUpdate(): TypeObject<ValidationBase>;
309
314
  }
310
315
 
311
- declare class GroupsRoutesController extends ModelController<GroupRoute> {
312
- model(): typeof GroupRoute;
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, routes: Array<number>, audit: TypeObjectAny): Promise<void>;
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
- dir: string;
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 avatar_remove(ctx: Context, user: User, audit: TypeObjectAny): Promise<void>;
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 token_remove(ctx: Context, id: string, audit: TypeObjectAny): Promise<void>;
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, user: User): Promise<void>;
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, password: string, user: User): Promise<void>;
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, console?: boolean): Promise<void>;
430
- static error(message: string, source?: string, console?: boolean): Promise<void>;
431
- static info(message: string, source?: string, console?: boolean): Promise<void>;
432
- static success(message: string, source?: string, console?: boolean): Promise<void>;
433
- static warning(message: string, source?: string, console?: boolean): Promise<void>;
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, GroupRoute, GroupsController, GroupsRoutesController, type IDatabaseOptions, type ITokenParameters, Log, Logs, LogsController, Model, ModelController, Permission, Register, RegisterController, ReqAudit, ReqAuth, ReqUser, type ResultModelAll, Route, RoutesController, Session, SetupController, Token, User, UserGroup, UsersController, UsersGroupsController, audit, conn, crt, key };
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.3
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",
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
- "build": "rollup --bundleConfigAsCjs -c rollup.config.js",
22
- "dev": "ts-node-dev ./src/dev.ts"
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.11",
49
- "@andrewcaires/node": "^1.1.5",
50
- "@andrewcaires/sequelize": "^1.0.3",
51
- "@andrewcaires/utils.js": "^0.3.6",
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.0",
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.4",
67
+ "@types/node": "^22.7.5",
66
68
  "@types/ws": "^8.5.12",
67
- "eslint": "^9.11.1",
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.8.0"
74
+ "typescript-eslint": "^8.9.0"
73
75
  }
74
76
  }