@andrewcaires/api 3.2.3 → 3.2.4

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 v3.2.3
2
+ * @andrewcaires/api v3.2.4
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"),i=require("sequelize"),s=require("dotenv"),n=require("fs"),d=require("express-session"),a=require("jsonwebtoken"),l=require("path");function u(e,t,r,o){var i,s=arguments.length,n=s<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--)(i=e[d])&&(n=(s<3?i(n):s>3?i(t,r,n):i(t,r))||n);return s>3&&n&&Object.defineProperty(t,r,n),n}function c(e,t){return function(r,o){t(r,o,e)}}function p(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function g(e,t,r,o){return new(r||(r=Promise))((function(i,s){function n(e){try{a(o.next(e))}catch(e){s(e)}}function d(e){try{a(o.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?i(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,s.config();class h{static getBool(e,t){return r.toBool(h.getString(e,t.toString()))}static getInt(e,t){return parseInt(h.getString(e,t.toString()))}static getMs(e,t){return r.parseMs(h.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}h.API_CONSOLE_ERROR=h.getBool("API_CONSOLE_ERROR",!1),h.API_DEFAULT_PATH=h.getString("API_DEFAULT_PATH","/api"),h.API_DB_DATABASE=h.getString("API_DB_DATABASE",""),h.API_DB_HOST=h.getString("API_DB_HOST","127.0.0.1"),h.API_DB_PASSWORD=h.getString("API_DB_PASSWORD",""),h.API_DB_PORT=h.getInt("API_DB_PORT",3306),h.API_DB_TYPE=h.getString("API_DB_TYPE",""),h.API_DB_USERNAME=h.getString("API_DB_USERNAME","root"),h.API_DB_LOG=h.getBool("API_DB_LOG",!1),h.API_DB_PREFIX=h.getString("API_DB_PREFIX",""),h.API_DB_TIMEZONE=h.getString("API_DB_TIMEZONE","+00:00"),h.API_HTTP_CRT=h.getString("API_HTTP_CRT",""),h.API_HTTP_KEY=h.getString("API_HTTP_KEY",""),h.API_HTTP_PORT=h.getInt("API_HTTP_PORT",3e3),h.API_HTTP_PUBLIC=h.getString("API_HTTP_PUBLIC",""),h.API_HTTP_CROSS=h.getBool("API_HTTP_CROSS",!1),h.API_HTTP_HYBRID=h.getBool("API_HTTP_HYBRID",!1),h.API_HTTP_REDIRECT=h.getString("API_HTTP_REDIRECT",""),h.API_KEY_HASH=h.getString("API_KEY_HASH",""),h.API_KEY_HEADER=h.getString("API_KEY_HEADER","api_key"),h.API_NOTFOUND_REDIRECT=h.getString("API_NOTFOUND_REDIRECT",""),h.API_SLEEP_AUTH=h.getMs("API_SLEEP_AUTH","2s"),h.API_SLEEP_FORGOT=h.getMs("API_SLEEP_FORGOT","5s"),h.API_SLEEP_REGISTRY=h.getMs("API_SLEEP_REGISTRY","5s"),h.API_SESSION_NAME=h.getString("API_SESSION_NAME","session.id"),h.API_SESSION_LIFETIME=h.getMs("API_SESSION_LIFETIME","1d"),h.API_SESSION_SECRET=h.getString("API_SESSION_SECRET","yoursecret"),h.API_TOKEN_CRT=h.getString("API_TOKEN_CRT",""),h.API_TOKEN_KEY=h.getString("API_TOKEN_KEY",""),h.API_TOKEN_FORGOT=h.getMs("API_TOKEN_LIFETIME","1d"),h.API_TOKEN_HEADER=h.getString("API_TOKEN_HEADER","authorization"),h.API_TOKEN_LIFETIME=h.getMs("API_TOKEN_LIFETIME","1d"),h.API_TOKEN_RENEW=h.getMs("API_TOKEN_RENEW","1d"),h.API_UPLOAD_COUNT=h.getInt("API_UPLOAD_COUNT",1),h.API_UPLOAD_FIELD=h.getString("API_UPLOAD_FIELD","upload"),h.API_UPLOAD_SIZE=h.getInt("API_UPLOAD_SIZE",2),h.API_UPLOAD_TEMP=h.getString("API_UPLOAD_TEMP","./temp"),h.API_WEBSOCKET_START=h.getBool("API_WEBSOCKET_START",!1);class y{static connect(e){const t="connect_"+h.API_DB_TYPE.toLowerCase();if(t in y)return y[t](e);throw new Error("No database is connected to this API")}static connect_mariadb(e){return new i.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mariadb",logging:h.API_DB_LOG,define:{timestamps:!1},timezone:h.API_DB_TIMEZONE})}static connect_memory(){return new i.Sequelize("sqlite::memory:",{logging:h.API_DB_LOG,define:{timestamps:!1},timezone:h.API_DB_TIMEZONE})}static connect_mysql(e){return new i.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mysql",logging:h.API_DB_LOG,define:{timestamps:!1},timezone:h.API_DB_TIMEZONE})}static connect_postgres(e){return new i.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"postgres",logging:h.API_DB_LOG,define:{timestamps:!1},timezone:h.API_DB_TIMEZONE})}static connect_sqlite(e){return new i.Sequelize({dialect:"sqlite",storage:e.database,logging:h.API_DB_LOG,define:{timestamps:!1},timezone:h.API_DB_TIMEZONE})}}const m=y.connect({database:h.API_DB_DATABASE,username:h.API_DB_USERNAME,password:h.API_DB_PASSWORD,hostname:h.API_DB_HOST,hostport:h.API_DB_PORT});class _ extends i.Model{}_.init({secret:i.DataTypes.STRING,logout:i.DataTypes.DATE,useragent:i.DataTypes.STRING},{sequelize:m,modelName:h.API_DB_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class x extends i.Model{}x.init({token:i.DataTypes.STRING,timestamp:i.DataTypes.BIGINT,state:i.DataTypes.BOOLEAN},{sequelize:m,modelName:h.API_DB_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class v extends i.Model{}v.init({name:i.DataTypes.STRING,description:i.DataTypes.TEXT,state:i.DataTypes.BOOLEAN},{sequelize:m,modelName:h.API_DB_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class P extends i.Model{}P.init({},{sequelize:m,modelName:h.API_DB_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),P.removeAttribute("id");class I extends i.Model{}I.init({token:i.DataTypes.STRING,state:i.DataTypes.BOOLEAN},{sequelize:m,modelName:h.API_DB_PREFIX+"register",timestamps:!0,createdAt:"created",updatedAt:"updated"});class f extends i.Model{}f.init({name:i.DataTypes.STRING,description:i.DataTypes.TEXT,state:i.DataTypes.BOOLEAN},{sequelize:m,modelName:h.API_DB_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class A extends i.Model{}A.init({name:i.DataTypes.STRING,email:i.DataTypes.STRING,username:i.DataTypes.STRING,password:i.DataTypes.STRING,salt:i.DataTypes.STRING,token:i.DataTypes.STRING,avatar:i.DataTypes.STRING,date:i.DataTypes.DATEONLY,description:i.DataTypes.TEXT,state:i.DataTypes.BOOLEAN},{sequelize:m,modelName:h.API_DB_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated",defaultScope:{attributes:{exclude:["password","salt","token"]}},scopes:{password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}});class C extends i.Model{}C.init({},{sequelize:m,modelName:h.API_DB_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),C.removeAttribute("id");class E extends i.Model{}E.init({key:i.DataTypes.STRING,value:i.DataTypes.STRING},{sequelize:m,modelName:h.API_DB_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),E.removeAttribute("id");class S extends i.Model{}S.init({type:i.DataTypes.STRING,source:i.DataTypes.STRING,message:i.DataTypes.TEXT},{sequelize:m,modelName:h.API_DB_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class w extends i.Model{}w.init({session:i.DataTypes.STRING,json:i.DataTypes.TEXT,expired:i.DataTypes.BIGINT},{sequelize:m,modelName:h.API_DB_PREFIX+"session",timestamps:!0,createdAt:"created",updatedAt:"updated"}),w.removeAttribute("id"),A.hasMany(_),_.belongsTo(A),A.hasMany(x),x.belongsTo(A),A.hasMany(I),I.belongsTo(A),v.hasMany(P),P.belongsTo(v),f.hasMany(P),P.belongsTo(f),A.hasMany(C),C.belongsTo(A),v.hasMany(C),C.belongsTo(v);class T{static write(e,r,o){return g(this,void 0,void 0,(function*(){yield T.writeRaw(t.LogColor.White,"",e,r,o)}))}static error(e,r,o){return g(this,void 0,void 0,(function*(){yield T.writeRaw(t.LogColor.Red,"error",e,r,o)}))}static info(e,r,o){return g(this,void 0,void 0,(function*(){yield T.writeRaw(t.LogColor.Cyan,"info",e,r,o)}))}static success(e,r,o){return g(this,void 0,void 0,(function*(){yield T.writeRaw(t.LogColor.Green,"success",e,r,o)}))}static warning(e,r,o){return g(this,void 0,void 0,(function*(){yield T.writeRaw(t.LogColor.Yellow,"warning",e,r,o)}))}static writeRaw(e,r,o,i,s){return g(this,void 0,void 0,(function*(){s&&t.Log.console(e,r,o),m&&(yield S.create({type:r,source:i,message:o}).catch((()=>null)))}))}}const O=e=>n.existsSync(e)?n.readFileSync(e):void 0,R={http:O(h.API_HTTP_CRT),token:O(h.API_TOKEN_CRT)},D={http:O(h.API_HTTP_KEY),token:O(h.API_TOKEN_KEY)};class M extends d.Store{constructor(){super(),this.all=e=>g(this,void 0,void 0,(function*(){e=e||r.noop;const t=yield w.findAll({attributes:["session"],where:{expired:{[i.Op.gte]:Date.now()}}}).catch((t=>(e(t),null)));t&&e(null,t.map((e=>e.session))),e()})),this.clear=e=>g(this,void 0,void 0,(function*(){yield w.destroy().catch(r.noop),e&&e()})),this.destroy=(e,t)=>g(this,void 0,void 0,(function*(){yield w.destroy({where:{session:e}}).catch(r.noop),t&&t()})),this.expired=()=>g(this,void 0,void 0,(function*(){yield w.destroy({where:{expired:{[i.Op.lt]:Date.now()}}}).catch(r.noop)})),this.get=(e,t)=>g(this,void 0,void 0,(function*(){t=t||r.noop;const o=yield w.findOne({where:{session:e,expired:{[i.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=>g(this,void 0,void 0,(function*(){e&&e(null,(yield w.count().catch(r.noop))||0)})),this.set=(e,t,o)=>g(this,void 0,void 0,(function*(){o=o||r.noop;const i=Date.now()+h.API_SESSION_LIFETIME,s=JSON.stringify(t),[n,d]=(yield w.findOrCreate({where:{session:e},defaults:{session:e,json:s,expired:i}}).catch(r.noop))||[];n&&(d||(n.json=s,n.expired=i,yield n.save().catch(r.noop))),o()})),this.loop=r.loop(this.expired,3e4),this.loop.start()}}class F{static create(e){return g(this,void 0,void 0,(function*(){if(!D.token)return{error:"Key not found"};const{id:t}=e,o=r.uuidv4(),i=yield _.create({secret:o,userId:t}).catch(F.error);if(!i)return{error:"Internal Server Error"};return{auth:i,token:a.sign({id:t,secret:o},D.token,F.options())}}))}static destroy(e){return g(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){T.error(e.message,"api.token",h.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:h.API_TOKEN_LIFETIME+"ms"}}static renew(e){return g(this,void 0,void 0,(function*(){if(!D.token)return{error:"Key not found"};const{error:t,decode:o}=F.verify(e,h.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(o){const{id:e,secret:t}=o;if(e&&t){const o=yield A.findOne({where:{id:e,state:!0}}).catch(F.error);if(o){const i=yield _.findOne({where:{secret:t,userId:o.id}}).catch(F.error);if(i&&!i.logout){i.secret=r.uuidv4(),yield i.save().catch(F.error);return{auth:i,token:a.sign({id:e,secret:i.secret},D.token,F.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e,t,r){return g(this,void 0,void 0,(function*(){if(e){t=r.hash.encrypt(e);const o=yield A.findOne({where:{token:t,state:!0}}).catch(F.error);if(o){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield _.findOrCreate({where:{secret:t,userId:o.id},defaults:{secret:t,userId:o.id}}).catch(F.error))||[];if(r)return{auth:r,user:o}}return{error:"Access denied"}}const{error:o,decode:i}=F.verify(t);if(o)return{error:o};if(i){const{id:e,secret:t}=i;if(e&&t){const r=yield A.findOne({where:{id:e,state:!0}}).catch(F.error);if(r){const e=yield _.findOne({where:{secret:t,userId:r.id}}).catch(F.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!R.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:a.verify(e,R.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class k extends e.Application{constructor(e){super(e,{cert:R.http,cross:h.API_HTTP_CROSS,hybrid:h.API_HTTP_HYBRID,key:D.http,notfound:h.API_NOTFOUND_REDIRECT,path:h.API_DEFAULT_PATH,port:h.API_HTTP_PORT,public:h.API_HTTP_PUBLIC,redirect:h.API_HTTP_REDIRECT,session:{store:new M,name:h.API_SESSION_NAME,secret:h.API_SESSION_SECRET,cookie:{maxAge:h.API_SESSION_LIFETIME},genid:r.uuidv4}}),this.hash=new t.Hash(h.API_KEY_HASH)}error(e,t){T.error(e.message,t,h.API_CONSOLE_ERROR)}log(e,t){T.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return g(this,void 0,void 0,(function*(){yield m.sync(),yield e.listen.call(this),h.API_WEBSOCKET_START&&this.server&&(this._webSocket=new o.Server({server:this.server,verifyClient:(e,t)=>t(h.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>g(this,void 0,void 0,(function*(){t.url||(t.url="");const o=t.url.length<=1?"":t.url.replace(/\//g,".");let i;e.on("message",(r=>g(this,void 0,void 0,(function*(){if(i)try{const s=JSON.parse(r);this.emit("ws.message"+o,{data:s,message:r,req:t,user:i,ws:e})}catch(s){this.emit("ws.message"+o,{message:r,req:t,user:i,ws:e})}else{const{user:s}=yield F.user("",r.toString(),this);s&&(i=s,this.emit("ws.connection"+o,{req:t,user:i,ws:e}))}i||e.close()})))),e.on("close",(()=>{i&&this.emit("ws.close"+o,{user:i,ws:e})})),yield r.sleep(2e3),i||e.close()})))))}))}websocket(){return this._webSocket}}class b{static all(){return g(this,void 0,void 0,(function*(){const e=yield E.findAll().catch(b.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e){return g(this,void 0,void 0,(function*(){return((yield E.destroy({where:{key:e}}).catch(b.error))||0)>0}))}static error(e){T.error(e.message,"api.config",h.API_CONSOLE_ERROR)}static get(e){return g(this,arguments,void 0,(function*(e,t=""){const r=yield E.findOne({where:{key:e}}).catch(b.error);return r?r.value:t}))}static set(e,t){return g(this,void 0,void 0,(function*(){const[r]=(yield E.findOrCreate({where:{key:e}}).catch(b.error))||[];r&&(r.value=t,yield r.save().catch(b.error))}))}}const N=e.parameterFactory((({ctx:e})=>e.req.auth)),q=e.parameterFactory((({ctx:e})=>e.req.user));class B{static all(e,t){return g(this,void 0,void 0,(function*(){return yield f.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:P,required:!0,include:[{model:v,required:!0,where:{state:!0},include:[{model:C,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{T.error(e.message,"api.permission",h.API_CONSOLE_ERROR)}))}))}static get(e){return g(this,void 0,void 0,(function*(){const t=yield B.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return g(this,void 0,void 0,(function*(){const r=yield B.all(e,{name:t});return!!r&&r.length>0}))}}class L extends r.EventEmitter{auth(e,t,r,o,i){return g(this,void 0,void 0,(function*(){const{auth:s,error:n,user:d}=yield F.user(t,r,i);return n?e.error(n):s&&d?s.useragent&&s.useragent!=o?e.error("Invalid token"):(e.req.auth=s,e.req.user=d,void e.next()):e.error("Internal Server Error")}))}session(e,t,o){return g(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){T.error(e.message,"api.controller",h.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r){return g(this,void 0,void 0,(function*(){return r?(yield B.is(r,t))?e.next():void e.unauthorized("Access denied"):e.unauthorized("Access denied")}))}read(e,t,r){return g(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".read",r)}))}upload(t,r){r.path||(r.path=h.API_UPLOAD_TEMP),r.size||(r.size=h.API_UPLOAD_SIZE),r.field||(r.field=h.API_UPLOAD_FIELD),e.Upload.middleware(t,r)}validation(e,t){return g(this,void 0,void 0,(function*(){const{error:o,value:i}=yield r.Validation.object(t).parse().validateAsync(e.req.body);if(o)return e.validation(o);e.req.body=i,e.next()}))}write(e,t,r){return g(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".write",r)}))}}u([c(0,e.Ctx()),c(1,e.Headers(h.API_KEY_HEADER)),c(2,e.Headers(h.API_TOKEN_HEADER)),c(3,e.Headers("user-agent")),c(4,e.App()),p("design:type",Function),p("design:paramtypes",[e.Context,String,String,String,k]),p("design:returntype",Promise)],L.prototype,"auth",null),u([c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Session()),p("design:type",Function),p("design:paramtypes",[e.Context,String,Object]),p("design:returntype",Promise)],L.prototype,"session",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,q()),p("design:type",Function),p("design:paramtypes",[e.Context,String,A]),p("design:returntype",Promise)],L.prototype,"permission",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,q()),p("design:type",Function),p("design:paramtypes",[e.Context,String,A]),p("design:returntype",Promise)],L.prototype,"read",null),u([c(0,e.Ctx()),c(1,e.Argument()),p("design:type",Function),p("design:paramtypes",[e.Context,Object]),p("design:returntype",void 0)],L.prototype,"upload",null),u([c(0,e.Ctx()),c(1,e.Argument()),p("design:type",Function),p("design:paramtypes",[e.Context,Object]),p("design:returntype",Promise)],L.prototype,"validation",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,q()),p("design:type",Function),p("design:paramtypes",[e.Context,String,A]),p("design:returntype",Promise)],L.prototype,"write",null),exports.AuthController=class extends L{login(e,o,s,n,d){return g(this,void 0,void 0,(function*(){var a;yield r.sleep(h.API_SLEEP_AUTH);const l=yield A.scope("password").findOne({where:{[i.Op.or]:[{email:s},{username:s}]}}).catch(this.error);if(n+=null!==(a=null==l?void 0:l.salt)&&void 0!==a?a:"",!l||l.password!=t.sha256(n))return e.notFound("Invalid username or password"),d.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const u=yield I.findOne({where:{state:!0,userId:l.id}}).catch(this.error);if(u)return e.error("Activation required"),d.emit("auth.activation",{ctx:e,register:u,user:l}),void this.emit("auth.activation",{ctx:e,register:u,user:l});if(!l.state)return e.notFound("Invalid username or password"),d.emit("auth.failure",{ctx:e,user:l}),void this.emit("auth.failure",{ctx:e,user:l});const{auth:c,error:p,token:g}=yield F.create(l);return p?(e.error(p),d.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):c&&g?(c.useragent=o,yield c.save().catch(this.error),e.json({token:g}),d.emit("auth.login",{auth:c,ctx:e,user:l}),void this.emit("auth.login",{auth:c,ctx:e,user:l})):(e.error("Internal Server Error"),d.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,r,o){return g(this,void 0,void 0,(function*(){if(yield F.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 g(this,void 0,void 0,(function*(){const{auth:i,error:s,token:n}=yield F.renew(r);return s?e.error(s):i?(i.useragent=t,yield i.save().catch(this.error),e.json({token:n}),o.emit("auth.renew",{auth:i,ctx:e}),void this.emit("auth.renew",{auth:i,ctx:e})):e.error("Internal Server Error")}))}user(e,t){return g(this,void 0,void 0,(function*(){const r=yield B.all(t);if(!r)return e.error("Internal Server Error");e.json(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))}))}))}},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()),p("design:type",Function),p("design:paramtypes",[e.Context,String,String,String,k]),p("design:returntype",Promise)],exports.AuthController.prototype,"login",null),u([e.Get("/logout"),e.Middleware("auth"),c(0,e.Ctx()),c(1,N()),c(2,q()),c(3,e.App()),p("design:type",Function),p("design:paramtypes",[e.Context,_,A,k]),p("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()),p("design:type",Function),p("design:paramtypes",[e.Context,String,String,k]),p("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),u([e.Get(),e.Middleware("auth"),c(0,e.Ctx()),c(1,q()),p("design:type",Function),p("design:paramtypes",[e.Context,A]),p("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=u([e.Controller("/auth"),e.Extends(L)],exports.AuthController),exports.FilesController=class extends L{directory(){return h.API_HTTP_PUBLIC||"./"}files(e){return g(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("Path not Found");let i=[];return i=n.readdirSync(o),i=i.map((e=>this.info(l.join(o,e)))),i=i.filter(r.isDef),Object.assign(Object.assign({},this.info(o)),{files:i})}))}access(e,t,r){return g(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()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.FilesController.prototype,"files",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,q()),p("design:type",Function),p("design:paramtypes",[e.Context,String,A]),p("design:returntype",Promise)],exports.FilesController.prototype,"access",null),exports.FilesController=u([e.Controller("/files"),e.Extends(L)],exports.FilesController),exports.ForgotController=class extends L{check(e,t){return g(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 g(this,void 0,void 0,(function*(){yield r.sleep(h.API_SLEEP_FORGOT);const s=t,n=yield A.findOne({where:{[i.Op.or]:[{email:s},{username:t}]}}).catch(this.error);if(!n)return e.notFound("User not found");const d=r.uniqueID(),a=Date.now()+6e4*h.API_TOKEN_FORGOT,l=yield x.create({token:d,timestamp:a,state:!0,userId:n.id});e.success("OK"),o.emit("forgot.send",{ctx:e,forgot:l,user:n}),this.emit("forgot.send",{ctx:e,forgot:l,user:n})}))}reset(e,r,o,i){return g(this,void 0,void 0,(function*(){const s=yield this.find(r);if(!s)return e.notFound("User not found");s.state=!1,yield s.save().catch(this.error),s.user.password=t.sha256(o),yield s.user.save().catch(this.error),e.success("OK"),i.emit("forgot.reset",{ctx:e,user:s.user}),this.emit("forgot.reset",{ctx:e,user:s.user})}))}find(e){return g(this,void 0,void 0,(function*(){return yield x.findOne({where:{token:e,state:!0},include:[{model:A,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")),p("design:type",Function),p("design:paramtypes",[e.Context,String]),p("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()),p("design:type",Function),p("design:paramtypes",[e.Context,String,k]),p("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()),p("design:type",Function),p("design:paramtypes",[e.Context,String,String,k]),p("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=u([e.Controller("/forgot"),e.Extends(L)],exports.ForgotController),exports.ModelController=class extends L{constructor(){super(...arguments),this._columns=[]}_add(t){return g(this,arguments,void 0,(function*({ctx:t,options:r,body:o}){const i=yield this.model().create(Object.assign(Object.assign({},t.req.body),o||{}),r||{}).catch(this.error);if(i){const r=this.key();return t.prepare(e.Status.OK,{[r]:i.getDataValue(r)}),i}t.error("Internal Server Error")}))}_all(t){return g(this,arguments,void 0,(function*({ctx:t,options:o,callback:s,scope:n}){var d,a,l;const u=this.scope(n),c=Object.assign({},o||{});c.where=Object.assign({},c.where||{});const p=t.req.query.limit;if(r.isString(p)){const e=p?parseInt(p):10;c.limit=e>0?e:void 0}const g=t.req.query.offset;if(r.isString(g)){const e=g?parseInt(g):0;c.offset=e>0?e:void 0}const h=[],y=this.columns(),m=e=>y.indexOf(e)>=0,_=null===(d=t.req.query.asc)||void 0===d?void 0:d.toString();_&&_.length&&h.push(..._.split(",").filter(m).map((e=>[e,"ASC"])));const x=null===(a=t.req.query.desc)||void 0===a?void 0:a.toString();x&&x.length&&h.push(...x.split(",").filter(m).map((e=>[e,"DESC"]))),h.length&&(c.order=h);const v=[],P=null===(l=t.req.query.search)||void 0===l?void 0:l.toString();(r.isArray(c.attributes)?c.attributes:y).filter(r.isString).forEach((e=>{var r;if(P&&P.length&&v.push({[e]:{[i.Op.like]:`%${P}%`}}),"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&&v.push({[e]:{[i.Op.like]:`%${o}%`}})}})),v.length&&(c.where=Object.assign(Object.assign({},c.where),{[i.Op.or]:[...v]}));const I=(yield u.count(Object.assign(Object.assign({},c),{col:y[0]})).catch(this.error))||0,f=yield u.findAll(c).catch(this.error);return f?(t.prepare(e.Status.OK,{count:I,records:s?yield s(f):f}),[f,I]):(t.error("Internal Server Error"),[])}))}columns(){return 0==this._columns.length&&(this._columns=Object.keys(this.model().getAttributes())),this._columns}_del(e){return g(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 i=yield this.model().destroy(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[r]:o})})).catch(this.error);return i?(e.success("OK"),i):(e.notFound("Record not found"),0)}))}error(e){e.sql?T.error(e.message+"\n"+e.sql,"api.controller.sql",h.API_CONSOLE_ERROR):super.error(e)}_get(t){return g(this,arguments,void 0,(function*({ctx:t,options:r,callback:o,scope:i}){const s=this.key(),{[s]:n}=t.req.params,d=yield this.scope(i).findOne(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[s]: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 g(this,arguments,void 0,(function*({ctx:e,options:t,body:r}){const o=this.key(),{[o]:i}=e.req.params,[s]=(yield this.model().update(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[o]:i})})).catch(this.error))||[];return s?(e.success("OK"),!0):(e.success("Record not changed"),!1)}))}},exports.ModelController=u([e.Extends(L)],exports.ModelController),exports.CrudController=class extends exports.ModelController{add(e){return g(this,void 0,void 0,(function*(){yield this._add({ctx:e})}))}all(e){return g(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}create(){return{}}del(e){return g(this,void 0,void 0,(function*(){yield this._del({ctx:e})}))}get(e){return g(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e){return g(this,void 0,void 0,(function*(){yield this._set({ctx:e})}))}update(){return{}}validationAdd(e){return g(this,void 0,void 0,(function*(){yield this.validation(e,this.create())}))}validationSet(e){return g(this,void 0,void 0,(function*(){yield this.validation(e,this.update())}))}},u([e.Post(),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationAdd"),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.CrudController.prototype,"add",null),u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.CrudController.prototype,"all",null),u([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.CrudController.prototype,"del",null),u([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.CrudController.prototype,"get",null),u([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationSet"),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.CrudController.prototype,"set",null),u([c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.CrudController.prototype,"validationAdd",null),u([c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("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 v}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=u([e.Controller("/groups"),e.Extends(exports.CrudController)],exports.GroupsController),exports.GroupsRoutesController=class extends exports.ModelController{model(){return P}all(e,t){return g(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{groupId:t},include:[{model:f,required:!0}]},callback:e=>e.map((e=>e.route))})}))}set(e,t,o){return g(this,void 0,void 0,(function*(){const i=yield v.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield P.destroy({where:{groupId:t}}),o){let e=0;for(let r=0;r<o.length;r++)e=yield f.count({where:{id:o[r]}}),e&&(yield P.create({groupId:t,routeId:o[r]}))}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")),p("design:type",Function),p("design:paramtypes",[e.Context,String]),p("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"all",null),u([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")),p("design:type",Function),p("design:paramtypes",[e.Context,String,Array]),p("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"set",null),exports.GroupsRoutesController=u([e.Controller("/groups"),e.Extends(exports.ModelController)],exports.GroupsRoutesController),exports.LogsController=class extends exports.ModelController{model(){return S}all(e,t,r){return g(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","DESC"]]}})}))}},u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),c(1,e.Query("type")),c(2,e.Query("source")),p("design:type",Function),p("design:paramtypes",[e.Context,String,String]),p("design:returntype",Promise)],exports.LogsController.prototype,"all",null),exports.LogsController=u([e.Controller("/logs"),e.Extends(exports.ModelController)],exports.LogsController),exports.RegisterController=class extends L{register(e,o,s){return g(this,void 0,void 0,(function*(){yield r.sleep(h.API_SLEEP_REGISTRY);const{name:n,date:d,email:a,username:l,password:u,confirm:c}=o,p=l||a,g=t.sha256(u);if(yield A.count({where:{[i.Op.or]:[{email:a},{username:p}]}}).catch(this.error))return e.validation("Invalid email or username");if(g!=t.sha256(c))return e.error("Invalid password");const y=yield A.create({name:n,email:a,username:p,password:g,avatar:"",date:d,description:"",state:!1}).catch(this.error);if(!y)return e.error("Internal Server Error");const m=yield I.create({token:yield this.getId(),userId:y.id,state:!0}).catch(this.error);if(!m)return y.destroy(),e.error("Internal Server Error");e.success("OK"),s.emit("register.user",{ctx:e,register:m,user:y}),this.emit("register.user",{ctx:e,register:m,user:y})}))}confirm(e,t,r){return g(this,void 0,void 0,(function*(){const o=yield I.findOne({where:{token:t,state:!0},include:[{model:A,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 g(this,void 0,void 0,(function*(){const o=t,s=yield I.findOne({where:{state:!0},include:[{model:A,required:!0,where:{[i.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 g(this,void 0,void 0,(function*(){const e=r.uuidv4();return(yield I.count({where:{token:e}}))?this.getId():e}))}},u([e.Post(),e.Middleware("validation",{name:r.Validation.string().required(),date:r.Validation.string().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()),p("design:type",Function),p("design:paramtypes",[e.Context,Object,k]),p("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()),p("design:type",Function),p("design:paramtypes",[e.Context,String,k]),p("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()),p("design:type",Function),p("design:paramtypes",[e.Context,String,k]),p("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=u([e.Controller("/register"),e.Extends(L)],exports.RegisterController),exports.RoutesController=class extends exports.CrudController{model(){return f}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=u([e.Controller("/routes"),e.Extends(exports.CrudController)],exports.RoutesController),exports.SetupController=class extends L{setup(e){return g(this,void 0,void 0,(function*(){if(0==(yield A.count())){const e=r.simpleID(),o=yield A.create({name:"Admin",email:"admin@localhost",username:"admin",password:t.sha256("admin"+e),salt:e,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0}),i={description:"API CORE",state:!0},s=yield v.create(Object.assign({name:"admin"},i));yield C.create({userId:o.id,groupId:s.id});const n=["read","write"],d=["users","groups","routes"];yield r.forEachSeries(d,(e=>g(this,void 0,void 0,(function*(){yield r.forEachSeries(n,(t=>g(this,void 0,void 0,(function*(){const r=e+"."+t,o=yield f.create(Object.assign({name:r},i));yield P.create({groupId:s.id,routeId:o.id})}))))}))));const a=[...n,"delete","list","rename","upload"];yield r.forEachSeries(a,(e=>g(this,void 0,void 0,(function*(){const t="files."+e,r=yield f.create(Object.assign({name:t},i));yield P.create({groupId:s.id,routeId:r.id})}))));const l=yield f.create(Object.assign({name:"logs.read"},i));yield P.create({groupId:s.id,routeId:l.id})}e.success("OK")}))}},u([e.Get(),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=u([e.Controller("/setup"),e.Extends(L)],exports.SetupController),exports.UsersController=class extends exports.ModelController{model(){return A}constructor(){super(),this.dir=h.API_HTTP_PUBLIC+"/avatar",h.API_HTTP_PUBLIC&&n.existsSync(h.API_HTTP_PUBLIC)&&!n.existsSync(this.dir)&&n.mkdirSync(this.dir)}avatar(e,t,r){return g(this,void 0,void 0,(function*(){if(t.length){const o=t[0].filename||"";if(o){const t=this.dir+"/"+r.avatar;if(n.existsSync(t)&&n.lstatSync(t).isFile()&&n.rmSync(t),r.avatar=o,yield r.save().catch(this.error))return e.success("OK")}}e.success("Record not changed")}))}avatar_remove(e,t){return g(this,void 0,void 0,(function*(){const r=this.dir+"/"+t.avatar;t.avatar="",(yield t.save().catch(this.error))&&n.existsSync(r)&&n.rmSync(r),e.success("OK")}))}password(e,o,i,s){return g(this,void 0,void 0,(function*(){var n;const d=yield this.scope("password").findOne({where:{id:s.id,state:!0}}).catch(this.error);return o+=null!==(n=null==d?void 0:d.salt)&&void 0!==n?n:"",d&&d.password==t.sha256(o)?(d.salt=r.simpleID(),d.password=t.sha256(i+d.salt),(yield d.save().catch(this.error))?e.success("OK"):void e.success("Record not changed")):e.error("Record not changed")}))}token(e,t,r){return g(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 g(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){return g(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().catch(this.error),e.success("OK");e.notFound("Record not found")}))}token_renew(e,t,r){return g(this,void 0,void 0,(function*(){const o=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(o){const t=yield this.token_new();return o.token=r.hash.encrypt(t),yield o.save().catch(this.error),e.json({token:t})}e.notFound("Record not found")}))}token_new(){return g(this,void 0,void 0,(function*(){const e=r.uuidv4();return(yield this.model().count({where:{token:e}}))?this.token_new():e}))}add(e,o){return g(this,void 0,void 0,(function*(){const i=r.simpleID();yield this._add({ctx:e,body:{password:t.sha256(o+i),salt:i}})}))}all(e){return g(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}del(e,t,r){return g(this,void 0,void 0,(function*(){t&&t.id.toString()!=r?yield this._del({ctx:e}):e.error("Internal Server Error")}))}get(e){return g(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,o){return g(this,void 0,void 0,(function*(){const i=r.simpleID();yield this._set({ctx:e,body:o?{password:t.sha256(o+i),salt:i}:{}})}))}},u([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,q()),p("design:type",Function),p("design:paramtypes",[e.Context,Array,A]),p("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),u([e.Get("/avatar/remove"),e.Middleware("auth"),c(0,e.Ctx()),c(1,q()),p("design:type",Function),p("design:paramtypes",[e.Context,A]),p("design:returntype",Promise)],exports.UsersController.prototype,"avatar_remove",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,q()),p("design:type",Function),p("design:paramtypes",[e.Context,String,String,A]),p("design:returntype",Promise)],exports.UsersController.prototype,"password",null),u([e.Get("/token"),e.Middleware("auth"),c(0,e.Ctx()),c(1,q()),c(2,e.App()),p("design:type",Function),p("design:paramtypes",[e.Context,A,k]),p("design:returntype",Promise)],exports.UsersController.prototype,"token",null),u([e.Get("/token/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.App()),p("design:type",Function),p("design:paramtypes",[e.Context,String,k]),p("design:returntype",Promise)],exports.UsersController.prototype,"token_get",null),u([e.Get("/token/remove/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,e.Params("id")),p("design:type",Function),p("design:paramtypes",[e.Context,String]),p("design:returntype",Promise)],exports.UsersController.prototype,"token_remove",null),u([e.Get("/token/renew/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.App()),p("design:type",Function),p("design:paramtypes",[e.Context,String,k]),p("design:returntype",Promise)],exports.UsersController.prototype,"token_renew",null),u([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")),p("design:type",Function),p("design:paramtypes",[e.Context,String]),p("design:returntype",Promise)],exports.UsersController.prototype,"add",null),u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.UsersController.prototype,"all",null),u([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,q()),c(2,e.Params("id")),p("design:type",Function),p("design:paramtypes",[e.Context,A,String]),p("design:returntype",Promise)],exports.UsersController.prototype,"del",null),u([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.UsersController.prototype,"get",null),u([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")),p("design:type",Function),p("design:paramtypes",[e.Context,String]),p("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=u([e.Controller("/users"),e.Extends(exports.ModelController),p("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class extends exports.ModelController{model(){return C}all(e,t){return g(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{userId:t},include:[{model:v,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,o){return g(this,void 0,void 0,(function*(){const i=yield A.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){if(yield C.destroy({where:{userId:i.id}}),o){let e=0;for(let t=0;t<o.length;t++)e=yield v.count({where:{id:o[t]}}),e&&(yield C.create({userId:i.id,groupId:o[t]}))}return e.success("OK")}if(r.isNull(i))return e.notFound("Record not found");e.error("Internal Server Error")}))}},u([e.Get("/:id/groups"),e.Middleware("auth"),e.Middleware("read","users"),c(0,e.Ctx()),c(1,e.Params("id")),p("design:type",Function),p("design:paramtypes",[e.Context,String]),p("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),u([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")),p("design:type",Function),p("design:paramtypes",[e.Context,String,Array]),p("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=u([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersGroupsController),exports.Application=k,exports.Auth=_,exports.Config=b,exports.Configs=E,exports.ControllerBase=L,exports.Database=y,exports.Env=h,exports.Forgot=x,exports.Group=v,exports.GroupRoute=P,exports.Log=S,exports.Logs=T,exports.Permission=B,exports.Register=I,exports.ReqAuth=N,exports.ReqUser=q,exports.Route=f,exports.Session=w,exports.Token=F,exports.User=A,exports.UserGroup=C,exports.crt=R,exports.key=D,exports.sequelize=m;
7
+ "use strict";var e=require("@andrewcaires/express"),t=require("@andrewcaires/node"),r=require("@andrewcaires/utils.js"),o=require("ws"),i=require("sequelize"),s=require("dotenv"),n=require("fs"),d=require("express-session"),a=require("jsonwebtoken"),l=require("path");function u(e,t,r,o){var i,s=arguments.length,n=s<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--)(i=e[d])&&(n=(s<3?i(n):s>3?i(t,r,n):i(t,r))||n);return s>3&&n&&Object.defineProperty(t,r,n),n}function c(e,t){return function(r,o){t(r,o,e)}}function p(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function g(e,t,r,o){return new(r||(r=Promise))((function(i,s){function n(e){try{a(o.next(e))}catch(e){s(e)}}function d(e){try{a(o.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?i(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,s.config();class h{static getBool(e,t){return r.toBool(h.getString(e,t.toString()))}static getInt(e,t){return parseInt(h.getString(e,t.toString()))}static getMs(e,t){return r.parseMs(h.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}h.API_CONSOLE_ERROR=h.getBool("API_CONSOLE_ERROR",!1),h.API_DEFAULT_PATH=h.getString("API_DEFAULT_PATH","/api"),h.API_DB_DATABASE=h.getString("API_DB_DATABASE",""),h.API_DB_HOST=h.getString("API_DB_HOST","127.0.0.1"),h.API_DB_PASSWORD=h.getString("API_DB_PASSWORD",""),h.API_DB_PORT=h.getInt("API_DB_PORT",3306),h.API_DB_TYPE=h.getString("API_DB_TYPE",""),h.API_DB_USERNAME=h.getString("API_DB_USERNAME","root"),h.API_DB_LOG=h.getBool("API_DB_LOG",!1),h.API_DB_PREFIX=h.getString("API_DB_PREFIX",""),h.API_DB_TIMEZONE=h.getString("API_DB_TIMEZONE","+00:00"),h.API_HTTP_CRT=h.getString("API_HTTP_CRT",""),h.API_HTTP_KEY=h.getString("API_HTTP_KEY",""),h.API_HTTP_PORT=h.getInt("API_HTTP_PORT",3e3),h.API_HTTP_PUBLIC=h.getString("API_HTTP_PUBLIC",""),h.API_HTTP_CROSS=h.getBool("API_HTTP_CROSS",!1),h.API_HTTP_HYBRID=h.getBool("API_HTTP_HYBRID",!1),h.API_HTTP_REDIRECT=h.getString("API_HTTP_REDIRECT",""),h.API_KEY_HASH=h.getString("API_KEY_HASH",""),h.API_KEY_HEADER=h.getString("API_KEY_HEADER","api_key"),h.API_NOTFOUND_REDIRECT=h.getString("API_NOTFOUND_REDIRECT",""),h.API_SLEEP_AUTH=h.getMs("API_SLEEP_AUTH","2s"),h.API_SLEEP_FORGOT=h.getMs("API_SLEEP_FORGOT","5s"),h.API_SLEEP_REGISTRY=h.getMs("API_SLEEP_REGISTRY","5s"),h.API_SESSION_NAME=h.getString("API_SESSION_NAME","session.id"),h.API_SESSION_LIFETIME=h.getMs("API_SESSION_LIFETIME","1d"),h.API_SESSION_SECRET=h.getString("API_SESSION_SECRET","yoursecret"),h.API_TOKEN_CRT=h.getString("API_TOKEN_CRT",""),h.API_TOKEN_KEY=h.getString("API_TOKEN_KEY",""),h.API_TOKEN_FORGOT=h.getMs("API_TOKEN_LIFETIME","1d"),h.API_TOKEN_HEADER=h.getString("API_TOKEN_HEADER","authorization"),h.API_TOKEN_LIFETIME=h.getMs("API_TOKEN_LIFETIME","1d"),h.API_TOKEN_RENEW=h.getMs("API_TOKEN_RENEW","1d"),h.API_UPLOAD_COUNT=h.getInt("API_UPLOAD_COUNT",1),h.API_UPLOAD_FIELD=h.getString("API_UPLOAD_FIELD","upload"),h.API_UPLOAD_SIZE=h.getInt("API_UPLOAD_SIZE",2),h.API_UPLOAD_TEMP=h.getString("API_UPLOAD_TEMP","./temp"),h.API_WEBSOCKET_START=h.getBool("API_WEBSOCKET_START",!1);class y{static connect(e){const t="connect_"+h.API_DB_TYPE.toLowerCase();if(t in y)return y[t](e);throw new Error("No database is connected to this API")}static connect_mariadb(e){return new i.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mariadb",logging:h.API_DB_LOG,define:{timestamps:!1},timezone:h.API_DB_TIMEZONE})}static connect_memory(){return new i.Sequelize("sqlite::memory:",{logging:h.API_DB_LOG,define:{timestamps:!1},timezone:h.API_DB_TIMEZONE})}static connect_mysql(e){return new i.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mysql",logging:h.API_DB_LOG,define:{timestamps:!1},timezone:h.API_DB_TIMEZONE})}static connect_postgres(e){return new i.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"postgres",logging:h.API_DB_LOG,define:{timestamps:!1},timezone:h.API_DB_TIMEZONE})}static connect_sqlite(e){return new i.Sequelize({dialect:"sqlite",storage:e.database,logging:h.API_DB_LOG,define:{timestamps:!1},timezone:h.API_DB_TIMEZONE})}}const m=y.connect({database:h.API_DB_DATABASE,username:h.API_DB_USERNAME,password:h.API_DB_PASSWORD,hostname:h.API_DB_HOST,hostport:h.API_DB_PORT});class _ extends i.Model{}_.init({secret:i.DataTypes.STRING,logout:i.DataTypes.DATE,useragent:i.DataTypes.STRING},{sequelize:m,modelName:h.API_DB_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class x extends i.Model{}x.init({token:i.DataTypes.STRING,timestamp:i.DataTypes.BIGINT,state:i.DataTypes.BOOLEAN},{sequelize:m,modelName:h.API_DB_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class v extends i.Model{}v.init({name:i.DataTypes.STRING,description:i.DataTypes.TEXT,state:i.DataTypes.BOOLEAN},{sequelize:m,modelName:h.API_DB_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class P extends i.Model{}P.init({},{sequelize:m,modelName:h.API_DB_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),P.removeAttribute("id");class I extends i.Model{}I.init({token:i.DataTypes.STRING,state:i.DataTypes.BOOLEAN},{sequelize:m,modelName:h.API_DB_PREFIX+"register",timestamps:!0,createdAt:"created",updatedAt:"updated"});class f extends i.Model{}f.init({name:i.DataTypes.STRING,description:i.DataTypes.TEXT,state:i.DataTypes.BOOLEAN},{sequelize:m,modelName:h.API_DB_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class A extends i.Model{}A.init({name:i.DataTypes.STRING,email:i.DataTypes.STRING,username:i.DataTypes.STRING,password:i.DataTypes.STRING,salt:i.DataTypes.STRING,token:i.DataTypes.STRING,avatar:i.DataTypes.STRING,date:i.DataTypes.DATEONLY,description:i.DataTypes.TEXT,state:i.DataTypes.BOOLEAN},{sequelize:m,modelName:h.API_DB_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated",defaultScope:{attributes:{exclude:["password","salt","token"]}},scopes:{password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}});class C extends i.Model{}C.init({},{sequelize:m,modelName:h.API_DB_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),C.removeAttribute("id");class E extends i.Model{}E.init({key:i.DataTypes.STRING,value:i.DataTypes.STRING},{sequelize:m,modelName:h.API_DB_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),E.removeAttribute("id");class S extends i.Model{}S.init({type:i.DataTypes.STRING,source:i.DataTypes.STRING,message:i.DataTypes.TEXT},{sequelize:m,modelName:h.API_DB_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class w extends i.Model{}w.init({session:i.DataTypes.STRING,json:i.DataTypes.TEXT,expired:i.DataTypes.BIGINT},{sequelize:m,modelName:h.API_DB_PREFIX+"session",timestamps:!0,createdAt:"created",updatedAt:"updated"}),w.removeAttribute("id"),A.hasMany(_),_.belongsTo(A),A.hasMany(x),x.belongsTo(A),A.hasMany(I),I.belongsTo(A),v.hasMany(P),P.belongsTo(v),f.hasMany(P),P.belongsTo(f),A.hasMany(C),C.belongsTo(A),v.hasMany(C),C.belongsTo(v);class T{static write(e,r,o){return g(this,void 0,void 0,(function*(){yield T.writeRaw(t.LogColor.White,"",e,r,o)}))}static error(e,r,o){return g(this,void 0,void 0,(function*(){yield T.writeRaw(t.LogColor.Red,"error",e,r,o)}))}static info(e,r,o){return g(this,void 0,void 0,(function*(){yield T.writeRaw(t.LogColor.Cyan,"info",e,r,o)}))}static success(e,r,o){return g(this,void 0,void 0,(function*(){yield T.writeRaw(t.LogColor.Green,"success",e,r,o)}))}static warning(e,r,o){return g(this,void 0,void 0,(function*(){yield T.writeRaw(t.LogColor.Yellow,"warning",e,r,o)}))}static writeRaw(e,r,o,i,s){return g(this,void 0,void 0,(function*(){s&&t.Log.console(e,r,o),m&&(yield S.create({type:r,source:i,message:o}).catch((()=>null)))}))}}const O=e=>n.existsSync(e)?n.readFileSync(e):void 0,R={http:O(h.API_HTTP_CRT),token:O(h.API_TOKEN_CRT)},D={http:O(h.API_HTTP_KEY),token:O(h.API_TOKEN_KEY)};class M extends d.Store{constructor(){super(),this.all=e=>g(this,void 0,void 0,(function*(){e=e||r.noop;const t=yield w.findAll({attributes:["session"],where:{expired:{[i.Op.gte]:Date.now()}}}).catch((t=>(e(t),null)));t&&e(null,t.map((e=>e.session))),e()})),this.clear=e=>g(this,void 0,void 0,(function*(){yield w.destroy().catch(r.noop),e&&e()})),this.destroy=(e,t)=>g(this,void 0,void 0,(function*(){yield w.destroy({where:{session:e}}).catch(r.noop),t&&t()})),this.expired=()=>g(this,void 0,void 0,(function*(){yield w.destroy({where:{expired:{[i.Op.lt]:Date.now()}}}).catch(r.noop)})),this.get=(e,t)=>g(this,void 0,void 0,(function*(){t=t||r.noop;const o=yield w.findOne({where:{session:e,expired:{[i.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=>g(this,void 0,void 0,(function*(){e&&e(null,(yield w.count().catch(r.noop))||0)})),this.set=(e,t,o)=>g(this,void 0,void 0,(function*(){o=o||r.noop;const i=Date.now()+h.API_SESSION_LIFETIME,s=JSON.stringify(t),[n,d]=(yield w.findOrCreate({where:{session:e},defaults:{session:e,json:s,expired:i}}).catch(r.noop))||[];n&&(d||(n.json=s,n.expired=i,yield n.save().catch(r.noop))),o()})),this.loop=r.loop(this.expired,3e4),this.loop.start()}}class F{static create(e){return g(this,void 0,void 0,(function*(){if(!D.token)return{error:"Key not found"};const{id:t}=e,o=r.uuidv4(),i=yield _.create({secret:o,userId:t}).catch(F.error);if(!i)return{error:"Internal Server Error"};return{auth:i,token:a.sign({id:t,secret:o},D.token,F.options())}}))}static destroy(e){return g(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){T.error(e.message,"api.token",h.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:h.API_TOKEN_LIFETIME+"ms"}}static renew(e){return g(this,void 0,void 0,(function*(){if(!D.token)return{error:"Key not found"};const{error:t,decode:o}=F.verify(e,h.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(o){const{id:e,secret:t}=o;if(e&&t){const o=yield A.findOne({where:{id:e,state:!0}}).catch(F.error);if(o){const i=yield _.findOne({where:{secret:t,userId:o.id}}).catch(F.error);if(i&&!i.logout){i.secret=r.uuidv4(),yield i.save().catch(F.error);return{auth:i,token:a.sign({id:e,secret:i.secret},D.token,F.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e,t,r){return g(this,void 0,void 0,(function*(){if(e){t=r.hash.encrypt(e);const o=yield A.findOne({where:{token:t,state:!0}}).catch(F.error);if(o){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield _.findOrCreate({where:{secret:t,userId:o.id},defaults:{secret:t,userId:o.id}}).catch(F.error))||[];if(r)return{auth:r,user:o}}return{error:"Access denied"}}const{error:o,decode:i}=F.verify(t);if(o)return{error:o};if(i){const{id:e,secret:t}=i;if(e&&t){const r=yield A.findOne({where:{id:e,state:!0}}).catch(F.error);if(r){const e=yield _.findOne({where:{secret:t,userId:r.id}}).catch(F.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!R.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:a.verify(e,R.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class k extends e.Application{constructor(e){super(e,{cert:R.http,cross:h.API_HTTP_CROSS,hybrid:h.API_HTTP_HYBRID,key:D.http,notfound:h.API_NOTFOUND_REDIRECT,path:h.API_DEFAULT_PATH,port:h.API_HTTP_PORT,public:h.API_HTTP_PUBLIC,redirect:h.API_HTTP_REDIRECT,session:{store:new M,name:h.API_SESSION_NAME,secret:h.API_SESSION_SECRET,cookie:{maxAge:h.API_SESSION_LIFETIME},genid:r.uuidv4}}),this.hash=new t.Hash(h.API_KEY_HASH)}error(e,t){T.error(e.message,t,h.API_CONSOLE_ERROR)}log(e,t){T.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return g(this,void 0,void 0,(function*(){yield m.sync(),yield e.listen.call(this),h.API_WEBSOCKET_START&&this.server&&(this._webSocket=new o.Server({server:this.server,verifyClient:(e,t)=>t(h.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>g(this,void 0,void 0,(function*(){t.url||(t.url="");const o=t.url.length<=1?"":t.url.replace(/\//g,".");let i;e.on("message",(r=>g(this,void 0,void 0,(function*(){if(i)try{const s=JSON.parse(r);this.emit("ws.message"+o,{data:s,message:r,req:t,user:i,ws:e})}catch(s){this.emit("ws.message"+o,{message:r,req:t,user:i,ws:e})}else{const{user:s}=yield F.user("",r.toString(),this);s&&(i=s,this.emit("ws.connection"+o,{req:t,user:i,ws:e}))}i||e.close()})))),e.on("close",(()=>{i&&this.emit("ws.close"+o,{user:i,ws:e})})),yield r.sleep(2e3),i||e.close()})))))}))}websocket(){return this._webSocket}}class b{static all(){return g(this,void 0,void 0,(function*(){const e=yield E.findAll().catch(b.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e){return g(this,void 0,void 0,(function*(){return((yield E.destroy({where:{key:e}}).catch(b.error))||0)>0}))}static error(e){T.error(e.message,"api.config",h.API_CONSOLE_ERROR)}static get(e){return g(this,arguments,void 0,(function*(e,t=""){const[r]=(yield E.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(b.error))||[];return r?r.value:t}))}static set(e,t){return g(this,void 0,void 0,(function*(){const[r]=(yield E.findOrCreate({where:{key:e}}).catch(b.error))||[];r&&(r.value=t,yield r.save().catch(b.error))}))}}const q=e.parameterFactory((({ctx:e})=>e.req.auth)),N=e.parameterFactory((({ctx:e})=>e.req.user));class B{static all(e,t){return g(this,void 0,void 0,(function*(){return yield f.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:P,required:!0,include:[{model:v,required:!0,where:{state:!0},include:[{model:C,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{T.error(e.message,"api.permission",h.API_CONSOLE_ERROR)}))}))}static get(e){return g(this,void 0,void 0,(function*(){const t=yield B.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return g(this,void 0,void 0,(function*(){const r=yield B.all(e,{name:t});return!!r&&r.length>0}))}}class L extends r.EventEmitter{auth(e,t,r,o,i){return g(this,void 0,void 0,(function*(){const{auth:s,error:n,user:d}=yield F.user(t,r,i);return n?e.error(n):s&&d?s.useragent&&s.useragent!=o?e.error("Invalid token"):(e.req.auth=s,e.req.user=d,void e.next()):e.error("Internal Server Error")}))}session(e,t,o){return g(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){T.error(e.message,"api.controller",h.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r){return g(this,void 0,void 0,(function*(){return r?(yield B.is(r,t))?e.next():void e.unauthorized("Access denied"):e.unauthorized("Access denied")}))}read(e,t,r){return g(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".read",r)}))}upload(t,r){r.path||(r.path=h.API_UPLOAD_TEMP),r.size||(r.size=h.API_UPLOAD_SIZE),r.field||(r.field=h.API_UPLOAD_FIELD),e.Upload.middleware(t,r)}validation(e,t){return g(this,void 0,void 0,(function*(){const{error:o,value:i}=yield r.Validation.object(t).parse().validateAsync(e.req.body);if(o)return e.validation(o);e.req.body=i,e.next()}))}write(e,t,r){return g(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".write",r)}))}}u([c(0,e.Ctx()),c(1,e.Headers(h.API_KEY_HEADER)),c(2,e.Headers(h.API_TOKEN_HEADER)),c(3,e.Headers("user-agent")),c(4,e.App()),p("design:type",Function),p("design:paramtypes",[e.Context,String,String,String,k]),p("design:returntype",Promise)],L.prototype,"auth",null),u([c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Session()),p("design:type",Function),p("design:paramtypes",[e.Context,String,Object]),p("design:returntype",Promise)],L.prototype,"session",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,N()),p("design:type",Function),p("design:paramtypes",[e.Context,String,A]),p("design:returntype",Promise)],L.prototype,"permission",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,N()),p("design:type",Function),p("design:paramtypes",[e.Context,String,A]),p("design:returntype",Promise)],L.prototype,"read",null),u([c(0,e.Ctx()),c(1,e.Argument()),p("design:type",Function),p("design:paramtypes",[e.Context,Object]),p("design:returntype",void 0)],L.prototype,"upload",null),u([c(0,e.Ctx()),c(1,e.Argument()),p("design:type",Function),p("design:paramtypes",[e.Context,Object]),p("design:returntype",Promise)],L.prototype,"validation",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,N()),p("design:type",Function),p("design:paramtypes",[e.Context,String,A]),p("design:returntype",Promise)],L.prototype,"write",null),exports.AuthController=class extends L{login(e,o,s,n,d){return g(this,void 0,void 0,(function*(){var a;yield r.sleep(h.API_SLEEP_AUTH);const l=yield A.scope("password").findOne({where:{[i.Op.or]:[{email:s},{username:s}]}}).catch(this.error);if(n+=null!==(a=null==l?void 0:l.salt)&&void 0!==a?a:"",!l||l.password!=t.sha256(n))return e.notFound("Invalid username or password"),d.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const u=yield I.findOne({where:{state:!0,userId:l.id}}).catch(this.error);if(u)return e.error("Activation required"),d.emit("auth.activation",{ctx:e,register:u,user:l}),void this.emit("auth.activation",{ctx:e,register:u,user:l});if(!l.state)return e.notFound("Invalid username or password"),d.emit("auth.failure",{ctx:e,user:l}),void this.emit("auth.failure",{ctx:e,user:l});const{auth:c,error:p,token:g}=yield F.create(l);return p?(e.error(p),d.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):c&&g?(c.useragent=o,yield c.save().catch(this.error),e.json({token:g}),d.emit("auth.login",{auth:c,ctx:e,user:l}),void this.emit("auth.login",{auth:c,ctx:e,user:l})):(e.error("Internal Server Error"),d.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,r,o){return g(this,void 0,void 0,(function*(){if(yield F.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 g(this,void 0,void 0,(function*(){const{auth:i,error:s,token:n}=yield F.renew(r);return s?e.error(s):i?(i.useragent=t,yield i.save().catch(this.error),e.json({token:n}),o.emit("auth.renew",{auth:i,ctx:e}),void this.emit("auth.renew",{auth:i,ctx:e})):e.error("Internal Server Error")}))}user(e,t){return g(this,void 0,void 0,(function*(){const r=yield B.all(t);if(!r)return e.error("Internal Server Error");e.json(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))}))}))}},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()),p("design:type",Function),p("design:paramtypes",[e.Context,String,String,String,k]),p("design:returntype",Promise)],exports.AuthController.prototype,"login",null),u([e.Get("/logout"),e.Middleware("auth"),c(0,e.Ctx()),c(1,q()),c(2,N()),c(3,e.App()),p("design:type",Function),p("design:paramtypes",[e.Context,_,A,k]),p("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()),p("design:type",Function),p("design:paramtypes",[e.Context,String,String,k]),p("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),u([e.Get(),e.Middleware("auth"),c(0,e.Ctx()),c(1,N()),p("design:type",Function),p("design:paramtypes",[e.Context,A]),p("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=u([e.Controller("/auth"),e.Extends(L)],exports.AuthController),exports.FilesController=class extends L{directory(){return h.API_HTTP_PUBLIC||"./"}files(e){return g(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("Path not Found");let i=[];return i=n.readdirSync(o),i=i.map((e=>this.info(l.join(o,e)))),i=i.filter(r.isDef),Object.assign(Object.assign({},this.info(o)),{files:i})}))}access(e,t,r){return g(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()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.FilesController.prototype,"files",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,N()),p("design:type",Function),p("design:paramtypes",[e.Context,String,A]),p("design:returntype",Promise)],exports.FilesController.prototype,"access",null),exports.FilesController=u([e.Controller("/files"),e.Extends(L)],exports.FilesController),exports.ForgotController=class extends L{check(e,t){return g(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 g(this,void 0,void 0,(function*(){yield r.sleep(h.API_SLEEP_FORGOT);const s=t,n=yield A.findOne({where:{[i.Op.or]:[{email:s},{username:t}]}}).catch(this.error);if(!n)return e.notFound("User not found");const d=r.uniqueID(),a=Date.now()+6e4*h.API_TOKEN_FORGOT,l=yield x.create({token:d,timestamp:a,state:!0,userId:n.id});e.success("OK"),o.emit("forgot.send",{ctx:e,forgot:l,user:n}),this.emit("forgot.send",{ctx:e,forgot:l,user:n})}))}reset(e,r,o,i){return g(this,void 0,void 0,(function*(){const s=yield this.find(r);if(!s)return e.notFound("User not found");s.state=!1,yield s.save().catch(this.error),s.user.password=t.sha256(o),yield s.user.save().catch(this.error),e.success("OK"),i.emit("forgot.reset",{ctx:e,user:s.user}),this.emit("forgot.reset",{ctx:e,user:s.user})}))}find(e){return g(this,void 0,void 0,(function*(){return yield x.findOne({where:{token:e,state:!0},include:[{model:A,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")),p("design:type",Function),p("design:paramtypes",[e.Context,String]),p("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()),p("design:type",Function),p("design:paramtypes",[e.Context,String,k]),p("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()),p("design:type",Function),p("design:paramtypes",[e.Context,String,String,k]),p("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=u([e.Controller("/forgot"),e.Extends(L)],exports.ForgotController),exports.ModelController=class extends L{constructor(){super(...arguments),this._columns=[]}_add(t){return g(this,arguments,void 0,(function*({ctx:t,options:r,body:o}){const i=yield this.model().create(Object.assign(Object.assign({},t.req.body),o||{}),r||{}).catch(this.error);if(i){const r=this.key();return t.prepare(e.Status.OK,{[r]:i.getDataValue(r)}),i}t.error("Internal Server Error")}))}_all(t){return g(this,arguments,void 0,(function*({ctx:t,options:o,callback:s,scope:n}){var d,a,l;const u=this.scope(n),c=Object.assign({},o||{});c.where=Object.assign({},c.where||{});const p=t.req.query.limit,g=r.isString(p)?parseInt(p):10;c.limit=g>0?g: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 y=[],m=this.columns(),_=e=>m.indexOf(e)>=0,x=null===(d=t.req.query.asc)||void 0===d?void 0:d.toString();x&&x.length&&y.push(...x.split(",").filter(_).map((e=>[e,"ASC"])));const v=null===(a=t.req.query.desc)||void 0===a?void 0:a.toString();v&&v.length&&y.push(...v.split(",").filter(_).map((e=>[e,"DESC"]))),y.length&&(c.order=y);const P=[],I=null===(l=t.req.query.search)||void 0===l?void 0:l.toString();(r.isArray(c.attributes)?c.attributes:m).filter(r.isString).forEach((e=>{var r;if(I&&I.length&&P.push({[e]:{[i.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]:{[i.Op.like]:`%${o}%`}})}})),P.length&&(c.where=Object.assign(Object.assign({},c.where),{[i.Op.or]:[...P]}));const f=(yield u.count(Object.assign(Object.assign({},c),{col:m[0]})).catch(this.error))||0,A=yield u.findAll(c).catch(this.error);return A?(t.prepare(e.Status.OK,{count:f,records:s?yield s(A):A}),[A,f]):(t.error("Internal Server Error"),[])}))}columns(){return 0==this._columns.length&&(this._columns=Object.keys(this.model().getAttributes())),this._columns}_del(e){return g(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 i=yield this.model().destroy(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[r]:o})})).catch(this.error);return i?(e.success("OK"),i):(e.notFound("Record not found"),0)}))}error(e){e.sql?T.error(e.message+"\n"+e.sql,"api.controller.sql",h.API_CONSOLE_ERROR):super.error(e)}_get(t){return g(this,arguments,void 0,(function*({ctx:t,options:r,callback:o,scope:i}){const s=this.key(),{[s]:n}=t.req.params,d=yield this.scope(i).findOne(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[s]: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 g(this,arguments,void 0,(function*({ctx:e,options:t,body:r}){const o=this.key(),{[o]:i}=e.req.params,[s]=(yield this.model().update(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[o]:i})})).catch(this.error))||[];return s?(e.success("OK"),!0):(e.success("Record not changed"),!1)}))}},exports.ModelController=u([e.Extends(L)],exports.ModelController),exports.CrudController=class extends exports.ModelController{add(e){return g(this,void 0,void 0,(function*(){yield this._add({ctx:e})}))}all(e){return g(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}create(){return{}}del(e){return g(this,void 0,void 0,(function*(){yield this._del({ctx:e})}))}get(e){return g(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e){return g(this,void 0,void 0,(function*(){yield this._set({ctx:e})}))}update(){return{}}validationAdd(e){return g(this,void 0,void 0,(function*(){yield this.validation(e,this.create())}))}validationSet(e){return g(this,void 0,void 0,(function*(){yield this.validation(e,this.update())}))}},u([e.Post(),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationAdd"),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.CrudController.prototype,"add",null),u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.CrudController.prototype,"all",null),u([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.CrudController.prototype,"del",null),u([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.CrudController.prototype,"get",null),u([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationSet"),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.CrudController.prototype,"set",null),u([c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.CrudController.prototype,"validationAdd",null),u([c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("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 v}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=u([e.Controller("/groups"),e.Extends(exports.CrudController)],exports.GroupsController),exports.GroupsRoutesController=class extends exports.ModelController{model(){return P}all(e,t){return g(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{groupId:t},include:[{model:f,required:!0}]},callback:e=>e.map((e=>e.route))})}))}set(e,t,o){return g(this,void 0,void 0,(function*(){const i=yield v.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield P.destroy({where:{groupId:t}}),o){let e=0;for(let r=0;r<o.length;r++)e=yield f.count({where:{id:o[r]}}),e&&(yield P.create({groupId:t,routeId:o[r]}))}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")),p("design:type",Function),p("design:paramtypes",[e.Context,String]),p("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"all",null),u([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")),p("design:type",Function),p("design:paramtypes",[e.Context,String,Array]),p("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"set",null),exports.GroupsRoutesController=u([e.Controller("/groups"),e.Extends(exports.ModelController)],exports.GroupsRoutesController),exports.LogsController=class extends exports.ModelController{model(){return S}all(e,t,r){return g(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","DESC"]]}})}))}},u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),c(1,e.Query("type")),c(2,e.Query("source")),p("design:type",Function),p("design:paramtypes",[e.Context,String,String]),p("design:returntype",Promise)],exports.LogsController.prototype,"all",null),exports.LogsController=u([e.Controller("/logs"),e.Extends(exports.ModelController)],exports.LogsController),exports.RegisterController=class extends L{register(e,o,s){return g(this,void 0,void 0,(function*(){yield r.sleep(h.API_SLEEP_REGISTRY);const{name:n,date:d,email:a,username:l,password:u,confirm:c}=o,p=l||a,g=t.sha256(u);if(yield A.count({where:{[i.Op.or]:[{email:a},{username:p}]}}).catch(this.error))return e.validation("Invalid email or username");if(g!=t.sha256(c))return e.error("Invalid password");const y=yield A.create({name:n,email:a,username:p,password:g,avatar:"",date:d,description:"",state:!1}).catch(this.error);if(!y)return e.error("Internal Server Error");const m=yield I.create({token:yield this.getId(),userId:y.id,state:!0}).catch(this.error);if(!m)return y.destroy(),e.error("Internal Server Error");e.success("OK"),s.emit("register.user",{ctx:e,register:m,user:y}),this.emit("register.user",{ctx:e,register:m,user:y})}))}confirm(e,t,r){return g(this,void 0,void 0,(function*(){const o=yield I.findOne({where:{token:t,state:!0},include:[{model:A,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 g(this,void 0,void 0,(function*(){const o=t,s=yield I.findOne({where:{state:!0},include:[{model:A,required:!0,where:{[i.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 g(this,void 0,void 0,(function*(){const e=r.uuidv4();return(yield I.count({where:{token:e}}))?this.getId():e}))}},u([e.Post(),e.Middleware("validation",{name:r.Validation.string().required(),date:r.Validation.string().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()),p("design:type",Function),p("design:paramtypes",[e.Context,Object,k]),p("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()),p("design:type",Function),p("design:paramtypes",[e.Context,String,k]),p("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()),p("design:type",Function),p("design:paramtypes",[e.Context,String,k]),p("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=u([e.Controller("/register"),e.Extends(L)],exports.RegisterController),exports.RoutesController=class extends exports.CrudController{model(){return f}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=u([e.Controller("/routes"),e.Extends(exports.CrudController)],exports.RoutesController),exports.SetupController=class extends L{setup(e){return g(this,void 0,void 0,(function*(){if(0==(yield A.count())){const e=r.uniqueID(),o=yield A.create({name:"Admin",email:"admin@localhost",username:"admin",password:t.sha256("admin"+e),salt:e,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0}),i={description:"API CORE",state:!0},s=yield v.create(Object.assign({name:"admin"},i));yield C.create({userId:o.id,groupId:s.id});const n=["read","write"],d=["users","groups","routes"];yield r.forEachSeries(d,(e=>g(this,void 0,void 0,(function*(){yield r.forEachSeries(n,(t=>g(this,void 0,void 0,(function*(){const r=e+"."+t,o=yield f.create(Object.assign({name:r},i));yield P.create({groupId:s.id,routeId:o.id})}))))}))));const a=[...n,"delete","list","rename","upload"];yield r.forEachSeries(a,(e=>g(this,void 0,void 0,(function*(){const t="files."+e,r=yield f.create(Object.assign({name:t},i));yield P.create({groupId:s.id,routeId:r.id})}))));const l=yield f.create(Object.assign({name:"logs.read"},i));yield P.create({groupId:s.id,routeId:l.id})}e.success("OK")}))}},u([e.Get(),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=u([e.Controller("/setup"),e.Extends(L)],exports.SetupController),exports.UsersController=class extends exports.ModelController{model(){return A}constructor(){super(),this.dir=h.API_HTTP_PUBLIC+"/avatar",h.API_HTTP_PUBLIC&&n.existsSync(h.API_HTTP_PUBLIC)&&!n.existsSync(this.dir)&&n.mkdirSync(this.dir)}avatar(e,t,r){return g(this,void 0,void 0,(function*(){if(t.length){const o=t[0].filename||"";if(o){const t=this.dir+"/"+r.avatar;if(n.existsSync(t)&&n.lstatSync(t).isFile()&&n.rmSync(t),r.avatar=o,yield r.save().catch(this.error))return e.success("OK")}}e.success("Record not changed")}))}avatar_remove(e,t){return g(this,void 0,void 0,(function*(){const r=this.dir+"/"+t.avatar;t.avatar="",(yield t.save().catch(this.error))&&n.existsSync(r)&&n.rmSync(r),e.success("OK")}))}password(e,o,i,s){return g(this,void 0,void 0,(function*(){var n;const d=yield this.scope("password").findOne({where:{id:s.id,state:!0}}).catch(this.error);return o+=null!==(n=null==d?void 0:d.salt)&&void 0!==n?n:"",d&&d.password==t.sha256(o)?(d.salt=r.uniqueID(),d.password=t.sha256(i+d.salt),(yield d.save().catch(this.error))?e.success("OK"):void e.success("Record not changed")):e.error("Record not changed")}))}token(e,t,r){return g(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 g(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){return g(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().catch(this.error),e.success("OK");e.notFound("Record not found")}))}token_renew(e,t,r){return g(this,void 0,void 0,(function*(){const o=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(o){const t=yield this.token_new();return o.token=r.hash.encrypt(t),yield o.save().catch(this.error),e.json({token:t})}e.notFound("Record not found")}))}token_new(){return g(this,void 0,void 0,(function*(){const e=r.uuidv4();return(yield this.model().count({where:{token:e}}))?this.token_new():e}))}add(e,o){return g(this,void 0,void 0,(function*(){const i=r.uniqueID();yield this._add({ctx:e,body:{password:t.sha256(o+i),salt:i}})}))}all(e){return g(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}del(e,t,r){return g(this,void 0,void 0,(function*(){t&&t.id.toString()!=r?yield this._del({ctx:e}):e.error("Internal Server Error")}))}get(e){return g(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,o){return g(this,void 0,void 0,(function*(){const i=r.uniqueID();yield this._set({ctx:e,body:o?{password:t.sha256(o+i),salt:i}:{}})}))}},u([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,N()),p("design:type",Function),p("design:paramtypes",[e.Context,Array,A]),p("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),u([e.Get("/avatar/remove"),e.Middleware("auth"),c(0,e.Ctx()),c(1,N()),p("design:type",Function),p("design:paramtypes",[e.Context,A]),p("design:returntype",Promise)],exports.UsersController.prototype,"avatar_remove",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,N()),p("design:type",Function),p("design:paramtypes",[e.Context,String,String,A]),p("design:returntype",Promise)],exports.UsersController.prototype,"password",null),u([e.Get("/token"),e.Middleware("auth"),c(0,e.Ctx()),c(1,N()),c(2,e.App()),p("design:type",Function),p("design:paramtypes",[e.Context,A,k]),p("design:returntype",Promise)],exports.UsersController.prototype,"token",null),u([e.Get("/token/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.App()),p("design:type",Function),p("design:paramtypes",[e.Context,String,k]),p("design:returntype",Promise)],exports.UsersController.prototype,"token_get",null),u([e.Get("/token/remove/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,e.Params("id")),p("design:type",Function),p("design:paramtypes",[e.Context,String]),p("design:returntype",Promise)],exports.UsersController.prototype,"token_remove",null),u([e.Get("/token/renew/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.App()),p("design:type",Function),p("design:paramtypes",[e.Context,String,k]),p("design:returntype",Promise)],exports.UsersController.prototype,"token_renew",null),u([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")),p("design:type",Function),p("design:paramtypes",[e.Context,String]),p("design:returntype",Promise)],exports.UsersController.prototype,"add",null),u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.UsersController.prototype,"all",null),u([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,N()),c(2,e.Params("id")),p("design:type",Function),p("design:paramtypes",[e.Context,A,String]),p("design:returntype",Promise)],exports.UsersController.prototype,"del",null),u([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),p("design:type",Function),p("design:paramtypes",[e.Context]),p("design:returntype",Promise)],exports.UsersController.prototype,"get",null),u([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")),p("design:type",Function),p("design:paramtypes",[e.Context,String]),p("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=u([e.Controller("/users"),e.Extends(exports.ModelController),p("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class extends exports.ModelController{model(){return C}all(e,t){return g(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{userId:t},include:[{model:v,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,o){return g(this,void 0,void 0,(function*(){const i=yield A.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){if(yield C.destroy({where:{userId:i.id}}),o){let e=0;for(let t=0;t<o.length;t++)e=yield v.count({where:{id:o[t]}}),e&&(yield C.create({userId:i.id,groupId:o[t]}))}return e.success("OK")}if(r.isNull(i))return e.notFound("Record not found");e.error("Internal Server Error")}))}},u([e.Get("/:id/groups"),e.Middleware("auth"),e.Middleware("read","users"),c(0,e.Ctx()),c(1,e.Params("id")),p("design:type",Function),p("design:paramtypes",[e.Context,String]),p("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),u([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")),p("design:type",Function),p("design:paramtypes",[e.Context,String,Array]),p("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=u([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersGroupsController),exports.Application=k,exports.Auth=_,exports.Config=b,exports.Configs=E,exports.ControllerBase=L,exports.Database=y,exports.Env=h,exports.Forgot=x,exports.Group=v,exports.GroupRoute=P,exports.Log=S,exports.Logs=T,exports.Permission=B,exports.Register=I,exports.ReqAuth=q,exports.ReqUser=N,exports.Route=f,exports.Session=w,exports.Token=F,exports.User=A,exports.UserGroup=C,exports.crt=R,exports.key=D,exports.sequelize=m;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @andrewcaires/api v3.2.3
2
+ * @andrewcaires/api v3.2.4
3
3
  * Simple api for small applications using express, jsonwebtoken, sequelize and websocket
4
4
  * (c) 2024 Andrew Caires
5
5
  * @license: MIT
package/dist/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/api v3.2.3
2
+ * @andrewcaires/api v3.2.4
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 s,Argument as o,Upload as d,Context as a,Post as u,Middleware as c,Body as l,Get as p,Controller as g,Extends as h,Status as m,Delete as y,Put as _,Params as v,Query as f,Files as I}from"@andrewcaires/express";import{LogColor as P,Log as A,Hash as E,sha256 as O}from"@andrewcaires/node";import{toBool as S,parseMs as T,noop as w,loop as R,uuidv4 as b,sleep as k,EventEmitter as D,Validation as N,isDef as x,uniqueID as F,isString as q,isArray as B,isNull as L,simpleID as j,forEachSeries as K}from"@andrewcaires/utils.js";import C from"ws";import{Sequelize as H,DataTypes as M,Model as U,Op as G}from"sequelize";import{config as z}from"dotenv";import{existsSync as Y,readFileSync as X,statSync as W,readdirSync as Z,mkdirSync as J,lstatSync as $,rmSync as V}from"fs";import{Store as Q}from"express-session";import{verify as ee,sign as te}from"jsonwebtoken";import{join as re}from"path";function ie(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o}function ne(e,t){return function(r,i){t(r,i,e)}}function se(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,s){function o(e){try{a(i.next(e))}catch(e){s(e)}}function d(e){try{a(i.throw(e))}catch(e){s(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(o,d)}a((i=i.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,z();class de{static getBool(e,t){return S(de.getString(e,t.toString()))}static getInt(e,t){return parseInt(de.getString(e,t.toString()))}static getMs(e,t){return T(de.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}de.API_CONSOLE_ERROR=de.getBool("API_CONSOLE_ERROR",!1),de.API_DEFAULT_PATH=de.getString("API_DEFAULT_PATH","/api"),de.API_DB_DATABASE=de.getString("API_DB_DATABASE",""),de.API_DB_HOST=de.getString("API_DB_HOST","127.0.0.1"),de.API_DB_PASSWORD=de.getString("API_DB_PASSWORD",""),de.API_DB_PORT=de.getInt("API_DB_PORT",3306),de.API_DB_TYPE=de.getString("API_DB_TYPE",""),de.API_DB_USERNAME=de.getString("API_DB_USERNAME","root"),de.API_DB_LOG=de.getBool("API_DB_LOG",!1),de.API_DB_PREFIX=de.getString("API_DB_PREFIX",""),de.API_DB_TIMEZONE=de.getString("API_DB_TIMEZONE","+00:00"),de.API_HTTP_CRT=de.getString("API_HTTP_CRT",""),de.API_HTTP_KEY=de.getString("API_HTTP_KEY",""),de.API_HTTP_PORT=de.getInt("API_HTTP_PORT",3e3),de.API_HTTP_PUBLIC=de.getString("API_HTTP_PUBLIC",""),de.API_HTTP_CROSS=de.getBool("API_HTTP_CROSS",!1),de.API_HTTP_HYBRID=de.getBool("API_HTTP_HYBRID",!1),de.API_HTTP_REDIRECT=de.getString("API_HTTP_REDIRECT",""),de.API_KEY_HASH=de.getString("API_KEY_HASH",""),de.API_KEY_HEADER=de.getString("API_KEY_HEADER","api_key"),de.API_NOTFOUND_REDIRECT=de.getString("API_NOTFOUND_REDIRECT",""),de.API_SLEEP_AUTH=de.getMs("API_SLEEP_AUTH","2s"),de.API_SLEEP_FORGOT=de.getMs("API_SLEEP_FORGOT","5s"),de.API_SLEEP_REGISTRY=de.getMs("API_SLEEP_REGISTRY","5s"),de.API_SESSION_NAME=de.getString("API_SESSION_NAME","session.id"),de.API_SESSION_LIFETIME=de.getMs("API_SESSION_LIFETIME","1d"),de.API_SESSION_SECRET=de.getString("API_SESSION_SECRET","yoursecret"),de.API_TOKEN_CRT=de.getString("API_TOKEN_CRT",""),de.API_TOKEN_KEY=de.getString("API_TOKEN_KEY",""),de.API_TOKEN_FORGOT=de.getMs("API_TOKEN_LIFETIME","1d"),de.API_TOKEN_HEADER=de.getString("API_TOKEN_HEADER","authorization"),de.API_TOKEN_LIFETIME=de.getMs("API_TOKEN_LIFETIME","1d"),de.API_TOKEN_RENEW=de.getMs("API_TOKEN_RENEW","1d"),de.API_UPLOAD_COUNT=de.getInt("API_UPLOAD_COUNT",1),de.API_UPLOAD_FIELD=de.getString("API_UPLOAD_FIELD","upload"),de.API_UPLOAD_SIZE=de.getInt("API_UPLOAD_SIZE",2),de.API_UPLOAD_TEMP=de.getString("API_UPLOAD_TEMP","./temp"),de.API_WEBSOCKET_START=de.getBool("API_WEBSOCKET_START",!1);class ae{static connect(e){const t="connect_"+de.API_DB_TYPE.toLowerCase();if(t in ae)return ae[t](e);throw new Error("No database is connected to this API")}static connect_mariadb(e){return new H(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mariadb",logging:de.API_DB_LOG,define:{timestamps:!1},timezone:de.API_DB_TIMEZONE})}static connect_memory(){return new H("sqlite::memory:",{logging:de.API_DB_LOG,define:{timestamps:!1},timezone:de.API_DB_TIMEZONE})}static connect_mysql(e){return new H(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mysql",logging:de.API_DB_LOG,define:{timestamps:!1},timezone:de.API_DB_TIMEZONE})}static connect_postgres(e){return new H(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"postgres",logging:de.API_DB_LOG,define:{timestamps:!1},timezone:de.API_DB_TIMEZONE})}static connect_sqlite(e){return new H({dialect:"sqlite",storage:e.database,logging:de.API_DB_LOG,define:{timestamps:!1},timezone:de.API_DB_TIMEZONE})}}const ue=ae.connect({database:de.API_DB_DATABASE,username:de.API_DB_USERNAME,password:de.API_DB_PASSWORD,hostname:de.API_DB_HOST,hostport:de.API_DB_PORT});class ce extends U{}ce.init({secret:M.STRING,logout:M.DATE,useragent:M.STRING},{sequelize:ue,modelName:de.API_DB_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class le extends U{}le.init({token:M.STRING,timestamp:M.BIGINT,state:M.BOOLEAN},{sequelize:ue,modelName:de.API_DB_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class pe extends U{}pe.init({name:M.STRING,description:M.TEXT,state:M.BOOLEAN},{sequelize:ue,modelName:de.API_DB_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class ge extends U{}ge.init({},{sequelize:ue,modelName:de.API_DB_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),ge.removeAttribute("id");class he extends U{}he.init({token:M.STRING,state:M.BOOLEAN},{sequelize:ue,modelName:de.API_DB_PREFIX+"register",timestamps:!0,createdAt:"created",updatedAt:"updated"});class me extends U{}me.init({name:M.STRING,description:M.TEXT,state:M.BOOLEAN},{sequelize:ue,modelName:de.API_DB_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class ye extends U{}ye.init({name:M.STRING,email:M.STRING,username:M.STRING,password:M.STRING,salt:M.STRING,token:M.STRING,avatar:M.STRING,date:M.DATEONLY,description:M.TEXT,state:M.BOOLEAN},{sequelize:ue,modelName:de.API_DB_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated",defaultScope:{attributes:{exclude:["password","salt","token"]}},scopes:{password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}});class _e extends U{}_e.init({},{sequelize:ue,modelName:de.API_DB_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),_e.removeAttribute("id");class ve extends U{}ve.init({key:M.STRING,value:M.STRING},{sequelize:ue,modelName:de.API_DB_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),ve.removeAttribute("id");class fe extends U{}fe.init({type:M.STRING,source:M.STRING,message:M.TEXT},{sequelize:ue,modelName:de.API_DB_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class Ie extends U{}Ie.init({session:M.STRING,json:M.TEXT,expired:M.BIGINT},{sequelize:ue,modelName:de.API_DB_PREFIX+"session",timestamps:!0,createdAt:"created",updatedAt:"updated"}),Ie.removeAttribute("id"),ye.hasMany(ce),ce.belongsTo(ye),ye.hasMany(le),le.belongsTo(ye),ye.hasMany(he),he.belongsTo(ye),pe.hasMany(ge),ge.belongsTo(pe),me.hasMany(ge),ge.belongsTo(me),ye.hasMany(_e),_e.belongsTo(ye),pe.hasMany(_e),_e.belongsTo(pe);class Pe{static write(e,t,r){return oe(this,void 0,void 0,(function*(){yield Pe.writeRaw(P.White,"",e,t,r)}))}static error(e,t,r){return oe(this,void 0,void 0,(function*(){yield Pe.writeRaw(P.Red,"error",e,t,r)}))}static info(e,t,r){return oe(this,void 0,void 0,(function*(){yield Pe.writeRaw(P.Cyan,"info",e,t,r)}))}static success(e,t,r){return oe(this,void 0,void 0,(function*(){yield Pe.writeRaw(P.Green,"success",e,t,r)}))}static warning(e,t,r){return oe(this,void 0,void 0,(function*(){yield Pe.writeRaw(P.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),ue&&(yield fe.create({type:t,source:i,message:r}).catch((()=>null)))}))}}const Ae=e=>Y(e)?X(e):void 0,Ee={http:Ae(de.API_HTTP_CRT),token:Ae(de.API_TOKEN_CRT)},Oe={http:Ae(de.API_HTTP_KEY),token:Ae(de.API_TOKEN_KEY)};class Se extends Q{constructor(){super(),this.all=e=>oe(this,void 0,void 0,(function*(){e=e||w;const t=yield Ie.findAll({attributes:["session"],where:{expired:{[G.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 Ie.destroy().catch(w),e&&e()})),this.destroy=(e,t)=>oe(this,void 0,void 0,(function*(){yield Ie.destroy({where:{session:e}}).catch(w),t&&t()})),this.expired=()=>oe(this,void 0,void 0,(function*(){yield Ie.destroy({where:{expired:{[G.lt]:Date.now()}}}).catch(w)})),this.get=(e,t)=>oe(this,void 0,void 0,(function*(){t=t||w;const r=yield Ie.findOne({where:{session:e,expired:{[G.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(w),void t(null)}t(null,e)}else t(null)})),this.length=e=>oe(this,void 0,void 0,(function*(){e&&e(null,(yield Ie.count().catch(w))||0)})),this.set=(e,t,r)=>oe(this,void 0,void 0,(function*(){r=r||w;const i=Date.now()+de.API_SESSION_LIFETIME,n=JSON.stringify(t),[s,o]=(yield Ie.findOrCreate({where:{session:e},defaults:{session:e,json:n,expired:i}}).catch(w))||[];s&&(o||(s.json=n,s.expired=i,yield s.save().catch(w))),r()})),this.loop=R(this.expired,3e4),this.loop.start()}}class Te{static create(e){return oe(this,void 0,void 0,(function*(){if(!Oe.token)return{error:"Key not found"};const{id:t}=e,r=b(),i=yield ce.create({secret:r,userId:t}).catch(Te.error);if(!i)return{error:"Internal Server Error"};return{auth:i,token:te({id:t,secret:r},Oe.token,Te.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){Pe.error(e.message,"api.token",de.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:de.API_TOKEN_LIFETIME+"ms"}}static renew(e){return oe(this,void 0,void 0,(function*(){if(!Oe.token)return{error:"Key not found"};const{error:t,decode:r}=Te.verify(e,de.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield ye.findOne({where:{id:e,state:!0}}).catch(Te.error);if(r){const i=yield ce.findOne({where:{secret:t,userId:r.id}}).catch(Te.error);if(i&&!i.logout){i.secret=b(),yield i.save().catch(Te.error);return{auth:i,token:te({id:e,secret:i.secret},Oe.token,Te.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 ye.findOne({where:{token:t,state:!0}}).catch(Te.error);if(i){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield ce.findOrCreate({where:{secret:t,userId:i.id},defaults:{secret:t,userId:i.id}}).catch(Te.error))||[];if(r)return{auth:r,user:i}}return{error:"Access denied"}}const{error:i,decode:n}=Te.verify(t);if(i)return{error:i};if(n){const{id:e,secret:t}=n;if(e&&t){const r=yield ye.findOne({where:{id:e,state:!0}}).catch(Te.error);if(r){const e=yield ce.findOne({where:{secret:t,userId:r.id}}).catch(Te.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!Ee.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:ee(e,Ee.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class we extends e{constructor(e){super(e,{cert:Ee.http,cross:de.API_HTTP_CROSS,hybrid:de.API_HTTP_HYBRID,key:Oe.http,notfound:de.API_NOTFOUND_REDIRECT,path:de.API_DEFAULT_PATH,port:de.API_HTTP_PORT,public:de.API_HTTP_PUBLIC,redirect:de.API_HTTP_REDIRECT,session:{store:new Se,name:de.API_SESSION_NAME,secret:de.API_SESSION_SECRET,cookie:{maxAge:de.API_SESSION_LIFETIME},genid:b}}),this.hash=new E(de.API_KEY_HASH)}error(e,t){Pe.error(e.message,t,de.API_CONSOLE_ERROR)}log(e,t){Pe.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return oe(this,void 0,void 0,(function*(){yield ue.sync(),yield e.listen.call(this),de.API_WEBSOCKET_START&&this.server&&(this._webSocket=new C.Server({server:this.server,verifyClient:(e,t)=>t(de.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 s=JSON.parse(n);this.emit("ws.message"+r,{data:s,message:n,req:t,user:i,ws:e})}catch(s){this.emit("ws.message"+r,{message:n,req:t,user:i,ws:e})}else{const{user:s}=yield Te.user("",n.toString(),this);s&&(i=s,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 Re{static all(){return oe(this,void 0,void 0,(function*(){const e=yield ve.findAll().catch(Re.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e){return oe(this,void 0,void 0,(function*(){return((yield ve.destroy({where:{key:e}}).catch(Re.error))||0)>0}))}static error(e){Pe.error(e.message,"api.config",de.API_CONSOLE_ERROR)}static get(e){return oe(this,arguments,void 0,(function*(e,t=""){const r=yield ve.findOne({where:{key:e}}).catch(Re.error);return r?r.value:t}))}static set(e,t){return oe(this,void 0,void 0,(function*(){const[r]=(yield ve.findOrCreate({where:{key:e}}).catch(Re.error))||[];r&&(r.value=t,yield r.save().catch(Re.error))}))}}const be=t((({ctx:e})=>e.req.auth)),ke=t((({ctx:e})=>e.req.user));class De{static all(e,t){return oe(this,void 0,void 0,(function*(){return yield me.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:ge,required:!0,include:[{model:pe,required:!0,where:{state:!0},include:[{model:_e,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{Pe.error(e.message,"api.permission",de.API_CONSOLE_ERROR)}))}))}static get(e){return oe(this,void 0,void 0,(function*(){const t=yield De.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return oe(this,void 0,void 0,(function*(){const r=yield De.all(e,{name:t});return!!r&&r.length>0}))}}class Ne extends D{auth(e,t,r,i,n){return oe(this,void 0,void 0,(function*(){const{auth:s,error:o,user:d}=yield Te.user(t,r,n);return o?e.error(o):s&&d?s.useragent&&s.useragent!=i?e.error("Invalid token"):(e.req.auth=s,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(w):(r.useragent=t,r.save(w))),e.next()}))}error(e){Pe.error(e.message,"api.controller",de.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r){return oe(this,void 0,void 0,(function*(){return r?(yield De.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=de.API_UPLOAD_TEMP),t.size||(t.size=de.API_UPLOAD_SIZE),t.field||(t.field=de.API_UPLOAD_FIELD),d.middleware(e,t)}validation(e,t){return oe(this,void 0,void 0,(function*(){const{error:r,value:i}=yield N.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)}))}}ie([ne(0,r()),ne(1,i(de.API_KEY_HEADER)),ne(2,i(de.API_TOKEN_HEADER)),ne(3,i("user-agent")),ne(4,n()),se("design:type",Function),se("design:paramtypes",[a,String,String,String,we]),se("design:returntype",Promise)],Ne.prototype,"auth",null),ie([ne(0,r()),ne(1,i("user-agent")),ne(2,s()),se("design:type",Function),se("design:paramtypes",[a,String,Object]),se("design:returntype",Promise)],Ne.prototype,"session",null),ie([ne(0,r()),ne(1,o()),ne(2,ke()),se("design:type",Function),se("design:paramtypes",[a,String,ye]),se("design:returntype",Promise)],Ne.prototype,"permission",null),ie([ne(0,r()),ne(1,o()),ne(2,ke()),se("design:type",Function),se("design:paramtypes",[a,String,ye]),se("design:returntype",Promise)],Ne.prototype,"read",null),ie([ne(0,r()),ne(1,o()),se("design:type",Function),se("design:paramtypes",[a,Object]),se("design:returntype",void 0)],Ne.prototype,"upload",null),ie([ne(0,r()),ne(1,o()),se("design:type",Function),se("design:paramtypes",[a,Object]),se("design:returntype",Promise)],Ne.prototype,"validation",null),ie([ne(0,r()),ne(1,o()),ne(2,ke()),se("design:type",Function),se("design:paramtypes",[a,String,ye]),se("design:returntype",Promise)],Ne.prototype,"write",null);let xe=class extends Ne{login(e,t,r,i,n){return oe(this,void 0,void 0,(function*(){var s;yield k(de.API_SLEEP_AUTH);const o=yield ye.scope("password").findOne({where:{[G.or]:[{email:r},{username:r}]}}).catch(this.error);if(i+=null!==(s=null==o?void 0:o.salt)&&void 0!==s?s:"",!o||o.password!=O(i))return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const d=yield he.findOne({where:{state:!0,userId:o.id}}).catch(this.error);if(d)return e.error("Activation required"),n.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"),n.emit("auth.failure",{ctx:e,user:o}),void this.emit("auth.failure",{ctx:e,user:o});const{auth:a,error:u,token:c}=yield Te.create(o);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:o}),void this.emit("auth.login",{auth:a,ctx:e,user:o})):(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 Te.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:s,token:o}=yield Te.renew(r);return s?e.error(s):n?(n.useragent=t,yield n.save().catch(this.error),e.json({token:o}),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 De.all(t);if(!r)return e.error("Internal Server Error");e.json(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))}))}))}};ie([u("/login"),c("validation",{username:N.string().min(3).required(),password:N.string().min(5).required()}),ne(0,r()),ne(1,i("user-agent")),ne(2,l("username")),ne(3,l("password")),ne(4,n()),se("design:type",Function),se("design:paramtypes",[a,String,String,String,we]),se("design:returntype",Promise)],xe.prototype,"login",null),ie([p("/logout"),c("auth"),ne(0,r()),ne(1,be()),ne(2,ke()),ne(3,n()),se("design:type",Function),se("design:paramtypes",[a,ce,ye,we]),se("design:returntype",Promise)],xe.prototype,"logout",null),ie([u("/renew"),c("validation",{token:N.string().required()}),ne(0,r()),ne(1,i("user-agent")),ne(2,l("token")),ne(3,n()),se("design:type",Function),se("design:paramtypes",[a,String,String,we]),se("design:returntype",Promise)],xe.prototype,"renew",null),ie([p(),c("auth"),ne(0,r()),ne(1,ke()),se("design:type",Function),se("design:paramtypes",[a,ye]),se("design:returntype",Promise)],xe.prototype,"user",null),xe=ie([g("/auth"),h(Ne)],xe);let Fe=class extends Ne{directory(){return de.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=re(this.directory(),t);if(!Y(r)||!W(r).isDirectory())return e.notFound("Path not Found");let i=[];return i=Z(r),i=i.map((e=>this.info(re(r,e)))),i=i.filter(x),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(!Y(e))return null;const t=W(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"}};ie([p("/path/?*"),c("auth"),c("access","list"),ne(0,r()),se("design:type",Function),se("design:paramtypes",[a]),se("design:returntype",Promise)],Fe.prototype,"files",null),ie([ne(0,r()),ne(1,o()),ne(2,ke()),se("design:type",Function),se("design:paramtypes",[a,String,ye]),se("design:returntype",Promise)],Fe.prototype,"access",null),Fe=ie([g("/files"),h(Ne)],Fe);let qe=class extends Ne{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=F(),yield r.save(),e.json({token:r.token})}))}forgot(e,t,r){return oe(this,void 0,void 0,(function*(){yield k(de.API_SLEEP_FORGOT);const i=t,n=yield ye.findOne({where:{[G.or]:[{email:i},{username:t}]}}).catch(this.error);if(!n)return e.notFound("User not found");const s=F(),o=Date.now()+6e4*de.API_TOKEN_FORGOT,d=yield le.create({token:s,timestamp:o,state:!0,userId: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=O(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 le.findOne({where:{token:e,state:!0},include:[{model:ye,required:!0}]}).catch(this.error)}))}};ie([p("/check"),c("validation",{token:N.string().required()}),ne(0,r()),ne(1,l("token")),se("design:type",Function),se("design:paramtypes",[a,String]),se("design:returntype",Promise)],qe.prototype,"check",null),ie([u(),c("validation",{username:N.string().min(4).required()}),ne(0,r()),ne(1,l("username")),ne(2,n()),se("design:type",Function),se("design:paramtypes",[a,String,we]),se("design:returntype",Promise)],qe.prototype,"forgot",null),ie([u("/reset"),c("validation",{token:N.string().required(),password:N.string().min(5).required()}),ne(0,r()),ne(1,l("token")),ne(2,l("password")),ne(3,n()),se("design:type",Function),se("design:paramtypes",[a,String,String,we]),se("design:returntype",Promise)],qe.prototype,"reset",null),qe=ie([g("/forgot"),h(Ne)],qe);let Be=class extends Ne{constructor(){super(...arguments),this._columns=[]}_add(e){return oe(this,arguments,void 0,(function*({ctx:e,options:t,body:r}){const i=yield this.model().create(Object.assign(Object.assign({},e.req.body),r||{}),t||{}).catch(this.error);if(i){const t=this.key();return e.prepare(m.OK,{[t]:i.getDataValue(t)}),i}e.error("Internal Server Error")}))}_all(e){return oe(this,arguments,void 0,(function*({ctx:e,options:t,callback:r,scope:i}){var n,s,o;const d=this.scope(i),a=Object.assign({},t||{});a.where=Object.assign({},a.where||{});const u=e.req.query.limit;if(q(u)){const e=u?parseInt(u):10;a.limit=e>0?e:void 0}const c=e.req.query.offset;if(q(c)){const e=c?parseInt(c):0;a.offset=e>0?e:void 0}const l=[],p=this.columns(),g=e=>p.indexOf(e)>=0,h=null===(n=e.req.query.asc)||void 0===n?void 0:n.toString();h&&h.length&&l.push(...h.split(",").filter(g).map((e=>[e,"ASC"])));const y=null===(s=e.req.query.desc)||void 0===s?void 0:s.toString();y&&y.length&&l.push(...y.split(",").filter(g).map((e=>[e,"DESC"]))),l.length&&(a.order=l);const _=[],v=null===(o=e.req.query.search)||void 0===o?void 0:o.toString();(B(a.attributes)?a.attributes:p).filter(q).forEach((t=>{var r;if(v&&v.length&&_.push({[t]:{[G.like]:`%${v}%`}}),"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&&_.push({[t]:{[G.like]:`%${i}%`}})}})),_.length&&(a.where=Object.assign(Object.assign({},a.where),{[G.or]:[..._]}));const f=(yield d.count(Object.assign(Object.assign({},a),{col:p[0]})).catch(this.error))||0,I=yield d.findAll(a).catch(this.error);return I?(e.prepare(m.OK,{count:f,records:r?yield r(I):I}),[I,f]):(e.error("Internal Server Error"),[])}))}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}){const r=this.key(),{[r]:i}=e.req.params;if(!i)return e.error("Internal Server Error"),0;const n=yield this.model().destroy(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[r]:i})})).catch(this.error);return n?(e.success("OK"),n):(e.notFound("Record not found"),0)}))}error(e){e.sql?Pe.error(e.message+"\n"+e.sql,"api.controller.sql",de.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]:s}=e.req.params,o=yield this.scope(i).findOne(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[n]:s})})).catch(this.error);return o?(e.prepare(m.OK,r?yield r(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 oe(this,arguments,void 0,(function*({ctx:e,options:t,body:r}){const i=this.key(),{[i]:n}=e.req.params,[s]=(yield this.model().update(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[i]:n})})).catch(this.error))||[];return s?(e.success("OK"),!0):(e.success("Record not changed"),!1)}))}};Be=ie([h(Ne)],Be);let Le=class extends Be{add(e){return oe(this,void 0,void 0,(function*(){yield this._add({ctx:e})}))}all(e){return oe(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}create(){return{}}del(e){return oe(this,void 0,void 0,(function*(){yield this._del({ctx:e})}))}get(e){return oe(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e){return oe(this,void 0,void 0,(function*(){yield this._set({ctx:e})}))}update(){return{}}validationAdd(e){return oe(this,void 0,void 0,(function*(){yield this.validation(e,this.create())}))}validationSet(e){return oe(this,void 0,void 0,(function*(){yield this.validation(e,this.update())}))}};ie([u(),c("auth"),c("write"),c("validationAdd"),ne(0,r()),se("design:type",Function),se("design:paramtypes",[a]),se("design:returntype",Promise)],Le.prototype,"add",null),ie([p(),c("auth"),c("read"),ne(0,r()),se("design:type",Function),se("design:paramtypes",[a]),se("design:returntype",Promise)],Le.prototype,"all",null),ie([y("/:id"),c("auth"),c("write"),ne(0,r()),se("design:type",Function),se("design:paramtypes",[a]),se("design:returntype",Promise)],Le.prototype,"del",null),ie([p("/:id"),c("auth"),c("read"),ne(0,r()),se("design:type",Function),se("design:paramtypes",[a]),se("design:returntype",Promise)],Le.prototype,"get",null),ie([_("/:id"),c("auth"),c("write"),c("validationSet"),ne(0,r()),se("design:type",Function),se("design:paramtypes",[a]),se("design:returntype",Promise)],Le.prototype,"set",null),ie([ne(0,r()),se("design:type",Function),se("design:paramtypes",[a]),se("design:returntype",Promise)],Le.prototype,"validationAdd",null),ie([ne(0,r()),se("design:type",Function),se("design:paramtypes",[a]),se("design:returntype",Promise)],Le.prototype,"validationSet",null),Le=ie([h(Be)],Le);let je=class extends Le{model(){return pe}create(){return{name:N.string().required(),description:N.string().empty(""),state:N.boolean().parse().required()}}update(){return{name:N.string().empty(),description:N.string().empty(),state:N.boolean().parse().empty()}}};je=ie([g("/groups"),h(Le)],je);let Ke=class extends Be{model(){return ge}all(e,t){return oe(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{groupId:t},include:[{model:me,required:!0}]},callback:e=>e.map((e=>e.route))})}))}set(e,t,r){return oe(this,void 0,void 0,(function*(){const i=yield pe.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield ge.destroy({where:{groupId:t}}),r){let e=0;for(let i=0;i<r.length;i++)e=yield me.count({where:{id:r[i]}}),e&&(yield ge.create({groupId:t,routeId:r[i]}))}return e.success("OK")}if(L(i))return e.notFound("Record not found");e.error("Internal Server Error")}))}};ie([p("/:id/routes"),c("auth"),c("read","groups"),ne(0,r()),ne(1,v("id")),se("design:type",Function),se("design:paramtypes",[a,String]),se("design:returntype",Promise)],Ke.prototype,"all",null),ie([_("/:id/routes"),c("auth"),c("write","groups"),c("validation",{routes:N.array(N.number().parse())}),ne(0,r()),ne(1,v("id")),ne(2,l("routes")),se("design:type",Function),se("design:paramtypes",[a,String,Array]),se("design:returntype",Promise)],Ke.prototype,"set",null),Ke=ie([g("/groups"),h(Be)],Ke);let Ce=class extends Be{model(){return fe}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","DESC"]]}})}))}};ie([p(),c("auth"),c("read"),ne(0,r()),ne(1,f("type")),ne(2,f("source")),se("design:type",Function),se("design:paramtypes",[a,String,String]),se("design:returntype",Promise)],Ce.prototype,"all",null),Ce=ie([g("/logs"),h(Be)],Ce);let He=class extends Ne{register(e,t,r){return oe(this,void 0,void 0,(function*(){yield k(de.API_SLEEP_REGISTRY);const{name:i,date:n,email:s,username:o,password:d,confirm:a}=t,u=o||s,c=O(d);if(yield ye.count({where:{[G.or]:[{email:s},{username:u}]}}).catch(this.error))return e.validation("Invalid email or username");if(c!=O(a))return e.error("Invalid password");const l=yield ye.create({name:i,email:s,username:u,password:c,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!l)return e.error("Internal Server Error");const p=yield he.create({token:yield this.getId(),userId:l.id,state:!0}).catch(this.error);if(!p)return l.destroy(),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 he.findOne({where:{token:t,state:!0},include:[{model:ye,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 he.findOne({where:{state:!0},include:[{model:ye,required:!0,where:{[G.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=b();return(yield he.count({where:{token:e}}))?this.getId():e}))}};ie([u(),c("validation",{name:N.string().required(),date:N.string().date().required(),email:N.string().email().required(),username:N.string().min(4).empty(),password:N.string().min(5).required(),confirm:N.string().min(5).required()}),ne(0,r()),ne(1,l()),ne(2,n()),se("design:type",Function),se("design:paramtypes",[a,Object,we]),se("design:returntype",Promise)],He.prototype,"register",null),ie([u("/confirm"),c("validation",{token:N.string().required()}),ne(0,r()),ne(1,l("token")),ne(2,n()),se("design:type",Function),se("design:paramtypes",[a,String,we]),se("design:returntype",Promise)],He.prototype,"confirm",null),ie([u("/send"),c("validation",{username:N.string().min(4).required()}),ne(0,r()),ne(1,l("username")),ne(2,n()),se("design:type",Function),se("design:paramtypes",[a,String,we]),se("design:returntype",Promise)],He.prototype,"send",null),He=ie([g("/register"),h(Ne)],He);let Me=class extends Le{model(){return me}create(){return{name:N.string().required(),description:N.string().empty(""),state:N.boolean().parse().required()}}update(){return{name:N.string().empty(),description:N.string().empty(),state:N.boolean().parse().empty()}}};Me=ie([g("/routes"),h(Le)],Me);let Ue=class extends Ne{setup(e){return oe(this,void 0,void 0,(function*(){if(0==(yield ye.count())){const e=j(),t=yield ye.create({name:"Admin",email:"admin@localhost",username:"admin",password:O("admin"+e),salt:e,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0}),r={description:"API CORE",state:!0},i=yield pe.create(Object.assign({name:"admin"},r));yield _e.create({userId:t.id,groupId:i.id});const n=["read","write"],s=["users","groups","routes"];yield K(s,(e=>oe(this,void 0,void 0,(function*(){yield K(n,(t=>oe(this,void 0,void 0,(function*(){const n=e+"."+t,s=yield me.create(Object.assign({name:n},r));yield ge.create({groupId:i.id,routeId:s.id})}))))}))));const o=[...n,"delete","list","rename","upload"];yield K(o,(e=>oe(this,void 0,void 0,(function*(){const t="files."+e,n=yield me.create(Object.assign({name:t},r));yield ge.create({groupId:i.id,routeId:n.id})}))));const d=yield me.create(Object.assign({name:"logs.read"},r));yield ge.create({groupId:i.id,routeId:d.id})}e.success("OK")}))}};ie([p(),ne(0,r()),se("design:type",Function),se("design:paramtypes",[a]),se("design:returntype",Promise)],Ue.prototype,"setup",null),Ue=ie([g("/setup"),h(Ne)],Ue);let Ge=class extends Be{model(){return ye}constructor(){super(),this.dir=de.API_HTTP_PUBLIC+"/avatar",de.API_HTTP_PUBLIC&&Y(de.API_HTTP_PUBLIC)&&!Y(this.dir)&&J(this.dir)}avatar(e,t,r){return oe(this,void 0,void 0,(function*(){if(t.length){const i=t[0].filename||"";if(i){const t=this.dir+"/"+r.avatar;if(Y(t)&&$(t).isFile()&&V(t),r.avatar=i,yield r.save().catch(this.error))return e.success("OK")}}e.success("Record not changed")}))}avatar_remove(e,t){return oe(this,void 0,void 0,(function*(){const r=this.dir+"/"+t.avatar;t.avatar="",(yield t.save().catch(this.error))&&Y(r)&&V(r),e.success("OK")}))}password(e,t,r,i){return oe(this,void 0,void 0,(function*(){var n;const s=yield this.scope("password").findOne({where:{id:i.id,state:!0}}).catch(this.error);return t+=null!==(n=null==s?void 0:s.salt)&&void 0!==n?n:"",s&&s.password==O(t)?(s.salt=j(),s.password=O(r+s.salt),(yield s.save().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){return oe(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().catch(this.error),e.success("OK");e.notFound("Record not found")}))}token_renew(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){const t=yield this.token_new();return i.token=r.hash.encrypt(t),yield i.save().catch(this.error),e.json({token:t})}e.notFound("Record not found")}))}token_new(){return oe(this,void 0,void 0,(function*(){const e=b();return(yield this.model().count({where:{token:e}}))?this.token_new():e}))}add(e,t){return oe(this,void 0,void 0,(function*(){const r=j();yield this._add({ctx:e,body:{password:O(t+r),salt: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*(){t&&t.id.toString()!=r?yield this._del({ctx:e}):e.error("Internal Server Error")}))}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*(){const r=j();yield this._set({ctx:e,body:t?{password:O(t+r),salt:r}:{}})}))}};ie([u("/avatar"),c("auth"),c("upload",(e=>({count:1,field:"file",path:e.controller.dir,types:["image/bmp","image/jpeg","image/png"],size:32}))),ne(0,r()),ne(1,I()),ne(2,ke()),se("design:type",Function),se("design:paramtypes",[a,Array,ye]),se("design:returntype",Promise)],Ge.prototype,"avatar",null),ie([p("/avatar/remove"),c("auth"),ne(0,r()),ne(1,ke()),se("design:type",Function),se("design:paramtypes",[a,ye]),se("design:returntype",Promise)],Ge.prototype,"avatar_remove",null),ie([u("/password"),c("auth"),c("validation",{oldPassword:N.string().min(5).required(),newPassword:N.string().min(5).required()}),ne(0,r()),ne(1,l("oldPassword")),ne(2,l("newPassword")),ne(3,ke()),se("design:type",Function),se("design:paramtypes",[a,String,String,ye]),se("design:returntype",Promise)],Ge.prototype,"password",null),ie([p("/token"),c("auth"),ne(0,r()),ne(1,ke()),ne(2,n()),se("design:type",Function),se("design:paramtypes",[a,ye,we]),se("design:returntype",Promise)],Ge.prototype,"token",null),ie([p("/token/:id"),c("auth"),c("write"),ne(0,r()),ne(1,v("id")),ne(2,n()),se("design:type",Function),se("design:paramtypes",[a,String,we]),se("design:returntype",Promise)],Ge.prototype,"token_get",null),ie([p("/token/remove/:id"),c("auth"),c("write"),ne(0,r()),ne(1,v("id")),se("design:type",Function),se("design:paramtypes",[a,String]),se("design:returntype",Promise)],Ge.prototype,"token_remove",null),ie([p("/token/renew/:id"),c("auth"),c("write"),ne(0,r()),ne(1,v("id")),ne(2,n()),se("design:type",Function),se("design:paramtypes",[a,String,we]),se("design:returntype",Promise)],Ge.prototype,"token_renew",null),ie([u(),c("auth"),c("write"),c("validation",{name:N.string().required(),email:N.string().email().required(),username:N.string().min(4).required(),password:N.string().min(5).required(),description:N.string().empty(""),state:N.boolean().parse().required()}),ne(0,r()),ne(1,l("password")),se("design:type",Function),se("design:paramtypes",[a,String]),se("design:returntype",Promise)],Ge.prototype,"add",null),ie([p(),c("auth"),c("read"),ne(0,r()),se("design:type",Function),se("design:paramtypes",[a]),se("design:returntype",Promise)],Ge.prototype,"all",null),ie([y("/:id"),c("auth"),c("write"),ne(0,r()),ne(1,ke()),ne(2,v("id")),se("design:type",Function),se("design:paramtypes",[a,ye,String]),se("design:returntype",Promise)],Ge.prototype,"del",null),ie([p("/:id"),c("auth"),c("read"),ne(0,r()),se("design:type",Function),se("design:paramtypes",[a]),se("design:returntype",Promise)],Ge.prototype,"get",null),ie([_("/:id"),c("auth"),c("write"),c("validation",{name:N.string().empty(),email:N.string().email().empty(),username:N.string().min(4).empty(),password:N.string().min(5).empty().filter(""),description:N.string().empty(),state:N.boolean().parse().empty()}),ne(0,r()),ne(1,l("password")),se("design:type",Function),se("design:paramtypes",[a,String]),se("design:returntype",Promise)],Ge.prototype,"set",null),Ge=ie([g("/users"),h(Be),se("design:paramtypes",[])],Ge);let ze=class extends Be{model(){return _e}all(e,t){return oe(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{userId:t},include:[{model:pe,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,r){return oe(this,void 0,void 0,(function*(){const i=yield ye.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){if(yield _e.destroy({where:{userId:i.id}}),r){let e=0;for(let t=0;t<r.length;t++)e=yield pe.count({where:{id:r[t]}}),e&&(yield _e.create({userId:i.id,groupId:r[t]}))}return e.success("OK")}if(L(i))return e.notFound("Record not found");e.error("Internal Server Error")}))}};ie([p("/:id/groups"),c("auth"),c("read","users"),ne(0,r()),ne(1,v("id")),se("design:type",Function),se("design:paramtypes",[a,String]),se("design:returntype",Promise)],ze.prototype,"all",null),ie([_("/:id/groups"),c("auth"),c("write","users"),c("validation",{groups:N.array(N.number().parse())}),ne(0,r()),ne(1,v("id")),ne(2,l("groups")),se("design:type",Function),se("design:paramtypes",[a,String,Array]),se("design:returntype",Promise)],ze.prototype,"set",null),ze=ie([g("/users"),h(Be)],ze);export{we as Application,ce as Auth,xe as AuthController,Re as Config,ve as Configs,Ne as ControllerBase,Le as CrudController,ae as Database,de as Env,Fe as FilesController,le as Forgot,qe as ForgotController,pe as Group,ge as GroupRoute,je as GroupsController,Ke as GroupsRoutesController,fe as Log,Pe as Logs,Ce as LogsController,Be as ModelController,De as Permission,he as Register,He as RegisterController,be as ReqAuth,ke as ReqUser,me as Route,Me as RoutesController,Ie as Session,Ue as SetupController,Te as Token,ye as User,_e as UserGroup,Ge as UsersController,ze as UsersGroupsController,Ee as crt,Oe as key,ue as sequelize};
7
+ import{Application as e,parameterFactory as t,Ctx as r,Headers as i,App as n,Session as s,Argument as o,Upload as d,Context as a,Post as u,Middleware as c,Body as l,Get as p,Controller as g,Extends as h,Status as m,Delete as y,Put as _,Params as v,Query as f,Files as I}from"@andrewcaires/express";import{LogColor as P,Log as A,Hash as E,sha256 as O}from"@andrewcaires/node";import{toBool as S,parseMs as T,noop as w,loop as R,uuidv4 as k,sleep as b,EventEmitter as D,Validation as N,isDef as x,uniqueID as F,isString as q,isArray as B,isNull as L,forEachSeries as j}from"@andrewcaires/utils.js";import K from"ws";import{Sequelize as C,DataTypes as H,Model as M,Op as U}from"sequelize";import{config as G}from"dotenv";import{existsSync as z,readFileSync as Y,statSync as X,readdirSync as W,mkdirSync as Z,lstatSync as J,rmSync as $}from"fs";import{Store as V}from"express-session";import{verify as Q,sign as ee}from"jsonwebtoken";import{join as te}from"path";function re(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o}function ie(e,t){return function(r,i){t(r,i,e)}}function ne(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function se(e,t,r,i){return new(r||(r=Promise))((function(n,s){function o(e){try{a(i.next(e))}catch(e){s(e)}}function d(e){try{a(i.throw(e))}catch(e){s(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(o,d)}a((i=i.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,G();class oe{static getBool(e,t){return S(oe.getString(e,t.toString()))}static getInt(e,t){return parseInt(oe.getString(e,t.toString()))}static getMs(e,t){return T(oe.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}oe.API_CONSOLE_ERROR=oe.getBool("API_CONSOLE_ERROR",!1),oe.API_DEFAULT_PATH=oe.getString("API_DEFAULT_PATH","/api"),oe.API_DB_DATABASE=oe.getString("API_DB_DATABASE",""),oe.API_DB_HOST=oe.getString("API_DB_HOST","127.0.0.1"),oe.API_DB_PASSWORD=oe.getString("API_DB_PASSWORD",""),oe.API_DB_PORT=oe.getInt("API_DB_PORT",3306),oe.API_DB_TYPE=oe.getString("API_DB_TYPE",""),oe.API_DB_USERNAME=oe.getString("API_DB_USERNAME","root"),oe.API_DB_LOG=oe.getBool("API_DB_LOG",!1),oe.API_DB_PREFIX=oe.getString("API_DB_PREFIX",""),oe.API_DB_TIMEZONE=oe.getString("API_DB_TIMEZONE","+00:00"),oe.API_HTTP_CRT=oe.getString("API_HTTP_CRT",""),oe.API_HTTP_KEY=oe.getString("API_HTTP_KEY",""),oe.API_HTTP_PORT=oe.getInt("API_HTTP_PORT",3e3),oe.API_HTTP_PUBLIC=oe.getString("API_HTTP_PUBLIC",""),oe.API_HTTP_CROSS=oe.getBool("API_HTTP_CROSS",!1),oe.API_HTTP_HYBRID=oe.getBool("API_HTTP_HYBRID",!1),oe.API_HTTP_REDIRECT=oe.getString("API_HTTP_REDIRECT",""),oe.API_KEY_HASH=oe.getString("API_KEY_HASH",""),oe.API_KEY_HEADER=oe.getString("API_KEY_HEADER","api_key"),oe.API_NOTFOUND_REDIRECT=oe.getString("API_NOTFOUND_REDIRECT",""),oe.API_SLEEP_AUTH=oe.getMs("API_SLEEP_AUTH","2s"),oe.API_SLEEP_FORGOT=oe.getMs("API_SLEEP_FORGOT","5s"),oe.API_SLEEP_REGISTRY=oe.getMs("API_SLEEP_REGISTRY","5s"),oe.API_SESSION_NAME=oe.getString("API_SESSION_NAME","session.id"),oe.API_SESSION_LIFETIME=oe.getMs("API_SESSION_LIFETIME","1d"),oe.API_SESSION_SECRET=oe.getString("API_SESSION_SECRET","yoursecret"),oe.API_TOKEN_CRT=oe.getString("API_TOKEN_CRT",""),oe.API_TOKEN_KEY=oe.getString("API_TOKEN_KEY",""),oe.API_TOKEN_FORGOT=oe.getMs("API_TOKEN_LIFETIME","1d"),oe.API_TOKEN_HEADER=oe.getString("API_TOKEN_HEADER","authorization"),oe.API_TOKEN_LIFETIME=oe.getMs("API_TOKEN_LIFETIME","1d"),oe.API_TOKEN_RENEW=oe.getMs("API_TOKEN_RENEW","1d"),oe.API_UPLOAD_COUNT=oe.getInt("API_UPLOAD_COUNT",1),oe.API_UPLOAD_FIELD=oe.getString("API_UPLOAD_FIELD","upload"),oe.API_UPLOAD_SIZE=oe.getInt("API_UPLOAD_SIZE",2),oe.API_UPLOAD_TEMP=oe.getString("API_UPLOAD_TEMP","./temp"),oe.API_WEBSOCKET_START=oe.getBool("API_WEBSOCKET_START",!1);class de{static connect(e){const t="connect_"+oe.API_DB_TYPE.toLowerCase();if(t in de)return de[t](e);throw new Error("No database is connected to this API")}static connect_mariadb(e){return new C(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mariadb",logging:oe.API_DB_LOG,define:{timestamps:!1},timezone:oe.API_DB_TIMEZONE})}static connect_memory(){return new C("sqlite::memory:",{logging:oe.API_DB_LOG,define:{timestamps:!1},timezone:oe.API_DB_TIMEZONE})}static connect_mysql(e){return new C(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mysql",logging:oe.API_DB_LOG,define:{timestamps:!1},timezone:oe.API_DB_TIMEZONE})}static connect_postgres(e){return new C(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"postgres",logging:oe.API_DB_LOG,define:{timestamps:!1},timezone:oe.API_DB_TIMEZONE})}static connect_sqlite(e){return new C({dialect:"sqlite",storage:e.database,logging:oe.API_DB_LOG,define:{timestamps:!1},timezone:oe.API_DB_TIMEZONE})}}const ae=de.connect({database:oe.API_DB_DATABASE,username:oe.API_DB_USERNAME,password:oe.API_DB_PASSWORD,hostname:oe.API_DB_HOST,hostport:oe.API_DB_PORT});class ue extends M{}ue.init({secret:H.STRING,logout:H.DATE,useragent:H.STRING},{sequelize:ae,modelName:oe.API_DB_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class ce extends M{}ce.init({token:H.STRING,timestamp:H.BIGINT,state:H.BOOLEAN},{sequelize:ae,modelName:oe.API_DB_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class le extends M{}le.init({name:H.STRING,description:H.TEXT,state:H.BOOLEAN},{sequelize:ae,modelName:oe.API_DB_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class pe extends M{}pe.init({},{sequelize:ae,modelName:oe.API_DB_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),pe.removeAttribute("id");class ge extends M{}ge.init({token:H.STRING,state:H.BOOLEAN},{sequelize:ae,modelName:oe.API_DB_PREFIX+"register",timestamps:!0,createdAt:"created",updatedAt:"updated"});class he extends M{}he.init({name:H.STRING,description:H.TEXT,state:H.BOOLEAN},{sequelize:ae,modelName:oe.API_DB_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class me extends M{}me.init({name:H.STRING,email:H.STRING,username:H.STRING,password:H.STRING,salt:H.STRING,token:H.STRING,avatar:H.STRING,date:H.DATEONLY,description:H.TEXT,state:H.BOOLEAN},{sequelize:ae,modelName:oe.API_DB_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated",defaultScope:{attributes:{exclude:["password","salt","token"]}},scopes:{password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}});class ye extends M{}ye.init({},{sequelize:ae,modelName:oe.API_DB_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),ye.removeAttribute("id");class _e extends M{}_e.init({key:H.STRING,value:H.STRING},{sequelize:ae,modelName:oe.API_DB_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),_e.removeAttribute("id");class ve extends M{}ve.init({type:H.STRING,source:H.STRING,message:H.TEXT},{sequelize:ae,modelName:oe.API_DB_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class fe extends M{}fe.init({session:H.STRING,json:H.TEXT,expired:H.BIGINT},{sequelize:ae,modelName:oe.API_DB_PREFIX+"session",timestamps:!0,createdAt:"created",updatedAt:"updated"}),fe.removeAttribute("id"),me.hasMany(ue),ue.belongsTo(me),me.hasMany(ce),ce.belongsTo(me),me.hasMany(ge),ge.belongsTo(me),le.hasMany(pe),pe.belongsTo(le),he.hasMany(pe),pe.belongsTo(he),me.hasMany(ye),ye.belongsTo(me),le.hasMany(ye),ye.belongsTo(le);class Ie{static write(e,t,r){return se(this,void 0,void 0,(function*(){yield Ie.writeRaw(P.White,"",e,t,r)}))}static error(e,t,r){return se(this,void 0,void 0,(function*(){yield Ie.writeRaw(P.Red,"error",e,t,r)}))}static info(e,t,r){return se(this,void 0,void 0,(function*(){yield Ie.writeRaw(P.Cyan,"info",e,t,r)}))}static success(e,t,r){return se(this,void 0,void 0,(function*(){yield Ie.writeRaw(P.Green,"success",e,t,r)}))}static warning(e,t,r){return se(this,void 0,void 0,(function*(){yield Ie.writeRaw(P.Yellow,"warning",e,t,r)}))}static writeRaw(e,t,r,i,n){return se(this,void 0,void 0,(function*(){n&&A.console(e,t,r),ae&&(yield ve.create({type:t,source:i,message:r}).catch((()=>null)))}))}}const Pe=e=>z(e)?Y(e):void 0,Ae={http:Pe(oe.API_HTTP_CRT),token:Pe(oe.API_TOKEN_CRT)},Ee={http:Pe(oe.API_HTTP_KEY),token:Pe(oe.API_TOKEN_KEY)};class Oe extends V{constructor(){super(),this.all=e=>se(this,void 0,void 0,(function*(){e=e||w;const t=yield fe.findAll({attributes:["session"],where:{expired:{[U.gte]:Date.now()}}}).catch((t=>(e(t),null)));t&&e(null,t.map((e=>e.session))),e()})),this.clear=e=>se(this,void 0,void 0,(function*(){yield fe.destroy().catch(w),e&&e()})),this.destroy=(e,t)=>se(this,void 0,void 0,(function*(){yield fe.destroy({where:{session:e}}).catch(w),t&&t()})),this.expired=()=>se(this,void 0,void 0,(function*(){yield fe.destroy({where:{expired:{[U.lt]:Date.now()}}}).catch(w)})),this.get=(e,t)=>se(this,void 0,void 0,(function*(){t=t||w;const r=yield fe.findOne({where:{session:e,expired:{[U.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(w),void t(null)}t(null,e)}else t(null)})),this.length=e=>se(this,void 0,void 0,(function*(){e&&e(null,(yield fe.count().catch(w))||0)})),this.set=(e,t,r)=>se(this,void 0,void 0,(function*(){r=r||w;const i=Date.now()+oe.API_SESSION_LIFETIME,n=JSON.stringify(t),[s,o]=(yield fe.findOrCreate({where:{session:e},defaults:{session:e,json:n,expired:i}}).catch(w))||[];s&&(o||(s.json=n,s.expired=i,yield s.save().catch(w))),r()})),this.loop=R(this.expired,3e4),this.loop.start()}}class Se{static create(e){return se(this,void 0,void 0,(function*(){if(!Ee.token)return{error:"Key not found"};const{id:t}=e,r=k(),i=yield ue.create({secret:r,userId:t}).catch(Se.error);if(!i)return{error:"Internal Server Error"};return{auth:i,token:ee({id:t,secret:r},Ee.token,Se.options())}}))}static destroy(e){return se(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){Ie.error(e.message,"api.token",oe.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:oe.API_TOKEN_LIFETIME+"ms"}}static renew(e){return se(this,void 0,void 0,(function*(){if(!Ee.token)return{error:"Key not found"};const{error:t,decode:r}=Se.verify(e,oe.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield me.findOne({where:{id:e,state:!0}}).catch(Se.error);if(r){const i=yield ue.findOne({where:{secret:t,userId:r.id}}).catch(Se.error);if(i&&!i.logout){i.secret=k(),yield i.save().catch(Se.error);return{auth:i,token:ee({id:e,secret:i.secret},Ee.token,Se.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e,t,r){return se(this,void 0,void 0,(function*(){if(e){t=r.hash.encrypt(e);const i=yield me.findOne({where:{token:t,state:!0}}).catch(Se.error);if(i){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield ue.findOrCreate({where:{secret:t,userId:i.id},defaults:{secret:t,userId:i.id}}).catch(Se.error))||[];if(r)return{auth:r,user:i}}return{error:"Access denied"}}const{error:i,decode:n}=Se.verify(t);if(i)return{error:i};if(n){const{id:e,secret:t}=n;if(e&&t){const r=yield me.findOne({where:{id:e,state:!0}}).catch(Se.error);if(r){const e=yield ue.findOne({where:{secret:t,userId:r.id}}).catch(Se.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!Ae.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:Q(e,Ae.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class Te extends e{constructor(e){super(e,{cert:Ae.http,cross:oe.API_HTTP_CROSS,hybrid:oe.API_HTTP_HYBRID,key:Ee.http,notfound:oe.API_NOTFOUND_REDIRECT,path:oe.API_DEFAULT_PATH,port:oe.API_HTTP_PORT,public:oe.API_HTTP_PUBLIC,redirect:oe.API_HTTP_REDIRECT,session:{store:new Oe,name:oe.API_SESSION_NAME,secret:oe.API_SESSION_SECRET,cookie:{maxAge:oe.API_SESSION_LIFETIME},genid:k}}),this.hash=new E(oe.API_KEY_HASH)}error(e,t){Ie.error(e.message,t,oe.API_CONSOLE_ERROR)}log(e,t){Ie.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return se(this,void 0,void 0,(function*(){yield ae.sync(),yield e.listen.call(this),oe.API_WEBSOCKET_START&&this.server&&(this._webSocket=new K.Server({server:this.server,verifyClient:(e,t)=>t(oe.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>se(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=>se(this,void 0,void 0,(function*(){if(i)try{const s=JSON.parse(n);this.emit("ws.message"+r,{data:s,message:n,req:t,user:i,ws:e})}catch(s){this.emit("ws.message"+r,{message:n,req:t,user:i,ws:e})}else{const{user:s}=yield Se.user("",n.toString(),this);s&&(i=s,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 b(2e3),i||e.close()})))))}))}websocket(){return this._webSocket}}class we{static all(){return se(this,void 0,void 0,(function*(){const e=yield _e.findAll().catch(we.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e){return se(this,void 0,void 0,(function*(){return((yield _e.destroy({where:{key:e}}).catch(we.error))||0)>0}))}static error(e){Ie.error(e.message,"api.config",oe.API_CONSOLE_ERROR)}static get(e){return se(this,arguments,void 0,(function*(e,t=""){const[r]=(yield _e.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(we.error))||[];return r?r.value:t}))}static set(e,t){return se(this,void 0,void 0,(function*(){const[r]=(yield _e.findOrCreate({where:{key:e}}).catch(we.error))||[];r&&(r.value=t,yield r.save().catch(we.error))}))}}const Re=t((({ctx:e})=>e.req.auth)),ke=t((({ctx:e})=>e.req.user));class be{static all(e,t){return se(this,void 0,void 0,(function*(){return yield he.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:pe,required:!0,include:[{model:le,required:!0,where:{state:!0},include:[{model:ye,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{Ie.error(e.message,"api.permission",oe.API_CONSOLE_ERROR)}))}))}static get(e){return se(this,void 0,void 0,(function*(){const t=yield be.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return se(this,void 0,void 0,(function*(){const r=yield be.all(e,{name:t});return!!r&&r.length>0}))}}class De extends D{auth(e,t,r,i,n){return se(this,void 0,void 0,(function*(){const{auth:s,error:o,user:d}=yield Se.user(t,r,n);return o?e.error(o):s&&d?s.useragent&&s.useragent!=i?e.error("Invalid token"):(e.req.auth=s,e.req.user=d,void e.next()):e.error("Internal Server Error")}))}session(e,t,r){return se(this,void 0,void 0,(function*(){r.auth&&r.user&&(r.useragent?r.useragent!=t&&r.regenerate(w):(r.useragent=t,r.save(w))),e.next()}))}error(e){Ie.error(e.message,"api.controller",oe.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r){return se(this,void 0,void 0,(function*(){return r?(yield be.is(r,t))?e.next():void e.unauthorized("Access denied"):e.unauthorized("Access denied")}))}read(e,t,r){return se(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".read",r)}))}upload(e,t){t.path||(t.path=oe.API_UPLOAD_TEMP),t.size||(t.size=oe.API_UPLOAD_SIZE),t.field||(t.field=oe.API_UPLOAD_FIELD),d.middleware(e,t)}validation(e,t){return se(this,void 0,void 0,(function*(){const{error:r,value:i}=yield N.object(t).parse().validateAsync(e.req.body);if(r)return e.validation(r);e.req.body=i,e.next()}))}write(e,t,r){return se(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".write",r)}))}}re([ie(0,r()),ie(1,i(oe.API_KEY_HEADER)),ie(2,i(oe.API_TOKEN_HEADER)),ie(3,i("user-agent")),ie(4,n()),ne("design:type",Function),ne("design:paramtypes",[a,String,String,String,Te]),ne("design:returntype",Promise)],De.prototype,"auth",null),re([ie(0,r()),ie(1,i("user-agent")),ie(2,s()),ne("design:type",Function),ne("design:paramtypes",[a,String,Object]),ne("design:returntype",Promise)],De.prototype,"session",null),re([ie(0,r()),ie(1,o()),ie(2,ke()),ne("design:type",Function),ne("design:paramtypes",[a,String,me]),ne("design:returntype",Promise)],De.prototype,"permission",null),re([ie(0,r()),ie(1,o()),ie(2,ke()),ne("design:type",Function),ne("design:paramtypes",[a,String,me]),ne("design:returntype",Promise)],De.prototype,"read",null),re([ie(0,r()),ie(1,o()),ne("design:type",Function),ne("design:paramtypes",[a,Object]),ne("design:returntype",void 0)],De.prototype,"upload",null),re([ie(0,r()),ie(1,o()),ne("design:type",Function),ne("design:paramtypes",[a,Object]),ne("design:returntype",Promise)],De.prototype,"validation",null),re([ie(0,r()),ie(1,o()),ie(2,ke()),ne("design:type",Function),ne("design:paramtypes",[a,String,me]),ne("design:returntype",Promise)],De.prototype,"write",null);let Ne=class extends De{login(e,t,r,i,n){return se(this,void 0,void 0,(function*(){var s;yield b(oe.API_SLEEP_AUTH);const o=yield me.scope("password").findOne({where:{[U.or]:[{email:r},{username:r}]}}).catch(this.error);if(i+=null!==(s=null==o?void 0:o.salt)&&void 0!==s?s:"",!o||o.password!=O(i))return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const d=yield ge.findOne({where:{state:!0,userId:o.id}}).catch(this.error);if(d)return e.error("Activation required"),n.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"),n.emit("auth.failure",{ctx:e,user:o}),void this.emit("auth.failure",{ctx:e,user:o});const{auth:a,error:u,token:c}=yield Se.create(o);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:o}),void this.emit("auth.login",{auth:a,ctx:e,user:o})):(e.error("Internal Server Error"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,r,i){return se(this,void 0,void 0,(function*(){if(yield Se.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 se(this,void 0,void 0,(function*(){const{auth:n,error:s,token:o}=yield Se.renew(r);return s?e.error(s):n?(n.useragent=t,yield n.save().catch(this.error),e.json({token:o}),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 se(this,void 0,void 0,(function*(){const r=yield be.all(t);if(!r)return e.error("Internal Server Error");e.json(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))}))}))}};re([u("/login"),c("validation",{username:N.string().min(3).required(),password:N.string().min(5).required()}),ie(0,r()),ie(1,i("user-agent")),ie(2,l("username")),ie(3,l("password")),ie(4,n()),ne("design:type",Function),ne("design:paramtypes",[a,String,String,String,Te]),ne("design:returntype",Promise)],Ne.prototype,"login",null),re([p("/logout"),c("auth"),ie(0,r()),ie(1,Re()),ie(2,ke()),ie(3,n()),ne("design:type",Function),ne("design:paramtypes",[a,ue,me,Te]),ne("design:returntype",Promise)],Ne.prototype,"logout",null),re([u("/renew"),c("validation",{token:N.string().required()}),ie(0,r()),ie(1,i("user-agent")),ie(2,l("token")),ie(3,n()),ne("design:type",Function),ne("design:paramtypes",[a,String,String,Te]),ne("design:returntype",Promise)],Ne.prototype,"renew",null),re([p(),c("auth"),ie(0,r()),ie(1,ke()),ne("design:type",Function),ne("design:paramtypes",[a,me]),ne("design:returntype",Promise)],Ne.prototype,"user",null),Ne=re([g("/auth"),h(De)],Ne);let xe=class extends De{directory(){return oe.API_HTTP_PUBLIC||"./"}files(e){return se(this,void 0,void 0,(function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const r=te(this.directory(),t);if(!z(r)||!X(r).isDirectory())return e.notFound("Path not Found");let i=[];return i=W(r),i=i.map((e=>this.info(te(r,e)))),i=i.filter(x),Object.assign(Object.assign({},this.info(r)),{files:i})}))}access(e,t,r){return se(this,void 0,void 0,(function*(){yield this.permission(e,this.name()+"."+t,r)}))}info(e){if(!z(e))return null;const t=X(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"}};re([p("/path/?*"),c("auth"),c("access","list"),ie(0,r()),ne("design:type",Function),ne("design:paramtypes",[a]),ne("design:returntype",Promise)],xe.prototype,"files",null),re([ie(0,r()),ie(1,o()),ie(2,ke()),ne("design:type",Function),ne("design:paramtypes",[a,String,me]),ne("design:returntype",Promise)],xe.prototype,"access",null),xe=re([g("/files"),h(De)],xe);let Fe=class extends De{check(e,t){return se(this,void 0,void 0,(function*(){const r=yield this.find(t);if(!r||!r.user)return e.notFound("User not found");r.token=F(),yield r.save(),e.json({token:r.token})}))}forgot(e,t,r){return se(this,void 0,void 0,(function*(){yield b(oe.API_SLEEP_FORGOT);const i=t,n=yield me.findOne({where:{[U.or]:[{email:i},{username:t}]}}).catch(this.error);if(!n)return e.notFound("User not found");const s=F(),o=Date.now()+6e4*oe.API_TOKEN_FORGOT,d=yield ce.create({token:s,timestamp:o,state:!0,userId: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 se(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=O(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 se(this,void 0,void 0,(function*(){return yield ce.findOne({where:{token:e,state:!0},include:[{model:me,required:!0}]}).catch(this.error)}))}};re([p("/check"),c("validation",{token:N.string().required()}),ie(0,r()),ie(1,l("token")),ne("design:type",Function),ne("design:paramtypes",[a,String]),ne("design:returntype",Promise)],Fe.prototype,"check",null),re([u(),c("validation",{username:N.string().min(4).required()}),ie(0,r()),ie(1,l("username")),ie(2,n()),ne("design:type",Function),ne("design:paramtypes",[a,String,Te]),ne("design:returntype",Promise)],Fe.prototype,"forgot",null),re([u("/reset"),c("validation",{token:N.string().required(),password:N.string().min(5).required()}),ie(0,r()),ie(1,l("token")),ie(2,l("password")),ie(3,n()),ne("design:type",Function),ne("design:paramtypes",[a,String,String,Te]),ne("design:returntype",Promise)],Fe.prototype,"reset",null),Fe=re([g("/forgot"),h(De)],Fe);let qe=class extends De{constructor(){super(...arguments),this._columns=[]}_add(e){return se(this,arguments,void 0,(function*({ctx:e,options:t,body:r}){const i=yield this.model().create(Object.assign(Object.assign({},e.req.body),r||{}),t||{}).catch(this.error);if(i){const t=this.key();return e.prepare(m.OK,{[t]:i.getDataValue(t)}),i}e.error("Internal Server Error")}))}_all(e){return se(this,arguments,void 0,(function*({ctx:e,options:t,callback:r,scope:i}){var n,s,o;const d=this.scope(i),a=Object.assign({},t||{});a.where=Object.assign({},a.where||{});const u=e.req.query.limit,c=q(u)?parseInt(u):10;a.limit=c>0?c:void 0;const l=e.req.query.offset;if(q(l)){const e=l?parseInt(l):0;a.offset=e>0?e:void 0}const p=[],g=this.columns(),h=e=>g.indexOf(e)>=0,y=null===(n=e.req.query.asc)||void 0===n?void 0:n.toString();y&&y.length&&p.push(...y.split(",").filter(h).map((e=>[e,"ASC"])));const _=null===(s=e.req.query.desc)||void 0===s?void 0:s.toString();_&&_.length&&p.push(..._.split(",").filter(h).map((e=>[e,"DESC"]))),p.length&&(a.order=p);const v=[],f=null===(o=e.req.query.search)||void 0===o?void 0:o.toString();(B(a.attributes)?a.attributes:g).filter(q).forEach((t=>{var r;if(f&&f.length&&v.push({[t]:{[U.like]:`%${f}%`}}),"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&&v.push({[t]:{[U.like]:`%${i}%`}})}})),v.length&&(a.where=Object.assign(Object.assign({},a.where),{[U.or]:[...v]}));const I=(yield d.count(Object.assign(Object.assign({},a),{col:g[0]})).catch(this.error))||0,P=yield d.findAll(a).catch(this.error);return P?(e.prepare(m.OK,{count:I,records:r?yield r(P):P}),[P,I]):(e.error("Internal Server Error"),[])}))}columns(){return 0==this._columns.length&&(this._columns=Object.keys(this.model().getAttributes())),this._columns}_del(e){return se(this,arguments,void 0,(function*({ctx:e,options:t}){const r=this.key(),{[r]:i}=e.req.params;if(!i)return e.error("Internal Server Error"),0;const n=yield this.model().destroy(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[r]:i})})).catch(this.error);return n?(e.success("OK"),n):(e.notFound("Record not found"),0)}))}error(e){e.sql?Ie.error(e.message+"\n"+e.sql,"api.controller.sql",oe.API_CONSOLE_ERROR):super.error(e)}_get(e){return se(this,arguments,void 0,(function*({ctx:e,options:t,callback:r,scope:i}){const n=this.key(),{[n]:s}=e.req.params,o=yield this.scope(i).findOne(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[n]:s})})).catch(this.error);return o?(e.prepare(m.OK,r?yield r(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 se(this,arguments,void 0,(function*({ctx:e,options:t,body:r}){const i=this.key(),{[i]:n}=e.req.params,[s]=(yield this.model().update(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[i]:n})})).catch(this.error))||[];return s?(e.success("OK"),!0):(e.success("Record not changed"),!1)}))}};qe=re([h(De)],qe);let Be=class extends qe{add(e){return se(this,void 0,void 0,(function*(){yield this._add({ctx:e})}))}all(e){return se(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}create(){return{}}del(e){return se(this,void 0,void 0,(function*(){yield this._del({ctx:e})}))}get(e){return se(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e){return se(this,void 0,void 0,(function*(){yield this._set({ctx:e})}))}update(){return{}}validationAdd(e){return se(this,void 0,void 0,(function*(){yield this.validation(e,this.create())}))}validationSet(e){return se(this,void 0,void 0,(function*(){yield this.validation(e,this.update())}))}};re([u(),c("auth"),c("write"),c("validationAdd"),ie(0,r()),ne("design:type",Function),ne("design:paramtypes",[a]),ne("design:returntype",Promise)],Be.prototype,"add",null),re([p(),c("auth"),c("read"),ie(0,r()),ne("design:type",Function),ne("design:paramtypes",[a]),ne("design:returntype",Promise)],Be.prototype,"all",null),re([y("/:id"),c("auth"),c("write"),ie(0,r()),ne("design:type",Function),ne("design:paramtypes",[a]),ne("design:returntype",Promise)],Be.prototype,"del",null),re([p("/:id"),c("auth"),c("read"),ie(0,r()),ne("design:type",Function),ne("design:paramtypes",[a]),ne("design:returntype",Promise)],Be.prototype,"get",null),re([_("/:id"),c("auth"),c("write"),c("validationSet"),ie(0,r()),ne("design:type",Function),ne("design:paramtypes",[a]),ne("design:returntype",Promise)],Be.prototype,"set",null),re([ie(0,r()),ne("design:type",Function),ne("design:paramtypes",[a]),ne("design:returntype",Promise)],Be.prototype,"validationAdd",null),re([ie(0,r()),ne("design:type",Function),ne("design:paramtypes",[a]),ne("design:returntype",Promise)],Be.prototype,"validationSet",null),Be=re([h(qe)],Be);let Le=class extends Be{model(){return le}create(){return{name:N.string().required(),description:N.string().empty(""),state:N.boolean().parse().required()}}update(){return{name:N.string().empty(),description:N.string().empty(),state:N.boolean().parse().empty()}}};Le=re([g("/groups"),h(Be)],Le);let je=class extends qe{model(){return pe}all(e,t){return se(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{groupId:t},include:[{model:he,required:!0}]},callback:e=>e.map((e=>e.route))})}))}set(e,t,r){return se(this,void 0,void 0,(function*(){const i=yield le.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield pe.destroy({where:{groupId:t}}),r){let e=0;for(let i=0;i<r.length;i++)e=yield he.count({where:{id:r[i]}}),e&&(yield pe.create({groupId:t,routeId:r[i]}))}return e.success("OK")}if(L(i))return e.notFound("Record not found");e.error("Internal Server Error")}))}};re([p("/:id/routes"),c("auth"),c("read","groups"),ie(0,r()),ie(1,v("id")),ne("design:type",Function),ne("design:paramtypes",[a,String]),ne("design:returntype",Promise)],je.prototype,"all",null),re([_("/:id/routes"),c("auth"),c("write","groups"),c("validation",{routes:N.array(N.number().parse())}),ie(0,r()),ie(1,v("id")),ie(2,l("routes")),ne("design:type",Function),ne("design:paramtypes",[a,String,Array]),ne("design:returntype",Promise)],je.prototype,"set",null),je=re([g("/groups"),h(qe)],je);let Ke=class extends qe{model(){return ve}all(e,t,r){return se(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","DESC"]]}})}))}};re([p(),c("auth"),c("read"),ie(0,r()),ie(1,f("type")),ie(2,f("source")),ne("design:type",Function),ne("design:paramtypes",[a,String,String]),ne("design:returntype",Promise)],Ke.prototype,"all",null),Ke=re([g("/logs"),h(qe)],Ke);let Ce=class extends De{register(e,t,r){return se(this,void 0,void 0,(function*(){yield b(oe.API_SLEEP_REGISTRY);const{name:i,date:n,email:s,username:o,password:d,confirm:a}=t,u=o||s,c=O(d);if(yield me.count({where:{[U.or]:[{email:s},{username:u}]}}).catch(this.error))return e.validation("Invalid email or username");if(c!=O(a))return e.error("Invalid password");const l=yield me.create({name:i,email:s,username:u,password:c,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!l)return e.error("Internal Server Error");const p=yield ge.create({token:yield this.getId(),userId:l.id,state:!0}).catch(this.error);if(!p)return l.destroy(),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 se(this,void 0,void 0,(function*(){const i=yield ge.findOne({where:{token:t,state:!0},include:[{model:me,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 se(this,void 0,void 0,(function*(){const i=t,n=yield ge.findOne({where:{state:!0},include:[{model:me,required:!0,where:{[U.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 se(this,void 0,void 0,(function*(){const e=k();return(yield ge.count({where:{token:e}}))?this.getId():e}))}};re([u(),c("validation",{name:N.string().required(),date:N.string().date().required(),email:N.string().email().required(),username:N.string().min(4).empty(),password:N.string().min(5).required(),confirm:N.string().min(5).required()}),ie(0,r()),ie(1,l()),ie(2,n()),ne("design:type",Function),ne("design:paramtypes",[a,Object,Te]),ne("design:returntype",Promise)],Ce.prototype,"register",null),re([u("/confirm"),c("validation",{token:N.string().required()}),ie(0,r()),ie(1,l("token")),ie(2,n()),ne("design:type",Function),ne("design:paramtypes",[a,String,Te]),ne("design:returntype",Promise)],Ce.prototype,"confirm",null),re([u("/send"),c("validation",{username:N.string().min(4).required()}),ie(0,r()),ie(1,l("username")),ie(2,n()),ne("design:type",Function),ne("design:paramtypes",[a,String,Te]),ne("design:returntype",Promise)],Ce.prototype,"send",null),Ce=re([g("/register"),h(De)],Ce);let He=class extends Be{model(){return he}create(){return{name:N.string().required(),description:N.string().empty(""),state:N.boolean().parse().required()}}update(){return{name:N.string().empty(),description:N.string().empty(),state:N.boolean().parse().empty()}}};He=re([g("/routes"),h(Be)],He);let Me=class extends De{setup(e){return se(this,void 0,void 0,(function*(){if(0==(yield me.count())){const e=F(),t=yield me.create({name:"Admin",email:"admin@localhost",username:"admin",password:O("admin"+e),salt:e,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0}),r={description:"API CORE",state:!0},i=yield le.create(Object.assign({name:"admin"},r));yield ye.create({userId:t.id,groupId:i.id});const n=["read","write"],s=["users","groups","routes"];yield j(s,(e=>se(this,void 0,void 0,(function*(){yield j(n,(t=>se(this,void 0,void 0,(function*(){const n=e+"."+t,s=yield he.create(Object.assign({name:n},r));yield pe.create({groupId:i.id,routeId:s.id})}))))}))));const o=[...n,"delete","list","rename","upload"];yield j(o,(e=>se(this,void 0,void 0,(function*(){const t="files."+e,n=yield he.create(Object.assign({name:t},r));yield pe.create({groupId:i.id,routeId:n.id})}))));const d=yield he.create(Object.assign({name:"logs.read"},r));yield pe.create({groupId:i.id,routeId:d.id})}e.success("OK")}))}};re([p(),ie(0,r()),ne("design:type",Function),ne("design:paramtypes",[a]),ne("design:returntype",Promise)],Me.prototype,"setup",null),Me=re([g("/setup"),h(De)],Me);let Ue=class extends qe{model(){return me}constructor(){super(),this.dir=oe.API_HTTP_PUBLIC+"/avatar",oe.API_HTTP_PUBLIC&&z(oe.API_HTTP_PUBLIC)&&!z(this.dir)&&Z(this.dir)}avatar(e,t,r){return se(this,void 0,void 0,(function*(){if(t.length){const i=t[0].filename||"";if(i){const t=this.dir+"/"+r.avatar;if(z(t)&&J(t).isFile()&&$(t),r.avatar=i,yield r.save().catch(this.error))return e.success("OK")}}e.success("Record not changed")}))}avatar_remove(e,t){return se(this,void 0,void 0,(function*(){const r=this.dir+"/"+t.avatar;t.avatar="",(yield t.save().catch(this.error))&&z(r)&&$(r),e.success("OK")}))}password(e,t,r,i){return se(this,void 0,void 0,(function*(){var n;const s=yield this.scope("password").findOne({where:{id:i.id,state:!0}}).catch(this.error);return t+=null!==(n=null==s?void 0:s.salt)&&void 0!==n?n:"",s&&s.password==O(t)?(s.salt=F(),s.password=O(r+s.salt),(yield s.save().catch(this.error))?e.success("OK"):void e.success("Record not changed")):e.error("Record not changed")}))}token(e,t,r){return se(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 se(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){return se(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().catch(this.error),e.success("OK");e.notFound("Record not found")}))}token_renew(e,t,r){return se(this,void 0,void 0,(function*(){const i=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(i){const t=yield this.token_new();return i.token=r.hash.encrypt(t),yield i.save().catch(this.error),e.json({token:t})}e.notFound("Record not found")}))}token_new(){return se(this,void 0,void 0,(function*(){const e=k();return(yield this.model().count({where:{token:e}}))?this.token_new():e}))}add(e,t){return se(this,void 0,void 0,(function*(){const r=F();yield this._add({ctx:e,body:{password:O(t+r),salt:r}})}))}all(e){return se(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}del(e,t,r){return se(this,void 0,void 0,(function*(){t&&t.id.toString()!=r?yield this._del({ctx:e}):e.error("Internal Server Error")}))}get(e){return se(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,t){return se(this,void 0,void 0,(function*(){const r=F();yield this._set({ctx:e,body:t?{password:O(t+r),salt:r}:{}})}))}};re([u("/avatar"),c("auth"),c("upload",(e=>({count:1,field:"file",path:e.controller.dir,types:["image/bmp","image/jpeg","image/png"],size:32}))),ie(0,r()),ie(1,I()),ie(2,ke()),ne("design:type",Function),ne("design:paramtypes",[a,Array,me]),ne("design:returntype",Promise)],Ue.prototype,"avatar",null),re([p("/avatar/remove"),c("auth"),ie(0,r()),ie(1,ke()),ne("design:type",Function),ne("design:paramtypes",[a,me]),ne("design:returntype",Promise)],Ue.prototype,"avatar_remove",null),re([u("/password"),c("auth"),c("validation",{oldPassword:N.string().min(5).required(),newPassword:N.string().min(5).required()}),ie(0,r()),ie(1,l("oldPassword")),ie(2,l("newPassword")),ie(3,ke()),ne("design:type",Function),ne("design:paramtypes",[a,String,String,me]),ne("design:returntype",Promise)],Ue.prototype,"password",null),re([p("/token"),c("auth"),ie(0,r()),ie(1,ke()),ie(2,n()),ne("design:type",Function),ne("design:paramtypes",[a,me,Te]),ne("design:returntype",Promise)],Ue.prototype,"token",null),re([p("/token/:id"),c("auth"),c("write"),ie(0,r()),ie(1,v("id")),ie(2,n()),ne("design:type",Function),ne("design:paramtypes",[a,String,Te]),ne("design:returntype",Promise)],Ue.prototype,"token_get",null),re([p("/token/remove/:id"),c("auth"),c("write"),ie(0,r()),ie(1,v("id")),ne("design:type",Function),ne("design:paramtypes",[a,String]),ne("design:returntype",Promise)],Ue.prototype,"token_remove",null),re([p("/token/renew/:id"),c("auth"),c("write"),ie(0,r()),ie(1,v("id")),ie(2,n()),ne("design:type",Function),ne("design:paramtypes",[a,String,Te]),ne("design:returntype",Promise)],Ue.prototype,"token_renew",null),re([u(),c("auth"),c("write"),c("validation",{name:N.string().required(),email:N.string().email().required(),username:N.string().min(4).required(),password:N.string().min(5).required(),description:N.string().empty(""),state:N.boolean().parse().required()}),ie(0,r()),ie(1,l("password")),ne("design:type",Function),ne("design:paramtypes",[a,String]),ne("design:returntype",Promise)],Ue.prototype,"add",null),re([p(),c("auth"),c("read"),ie(0,r()),ne("design:type",Function),ne("design:paramtypes",[a]),ne("design:returntype",Promise)],Ue.prototype,"all",null),re([y("/:id"),c("auth"),c("write"),ie(0,r()),ie(1,ke()),ie(2,v("id")),ne("design:type",Function),ne("design:paramtypes",[a,me,String]),ne("design:returntype",Promise)],Ue.prototype,"del",null),re([p("/:id"),c("auth"),c("read"),ie(0,r()),ne("design:type",Function),ne("design:paramtypes",[a]),ne("design:returntype",Promise)],Ue.prototype,"get",null),re([_("/:id"),c("auth"),c("write"),c("validation",{name:N.string().empty(),email:N.string().email().empty(),username:N.string().min(4).empty(),password:N.string().min(5).empty().filter(""),description:N.string().empty(),state:N.boolean().parse().empty()}),ie(0,r()),ie(1,l("password")),ne("design:type",Function),ne("design:paramtypes",[a,String]),ne("design:returntype",Promise)],Ue.prototype,"set",null),Ue=re([g("/users"),h(qe),ne("design:paramtypes",[])],Ue);let Ge=class extends qe{model(){return ye}all(e,t){return se(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{userId:t},include:[{model:le,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,r){return se(this,void 0,void 0,(function*(){const i=yield me.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){if(yield ye.destroy({where:{userId:i.id}}),r){let e=0;for(let t=0;t<r.length;t++)e=yield le.count({where:{id:r[t]}}),e&&(yield ye.create({userId:i.id,groupId:r[t]}))}return e.success("OK")}if(L(i))return e.notFound("Record not found");e.error("Internal Server Error")}))}};re([p("/:id/groups"),c("auth"),c("read","users"),ie(0,r()),ie(1,v("id")),ne("design:type",Function),ne("design:paramtypes",[a,String]),ne("design:returntype",Promise)],Ge.prototype,"all",null),re([_("/:id/groups"),c("auth"),c("write","users"),c("validation",{groups:N.array(N.number().parse())}),ie(0,r()),ie(1,v("id")),ie(2,l("groups")),ne("design:type",Function),ne("design:paramtypes",[a,String,Array]),ne("design:returntype",Promise)],Ge.prototype,"set",null),Ge=re([g("/users"),h(qe)],Ge);export{Te as Application,ue as Auth,Ne as AuthController,we as Config,_e as Configs,De as ControllerBase,Be as CrudController,de as Database,oe as Env,xe as FilesController,ce as Forgot,Fe as ForgotController,le as Group,pe as GroupRoute,Le as GroupsController,je as GroupsRoutesController,ve as Log,Ie as Logs,Ke as LogsController,qe as ModelController,be as Permission,ge as Register,Ce as RegisterController,Re as ReqAuth,ke as ReqUser,he as Route,He as RoutesController,fe as Session,Me as SetupController,Se as Token,me as User,ye as UserGroup,Ue as UsersController,Ge as UsersGroupsController,Ae as crt,Ee as key,ae as sequelize};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrewcaires/api",
3
- "version": "3.2.3",
3
+ "version": "3.2.4",
4
4
  "description": "Simple api for small applications using express, jsonwebtoken, sequelize and websocket",
5
5
  "main": "./dist/index.cjs.js",
6
6
  "types": "./dist/index.d.ts",