@andrewcaires/api 3.2.7 → 4.0.1

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.7
2
+ * @andrewcaires/api v4.0.1
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"),i=require("ws"),o=require("sequelize"),s=require("dotenv"),n=require("fs"),d=require("express-session"),a=require("jsonwebtoken"),l=require("path");function u(e,t,r,i){var o,s=arguments.length,n=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,i);else for(var d=e.length-1;d>=0;d--)(o=e[d])&&(n=(s<3?o(n):s>3?o(t,r,n):o(t,r))||n);return s>3&&n&&Object.defineProperty(t,r,n),n}function c(e,t){return function(r,i){t(r,i,e)}}function p(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function g(e,t,r,i){return new(r||(r=Promise))((function(o,s){function n(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?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(n,d)}a((i=i.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_MODEL_LIMIT=h.getInt("API_MODEL_LIMIT",10),h.API_MODEL_LIMIT_MAX=h.getInt("API_MODEL_LIMIT_MAX",500),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 o.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 o.Sequelize("sqlite::memory:",{logging:h.API_DB_LOG,define:{timestamps:!1},timezone:h.API_DB_TIMEZONE})}static connect_mysql(e){return new o.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 o.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 o.Sequelize({dialect:"sqlite",storage:e.database,logging:h.API_DB_LOG,define:{timestamps:!1}})}}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 o.Model{}_.init({secret:o.DataTypes.STRING,logout:o.DataTypes.DATE,useragent:o.DataTypes.STRING},{sequelize:m,modelName:h.API_DB_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class I extends o.Model{}I.init({token:o.DataTypes.STRING,timestamp:o.DataTypes.BIGINT,state:o.DataTypes.BOOLEAN},{sequelize:m,modelName:h.API_DB_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class x extends o.Model{}x.init({name:o.DataTypes.STRING,description:o.DataTypes.TEXT,state:o.DataTypes.BOOLEAN},{sequelize:m,modelName:h.API_DB_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class v extends o.Model{}v.init({},{sequelize:m,modelName:h.API_DB_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),v.removeAttribute("id");class P extends o.Model{}P.init({token:o.DataTypes.STRING,state:o.DataTypes.BOOLEAN},{sequelize:m,modelName:h.API_DB_PREFIX+"register",timestamps:!0,createdAt:"created",updatedAt:"updated"});class f extends o.Model{}f.init({name:o.DataTypes.STRING,description:o.DataTypes.TEXT,state:o.DataTypes.BOOLEAN},{sequelize:m,modelName:h.API_DB_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class A extends o.Model{}A.init({name:o.DataTypes.STRING,email:o.DataTypes.STRING,username:o.DataTypes.STRING,password:o.DataTypes.STRING,salt:o.DataTypes.STRING,token:o.DataTypes.STRING,avatar:o.DataTypes.STRING,date:o.DataTypes.DATEONLY,description:o.DataTypes.TEXT,state:o.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 o.Model{}C.init({},{sequelize:m,modelName:h.API_DB_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),C.removeAttribute("id");class E extends o.Model{}E.init({key:o.DataTypes.STRING,value:o.DataTypes.STRING},{sequelize:m,modelName:h.API_DB_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),E.removeAttribute("id");class S extends o.Model{}S.init({type:o.DataTypes.STRING,source:o.DataTypes.STRING,message:o.DataTypes.TEXT},{sequelize:m,modelName:h.API_DB_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class w extends o.Model{}w.init({session:o.DataTypes.STRING,json:o.DataTypes.TEXT,expired:o.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(I),I.belongsTo(A),A.hasMany(P),P.belongsTo(A),x.hasMany(v),v.belongsTo(x),f.hasMany(v),v.belongsTo(f),A.hasMany(C),C.belongsTo(A),x.hasMany(C),C.belongsTo(x);class O{static write(e,r,i){return g(this,void 0,void 0,(function*(){yield O.writeRaw(t.LogColor.White,"",e,r,i)}))}static error(e,r,i){return g(this,void 0,void 0,(function*(){yield O.writeRaw(t.LogColor.Red,"error",e,r,i)}))}static info(e,r,i){return g(this,void 0,void 0,(function*(){yield O.writeRaw(t.LogColor.Cyan,"info",e,r,i)}))}static success(e,r,i){return g(this,void 0,void 0,(function*(){yield O.writeRaw(t.LogColor.Green,"success",e,r,i)}))}static warning(e,r,i){return g(this,void 0,void 0,(function*(){yield O.writeRaw(t.LogColor.Yellow,"warning",e,r,i)}))}static writeRaw(e,r,i,o,s){return g(this,void 0,void 0,(function*(){s&&t.Log.console(e,r,i),m&&(yield S.create({type:r,source:o,message:i}).catch((()=>null)))}))}}const T=e=>n.existsSync(e)?n.readFileSync(e):void 0,R={http:T(h.API_HTTP_CRT),token:T(h.API_TOKEN_CRT)},D={http:T(h.API_HTTP_KEY),token:T(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:{[o.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:{[o.Op.lt]:Date.now()}}}).catch(r.noop)})),this.get=(e,t)=>g(this,void 0,void 0,(function*(){t=t||r.noop;const i=yield w.findOne({where:{session:e,expired:{[o.Op.gte]:Date.now()}}}).catch((e=>(t(e),null)));if(i){const e=JSON.parse(i.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield i.destroy().catch(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,i)=>g(this,void 0,void 0,(function*(){i=i||r.noop;const o=Date.now()+h.API_SESSION_LIFETIME,s=JSON.stringify(t),[n,d]=(yield w.findOrCreate({where:{session:e},defaults:{session:e,json:s,expired:o}}).catch(r.noop))||[];n&&(d||(n.json=s,n.expired=o,yield n.save().catch(r.noop))),i()})),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,i=r.uuidv4(),o=yield _.create({secret:i,userId:t}).catch(F.error);if(!o)return{error:"Internal Server Error"};return{auth:o,token:a.sign({id:t,secret:i},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){O.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:i}=F.verify(e,h.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(i){const{id:e,secret:t}=i;if(e&&t){const i=yield A.findOne({where:{id:e,state:!0}}).catch(F.error);if(i){const o=yield _.findOne({where:{secret:t,userId:i.id}}).catch(F.error);if(o&&!o.logout){o.secret=r.uuidv4(),yield o.save().catch(F.error);return{auth:o,token:a.sign({id:e,secret:o.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 i=yield A.findOne({where:{token:t,state:!0}}).catch(F.error);if(i){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield _.findOrCreate({where:{secret:t,userId:i.id},defaults:{secret:t,userId:i.id}}).catch(F.error))||[];if(r)return{auth:r,user:i}}return{error:"Access denied"}}const{error:i,decode:o}=F.verify(t);if(i)return{error:i};if(o){const{id:e,secret:t}=o;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 b 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){O.error(e.message,t,h.API_CONSOLE_ERROR)}log(e,t){O.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 i.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 i=t.url.length<=1?"":t.url.replace(/\//g,".");let o;e.on("message",(r=>g(this,void 0,void 0,(function*(){if(o)try{const s=JSON.parse(r);this.emit("ws.message"+i,{data:s,message:r,req:t,user:o,ws:e})}catch(s){this.emit("ws.message"+i,{message:r,req:t,user:o,ws:e})}else{const{user:s}=yield F.user("",r.toString(),this);s&&(o=s,this.emit("ws.connection"+i,{req:t,user:o,ws:e}))}o||e.close()})))),e.on("close",(()=>{o&&this.emit("ws.close"+i,{user:o,ws:e})})),yield r.sleep(2e3),o||e.close()})))))}))}websocket(){return this._webSocket}}class k{static all(){return g(this,void 0,void 0,(function*(){const e=yield E.findAll().catch(k.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(k.error))||0)>0}))}static error(e){O.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(k.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(k.error))||[];r&&(r.value=t,yield r.save().catch(k.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:v,required:!0,include:[{model:x,required:!0,where:{state:!0},include:[{model:C,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{O.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,i,o){return g(this,void 0,void 0,(function*(){const{auth:s,error:n,user:d}=yield F.user(t,r,o);return n?e.error(n):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,i){return g(this,void 0,void 0,(function*(){i.auth&&i.user&&(i.useragent?i.useragent!=t&&i.regenerate(r.noop):(i.useragent=t,i.save(r.noop))),e.next()}))}error(e){O.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:i,value:o}=yield r.Validation.object(t).parse().validateAsync(e.req.body);if(i)return e.validation(i);e.req.body=o,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,b]),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,i,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:{[o.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 P.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=i,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,i){return g(this,void 0,void 0,(function*(){if(yield F.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 g(this,void 0,void 0,(function*(){const{auth:o,error:s,token:n}=yield F.renew(r);return s?e.error(s):o?(o.useragent=t,yield o.save().catch(this.error),e.json({token:n}),i.emit("auth.renew",{auth:o,ctx:e}),void this.emit("auth.renew",{auth:o,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,b]),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,b]),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,b]),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 i=l.join(this.directory(),t);if(!n.existsSync(i)||!n.statSync(i).isDirectory())return e.notFound("Path not Found");let o=[];return o=n.readdirSync(i),o=o.map((e=>this.info(l.join(i,e)))),o=o.filter(r.isDef),Object.assign(Object.assign({},this.info(i)),{files:o})}))}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 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"}},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 i=yield this.find(t);if(!i||!i.user)return e.notFound("User not found");i.token=r.uniqueID(),yield i.save(),e.json({token:i.token})}))}forgot(e,t,i){return g(this,void 0,void 0,(function*(){yield r.sleep(h.API_SLEEP_FORGOT);const s=t,n=yield A.findOne({where:{[o.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 I.create({token:d,timestamp:a,state:!0,userId:n.id});e.success("OK"),i.emit("forgot.send",{ctx:e,forgot:l,user:n}),this.emit("forgot.send",{ctx:e,forgot:l,user:n})}))}reset(e,r,i,o){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(i),yield s.user.save().catch(this.error),e.success("OK"),o.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 I.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,b]),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,b]),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:i}){const o=yield this.model().create(Object.assign(Object.assign({},t.req.body),i||{}),r||{}).catch(this.error);if(o){const r=this.key();return t.prepare(e.Status.OK,{[r]:o.getDataValue(r)}),o}t.error("Internal Server Error")}))}_all(t){return g(this,arguments,void 0,(function*({ctx:t,options:i,callback:s,scope:n}){var d,a,l,u,c,p;const g=this.scope(n),y=Object.assign({},i||{});y.where=Object.assign({},y.where||{});const m=t.req.query.limit,_=r.isString(m)?parseInt(m):h.API_MODEL_LIMIT;y.limit=_>=0?Math.min(_,h.API_MODEL_LIMIT_MAX):void 0;const I=t.req.query.offset;if(r.isString(I)){const e=I?parseInt(I):0;y.offset=e>0?e:void 0}const x=[],v=this.columns(),P=e=>v.indexOf(e)>=0,f=null===(d=t.req.query.asc)||void 0===d?void 0:d.toString();f&&f.length&&x.push(...f.split(",").filter(P).map((e=>[e,"ASC"])));const A=null===(a=t.req.query.desc)||void 0===a?void 0:a.toString();A&&A.length&&x.push(...A.split(",").filter(P).map((e=>[e,"DESC"]))),x.length&&(y.order=x);const C=[],E=null===(l=t.req.query.search)||void 0===l?void 0:l.toString();(r.isArray(y.attributes)?y.attributes:v).filter(r.isString).forEach((e=>{var r;if(E&&E.length&&C.push({[e]:{[o.Op.like]:`%${E}%`}}),"search_"+e in t.req.query){const i=null===(r=t.req.query["search_"+e])||void 0===r?void 0:r.toString();i&&i.length&&C.push({[e]:{[o.Op.like]:`%${i}%`}})}})),C.length&&(y.where=Object.assign(Object.assign({},y.where),{[o.Op.or]:[...C]}));const S=null!==(u=yield g.count(Object.assign(Object.assign({},y),{col:v[0]})).catch(this.error))&&void 0!==u?u:0,w=yield g.findAll(y).catch(this.error),O={count:S,limit:null!==(c=y.limit)&&void 0!==c?c:-1,offset:null!==(p=y.offset)&&void 0!==p?p:0};return w?(t.prepare(e.Status.OK,Object.assign(Object.assign({},O),{records:s?yield s(w):w})),Object.assign(Object.assign({},O),{records:w})):(t.error("Internal Server Error"),Object.assign(Object.assign({},O),{records:[]}))}))}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]:i}=e.req.params;if(!i)return e.error("Internal Server Error"),0;const o=yield this.model().destroy(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[r]:i})})).catch(this.error);return o?(e.success("OK"),o):(e.notFound("Record not found"),0)}))}error(e){e.sql?O.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:i,scope:o}){const s=this.key(),{[s]:n}=t.req.params,d=yield this.scope(o).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,i?yield i(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 i=this.key(),{[i]:o}=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]:o})})).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 x}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 v}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,i){return g(this,void 0,void 0,(function*(){const o=yield x.findByPk(t,{attributes:["id"]}).catch(this.error);if(o){const t=o.id;if(yield v.destroy({where:{groupId:t}}),i){let e=0;for(let r=0;r<i.length;r++)e=yield f.count({where:{id:i[r]}}),e&&(yield v.create({groupId:t,routeId:i[r]}))}return e.success("OK")}if(r.isNull(o))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 i={};t&&(i.type=t),r&&(i.source=r),yield this._all({ctx:e,options:{where:i,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,i,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}=i,p=l||a,g=t.sha256(u);if(yield A.count({where:{[o.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 P.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 i=yield P.findOne({where:{token:t,state:!0},include:[{model:A,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 g(this,void 0,void 0,(function*(){const i=t,s=yield P.findOne({where:{state:!0},include:[{model:A,required:!0,where:{[o.Op.or]:[{email:i},{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 P.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,b]),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,b]),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,b]),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(),i=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}),o={description:"API CORE",state:!0},s=yield x.create(Object.assign({name:"admin"},o));yield C.create({userId:i.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,i=yield f.create(Object.assign({name:r},o));yield v.create({groupId:s.id,routeId:i.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},o));yield v.create({groupId:s.id,routeId:r.id})}))));const l=yield f.create(Object.assign({name:"logs.read"},o));yield v.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 i=t[0].filename||"";if(i){const t=this.dir+"/"+r.avatar;if(n.existsSync(t)&&n.lstatSync(t).isFile()&&n.rmSync(t),r.avatar=i,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,i,o,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 i+=null!==(n=null==d?void 0:d.salt)&&void 0!==n?n:"",d&&d.password==t.sha256(i)?(d.salt=r.uniqueID(),d.password=t.sha256(o+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 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 g(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 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 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 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,i){return g(this,void 0,void 0,(function*(){const o=r.uniqueID();yield this._add({ctx:e,body:{password:t.sha256(i+o),salt:o}})}))}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,i){return g(this,void 0,void 0,(function*(){const o=r.uniqueID();yield this._set({ctx:e,body:i?{password:t.sha256(i+o),salt:o}:{}})}))}},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,b]),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,b]),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,b]),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:x,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,i){return g(this,void 0,void 0,(function*(){const o=yield A.findByPk(t,{attributes:["id"]}).catch(this.error);if(o){if(yield C.destroy({where:{userId:o.id}}),i){let e=0;for(let t=0;t<i.length;t++)e=yield x.count({where:{id:i[t]}}),e&&(yield C.create({userId:o.id,groupId:i[t]}))}return e.success("OK")}if(r.isNull(o))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=b,exports.Auth=_,exports.Config=k,exports.Configs=E,exports.ControllerBase=L,exports.Database=y,exports.Env=h,exports.Forgot=I,exports.Group=x,exports.GroupRoute=v,exports.Log=S,exports.Logs=O,exports.Permission=B,exports.Register=P,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;
7
+ "use strict";var e=require("@andrewcaires/express"),t=require("@andrewcaires/node"),r=require("@andrewcaires/utils.js"),o=require("ws"),s=require("@andrewcaires/sequelize"),i=require("dotenv"),n=require("fs"),d=require("express-session"),a=require("sequelize"),p=require("jsonwebtoken"),u=require("path");function l(e,t,r,o){var s,i=arguments.length,n=i<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,o);else for(var d=e.length-1;d>=0;d--)(s=e[d])&&(n=(i<3?s(n):i>3?s(t,r,n):s(t,r))||n);return i>3&&n&&Object.defineProperty(t,r,n),n}function c(e,t){return function(r,o){t(r,o,e)}}function g(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function y(e,t,r,o){return new(r||(r=Promise))((function(s,i){function n(e){try{a(o.next(e))}catch(e){i(e)}}function d(e){try{a(o.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?s(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(n,d)}a((o=o.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,i.config();class x{static getBool(e,t){return r.toBool(x.getString(e,t.toString()))}static getInt(e,t){return parseInt(x.getString(e,t.toString()))}static getMs(e,t){return r.parseMs(x.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}x.API_CONSOLE_ERROR=x.getBool("API_CONSOLE_ERROR",!1),x.API_DEFAULT_PATH=x.getString("API_DEFAULT_PATH","/api"),x.API_DB_DATABASE=x.getString("API_DB_DATABASE",""),x.API_DB_HOST=x.getString("API_DB_HOST","127.0.0.1"),x.API_DB_PASSWORD=x.getString("API_DB_PASSWORD",""),x.API_DB_PORT=x.getInt("API_DB_PORT",3306),x.API_DB_TYPE=x.getString("API_DB_TYPE",""),x.API_DB_USERNAME=x.getString("API_DB_USERNAME","root"),x.API_DB_LOG=x.getBool("API_DB_LOG",!1),x.API_DB_AUDIT=x.getBool("API_DB_AUDIT",!0),x.API_DB_PREFIX=x.getString("API_DB_PREFIX",""),x.API_DB_TIMEZONE=x.getString("API_DB_TIMEZONE","+00:00"),x.API_HTTP_CRT=x.getString("API_HTTP_CRT",""),x.API_HTTP_KEY=x.getString("API_HTTP_KEY",""),x.API_HTTP_PORT=x.getInt("API_HTTP_PORT",3e3),x.API_HTTP_PUBLIC=x.getString("API_HTTP_PUBLIC",""),x.API_HTTP_CROSS=x.getBool("API_HTTP_CROSS",!1),x.API_HTTP_HYBRID=x.getBool("API_HTTP_HYBRID",!1),x.API_HTTP_REDIRECT=x.getString("API_HTTP_REDIRECT",""),x.API_KEY_HASH=x.getString("API_KEY_HASH",""),x.API_KEY_HEADER=x.getString("API_KEY_HEADER","api_key"),x.API_MODEL_LIMIT=x.getInt("API_MODEL_LIMIT",10),x.API_MODEL_LIMIT_MAX=x.getInt("API_MODEL_LIMIT_MAX",500),x.API_NOTFOUND_REDIRECT=x.getString("API_NOTFOUND_REDIRECT",""),x.API_SLEEP_AUTH=x.getMs("API_SLEEP_AUTH","2s"),x.API_SLEEP_FORGOT=x.getMs("API_SLEEP_FORGOT","5s"),x.API_SLEEP_REGISTRY=x.getMs("API_SLEEP_REGISTRY","5s"),x.API_SESSION_NAME=x.getString("API_SESSION_NAME","session.id"),x.API_SESSION_LIFETIME=x.getMs("API_SESSION_LIFETIME","1d"),x.API_SESSION_SECRET=x.getString("API_SESSION_SECRET","yoursecret"),x.API_TOKEN_CRT=x.getString("API_TOKEN_CRT",""),x.API_TOKEN_KEY=x.getString("API_TOKEN_KEY",""),x.API_TOKEN_FORGOT=x.getMs("API_TOKEN_LIFETIME","1d"),x.API_TOKEN_HEADER=x.getString("API_TOKEN_HEADER","authorization"),x.API_TOKEN_LIFETIME=x.getMs("API_TOKEN_LIFETIME","1d"),x.API_TOKEN_RENEW=x.getMs("API_TOKEN_RENEW","1d"),x.API_UPLOAD_COUNT=x.getInt("API_UPLOAD_COUNT",1),x.API_UPLOAD_FIELD=x.getString("API_UPLOAD_FIELD","upload"),x.API_UPLOAD_SIZE=x.getInt("API_UPLOAD_SIZE",2),x.API_UPLOAD_TEMP=x.getString("API_UPLOAD_TEMP","./temp"),x.API_WEBSOCKET_START=x.getBool("API_WEBSOCKET_START",!1);const h=new s.Connection({type:x.API_DB_TYPE,database:x.API_DB_DATABASE,username:x.API_DB_USERNAME,password:x.API_DB_PASSWORD,hostname:x.API_DB_HOST,hostport:x.API_DB_PORT,logging:x.API_DB_LOG,prefix:x.API_DB_PREFIX});class v extends s.Model{}const m={afterCreate:(e,t)=>y(void 0,void 0,void 0,(function*(){var o,s,i;if(!x.API_DB_AUDIT)return;const n=r.isObject(e)?e.constructor:null,d=null!==(o=null==n?void 0:n.primaryKeyAttribute)&&void 0!==o?o:null;yield exports.Audit.create({type:"CREATE",model:null!==(s=null==n?void 0:n.getTableName())&&void 0!==s?s:null,record:d?e.getDataValue(d):null,data:JSON.stringify(e.toJSON()),state:!0,userId:null!==(i=null==t?void 0:t.userId)&&void 0!==i?i:null}).catch(r.noop)})),afterUpdate:(e,t)=>y(void 0,void 0,void 0,(function*(){var o,s,i;if(!x.API_DB_AUDIT)return;const n=r.isObject(e)?e.constructor:null,d=null!==(o=null==n?void 0:n.primaryKeyAttribute)&&void 0!==o?o:null,a={},p=e.changed();p&&p.forEach((t=>a[t]=e.getDataValue(t))),yield exports.Audit.create({type:"UPDATE",model:null!==(s=null==n?void 0:n.getTableName())&&void 0!==s?s:null,record:d?e.getDataValue(d):null,data:JSON.stringify({before:e.previous(),after:a}),state:!0,userId:null!==(i=null==t?void 0:t.userId)&&void 0!==i?i:null}).catch(r.noop)})),afterDestroy:(e,t)=>y(void 0,void 0,void 0,(function*(){var o,s,i;if(!x.API_DB_AUDIT)return;const n=r.isObject(e)?e.constructor:null,d=null!==(o=null==n?void 0:n.primaryKeyAttribute)&&void 0!==o?o:null;yield exports.Audit.create({type:"DELETE",model:null!==(s=null==n?void 0:n.getTableName())&&void 0!==s?s:null,record:d?e.getDataValue(d):null,data:JSON.stringify(e.toJSON()),state:!0,userId:null!==(i=null==t?void 0:t.userId)&&void 0!==i?i:null}).catch(r.noop)}))};exports.Auth=class extends v{},l([s.Integer(),s.PrimaryKey,s.NotNull,s.AutoIncrement,g("design:type",Number)],exports.Auth.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.Auth.prototype,"secret",void 0),l([s.FullDate(),g("design:type",Date)],exports.Auth.prototype,"logout",void 0),l([s.String(),g("design:type",s.String)],exports.Auth.prototype,"useragent",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Auth.prototype,"createdAt",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Auth.prototype,"updatedAt",void 0),l([s.DeletedAt,g("design:type",Date)],exports.Auth.prototype,"deletedAt",void 0),l([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Auth.prototype,"userId",void 0),exports.Auth=l([s.Database(h),s.ModelName("auth")],exports.Auth),exports.Register=class extends v{},l([s.Integer(),s.PrimaryKey,s.NotNull,s.AutoIncrement,g("design:type",Number)],exports.Register.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.Register.prototype,"token",void 0),l([s.Boolean(),g("design:type",s.Boolean)],exports.Register.prototype,"state",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Register.prototype,"createdAt",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Register.prototype,"updatedAt",void 0),l([s.DeletedAt,g("design:type",Date)],exports.Register.prototype,"deletedAt",void 0),l([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Register.prototype,"userId",void 0),exports.Register=l([s.Database(h),s.ModelName("register")],exports.Register),exports.Group=class extends v{},l([s.Integer(),s.PrimaryKey,s.NotNull,s.AutoIncrement,g("design:type",Number)],exports.Group.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.Group.prototype,"name",void 0),l([s.Text(),g("design:type",s.String)],exports.Group.prototype,"description",void 0),l([s.Boolean(),g("design:type",s.Boolean)],exports.Group.prototype,"state",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Group.prototype,"createdAt",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Group.prototype,"updatedAt",void 0),l([s.DeletedAt,g("design:type",Date)],exports.Group.prototype,"deletedAt",void 0),l([s.HasMany((()=>exports.UserGroup),"groupId"),g("design:type",Array)],exports.Group.prototype,"groups_routes",void 0),l([s.HasMany((()=>exports.UserGroup),"groupId"),g("design:type",Array)],exports.Group.prototype,"users_groups",void 0),exports.Group=l([s.Database(h),s.ModelName("group"),s.Hooks(m)],exports.Group),exports.UserGroup=class extends v{},l([s.CreatedAt,g("design:type",Date)],exports.UserGroup.prototype,"createdAt",void 0),l([s.BelongsTo((()=>exports.Group)),g("design:type",Number)],exports.UserGroup.prototype,"groupId",void 0),l([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.UserGroup.prototype,"userId",void 0),exports.UserGroup=l([s.Database(h),s.ModelName("users_groups"),s.Hooks(m)],exports.UserGroup),exports.User=class extends v{},l([s.Integer(),s.PrimaryKey,s.NotNull,s.AutoIncrement,g("design:type",Number)],exports.User.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.User.prototype,"name",void 0),l([s.String(),g("design:type",s.String)],exports.User.prototype,"email",void 0),l([s.String(),g("design:type",s.String)],exports.User.prototype,"username",void 0),l([s.String(),g("design:type",s.String)],exports.User.prototype,"password",void 0),l([s.String(),g("design:type",s.String)],exports.User.prototype,"salt",void 0),l([s.String(),g("design:type",s.String)],exports.User.prototype,"token",void 0),l([s.String(),g("design:type",s.String)],exports.User.prototype,"avatar",void 0),l([s.DateOnly(),g("design:type",s.String)],exports.User.prototype,"date",void 0),l([s.Text(),g("design:type",s.String)],exports.User.prototype,"description",void 0),l([s.Boolean(),g("design:type",s.Boolean)],exports.User.prototype,"state",void 0),l([s.CreatedAt,g("design:type",Date)],exports.User.prototype,"createdAt",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.User.prototype,"updatedAt",void 0),l([s.DeletedAt,g("design:type",Date)],exports.User.prototype,"deletedAt",void 0),l([s.HasMany((()=>exports.Audit),"userId"),g("design:type",Array)],exports.User.prototype,"audits",void 0),l([s.HasMany((()=>exports.Auth),"userId"),g("design:type",Array)],exports.User.prototype,"auths",void 0),l([s.HasMany((()=>exports.Register),"userId"),g("design:type",Array)],exports.User.prototype,"registers",void 0),l([s.HasMany((()=>exports.UserGroup),"userId"),g("design:type",Array)],exports.User.prototype,"users_groups",void 0),exports.User=l([s.Database(h),s.ModelName("user"),s.DefaultScope({attributes:{exclude:["password","salt","token"]}}),s.Scopes({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),s.Hooks(m)],exports.User),exports.Audit=class extends v{},l([s.Integer(),s.PrimaryKey,s.NotNull,s.AutoIncrement,g("design:type",Number)],exports.Audit.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.Audit.prototype,"type",void 0),l([s.String(),g("design:type",s.String)],exports.Audit.prototype,"model",void 0),l([s.Integer(),g("design:type",s.String)],exports.Audit.prototype,"record",void 0),l([s.Text(),g("design:type",s.String)],exports.Audit.prototype,"data",void 0),l([s.Boolean(),g("design:type",s.Boolean)],exports.Audit.prototype,"state",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Audit.prototype,"createdAt",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Audit.prototype,"updatedAt",void 0),l([s.DeletedAt,g("design:type",Date)],exports.Audit.prototype,"deletedAt",void 0),l([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Audit.prototype,"userId",void 0),exports.Audit=l([s.Database(h),s.ModelName("audit")],exports.Audit),exports.Configs=class extends v{},l([s.String(),g("design:type",s.String)],exports.Configs.prototype,"key",void 0),l([s.String(),g("design:type",s.String)],exports.Configs.prototype,"value",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Configs.prototype,"createdAt",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Configs.prototype,"updatedAt",void 0),exports.Configs=l([s.Database(h),s.ModelName("configs"),s.Hooks(m)],exports.Configs),exports.Forgot=class extends v{},l([s.Integer(),s.PrimaryKey,s.NotNull,s.AutoIncrement,g("design:type",Number)],exports.Forgot.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.Forgot.prototype,"token",void 0),l([s.BigInt(),g("design:type",Number)],exports.Forgot.prototype,"timestamp",void 0),l([s.Boolean(),g("design:type",s.Boolean)],exports.Forgot.prototype,"state",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Forgot.prototype,"createdAt",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Forgot.prototype,"updatedAt",void 0),l([s.DeletedAt,g("design:type",Date)],exports.Forgot.prototype,"deletedAt",void 0),l([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Forgot.prototype,"userId",void 0),exports.Forgot=l([s.Database(h),s.ModelName("forgot")],exports.Forgot),exports.Route=class extends v{},l([s.Integer(),s.PrimaryKey,s.NotNull,s.AutoIncrement,g("design:type",Number)],exports.Route.prototype,"id",void 0),l([s.String(),g("design:type",s.String)],exports.Route.prototype,"name",void 0),l([s.Text(),g("design:type",s.String)],exports.Route.prototype,"description",void 0),l([s.Boolean(),g("design:type",s.Boolean)],exports.Route.prototype,"state",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Route.prototype,"createdAt",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Route.prototype,"updatedAt",void 0),l([s.DeletedAt,g("design:type",Date)],exports.Route.prototype,"deletedAt",void 0),l([s.HasMany((()=>exports.GroupRoute),"routeId"),g("design:type",Array)],exports.Route.prototype,"groups_routes",void 0),exports.Route=l([s.Database(h),s.ModelName("route"),s.Hooks(m)],exports.Route),exports.GroupRoute=class extends v{},l([s.CreatedAt,g("design:type",Date)],exports.GroupRoute.prototype,"createdAt",void 0),l([s.BelongsTo((()=>exports.Group)),g("design:type",Number)],exports.GroupRoute.prototype,"groupId",void 0),l([s.BelongsTo((()=>exports.Route)),g("design:type",Number)],exports.GroupRoute.prototype,"routeId",void 0),exports.GroupRoute=l([s.Database(h),s.ModelName("groups_routes"),s.Hooks(m)],exports.GroupRoute),exports.Log=class extends v{},l([s.String(),g("design:type",s.String)],exports.Log.prototype,"type",void 0),l([s.String(),g("design:type",s.String)],exports.Log.prototype,"source",void 0),l([s.Text(),g("design:type",s.String)],exports.Log.prototype,"message",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Log.prototype,"createdAt",void 0),exports.Log=l([s.Database(h),s.ModelName("log")],exports.Log),exports.Session=class extends v{},l([s.String(),g("design:type",s.String)],exports.Session.prototype,"session",void 0),l([s.Text(),g("design:type",s.String)],exports.Session.prototype,"json",void 0),l([s.BigInt(),g("design:type",Number)],exports.Session.prototype,"expired",void 0),l([s.CreatedAt,g("design:type",Date)],exports.Session.prototype,"createdAt",void 0),l([s.UpdatedAt,g("design:type",Date)],exports.Session.prototype,"updatedAt",void 0),exports.Session=l([s.Database(h),s.ModelName("session")],exports.Session);class A{static write(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.White,"",e,r,o)}))}static error(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.Red,"error",e,r,o)}))}static info(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.Cyan,"info",e,r,o)}))}static success(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.Green,"success",e,r,o)}))}static warning(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.Yellow,"warning",e,r,o)}))}static writeRaw(e,r,o,s,i){return y(this,void 0,void 0,(function*(){i&&t.Log.console(e,r,o),h&&(yield exports.Log.create({type:r,source:s,message:o}).catch((()=>null)))}))}}const f=e=>n.existsSync(e)?n.readFileSync(e):void 0,_={http:f(x.API_HTTP_CRT),token:f(x.API_TOKEN_CRT)},I={http:f(x.API_HTTP_KEY),token:f(x.API_TOKEN_KEY)};class C extends d.Store{constructor(){super(),this.all=e=>y(this,void 0,void 0,(function*(){e=e||r.noop;const t=yield exports.Session.findAll({attributes:["session"],where:{expired:{[a.Op.gte]:Date.now()}}}).catch((t=>(e(t),null)));t&&e(null,t.map((e=>e.session))),e()})),this.clear=e=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy().catch(r.noop),e&&e()})),this.destroy=(e,t)=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy({where:{session:e}}).catch(r.noop),t&&t()})),this.expired=()=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy({where:{expired:{[a.Op.lt]:Date.now()}}}).catch(r.noop)})),this.get=(e,t)=>y(this,void 0,void 0,(function*(){t=t||r.noop;const o=yield exports.Session.findOne({where:{session:e,expired:{[a.Op.gte]:Date.now()}}}).catch((e=>(t(e),null)));if(o){const e=JSON.parse(o.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield o.destroy().catch(r.noop),void t(null)}t(null,e)}else t(null)})),this.length=e=>y(this,void 0,void 0,(function*(){e&&e(null,(yield exports.Session.count().catch(r.noop))||0)})),this.set=(e,t,o)=>y(this,void 0,void 0,(function*(){o=o||r.noop;const s=Date.now()+x.API_SESSION_LIFETIME,i=JSON.stringify(t),[n,d]=(yield exports.Session.findOrCreate({where:{session:e},defaults:{session:e,json:i,expired:s}}).catch(r.noop))||[];n&&(d||(n.json=i,n.expired=s,yield n.save().catch(r.noop))),o()})),this.loop=r.loop(this.expired,3e4),this.loop.start()}}class P{static create(e){return y(this,void 0,void 0,(function*(){if(!I.token)return{error:"Key not found"};const{id:t}=e,o=r.uuidv4(),s=yield exports.Auth.create({secret:o,userId:t}).catch(P.error);if(!s)return{error:"Internal Server Error"};return{auth:s,token:p.sign({id:t,secret:o},I.token,P.options())}}))}static destroy(e){return y(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){A.error(e.message,"api.token",x.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:x.API_TOKEN_LIFETIME+"ms"}}static renew(e){return y(this,void 0,void 0,(function*(){if(!I.token)return{error:"Key not found"};const{error:t,decode:o}=P.verify(e,x.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(o){const{id:e,secret:t}=o;if(e&&t){const o=yield exports.User.findOne({where:{id:e,state:!0}}).catch(P.error);if(o){const s=yield exports.Auth.findOne({where:{secret:t,userId:o.id}}).catch(P.error);if(s&&!s.logout){s.secret=r.uuidv4(),yield s.save().catch(P.error);return{auth:s,token:p.sign({id:e,secret:s.secret},I.token,P.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e,t,r){return y(this,void 0,void 0,(function*(){if(e){t=r.hash.encrypt(e);const o=yield exports.User.findOne({where:{token:t,state:!0}}).catch(P.error);if(o){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield exports.Auth.findOrCreate({where:{secret:t,userId:o.id},defaults:{secret:t,userId:o.id}}).catch(P.error))||[];if(r)return{auth:r,user:o}}return{error:"Access denied"}}const{error:o,decode:s}=P.verify(t);if(o)return{error:o};if(s){const{id:e,secret:t}=s;if(e&&t){const r=yield exports.User.findOne({where:{id:e,state:!0}}).catch(P.error);if(r){const e=yield exports.Auth.findOne({where:{secret:t,userId:r.id}}).catch(P.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!_.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:p.verify(e,_.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class S extends e.Application{constructor(e){super(e,{cert:_.http,cross:x.API_HTTP_CROSS,hybrid:x.API_HTTP_HYBRID,key:I.http,notfound:x.API_NOTFOUND_REDIRECT,path:x.API_DEFAULT_PATH,port:x.API_HTTP_PORT,public:x.API_HTTP_PUBLIC,redirect:x.API_HTTP_REDIRECT,session:{store:new C,name:x.API_SESSION_NAME,secret:x.API_SESSION_SECRET,cookie:{maxAge:x.API_SESSION_LIFETIME},genid:r.uuidv4}}),this.hash=new t.Hash(x.API_KEY_HASH)}error(e,t){A.error(e.message,t,x.API_CONSOLE_ERROR)}log(e,t){A.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return y(this,void 0,void 0,(function*(){yield h.sync(),yield e.listen.call(this),x.API_WEBSOCKET_START&&this.server&&(this._webSocket=new o.Server({server:this.server,verifyClient:(e,t)=>t(x.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>y(this,void 0,void 0,(function*(){t.url||(t.url="");const o=t.url.length<=1?"":t.url.replace(/\//g,".");let s;e.on("message",(r=>y(this,void 0,void 0,(function*(){if(s)try{const i=JSON.parse(r);this.emit("ws.message"+o,{data:i,message:r,req:t,user:s,ws:e})}catch(i){this.emit("ws.message"+o,{message:r,req:t,user:s,ws:e})}else{const{user:i}=yield P.user("",r.toString(),this);i&&(s=i,this.emit("ws.connection"+o,{req:t,user:s,ws:e}))}s||e.close()})))),e.on("close",(()=>{s&&this.emit("ws.close"+o,{user:s,ws:e})})),yield r.sleep(2e3),s||e.close()})))))}))}websocket(){return this._webSocket}}class O{static all(){return y(this,void 0,void 0,(function*(){const e=yield exports.Configs.findAll().catch(O.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e,t){return y(this,void 0,void 0,(function*(){var r;const o=null!==(r=null==t?void 0:t.id)&&void 0!==r?r:null;return((yield exports.Configs.destroy(Object.assign({where:{key:e}},{userId:o})).catch(O.error))||0)>0}))}static error(e){A.error(e.message,"api.config",x.API_CONSOLE_ERROR)}static get(e){return y(this,arguments,void 0,(function*(e,t=""){const[r]=(yield exports.Configs.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(O.error))||[];return r?r.value:t}))}static set(e,t,r){return y(this,void 0,void 0,(function*(){var o;const s=null!==(o=null==r?void 0:r.id)&&void 0!==o?o:null,[i]=(yield exports.Configs.findOrCreate(Object.assign({where:{key:e}},{userId:s})).catch(O.error))||[];i&&(i.value=t,yield i.save().catch(O.error))}))}}const w=e.parameterFactory((({ctx:e})=>{var t,r,o;return{userId:null!==(o=null===(r=null===(t=e.req)||void 0===t?void 0:t.user)||void 0===r?void 0:r.id)&&void 0!==o?o:null}})),E=e.parameterFactory((({ctx:e})=>e.req.auth)),R=e.parameterFactory((({ctx:e})=>e.req.user));class T{static all(e,t){return y(this,void 0,void 0,(function*(){return yield exports.Route.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:exports.GroupRoute,required:!0,include:[{model:exports.Group,required:!0,where:{state:!0},include:[{model:exports.UserGroup,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{A.error(e.message,"api.permission",x.API_CONSOLE_ERROR)}))}))}static get(e){return y(this,void 0,void 0,(function*(){const t=yield T.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return y(this,void 0,void 0,(function*(){const r=yield T.all(e,{name:t});return!!r&&r.length>0}))}}class D extends r.EventEmitter{auth(e,t,r,o,s){return y(this,void 0,void 0,(function*(){const{auth:i,error:n,user:d}=yield P.user(t,r,s);return n?e.error(n):i&&d?i.useragent&&i.useragent!=o?e.error("Invalid token"):(e.req.auth=i,e.req.user=d,void e.next()):e.error("Internal Server Error")}))}session(e,t,o){return y(this,void 0,void 0,(function*(){o.auth&&o.user&&(o.useragent?o.useragent!=t&&o.regenerate(r.noop):(o.useragent=t,o.save(r.noop))),e.next()}))}error(e){A.error(e.message,"api.controller",x.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r){return y(this,void 0,void 0,(function*(){return r?(yield T.is(r,t))?e.next():void e.unauthorized("Access denied"):e.unauthorized("Access denied")}))}read(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".read",r)}))}upload(t,r){r.path||(r.path=x.API_UPLOAD_TEMP),r.size||(r.size=x.API_UPLOAD_SIZE),r.field||(r.field=x.API_UPLOAD_FIELD),e.Upload.middleware(t,r)}validation(e,t){return y(this,void 0,void 0,(function*(){const{error:o,value:s}=yield r.Validation.object(t).parse().validateAsync(e.req.body);if(o)return e.validation(o);e.req.body=s,e.next()}))}write(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".write",r)}))}}l([c(0,e.Ctx()),c(1,e.Headers(x.API_KEY_HEADER)),c(2,e.Headers(x.API_TOKEN_HEADER)),c(3,e.Headers("user-agent")),c(4,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,String,S]),g("design:returntype",Promise)],D.prototype,"auth",null),l([c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Session()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object]),g("design:returntype",Promise)],D.prototype,"session",null),l([c(0,e.Ctx()),c(1,e.Argument()),c(2,R()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],D.prototype,"permission",null),l([c(0,e.Ctx()),c(1,e.Argument()),c(2,R()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],D.prototype,"read",null),l([c(0,e.Ctx()),c(1,e.Argument()),g("design:type",Function),g("design:paramtypes",[e.Context,Object]),g("design:returntype",void 0)],D.prototype,"upload",null),l([c(0,e.Ctx()),c(1,e.Argument()),g("design:type",Function),g("design:paramtypes",[e.Context,Object]),g("design:returntype",Promise)],D.prototype,"validation",null),l([c(0,e.Ctx()),c(1,e.Argument()),c(2,R()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],D.prototype,"write",null),exports.ModelController=class extends D{constructor(){super(...arguments),this._columns=[]}_add(t){return y(this,arguments,void 0,(function*({ctx:t,options:r,body:o,user:s}){var i;const n=null!==(i=null==s?void 0:s.id)&&void 0!==i?i:null,d=yield this.model().create(Object.assign(Object.assign({},t.req.body),o||{}),Object.assign(Object.assign({},r||{}),{userId:n})).catch(this.error);if(d){const r=this.key();return t.prepare(e.Status.OK,{[r]:d.getDataValue(r)}),d}t.error("Internal Server Error")}))}_all(t){return y(this,arguments,void 0,(function*({ctx:t,options:o,callback:s,scope:i}){var n,d,p,u,l,c;const g=this.scope(i),y=Object.assign({},o||{});y.where=Object.assign({},y.where||{});const h=t.req.query.limit,v=r.isString(h)?parseInt(h):x.API_MODEL_LIMIT;y.limit=v>=0?Math.min(v,x.API_MODEL_LIMIT_MAX):void 0;const m=t.req.query.offset;if(r.isString(m)){const e=m?parseInt(m):0;y.offset=e>0?e:void 0}const A=[],f=this.columns(),_=e=>f.indexOf(e)>=0,I=null===(n=t.req.query.asc)||void 0===n?void 0:n.toString();I&&I.length&&A.push(...I.split(",").filter(_).map((e=>[e,"ASC"])));const C=null===(d=t.req.query.desc)||void 0===d?void 0:d.toString();C&&C.length&&A.push(...C.split(",").filter(_).map((e=>[e,"DESC"]))),A.length&&(y.order=A);const P=[],S=null===(p=t.req.query.search)||void 0===p?void 0:p.toString();(r.isArray(y.attributes)?y.attributes:f).filter(r.isString).forEach((e=>{var r;if(S&&S.length&&P.push({[e]:{[a.Op.like]:`%${S}%`}}),"search_"+e in t.req.query){const o=null===(r=t.req.query["search_"+e])||void 0===r?void 0:r.toString();o&&o.length&&P.push({[e]:{[a.Op.like]:`%${o}%`}})}})),P.length&&(y.where=Object.assign(Object.assign({},y.where),{[a.Op.or]:[...P]}));const O=null!==(u=yield g.count(Object.assign(Object.assign({},y),{col:f[0]})).catch(this.error))&&void 0!==u?u:0,w=yield g.findAll(y).catch(this.error),E={count:O,limit:null!==(l=y.limit)&&void 0!==l?l:-1,offset:null!==(c=y.offset)&&void 0!==c?c:0};return w?(t.prepare(e.Status.OK,Object.assign(Object.assign({},E),{records:s?yield s(w):w})),Object.assign(Object.assign({},E),{records:w})):(t.error("Internal Server Error"),Object.assign(Object.assign({},E),{records:[]}))}))}columns(){return 0==this._columns.length&&(this._columns=Object.keys(this.model().getAttributes())),this._columns}_del(e){return y(this,arguments,void 0,(function*({ctx:e,options:t,user:r}){var o;const s=this.key(),{[s]:i}=e.req.params;if(!i)return e.error("Internal Server Error"),0;const n=null!==(o=null==r?void 0:r.id)&&void 0!==o?o:null,d=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[s]:i}),individualHooks:!0}),{userId:n})).catch(this.error);return d?(e.success("OK"),d):(e.notFound("Record not found"),0)}))}error(e){e.sql?A.error(e.message+"\n"+e.sql,"api.controller.sql",x.API_CONSOLE_ERROR):super.error(e)}_get(t){return y(this,arguments,void 0,(function*({ctx:t,options:r,callback:o,scope:s}){const i=this.key(),{[i]:n}=t.req.params,d=yield this.scope(s).findOne(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[i]:n})})).catch(this.error);return d?(t.prepare(e.Status.OK,o?yield o(d):d.toJSON()),d):null===d?t.notFound("Record not found"):void t.error("Internal Server Error")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}_set(e){return y(this,arguments,void 0,(function*({ctx:e,options:t,body:r,user:o}){var s,i;const n=this.key(),{[n]:d}=e.req.params,a=null!==(s=null==o?void 0:o.id)&&void 0!==s?s:null,[p]=null!==(i=yield this.model().update(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[n]:d}),individualHooks:!0}),{userId:a})).catch(this.error))&&void 0!==i?i:[];return p?(e.success("OK"),!0):(e.success("Record not changed"),!1)}))}},exports.ModelController=l([e.Extends(D)],exports.ModelController),exports.AuditsController=class extends exports.ModelController{model(){return exports.Audit}all(e,t,r){return y(this,void 0,void 0,(function*(){const o={};t&&(o.type=t),r&&(o.table=r),yield this._all({ctx:e,options:{attributes:{exclude:["data"]},where:o,order:[["created","DESC"]]}})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}},l([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),c(1,e.Query("type")),c(2,e.Query("table")),g("design:type",Function),g("design:paramtypes",[e.Context,String,String]),g("design:returntype",Promise)],exports.AuditsController.prototype,"all",null),l([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.AuditsController.prototype,"get",null),exports.AuditsController=l([e.Controller("/audits"),e.Extends(exports.ModelController)],exports.AuditsController),exports.AuthController=class extends D{login(e,o,s,i,n){return y(this,void 0,void 0,(function*(){var d;yield r.sleep(x.API_SLEEP_AUTH);const p=yield exports.User.scope("password").findOne({where:{[a.Op.or]:[{email:s},{username:s}]}}).catch(this.error);if(i+=null!==(d=null==p?void 0:p.salt)&&void 0!==d?d:"",!p||p.password!=t.sha256(i))return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const u=yield exports.Register.findOne({where:{state:!0,userId:p.id}}).catch(this.error);if(u)return e.error("Activation required"),n.emit("auth.activation",{ctx:e,register:u,user:p}),void this.emit("auth.activation",{ctx:e,register:u,user:p});if(!p.state)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e,user:p}),void this.emit("auth.failure",{ctx:e,user:p});const{auth:l,error:c,token:g}=yield P.create(p);return c?(e.error(c),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):l&&g?(l.useragent=o,yield l.save().catch(this.error),e.json({token:g}),n.emit("auth.login",{auth:l,ctx:e,user:p}),void this.emit("auth.login",{auth:l,ctx:e,user:p})):(e.error("Internal Server Error"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,r,o){return y(this,void 0,void 0,(function*(){if(yield P.destroy(t))return e.success("Disconcerted"),o.emit("auth.logout",{auth:t,ctx:e,user:r}),void this.emit("auth.logout",{auth:t,ctx:e,user:r});e.unauthorized("Access denied")}))}renew(e,t,r,o){return y(this,void 0,void 0,(function*(){const{auth:s,error:i,token:n}=yield P.renew(r);return i?e.error(i):s?(s.useragent=t,yield s.save().catch(this.error),e.json({token:n}),o.emit("auth.renew",{auth:s,ctx:e}),void this.emit("auth.renew",{auth:s,ctx:e})):e.error("Internal Server Error")}))}user(e,t){return y(this,void 0,void 0,(function*(){const r=yield T.all(t);if(!r)return e.error("Internal Server Error");e.json(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))}))}))}},l([e.Post("/login"),e.Middleware("validation",{username:r.Validation.string().min(3).required(),password:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Body("username")),c(3,e.Body("password")),c(4,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,String,S]),g("design:returntype",Promise)],exports.AuthController.prototype,"login",null),l([e.Get("/logout"),e.Middleware("auth"),c(0,e.Ctx()),c(1,E()),c(2,R()),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.Auth,exports.User,S]),g("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),l([e.Post("/renew"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Body("token")),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,S]),g("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),l([e.Get(),e.Middleware("auth"),c(0,e.Ctx()),c(1,R()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=l([e.Controller("/auth"),e.Extends(D)],exports.AuthController),exports.FilesController=class extends D{directory(){return x.API_HTTP_PUBLIC||"./"}files(e){return y(this,void 0,void 0,(function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const o=u.join(this.directory(),t);if(!n.existsSync(o)||!n.statSync(o).isDirectory())return e.notFound("Path not Found");let s=[];return s=n.readdirSync(o),s=s.map((e=>this.info(u.join(o,e)))),s=s.filter(r.isDef),Object.assign(Object.assign({},this.info(o)),{files:s})}))}access(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,this.name()+"."+t,r)}))}info(e){if(!n.existsSync(e))return null;const t=n.statSync(e),r=e.split("/").pop();e=e.replace(this.directory(),"/").replace(/^\/\//,"/");const o=t.isDirectory();return{name:r,path:e.replace(/^\/\//,"/"),size:t.size,extension:o?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:o,symlink:t.isSymbolicLink()}}name(){return"files"}},l([e.Get("/path/?*"),e.Middleware("auth"),e.Middleware("access","list"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.FilesController.prototype,"files",null),l([c(0,e.Ctx()),c(1,e.Argument()),c(2,R()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],exports.FilesController.prototype,"access",null),exports.FilesController=l([e.Controller("/files"),e.Extends(D)],exports.FilesController),exports.ForgotController=class extends D{check(e,t){return y(this,void 0,void 0,(function*(){const o=yield this.find(t);if(!o||!o.user)return e.notFound("User not found");o.token=r.uniqueID(),yield o.save(),e.json({token:o.token})}))}forgot(e,t,o){return y(this,void 0,void 0,(function*(){yield r.sleep(x.API_SLEEP_FORGOT);const s=t,i=yield exports.User.findOne({where:{[a.Op.or]:[{email:s},{username:t}]}}).catch(this.error);if(!i)return e.notFound("User not found");const n=r.uniqueID(),d=Date.now()+6e4*x.API_TOKEN_FORGOT,p=yield exports.Forgot.create({token:n,timestamp:d,state:!0,userId:i.id});e.success("OK"),o.emit("forgot.send",{ctx:e,forgot:p,user:i}),this.emit("forgot.send",{ctx:e,forgot:p,user:i})}))}reset(e,r,o,s){return y(this,void 0,void 0,(function*(){const i=yield this.find(r);if(!i)return e.notFound("User not found");i.state=!1,yield i.save().catch(this.error),i.user.password=t.sha256(o),yield i.user.save().catch(this.error),e.success("OK"),s.emit("forgot.reset",{ctx:e,user:i.user}),this.emit("forgot.reset",{ctx:e,user:i.user})}))}find(e){return y(this,void 0,void 0,(function*(){return yield exports.Forgot.findOne({where:{token:e,state:!0},include:[{model:exports.User,required:!0}]}).catch(this.error)}))}},l([e.Get("/check"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Body("token")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),l([e.Post(),e.Middleware("validation",{username:r.Validation.string().min(4).required()}),c(0,e.Ctx()),c(1,e.Body("username")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,S]),g("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),l([e.Post("/reset"),e.Middleware("validation",{token:r.Validation.string().required(),password:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Body("token")),c(2,e.Body("password")),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,S]),g("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=l([e.Controller("/forgot"),e.Extends(D)],exports.ForgotController),exports.CrudController=class extends exports.ModelController{constructor(){super(...arguments),this._crud={}}add(e,t){return y(this,void 0,void 0,(function*(){yield this._add({ctx:e,user:t})}))}all(e){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}create(){return this._crud}del(e,t){return y(this,void 0,void 0,(function*(){yield this._del({ctx:e,user:t})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,t){return y(this,void 0,void 0,(function*(){yield this._set({ctx:e,user:t})}))}update(){return this._crud}validationAdd(e){return y(this,void 0,void 0,(function*(){const t=this.create();if(t==this._crud)return e.error("Internal Server Error");yield this.validation(e,t)}))}validationSet(e){return y(this,void 0,void 0,(function*(){const t=this.update();if(t==this._crud)return e.error("Internal Server Error");yield this.validation(e,t)}))}},l([e.Post(),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationAdd"),c(0,e.Ctx()),c(1,R()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.CrudController.prototype,"add",null),l([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"all",null),l([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,R()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.CrudController.prototype,"del",null),l([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"get",null),l([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationSet"),c(0,e.Ctx()),c(1,R()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.CrudController.prototype,"set",null),l([c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"validationAdd",null),l([c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"validationSet",null),exports.CrudController=l([e.Extends(exports.ModelController)],exports.CrudController),exports.GroupsController=class extends exports.CrudController{model(){return exports.Group}create(){return{name:r.Validation.string().required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}}update(){return{name:r.Validation.string().empty(),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}}},exports.GroupsController=l([e.Controller("/groups"),e.Extends(exports.CrudController)],exports.GroupsController),exports.GroupsRoutesController=class extends exports.ModelController{model(){return exports.GroupRoute}all(e,t){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{groupId:t},include:[{model:exports.Route,required:!0}]},callback:e=>e.map((e=>e.route))})}))}set(e,t,o,s){return y(this,void 0,void 0,(function*(){const i=yield exports.Group.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield exports.GroupRoute.destroy(Object.assign({where:{groupId:t}},s)),o){let e=0;for(let r=0;r<o.length;r++)e=yield exports.Route.count({where:{id:o[r]}}),e&&(yield exports.GroupRoute.create({groupId:t,routeId:o[r]},Object.assign({},s)))}return e.success("OK")}if(r.isNull(i))return e.notFound("Record not found");e.error("Internal Server Error")}))}},l([e.Get("/:id/routes"),e.Middleware("auth"),e.Middleware("read","groups"),c(0,e.Ctx()),c(1,e.Params("id")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"all",null),l([e.Put("/:id/routes"),e.Middleware("auth"),e.Middleware("write","groups"),e.Middleware("validation",{routes:r.Validation.array(r.Validation.number().parse())}),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.Body("routes")),c(3,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Array,Object]),g("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"set",null),exports.GroupsRoutesController=l([e.Controller("/groups"),e.Extends(exports.ModelController)],exports.GroupsRoutesController),exports.LogsController=class extends exports.ModelController{model(){return exports.Log}all(e,t,r){return y(this,void 0,void 0,(function*(){const o={};t&&(o.type=t),r&&(o.source=r),yield this._all({ctx:e,options:{where:o,order:[["created","DESC"]]}})}))}},l([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),c(1,e.Query("type")),c(2,e.Query("source")),g("design:type",Function),g("design:paramtypes",[e.Context,String,String]),g("design:returntype",Promise)],exports.LogsController.prototype,"all",null),exports.LogsController=l([e.Controller("/logs"),e.Extends(exports.ModelController)],exports.LogsController),exports.RegisterController=class extends D{register(e,o,s){return y(this,void 0,void 0,(function*(){yield r.sleep(x.API_SLEEP_REGISTRY);const{name:i,date:n,email:d,username:p,password:u,confirm:l}=o,c=p||d,g=t.sha256(u);if(yield exports.User.count({where:{[a.Op.or]:[{email:d},{username:c}]}}).catch(this.error))return e.validation("Invalid email or username");if(g!=t.sha256(l))return e.error("Invalid password");const y=yield exports.User.create({name:i,email:d,username:c,password:g,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!y)return e.error("Internal Server Error");const h=yield exports.Register.create({token:yield this.getId(),userId:y.id,state:!0}).catch(this.error);if(!h)return y.destroy(),e.error("Internal Server Error");e.success("OK"),s.emit("register.user",{ctx:e,register:h,user:y}),this.emit("register.user",{ctx:e,register:h,user:y})}))}confirm(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield exports.Register.findOne({where:{token:t,state:!0},include:[{model:exports.User,required:!0}]}).catch(this.error);if(!o)return e.notFound("User not found");o.state=!1,yield o.save().catch(this.error),o.user.state=!0,yield o.user.save().catch(this.error),e.success("OK"),r.emit("register.confirm",{ctx:e,register:o,user:o.user}),this.emit("register.confirm",{ctx:e,register:o,user:o.user})}))}send(e,t,r){return y(this,void 0,void 0,(function*(){const o=t,s=yield exports.Register.findOne({where:{state:!0},include:[{model:exports.User,required:!0,where:{[a.Op.or]:[{email:o},{username:t}]}}]}).catch(this.error);if(!s)return e.notFound("User not found");e.success("OK"),r.emit("register.send",{ctx:e,register:s,user:s.user}),this.emit("register.send",{ctx:e,register:s,user:s.user})}))}getId(){return y(this,void 0,void 0,(function*(){const e=r.uuidv4();return(yield exports.Register.count({where:{token:e}}))?this.getId():e}))}},l([e.Post(),e.Middleware("validation",{name:r.Validation.string().required(),date:r.Validation.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()),g("design:type",Function),g("design:paramtypes",[e.Context,Object,S]),g("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),l([e.Post("/confirm"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Body("token")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,S]),g("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),l([e.Post("/send"),e.Middleware("validation",{username:r.Validation.string().min(4).required()}),c(0,e.Ctx()),c(1,e.Body("username")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,S]),g("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=l([e.Controller("/register"),e.Extends(D)],exports.RegisterController),exports.RoutesController=class extends exports.CrudController{model(){return exports.Route}create(){return{name:r.Validation.string().required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}}update(){return{name:r.Validation.string().empty(),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}}},exports.RoutesController=l([e.Controller("/routes"),e.Extends(exports.CrudController)],exports.RoutesController),exports.SetupController=class extends D{setup(e){return y(this,void 0,void 0,(function*(){if(0==(yield exports.User.count())){const e=r.uniqueID(),o=yield exports.User.create({name:"Admin",email:"admin@localhost",username:"admin",password:t.sha256("admin"+e),salt:e,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0}),s={description:"API CORE",state:!0},i=yield exports.Group.create(Object.assign({name:"admin"},s));yield exports.UserGroup.create({userId:o.id,groupId:i.id});const n=["read","write"],d=["audits","users","groups","routes"];yield r.forEachSeries(d,(e=>y(this,void 0,void 0,(function*(){yield r.forEachSeries(n,(t=>y(this,void 0,void 0,(function*(){const r=yield exports.Route.create(Object.assign({name:`${e}.${t}`},s));yield exports.GroupRoute.create({groupId:i.id,routeId:r.id})}))))}))));const a=["delete","list","read","rename","upload","write"];yield r.forEachSeries(a,(e=>y(this,void 0,void 0,(function*(){const t=yield exports.Route.create(Object.assign({name:`files.${e}`},s));yield exports.GroupRoute.create({groupId:i.id,routeId:t.id})}))));const p=["logs"];yield r.forEachSeries(p,(e=>y(this,void 0,void 0,(function*(){const t=yield exports.Route.create(Object.assign({name:`${e}.read`},s));yield exports.GroupRoute.create({groupId:i.id,routeId:t.id})}))))}e.success("OK")}))}},l([e.Get(),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=l([e.Controller("/setup"),e.Extends(D)],exports.SetupController),exports.UsersController=class extends exports.ModelController{model(){return exports.User}constructor(){super(),this.dir=x.API_HTTP_PUBLIC+"/avatar",x.API_HTTP_PUBLIC&&n.existsSync(x.API_HTTP_PUBLIC)&&!n.existsSync(this.dir)&&n.mkdirSync(this.dir)}avatar(e,t,r,o){return y(this,void 0,void 0,(function*(){if(t.length){const s=t[0].filename||"";if(s){const t=this.dir+"/"+r.avatar;if(n.existsSync(t)&&n.lstatSync(t).isFile()&&n.rmSync(t),r.avatar=s,yield r.save(Object.assign({},o)).catch(this.error))return e.success("OK")}}e.success("Record not changed")}))}avatar_remove(e,t,r){return y(this,void 0,void 0,(function*(){const o=this.dir+"/"+t.avatar;t.avatar="",(yield t.save(Object.assign({},r)).catch(this.error))&&n.existsSync(o)&&n.rmSync(o),e.success("OK")}))}password(e,o,s,i,n){return y(this,void 0,void 0,(function*(){var d;const a=yield this.scope("password").findOne({where:{id:i.id,state:!0}}).catch(this.error);return o+=null!==(d=null==a?void 0:a.salt)&&void 0!==d?d:"",a&&a.password==t.sha256(o)?(a.salt=r.uniqueID(),a.password=t.sha256(s+a.salt),(yield a.save(Object.assign({},n)).catch(this.error))?e.success("OK"):void e.success("Record not changed")):e.error("Record not changed")}))}token(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.model().findOne({attributes:["token"],where:{id:t.id}}).catch(this.error);if(o)return e.json({token:r.hash.decrypt(o.token)});e.notFound("Record not found")}))}token_get(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.scope("token").findOne({where:{id:t}}).catch(this.error);if(o)return e.json({token:r.hash.decrypt(o.token)});e.notFound("Record not found")}))}token_remove(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(o)return o.token="",yield o.save(Object.assign({},r)).catch(this.error),e.success("OK");e.notFound("Record not found")}))}token_renew(e,t,r,o){return y(this,void 0,void 0,(function*(){const s=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(s){const t=yield this.token_new();return s.token=o.hash.encrypt(t),yield s.save(Object.assign({},r)).catch(this.error),e.json({token:t})}e.notFound("Record not found")}))}token_new(){return y(this,void 0,void 0,(function*(){var e;const t=r.uuidv4();return(null!==(e=yield this.model().count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t}))}add(e,o,s){return y(this,void 0,void 0,(function*(){const i=r.uniqueID();yield this._add({ctx:e,body:{password:t.sha256(o+i),salt:i},user:s})}))}all(e){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}del(e,t,r){return y(this,void 0,void 0,(function*(){if(r.id.toString()==t)return e.notFound("Record not found");yield this._del({ctx:e,user:r})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,o,s){return y(this,void 0,void 0,(function*(){const i=r.uniqueID();yield this._set({ctx:e,body:o?{password:t.sha256(o+i),salt:i}:{},user:s})}))}},l([e.Post("/avatar"),e.Middleware("auth"),e.Middleware("upload",(e=>({count:1,field:"file",path:e.controller.dir,types:["image/bmp","image/jpeg","image/png"],size:32}))),c(0,e.Ctx()),c(1,e.Files()),c(2,R()),c(3,w()),g("design:type",Function),g("design:paramtypes",[e.Context,Array,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),l([e.Get("/avatar/remove"),e.Middleware("auth"),c(0,e.Ctx()),c(1,R()),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"avatar_remove",null),l([e.Post("/password"),e.Middleware("auth"),e.Middleware("validation",{oldPassword:r.Validation.string().min(5).required(),newPassword:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Body("oldPassword")),c(2,e.Body("newPassword")),c(3,R()),c(4,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"password",null),l([e.Get("/token"),e.Middleware("auth"),c(0,e.Ctx()),c(1,R()),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User,S]),g("design:returntype",Promise)],exports.UsersController.prototype,"token",null),l([e.Get("/token/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,S]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_get",null),l([e.Get("/token/remove/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_remove",null),l([e.Get("/token/renew/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,w()),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object,S]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_renew",null),l([e.Post(),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validation",{name:r.Validation.string().required(),email:r.Validation.string().email().required(),username:r.Validation.string().min(4).required(),password:r.Validation.string().min(5).required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}),c(0,e.Ctx()),c(1,e.Body("password")),c(2,R()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],exports.UsersController.prototype,"add",null),l([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.UsersController.prototype,"all",null),l([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,R()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],exports.UsersController.prototype,"del",null),l([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.UsersController.prototype,"get",null),l([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validation",{name:r.Validation.string().empty(),email:r.Validation.string().email().empty(),username:r.Validation.string().min(4).empty(),password:r.Validation.string().min(5).empty().filter(""),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}),c(0,e.Ctx()),c(1,e.Body("password")),c(2,R()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=l([e.Controller("/users"),e.Extends(exports.ModelController),g("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class extends exports.ModelController{model(){return exports.UserGroup}groups(e,t){return y(this,void 0,void 0,(function*(){yield this.all(e,t.id.toString())}))}all(e,t){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{userId:t},include:[{model:exports.Group,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,o,s){return y(this,void 0,void 0,(function*(){const i=yield exports.User.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){if(yield exports.UserGroup.destroy(Object.assign({where:{userId:i.id}},s)),o){let e=0;for(let t=0;t<o.length;t++)e=yield exports.Group.count({where:{id:o[t]}}),e&&(yield exports.UserGroup.create({userId:i.id,groupId:o[t]},Object.assign({},s)))}return e.success("OK")}if(r.isNull(i))return e.notFound("Record not found");e.error("Internal Server Error")}))}},l([e.Get("/groups"),e.Middleware("auth"),c(0,e.Ctx()),c(1,R()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"groups",null),l([e.Get("/:id/groups"),e.Middleware("auth"),e.Middleware("read","users"),c(0,e.Ctx()),c(1,e.Params("id")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),l([e.Put("/:id/groups"),e.Middleware("auth"),e.Middleware("write","users"),e.Middleware("validation",{groups:r.Validation.array(r.Validation.number().parse())}),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.Body("groups")),c(3,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Array,Object]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=l([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersGroupsController),exports.Application=S,exports.Config=O,exports.ControllerBase=D,exports.Env=x,exports.Logs=A,exports.Model=v,exports.Permission=T,exports.ReqAudit=w,exports.ReqAuth=E,exports.ReqUser=R,exports.Token=P,exports.audit=m,exports.conn=h,exports.crt=_,exports.key=I;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @andrewcaires/api v3.2.7
2
+ * @andrewcaires/api v4.0.1
3
3
  * Simple api for small applications using express, jsonwebtoken, sequelize and websocket
4
4
  * (c) 2024 Andrew Caires
5
5
  * @license: MIT
@@ -7,22 +7,53 @@
7
7
  import { Context, IStore, IUpload, Application as Application$1, IFile } from '@andrewcaires/express';
8
8
  import { Hash } from '@andrewcaires/node';
9
9
  import WebSocket from 'ws';
10
- import { EventEmitter, TypeObject, ValidationBase, TypeObjectString, TypeObjectAny } from '@andrewcaires/utils.js';
11
- import { Model, CreateOptions, Attributes, FindOptions, UpdateOptions, ModelStatic, Sequelize, WhereOptions } from 'sequelize';
10
+ import { EventEmitter, TypeObject, ValidationBase, TypeObjectAny, TypeObjectString } from '@andrewcaires/utils.js';
11
+ import { Model as Model$1, Connection } from '@andrewcaires/sequelize';
12
+ import { Model as Model$2, CreateOptions, Attributes, FindOptions, UpdateOptions, ModelStatic, WhereOptions } from 'sequelize';
13
+
14
+ declare class Model extends Model$1 {
15
+ }
16
+
17
+ declare class Auth extends Model {
18
+ id: number;
19
+ secret: string;
20
+ logout: Date;
21
+ useragent: string;
22
+ createdAt: Date;
23
+ updatedAt: Date;
24
+ deletedAt: Date;
25
+ userId: number;
26
+ user: User;
27
+ }
28
+
29
+ declare class Register extends Model {
30
+ id: number;
31
+ token: string;
32
+ state: boolean;
33
+ createdAt: Date;
34
+ updatedAt: Date;
35
+ deletedAt: Date;
36
+ userId: number;
37
+ user: User;
38
+ }
12
39
 
13
40
  declare class Route extends Model {
14
41
  id: number;
15
42
  name: string;
16
43
  description: string;
17
44
  state: boolean;
45
+ createdAt: Date;
46
+ updatedAt: Date;
47
+ deletedAt: Date;
18
48
  groups_routes: Array<GroupRoute>;
19
49
  }
20
50
 
21
51
  declare class GroupRoute extends Model {
22
- group: Group;
52
+ createdAt: Date;
23
53
  groupId: number;
24
- route: Route;
54
+ group: Group;
25
55
  routeId: number;
56
+ route: Route;
26
57
  }
27
58
 
28
59
  declare class Group extends Model {
@@ -30,15 +61,19 @@ declare class Group extends Model {
30
61
  name: string;
31
62
  description: string;
32
63
  state: boolean;
64
+ createdAt: Date;
65
+ updatedAt: Date;
66
+ deletedAt: Date;
33
67
  groups_routes: Array<GroupRoute>;
34
68
  users_groups: Array<UserGroup>;
35
69
  }
36
70
 
37
71
  declare class UserGroup extends Model {
38
- user: User;
39
- userId: number;
40
- group: Group;
72
+ createdAt: Date;
41
73
  groupId: number;
74
+ group: Group;
75
+ userId: number;
76
+ user: User;
42
77
  }
43
78
 
44
79
  declare class User extends Model {
@@ -53,21 +88,34 @@ declare class User extends Model {
53
88
  date: string;
54
89
  description: string;
55
90
  state: boolean;
91
+ createdAt: Date;
92
+ updatedAt: Date;
93
+ deletedAt: Date;
94
+ audits: Array<Audit>;
95
+ auths: Array<Auth>;
96
+ registers: Array<Register>;
56
97
  users_groups: Array<UserGroup>;
57
98
  }
58
99
 
59
- declare class Auth extends Model {
100
+ declare class Audit extends Model {
60
101
  id: number;
61
- secret: string;
62
- logout: Date;
63
- useragent: string;
64
- user: User;
102
+ type: string;
103
+ model: string;
104
+ record: string;
105
+ data: string;
106
+ state: boolean;
107
+ createdAt: Date;
108
+ updatedAt: Date;
109
+ deletedAt: Date;
65
110
  userId: number;
111
+ user: User;
66
112
  }
67
113
 
68
114
  declare class Configs extends Model {
69
115
  key: string;
70
116
  value: string;
117
+ createdAt: Date;
118
+ updatedAt: Date;
71
119
  }
72
120
 
73
121
  declare class Forgot extends Model {
@@ -75,28 +123,26 @@ declare class Forgot extends Model {
75
123
  token: string;
76
124
  timestamp: number;
77
125
  state: boolean;
78
- user: User;
126
+ createdAt: Date;
127
+ updatedAt: Date;
128
+ deletedAt: Date;
79
129
  userId: number;
130
+ user: User;
80
131
  }
81
132
 
82
133
  declare class Log extends Model {
83
134
  type: string;
84
135
  source: string;
85
136
  message: string;
86
- }
87
-
88
- declare class Register extends Model {
89
- id: number;
90
- token: string;
91
- state: boolean;
92
- user: User;
93
- userId: number;
137
+ createdAt: Date;
94
138
  }
95
139
 
96
140
  declare class Session extends Model {
97
141
  session: string;
98
142
  json: string;
99
143
  expired: number;
144
+ createdAt: Date;
145
+ updatedAt: Date;
100
146
  }
101
147
 
102
148
  declare abstract class ControllerBase extends EventEmitter {
@@ -121,69 +167,58 @@ declare class Application extends Application$1 {
121
167
  websocket(): WebSocket.Server | undefined;
122
168
  }
123
169
 
170
+ declare const audit: {
171
+ afterCreate: (record: Model, options: TypeObjectAny) => Promise<void>;
172
+ afterUpdate: (record: Model, options: TypeObjectAny) => Promise<void>;
173
+ afterDestroy: (record: Model, options: TypeObjectAny) => Promise<void>;
174
+ };
175
+
124
176
  declare class Config {
125
177
  static all(): Promise<TypeObjectString>;
126
- static del(key: string): Promise<boolean>;
178
+ static del(key: string, user?: User): Promise<boolean>;
127
179
  private static error;
128
180
  static get(key: string, value?: string): Promise<string>;
129
- static set(key: string, value: string): Promise<void>;
130
- }
131
-
132
- declare class AuthController extends ControllerBase {
133
- protected login(ctx: Context, useragent: string, username: string, password: string, app: Application): Promise<void>;
134
- protected logout(ctx: Context, auth: Auth, user: User, app: Application): Promise<void>;
135
- protected renew(ctx: Context, useragent: string, old: string, app: Application): Promise<void>;
136
- protected user(ctx: Context, user: User): Promise<void>;
137
- }
138
-
139
- declare class FilesController extends ControllerBase {
140
- directory(): string;
141
- files(ctx: Context): Promise<TypeObjectAny | void>;
142
- access(ctx: Context, name: string, user: User): Promise<void>;
143
- private info;
144
- name(): string;
181
+ static set(key: string, value: string, user?: User): Promise<void>;
145
182
  }
146
183
 
147
- declare class ForgotController extends ControllerBase {
148
- check(ctx: Context, token: string): Promise<void>;
149
- forgot(ctx: Context, username: string, app: Application): Promise<void>;
150
- reset(ctx: Context, token: string, password: string, app: Application): Promise<void>;
151
- private find;
152
- }
184
+ declare const conn: Connection;
153
185
 
154
- interface ArgumentsModelAdd<M extends Model<M>> {
186
+ interface ArgumentsModelAdd<M extends Model$2<M>> {
155
187
  ctx: Context;
156
188
  options?: CreateOptions<Attributes<M>>;
157
189
  body?: TypeObjectAny;
190
+ user?: User;
158
191
  }
159
192
 
160
193
  type CallbackModelAll<M> = (records: Array<M>) => Array<any> | Promise<Array<any>>;
161
194
 
162
- interface ArgumentsModelAll<M extends Model<M>> {
195
+ interface ArgumentsModelAll<M extends Model$2<M>> {
163
196
  ctx: Context;
164
197
  options?: FindOptions<Attributes<M>>;
165
198
  callback?: CallbackModelAll<M>;
166
199
  scope?: string;
167
200
  }
168
201
 
169
- interface ArgumentsModelDel<M extends Model<M>> {
202
+ interface ArgumentsModelDel<M extends Model$2<M>> {
170
203
  ctx: Context;
171
204
  options?: FindOptions<Attributes<M>>;
205
+ user?: User;
172
206
  }
173
207
 
174
208
  type CallbackModelGet<M> = (records: M) => any | Promise<any>;
175
209
 
176
- interface ArgumentsModelGet<M extends Model<M>> {
210
+ interface ArgumentsModelGet<M extends Model$2<M>> {
177
211
  ctx: Context;
178
212
  options?: FindOptions<Attributes<M>>;
179
213
  callback?: CallbackModelGet<M>;
180
214
  scope?: string;
181
215
  }
182
216
 
183
- interface ArgumentsModelSet<M extends Model<M>> {
217
+ interface ArgumentsModelSet<M extends Model$2<M>> {
184
218
  ctx: Context;
185
219
  options?: UpdateOptions<Attributes<M>>;
186
220
  body?: TypeObjectAny;
221
+ user?: User;
187
222
  }
188
223
 
189
224
  interface IDatabaseOptions {
@@ -203,38 +238,67 @@ interface ITokenParameters {
203
238
  user?: User;
204
239
  }
205
240
 
206
- interface ResultModelAll<M extends Model<M>> {
241
+ interface ResultModelAll<M extends Model$2<M>> {
207
242
  count: number;
208
243
  limit: number;
209
244
  offset: number;
210
245
  records: Array<M>;
211
246
  }
212
247
 
213
- declare abstract class ModelController<M extends Model<M>> extends ControllerBase {
248
+ declare abstract class ModelController<M extends Model$2<M>> extends ControllerBase {
214
249
  private _columns;
215
- protected _add({ ctx, options, body }: ArgumentsModelAdd<M>): Promise<M | void>;
250
+ protected _add({ ctx, options, body, user }: ArgumentsModelAdd<M>): Promise<M | void>;
216
251
  protected _all({ ctx, options, callback, scope }: ArgumentsModelAll<M>): Promise<ResultModelAll<M>>;
217
- protected columns(): string[];
218
- protected _del({ ctx, options }: ArgumentsModelDel<M>): Promise<number>;
252
+ protected columns(): Array<string>;
253
+ protected _del({ ctx, options, user }: ArgumentsModelDel<M>): Promise<number>;
219
254
  error(error: any): void;
220
255
  protected _get({ ctx, options, callback, scope }: ArgumentsModelGet<M>): Promise<M | void>;
221
256
  key(): string;
222
257
  abstract model(): ModelStatic<M>;
223
258
  name(): string;
224
259
  scope(name?: string): ModelStatic<M>;
225
- protected _set({ ctx, options, body }: ArgumentsModelSet<M>): Promise<boolean>;
260
+ protected _set({ ctx, options, body, user }: ArgumentsModelSet<M>): Promise<boolean>;
261
+ }
262
+
263
+ declare class AuditsController extends ModelController<Audit> {
264
+ model(): typeof Audit;
265
+ protected all(ctx: Context, type: string, table: string): Promise<void>;
266
+ protected get(ctx: Context): Promise<void>;
226
267
  }
227
268
 
228
- declare abstract class CrudController<M extends Model<M>> extends ModelController<M> {
229
- add(ctx: Context): Promise<void>;
230
- all(ctx: Context): Promise<void>;
269
+ declare class AuthController extends ControllerBase {
270
+ protected login(ctx: Context, useragent: string, username: string, password: string, app: Application): Promise<void>;
271
+ protected logout(ctx: Context, auth: Auth, user: User, app: Application): Promise<void>;
272
+ protected renew(ctx: Context, useragent: string, old: string, app: Application): Promise<void>;
273
+ protected user(ctx: Context, user: User): Promise<void>;
274
+ }
275
+
276
+ declare class FilesController extends ControllerBase {
277
+ directory(): string;
278
+ protected files(ctx: Context): Promise<TypeObjectAny | void>;
279
+ protected access(ctx: Context, name: string, user: User): Promise<void>;
280
+ private info;
281
+ name(): string;
282
+ }
283
+
284
+ declare class ForgotController extends ControllerBase {
285
+ protected check(ctx: Context, token: string): Promise<void>;
286
+ protected forgot(ctx: Context, username: string, app: Application): Promise<void>;
287
+ protected reset(ctx: Context, token: string, password: string, app: Application): Promise<void>;
288
+ private find;
289
+ }
290
+
291
+ declare abstract class CrudController<M extends Model$2<M>> extends ModelController<M> {
292
+ private _crud;
293
+ protected add(ctx: Context, user: User): Promise<void>;
294
+ protected all(ctx: Context): Promise<void>;
231
295
  create(): TypeObject<ValidationBase>;
232
- del(ctx: Context): Promise<void>;
233
- get(ctx: Context): Promise<void>;
234
- set(ctx: Context): Promise<void>;
296
+ protected del(ctx: Context, user: User): Promise<void>;
297
+ protected get(ctx: Context): Promise<void>;
298
+ protected set(ctx: Context, user: User): Promise<void>;
235
299
  update(): TypeObject<ValidationBase>;
236
- validationAdd(ctx: Context): Promise<void>;
237
- validationSet(ctx: Context): Promise<void>;
300
+ protected validationAdd(ctx: Context): Promise<void>;
301
+ protected validationSet(ctx: Context): Promise<void>;
238
302
  }
239
303
 
240
304
  declare class GroupsController extends CrudController<Group> {
@@ -245,8 +309,8 @@ declare class GroupsController extends CrudController<Group> {
245
309
 
246
310
  declare class GroupsRoutesController extends ModelController<GroupRoute> {
247
311
  model(): typeof GroupRoute;
248
- all(ctx: Context, groupId: string): Promise<void>;
249
- set(ctx: Context, id: string, routes: Array<number>): Promise<void>;
312
+ protected all(ctx: Context, groupId: string): Promise<void>;
313
+ protected set(ctx: Context, id: string, routes: Array<number>, audit: TypeObjectAny): Promise<void>;
250
314
  }
251
315
 
252
316
  declare class LogsController extends ModelController<Log> {
@@ -256,8 +320,8 @@ declare class LogsController extends ModelController<Log> {
256
320
 
257
321
  declare class RegisterController extends ControllerBase {
258
322
  protected register(ctx: Context, body: TypeObjectAny, app: Application): Promise<void>;
259
- confirm(ctx: Context, token: string, app: Application): Promise<void>;
260
- send(ctx: Context, username: string, app: Application): Promise<void>;
323
+ protected confirm(ctx: Context, token: string, app: Application): Promise<void>;
324
+ protected send(ctx: Context, username: string, app: Application): Promise<void>;
261
325
  private getId;
262
326
  }
263
327
 
@@ -275,37 +339,28 @@ declare class UsersController extends ModelController<User> {
275
339
  dir: string;
276
340
  model(): typeof User;
277
341
  constructor();
278
- protected avatar(ctx: Context, files: Array<IFile>, user: User): Promise<void>;
279
- protected avatar_remove(ctx: Context, user: User): Promise<void>;
280
- protected password(ctx: Context, oldPassword: string, newPassword: string, user: User): Promise<void>;
342
+ protected avatar(ctx: Context, files: Array<IFile>, user: User, audit: TypeObjectAny): Promise<void>;
343
+ protected avatar_remove(ctx: Context, user: User, audit: TypeObjectAny): Promise<void>;
344
+ protected password(ctx: Context, oldPassword: string, newPassword: string, user: User, audit: TypeObjectAny): Promise<void>;
281
345
  protected token(ctx: Context, user: User, app: Application): Promise<void>;
282
346
  protected token_get(ctx: Context, id: string, app: Application): Promise<void>;
283
- protected token_remove(ctx: Context, id: string): Promise<void>;
284
- protected token_renew(ctx: Context, id: string, app: Application): Promise<void>;
347
+ protected token_remove(ctx: Context, id: string, audit: TypeObjectAny): Promise<void>;
348
+ protected token_renew(ctx: Context, id: string, audit: TypeObjectAny, app: Application): Promise<void>;
285
349
  private token_new;
286
- protected add(ctx: Context, password: string): Promise<void>;
350
+ protected add(ctx: Context, password: string, user: User): Promise<void>;
287
351
  protected all(ctx: Context): Promise<void>;
288
- protected del(ctx: Context, user: User, id: string): Promise<void>;
352
+ protected del(ctx: Context, id: string, user: User): Promise<void>;
289
353
  protected get(ctx: Context): Promise<void>;
290
- protected set(ctx: Context, password: string): Promise<void>;
354
+ protected set(ctx: Context, password: string, user: User): Promise<void>;
291
355
  }
292
356
 
293
357
  declare class UsersGroupsController extends ModelController<UserGroup> {
294
358
  model(): typeof UserGroup;
295
- all(ctx: Context, userId: string): Promise<void>;
296
- set(ctx: Context, id: string, groups: Array<number>): Promise<void>;
359
+ protected groups(ctx: Context, user: User): Promise<void>;
360
+ protected all(ctx: Context, userId: string): Promise<void>;
361
+ protected set(ctx: Context, id: string, groups: Array<number>, audit: TypeObjectAny): Promise<void>;
297
362
  }
298
363
 
299
- declare class Database {
300
- static connect(options: IDatabaseOptions): Sequelize;
301
- static connect_mariadb(options: IDatabaseOptions): Sequelize;
302
- static connect_memory(): Sequelize;
303
- static connect_mysql(options: IDatabaseOptions): Sequelize;
304
- static connect_postgres(options: IDatabaseOptions): Sequelize;
305
- static connect_sqlite(options: IDatabaseOptions): Sequelize;
306
- }
307
- declare const sequelize: Sequelize;
308
-
309
364
  declare class Env {
310
365
  static readonly API_CONSOLE_ERROR: boolean;
311
366
  static readonly API_DEFAULT_PATH: string;
@@ -316,6 +371,7 @@ declare class Env {
316
371
  static readonly API_DB_TYPE: string;
317
372
  static readonly API_DB_USERNAME: string;
318
373
  static readonly API_DB_LOG: boolean;
374
+ static readonly API_DB_AUDIT: boolean;
319
375
  static readonly API_DB_PREFIX: string;
320
376
  static readonly API_DB_TIMEZONE: string;
321
377
  static readonly API_HTTP_CRT: string;
@@ -353,8 +409,12 @@ declare class Env {
353
409
  protected static getString(key: string, value: string): string;
354
410
  }
355
411
 
356
- declare const ReqAuth: (key?: string | undefined) => ParameterDecorator;
357
- declare const ReqUser: (key?: string | undefined) => ParameterDecorator;
412
+ declare const ReqAudit: (key?: string) => ParameterDecorator;
413
+
414
+ declare const ReqAuth: (key?: string) => ParameterDecorator;
415
+
416
+ declare const ReqUser: (key?: string) => ParameterDecorator;
417
+
358
418
  declare global {
359
419
  namespace Express {
360
420
  interface Request {
@@ -398,4 +458,4 @@ declare class Token {
398
458
  private static verify;
399
459
  }
400
460
 
401
- export { Application, type ArgumentsModelAdd, type ArgumentsModelAll, type ArgumentsModelDel, type ArgumentsModelGet, type ArgumentsModelSet, Auth, AuthController, type CallbackModelAll, type CallbackModelGet, Config, Configs, ControllerBase, CrudController, Database, Env, FilesController, Forgot, ForgotController, Group, GroupRoute, GroupsController, GroupsRoutesController, type IDatabaseOptions, type ITokenParameters, Log, Logs, LogsController, ModelController, Permission, Register, RegisterController, ReqAuth, ReqUser, type ResultModelAll, Route, RoutesController, Session, SetupController, Token, User, UserGroup, UsersController, UsersGroupsController, crt, key, sequelize };
461
+ export { Application, type ArgumentsModelAdd, type ArgumentsModelAll, type ArgumentsModelDel, type ArgumentsModelGet, type ArgumentsModelSet, Audit, AuditsController, Auth, AuthController, type CallbackModelAll, type CallbackModelGet, Config, Configs, ControllerBase, CrudController, Env, FilesController, Forgot, ForgotController, Group, GroupRoute, GroupsController, GroupsRoutesController, type IDatabaseOptions, type ITokenParameters, Log, Logs, LogsController, Model, ModelController, Permission, Register, RegisterController, ReqAudit, ReqAuth, ReqUser, type ResultModelAll, Route, RoutesController, Session, SetupController, Token, User, UserGroup, UsersController, UsersGroupsController, audit, conn, crt, key };
package/dist/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/api v3.2.7
2
+ * @andrewcaires/api v4.0.1
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 I,Query as v,Files as f}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 D,EventEmitter as k,Validation as N,isDef as x,uniqueID as F,isString as q,isArray as L,isNull as B,forEachSeries as j}from"@andrewcaires/utils.js";import K from"ws";import{Sequelize as M,DataTypes as C,Model as H,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_MODEL_LIMIT=oe.getInt("API_MODEL_LIMIT",10),oe.API_MODEL_LIMIT_MAX=oe.getInt("API_MODEL_LIMIT_MAX",500),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 M(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 M("sqlite::memory:",{logging:oe.API_DB_LOG,define:{timestamps:!1},timezone:oe.API_DB_TIMEZONE})}static connect_mysql(e){return new M(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 M(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 M({dialect:"sqlite",storage:e.database,logging:oe.API_DB_LOG,define:{timestamps:!1}})}}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 H{}ue.init({secret:C.STRING,logout:C.DATE,useragent:C.STRING},{sequelize:ae,modelName:oe.API_DB_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class ce extends H{}ce.init({token:C.STRING,timestamp:C.BIGINT,state:C.BOOLEAN},{sequelize:ae,modelName:oe.API_DB_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class le extends H{}le.init({name:C.STRING,description:C.TEXT,state:C.BOOLEAN},{sequelize:ae,modelName:oe.API_DB_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class pe extends H{}pe.init({},{sequelize:ae,modelName:oe.API_DB_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),pe.removeAttribute("id");class ge extends H{}ge.init({token:C.STRING,state:C.BOOLEAN},{sequelize:ae,modelName:oe.API_DB_PREFIX+"register",timestamps:!0,createdAt:"created",updatedAt:"updated"});class he extends H{}he.init({name:C.STRING,description:C.TEXT,state:C.BOOLEAN},{sequelize:ae,modelName:oe.API_DB_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class me extends H{}me.init({name:C.STRING,email:C.STRING,username:C.STRING,password:C.STRING,salt:C.STRING,token:C.STRING,avatar:C.STRING,date:C.DATEONLY,description:C.TEXT,state:C.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 H{}ye.init({},{sequelize:ae,modelName:oe.API_DB_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),ye.removeAttribute("id");class _e extends H{}_e.init({key:C.STRING,value:C.STRING},{sequelize:ae,modelName:oe.API_DB_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),_e.removeAttribute("id");class Ie extends H{}Ie.init({type:C.STRING,source:C.STRING,message:C.TEXT},{sequelize:ae,modelName:oe.API_DB_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class ve extends H{}ve.init({session:C.STRING,json:C.TEXT,expired:C.BIGINT},{sequelize:ae,modelName:oe.API_DB_PREFIX+"session",timestamps:!0,createdAt:"created",updatedAt:"updated"}),ve.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 fe{static write(e,t,r){return se(this,void 0,void 0,(function*(){yield fe.writeRaw(P.White,"",e,t,r)}))}static error(e,t,r){return se(this,void 0,void 0,(function*(){yield fe.writeRaw(P.Red,"error",e,t,r)}))}static info(e,t,r){return se(this,void 0,void 0,(function*(){yield fe.writeRaw(P.Cyan,"info",e,t,r)}))}static success(e,t,r){return se(this,void 0,void 0,(function*(){yield fe.writeRaw(P.Green,"success",e,t,r)}))}static warning(e,t,r){return se(this,void 0,void 0,(function*(){yield fe.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 Ie.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 ve.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 ve.destroy().catch(w),e&&e()})),this.destroy=(e,t)=>se(this,void 0,void 0,(function*(){yield ve.destroy({where:{session:e}}).catch(w),t&&t()})),this.expired=()=>se(this,void 0,void 0,(function*(){yield ve.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 ve.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 ve.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 ve.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=b(),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){fe.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=b(),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:b}}),this.hash=new E(oe.API_KEY_HASH)}error(e,t){fe.error(e.message,t,oe.API_CONSOLE_ERROR)}log(e,t){fe.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 D(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){fe.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)),be=t((({ctx:e})=>e.req.user));class De{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=>{fe.error(e.message,"api.permission",oe.API_CONSOLE_ERROR)}))}))}static get(e){return se(this,void 0,void 0,(function*(){const t=yield De.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return se(this,void 0,void 0,(function*(){const r=yield De.all(e,{name:t});return!!r&&r.length>0}))}}class ke extends k{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){fe.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 De.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)],ke.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)],ke.prototype,"session",null),re([ie(0,r()),ie(1,o()),ie(2,be()),ne("design:type",Function),ne("design:paramtypes",[a,String,me]),ne("design:returntype",Promise)],ke.prototype,"permission",null),re([ie(0,r()),ie(1,o()),ie(2,be()),ne("design:type",Function),ne("design:paramtypes",[a,String,me]),ne("design:returntype",Promise)],ke.prototype,"read",null),re([ie(0,r()),ie(1,o()),ne("design:type",Function),ne("design:paramtypes",[a,Object]),ne("design:returntype",void 0)],ke.prototype,"upload",null),re([ie(0,r()),ie(1,o()),ne("design:type",Function),ne("design:paramtypes",[a,Object]),ne("design:returntype",Promise)],ke.prototype,"validation",null),re([ie(0,r()),ie(1,o()),ie(2,be()),ne("design:type",Function),ne("design:paramtypes",[a,String,me]),ne("design:returntype",Promise)],ke.prototype,"write",null);let Ne=class extends ke{login(e,t,r,i,n){return se(this,void 0,void 0,(function*(){var s;yield D(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 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))}))}))}};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,be()),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,be()),ne("design:type",Function),ne("design:paramtypes",[a,me]),ne("design:returntype",Promise)],Ne.prototype,"user",null),Ne=re([g("/auth"),h(ke)],Ne);let xe=class extends ke{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,be()),ne("design:type",Function),ne("design:paramtypes",[a,String,me]),ne("design:returntype",Promise)],xe.prototype,"access",null),xe=re([g("/files"),h(ke)],xe);let Fe=class extends ke{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 D(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(ke)],Fe);let qe=class extends ke{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,d,a,u;const c=this.scope(i),l=Object.assign({},t||{});l.where=Object.assign({},l.where||{});const p=e.req.query.limit,g=q(p)?parseInt(p):oe.API_MODEL_LIMIT;l.limit=g>=0?Math.min(g,oe.API_MODEL_LIMIT_MAX):void 0;const h=e.req.query.offset;if(q(h)){const e=h?parseInt(h):0;l.offset=e>0?e:void 0}const y=[],_=this.columns(),I=e=>_.indexOf(e)>=0,v=null===(n=e.req.query.asc)||void 0===n?void 0:n.toString();v&&v.length&&y.push(...v.split(",").filter(I).map((e=>[e,"ASC"])));const f=null===(s=e.req.query.desc)||void 0===s?void 0:s.toString();f&&f.length&&y.push(...f.split(",").filter(I).map((e=>[e,"DESC"]))),y.length&&(l.order=y);const P=[],A=null===(o=e.req.query.search)||void 0===o?void 0:o.toString();(L(l.attributes)?l.attributes:_).filter(q).forEach((t=>{var r;if(A&&A.length&&P.push({[t]:{[U.like]:`%${A}%`}}),"search_"+t in e.req.query){const i=null===(r=e.req.query["search_"+t])||void 0===r?void 0:r.toString();i&&i.length&&P.push({[t]:{[U.like]:`%${i}%`}})}})),P.length&&(l.where=Object.assign(Object.assign({},l.where),{[U.or]:[...P]}));const E=null!==(d=yield c.count(Object.assign(Object.assign({},l),{col:_[0]})).catch(this.error))&&void 0!==d?d:0,O=yield c.findAll(l).catch(this.error),S={count:E,limit:null!==(a=l.limit)&&void 0!==a?a:-1,offset:null!==(u=l.offset)&&void 0!==u?u:0};return O?(e.prepare(m.OK,Object.assign(Object.assign({},S),{records:r?yield r(O):O})),Object.assign(Object.assign({},S),{records:O})):(e.error("Internal Server Error"),Object.assign(Object.assign({},S),{records:[]}))}))}columns(){return 0==this._columns.length&&(this._columns=Object.keys(this.model().getAttributes())),this._columns}_del(e){return 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?fe.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(ke)],qe);let Le=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)],Le.prototype,"add",null),re([p(),c("auth"),c("read"),ie(0,r()),ne("design:type",Function),ne("design:paramtypes",[a]),ne("design:returntype",Promise)],Le.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)],Le.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)],Le.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)],Le.prototype,"set",null),re([ie(0,r()),ne("design:type",Function),ne("design:paramtypes",[a]),ne("design:returntype",Promise)],Le.prototype,"validationAdd",null),re([ie(0,r()),ne("design:type",Function),ne("design:paramtypes",[a]),ne("design:returntype",Promise)],Le.prototype,"validationSet",null),Le=re([h(qe)],Le);let Be=class extends Le{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()}}};Be=re([g("/groups"),h(Le)],Be);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(B(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,I("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,I("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 Ie}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,v("type")),ie(2,v("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 Me=class extends ke{register(e,t,r){return se(this,void 0,void 0,(function*(){yield D(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=b();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)],Me.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)],Me.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)],Me.prototype,"send",null),Me=re([g("/register"),h(ke)],Me);let Ce=class extends Le{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()}}};Ce=re([g("/routes"),h(Le)],Ce);let He=class extends ke{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)],He.prototype,"setup",null),He=re([g("/setup"),h(ke)],He);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=b();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,f()),ie(2,be()),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,be()),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,be()),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,be()),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,I("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,I("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,I("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,be()),ie(2,I("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(B(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,I("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,I("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,ke as ControllerBase,Le as CrudController,de as Database,oe as Env,xe as FilesController,ce as Forgot,Fe as ForgotController,le as Group,pe as GroupRoute,Be as GroupsController,je as GroupsRoutesController,Ie as Log,fe as Logs,Ke as LogsController,qe as ModelController,De as Permission,ge as Register,Me as RegisterController,Re as ReqAuth,be as ReqUser,he as Route,Ce as RoutesController,ve as Session,He 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};
7
+ import{Application as e,parameterFactory as t,Ctx as r,Headers as i,App as n,Session as o,Argument as s,Upload as d,Context as a,Extends as u,Status as c,Get as p,Middleware as l,Query as y,Controller as g,Post as h,Body as v,Delete as m,Put as _,Params as f,Files as I}from"@andrewcaires/express";import{LogColor as P,Log as A,Hash as O,sha256 as E}from"@andrewcaires/node";import{toBool as S,parseMs as w,isObject as T,noop as b,loop as D,uuidv4 as R,sleep as k,EventEmitter as x,Validation as F,isString as N,isArray as j,isDef as q,uniqueID as L,isNull as B,forEachSeries as K}from"@andrewcaires/utils.js";import C from"ws";import{Connection as H,Model as U,Integer as M,PrimaryKey as Y,NotNull as G,AutoIncrement as z,String as W,FullDate as J,CreatedAt as X,UpdatedAt as $,DeletedAt as V,BelongsTo as Z,Database as Q,ModelName as ee,Boolean as te,Text as re,HasMany as ie,Hooks as ne,DateOnly as oe,DefaultScope as se,Scopes as de,BigInt as ae}from"@andrewcaires/sequelize";import{config as ue}from"dotenv";import{existsSync as ce,readFileSync as pe,statSync as le,readdirSync as ye,mkdirSync as ge,lstatSync as he,rmSync as ve}from"fs";import{Store as me}from"express-session";import{Op as _e}from"sequelize";import{verify as fe,sign as Ie}from"jsonwebtoken";import{join as Pe}from"path";function Ae(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s}function Oe(e,t){return function(r,i){t(r,i,e)}}function Ee(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,o){function s(e){try{a(i.next(e))}catch(e){o(e)}}function d(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,d)}a((i=i.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,ue();class we{static getBool(e,t){return S(we.getString(e,t.toString()))}static getInt(e,t){return parseInt(we.getString(e,t.toString()))}static getMs(e,t){return w(we.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}we.API_CONSOLE_ERROR=we.getBool("API_CONSOLE_ERROR",!1),we.API_DEFAULT_PATH=we.getString("API_DEFAULT_PATH","/api"),we.API_DB_DATABASE=we.getString("API_DB_DATABASE",""),we.API_DB_HOST=we.getString("API_DB_HOST","127.0.0.1"),we.API_DB_PASSWORD=we.getString("API_DB_PASSWORD",""),we.API_DB_PORT=we.getInt("API_DB_PORT",3306),we.API_DB_TYPE=we.getString("API_DB_TYPE",""),we.API_DB_USERNAME=we.getString("API_DB_USERNAME","root"),we.API_DB_LOG=we.getBool("API_DB_LOG",!1),we.API_DB_AUDIT=we.getBool("API_DB_AUDIT",!0),we.API_DB_PREFIX=we.getString("API_DB_PREFIX",""),we.API_DB_TIMEZONE=we.getString("API_DB_TIMEZONE","+00:00"),we.API_HTTP_CRT=we.getString("API_HTTP_CRT",""),we.API_HTTP_KEY=we.getString("API_HTTP_KEY",""),we.API_HTTP_PORT=we.getInt("API_HTTP_PORT",3e3),we.API_HTTP_PUBLIC=we.getString("API_HTTP_PUBLIC",""),we.API_HTTP_CROSS=we.getBool("API_HTTP_CROSS",!1),we.API_HTTP_HYBRID=we.getBool("API_HTTP_HYBRID",!1),we.API_HTTP_REDIRECT=we.getString("API_HTTP_REDIRECT",""),we.API_KEY_HASH=we.getString("API_KEY_HASH",""),we.API_KEY_HEADER=we.getString("API_KEY_HEADER","api_key"),we.API_MODEL_LIMIT=we.getInt("API_MODEL_LIMIT",10),we.API_MODEL_LIMIT_MAX=we.getInt("API_MODEL_LIMIT_MAX",500),we.API_NOTFOUND_REDIRECT=we.getString("API_NOTFOUND_REDIRECT",""),we.API_SLEEP_AUTH=we.getMs("API_SLEEP_AUTH","2s"),we.API_SLEEP_FORGOT=we.getMs("API_SLEEP_FORGOT","5s"),we.API_SLEEP_REGISTRY=we.getMs("API_SLEEP_REGISTRY","5s"),we.API_SESSION_NAME=we.getString("API_SESSION_NAME","session.id"),we.API_SESSION_LIFETIME=we.getMs("API_SESSION_LIFETIME","1d"),we.API_SESSION_SECRET=we.getString("API_SESSION_SECRET","yoursecret"),we.API_TOKEN_CRT=we.getString("API_TOKEN_CRT",""),we.API_TOKEN_KEY=we.getString("API_TOKEN_KEY",""),we.API_TOKEN_FORGOT=we.getMs("API_TOKEN_LIFETIME","1d"),we.API_TOKEN_HEADER=we.getString("API_TOKEN_HEADER","authorization"),we.API_TOKEN_LIFETIME=we.getMs("API_TOKEN_LIFETIME","1d"),we.API_TOKEN_RENEW=we.getMs("API_TOKEN_RENEW","1d"),we.API_UPLOAD_COUNT=we.getInt("API_UPLOAD_COUNT",1),we.API_UPLOAD_FIELD=we.getString("API_UPLOAD_FIELD","upload"),we.API_UPLOAD_SIZE=we.getInt("API_UPLOAD_SIZE",2),we.API_UPLOAD_TEMP=we.getString("API_UPLOAD_TEMP","./temp"),we.API_WEBSOCKET_START=we.getBool("API_WEBSOCKET_START",!1);const Te=new H({type:we.API_DB_TYPE,database:we.API_DB_DATABASE,username:we.API_DB_USERNAME,password:we.API_DB_PASSWORD,hostname:we.API_DB_HOST,hostport:we.API_DB_PORT,logging:we.API_DB_LOG,prefix:we.API_DB_PREFIX});class be extends U{}const De={afterCreate:(e,t)=>Se(void 0,void 0,void 0,(function*(){var r,i,n;if(!we.API_DB_AUDIT)return;const o=T(e)?e.constructor:null,s=null!==(r=null==o?void 0:o.primaryKeyAttribute)&&void 0!==r?r:null;yield je.create({type:"CREATE",model:null!==(i=null==o?void 0:o.getTableName())&&void 0!==i?i:null,record:s?e.getDataValue(s):null,data:JSON.stringify(e.toJSON()),state:!0,userId:null!==(n=null==t?void 0:t.userId)&&void 0!==n?n:null}).catch(b)})),afterUpdate:(e,t)=>Se(void 0,void 0,void 0,(function*(){var r,i,n;if(!we.API_DB_AUDIT)return;const o=T(e)?e.constructor:null,s=null!==(r=null==o?void 0:o.primaryKeyAttribute)&&void 0!==r?r:null,d={},a=e.changed();a&&a.forEach((t=>d[t]=e.getDataValue(t))),yield je.create({type:"UPDATE",model:null!==(i=null==o?void 0:o.getTableName())&&void 0!==i?i:null,record:s?e.getDataValue(s):null,data:JSON.stringify({before:e.previous(),after:d}),state:!0,userId:null!==(n=null==t?void 0:t.userId)&&void 0!==n?n:null}).catch(b)})),afterDestroy:(e,t)=>Se(void 0,void 0,void 0,(function*(){var r,i,n;if(!we.API_DB_AUDIT)return;const o=T(e)?e.constructor:null,s=null!==(r=null==o?void 0:o.primaryKeyAttribute)&&void 0!==r?r:null;yield je.create({type:"DELETE",model:null!==(i=null==o?void 0:o.getTableName())&&void 0!==i?i:null,record:s?e.getDataValue(s):null,data:JSON.stringify(e.toJSON()),state:!0,userId:null!==(n=null==t?void 0:t.userId)&&void 0!==n?n:null}).catch(b)}))};let Re=class extends be{};Ae([M(),Y,G,z,Ee("design:type",Number)],Re.prototype,"id",void 0),Ae([W(),Ee("design:type",W)],Re.prototype,"secret",void 0),Ae([J(),Ee("design:type",Date)],Re.prototype,"logout",void 0),Ae([W(),Ee("design:type",W)],Re.prototype,"useragent",void 0),Ae([X,Ee("design:type",Date)],Re.prototype,"createdAt",void 0),Ae([$,Ee("design:type",Date)],Re.prototype,"updatedAt",void 0),Ae([V,Ee("design:type",Date)],Re.prototype,"deletedAt",void 0),Ae([Z((()=>Ne)),Ee("design:type",Number)],Re.prototype,"userId",void 0),Re=Ae([Q(Te),ee("auth")],Re);let ke=class extends be{};Ae([M(),Y,G,z,Ee("design:type",Number)],ke.prototype,"id",void 0),Ae([W(),Ee("design:type",W)],ke.prototype,"token",void 0),Ae([te(),Ee("design:type",te)],ke.prototype,"state",void 0),Ae([X,Ee("design:type",Date)],ke.prototype,"createdAt",void 0),Ae([$,Ee("design:type",Date)],ke.prototype,"updatedAt",void 0),Ae([V,Ee("design:type",Date)],ke.prototype,"deletedAt",void 0),Ae([Z((()=>Ne)),Ee("design:type",Number)],ke.prototype,"userId",void 0),ke=Ae([Q(Te),ee("register")],ke);let xe=class extends be{};Ae([M(),Y,G,z,Ee("design:type",Number)],xe.prototype,"id",void 0),Ae([W(),Ee("design:type",W)],xe.prototype,"name",void 0),Ae([re(),Ee("design:type",W)],xe.prototype,"description",void 0),Ae([te(),Ee("design:type",te)],xe.prototype,"state",void 0),Ae([X,Ee("design:type",Date)],xe.prototype,"createdAt",void 0),Ae([$,Ee("design:type",Date)],xe.prototype,"updatedAt",void 0),Ae([V,Ee("design:type",Date)],xe.prototype,"deletedAt",void 0),Ae([ie((()=>Fe),"groupId"),Ee("design:type",Array)],xe.prototype,"groups_routes",void 0),Ae([ie((()=>Fe),"groupId"),Ee("design:type",Array)],xe.prototype,"users_groups",void 0),xe=Ae([Q(Te),ee("group"),ne(De)],xe);let Fe=class extends be{};Ae([X,Ee("design:type",Date)],Fe.prototype,"createdAt",void 0),Ae([Z((()=>xe)),Ee("design:type",Number)],Fe.prototype,"groupId",void 0),Ae([Z((()=>Ne)),Ee("design:type",Number)],Fe.prototype,"userId",void 0),Fe=Ae([Q(Te),ee("users_groups"),ne(De)],Fe);let Ne=class extends be{};Ae([M(),Y,G,z,Ee("design:type",Number)],Ne.prototype,"id",void 0),Ae([W(),Ee("design:type",W)],Ne.prototype,"name",void 0),Ae([W(),Ee("design:type",W)],Ne.prototype,"email",void 0),Ae([W(),Ee("design:type",W)],Ne.prototype,"username",void 0),Ae([W(),Ee("design:type",W)],Ne.prototype,"password",void 0),Ae([W(),Ee("design:type",W)],Ne.prototype,"salt",void 0),Ae([W(),Ee("design:type",W)],Ne.prototype,"token",void 0),Ae([W(),Ee("design:type",W)],Ne.prototype,"avatar",void 0),Ae([oe(),Ee("design:type",W)],Ne.prototype,"date",void 0),Ae([re(),Ee("design:type",W)],Ne.prototype,"description",void 0),Ae([te(),Ee("design:type",te)],Ne.prototype,"state",void 0),Ae([X,Ee("design:type",Date)],Ne.prototype,"createdAt",void 0),Ae([$,Ee("design:type",Date)],Ne.prototype,"updatedAt",void 0),Ae([V,Ee("design:type",Date)],Ne.prototype,"deletedAt",void 0),Ae([ie((()=>je),"userId"),Ee("design:type",Array)],Ne.prototype,"audits",void 0),Ae([ie((()=>Re),"userId"),Ee("design:type",Array)],Ne.prototype,"auths",void 0),Ae([ie((()=>ke),"userId"),Ee("design:type",Array)],Ne.prototype,"registers",void 0),Ae([ie((()=>Fe),"userId"),Ee("design:type",Array)],Ne.prototype,"users_groups",void 0),Ne=Ae([Q(Te),ee("user"),se({attributes:{exclude:["password","salt","token"]}}),de({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),ne(De)],Ne);let je=class extends be{};Ae([M(),Y,G,z,Ee("design:type",Number)],je.prototype,"id",void 0),Ae([W(),Ee("design:type",W)],je.prototype,"type",void 0),Ae([W(),Ee("design:type",W)],je.prototype,"model",void 0),Ae([M(),Ee("design:type",W)],je.prototype,"record",void 0),Ae([re(),Ee("design:type",W)],je.prototype,"data",void 0),Ae([te(),Ee("design:type",te)],je.prototype,"state",void 0),Ae([X,Ee("design:type",Date)],je.prototype,"createdAt",void 0),Ae([$,Ee("design:type",Date)],je.prototype,"updatedAt",void 0),Ae([V,Ee("design:type",Date)],je.prototype,"deletedAt",void 0),Ae([Z((()=>Ne)),Ee("design:type",Number)],je.prototype,"userId",void 0),je=Ae([Q(Te),ee("audit")],je);let qe=class extends be{};Ae([W(),Ee("design:type",W)],qe.prototype,"key",void 0),Ae([W(),Ee("design:type",W)],qe.prototype,"value",void 0),Ae([X,Ee("design:type",Date)],qe.prototype,"createdAt",void 0),Ae([$,Ee("design:type",Date)],qe.prototype,"updatedAt",void 0),qe=Ae([Q(Te),ee("configs"),ne(De)],qe);let Le=class extends be{};Ae([M(),Y,G,z,Ee("design:type",Number)],Le.prototype,"id",void 0),Ae([W(),Ee("design:type",W)],Le.prototype,"token",void 0),Ae([ae(),Ee("design:type",Number)],Le.prototype,"timestamp",void 0),Ae([te(),Ee("design:type",te)],Le.prototype,"state",void 0),Ae([X,Ee("design:type",Date)],Le.prototype,"createdAt",void 0),Ae([$,Ee("design:type",Date)],Le.prototype,"updatedAt",void 0),Ae([V,Ee("design:type",Date)],Le.prototype,"deletedAt",void 0),Ae([Z((()=>Ne)),Ee("design:type",Number)],Le.prototype,"userId",void 0),Le=Ae([Q(Te),ee("forgot")],Le);let Be=class extends be{};Ae([M(),Y,G,z,Ee("design:type",Number)],Be.prototype,"id",void 0),Ae([W(),Ee("design:type",W)],Be.prototype,"name",void 0),Ae([re(),Ee("design:type",W)],Be.prototype,"description",void 0),Ae([te(),Ee("design:type",te)],Be.prototype,"state",void 0),Ae([X,Ee("design:type",Date)],Be.prototype,"createdAt",void 0),Ae([$,Ee("design:type",Date)],Be.prototype,"updatedAt",void 0),Ae([V,Ee("design:type",Date)],Be.prototype,"deletedAt",void 0),Ae([ie((()=>Ke),"routeId"),Ee("design:type",Array)],Be.prototype,"groups_routes",void 0),Be=Ae([Q(Te),ee("route"),ne(De)],Be);let Ke=class extends be{};Ae([X,Ee("design:type",Date)],Ke.prototype,"createdAt",void 0),Ae([Z((()=>xe)),Ee("design:type",Number)],Ke.prototype,"groupId",void 0),Ae([Z((()=>Be)),Ee("design:type",Number)],Ke.prototype,"routeId",void 0),Ke=Ae([Q(Te),ee("groups_routes"),ne(De)],Ke);let Ce=class extends be{};Ae([W(),Ee("design:type",W)],Ce.prototype,"type",void 0),Ae([W(),Ee("design:type",W)],Ce.prototype,"source",void 0),Ae([re(),Ee("design:type",W)],Ce.prototype,"message",void 0),Ae([X,Ee("design:type",Date)],Ce.prototype,"createdAt",void 0),Ce=Ae([Q(Te),ee("log")],Ce);let He=class extends be{};Ae([W(),Ee("design:type",W)],He.prototype,"session",void 0),Ae([re(),Ee("design:type",W)],He.prototype,"json",void 0),Ae([ae(),Ee("design:type",Number)],He.prototype,"expired",void 0),Ae([X,Ee("design:type",Date)],He.prototype,"createdAt",void 0),Ae([$,Ee("design:type",Date)],He.prototype,"updatedAt",void 0),He=Ae([Q(Te),ee("session")],He);class Ue{static write(e,t,r){return Se(this,void 0,void 0,(function*(){yield Ue.writeRaw(P.White,"",e,t,r)}))}static error(e,t,r){return Se(this,void 0,void 0,(function*(){yield Ue.writeRaw(P.Red,"error",e,t,r)}))}static info(e,t,r){return Se(this,void 0,void 0,(function*(){yield Ue.writeRaw(P.Cyan,"info",e,t,r)}))}static success(e,t,r){return Se(this,void 0,void 0,(function*(){yield Ue.writeRaw(P.Green,"success",e,t,r)}))}static warning(e,t,r){return Se(this,void 0,void 0,(function*(){yield Ue.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),Te&&(yield Ce.create({type:t,source:i,message:r}).catch((()=>null)))}))}}const Me=e=>ce(e)?pe(e):void 0,Ye={http:Me(we.API_HTTP_CRT),token:Me(we.API_TOKEN_CRT)},Ge={http:Me(we.API_HTTP_KEY),token:Me(we.API_TOKEN_KEY)};class ze extends me{constructor(){super(),this.all=e=>Se(this,void 0,void 0,(function*(){e=e||b;const t=yield He.findAll({attributes:["session"],where:{expired:{[_e.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 He.destroy().catch(b),e&&e()})),this.destroy=(e,t)=>Se(this,void 0,void 0,(function*(){yield He.destroy({where:{session:e}}).catch(b),t&&t()})),this.expired=()=>Se(this,void 0,void 0,(function*(){yield He.destroy({where:{expired:{[_e.lt]:Date.now()}}}).catch(b)})),this.get=(e,t)=>Se(this,void 0,void 0,(function*(){t=t||b;const r=yield He.findOne({where:{session:e,expired:{[_e.gte]:Date.now()}}}).catch((e=>(t(e),null)));if(r){const e=JSON.parse(r.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield r.destroy().catch(b),void t(null)}t(null,e)}else t(null)})),this.length=e=>Se(this,void 0,void 0,(function*(){e&&e(null,(yield He.count().catch(b))||0)})),this.set=(e,t,r)=>Se(this,void 0,void 0,(function*(){r=r||b;const i=Date.now()+we.API_SESSION_LIFETIME,n=JSON.stringify(t),[o,s]=(yield He.findOrCreate({where:{session:e},defaults:{session:e,json:n,expired:i}}).catch(b))||[];o&&(s||(o.json=n,o.expired=i,yield o.save().catch(b))),r()})),this.loop=D(this.expired,3e4),this.loop.start()}}class We{static create(e){return Se(this,void 0,void 0,(function*(){if(!Ge.token)return{error:"Key not found"};const{id:t}=e,r=R(),i=yield Re.create({secret:r,userId:t}).catch(We.error);if(!i)return{error:"Internal Server Error"};return{auth:i,token:Ie({id:t,secret:r},Ge.token,We.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){Ue.error(e.message,"api.token",we.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:we.API_TOKEN_LIFETIME+"ms"}}static renew(e){return Se(this,void 0,void 0,(function*(){if(!Ge.token)return{error:"Key not found"};const{error:t,decode:r}=We.verify(e,we.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield Ne.findOne({where:{id:e,state:!0}}).catch(We.error);if(r){const i=yield Re.findOne({where:{secret:t,userId:r.id}}).catch(We.error);if(i&&!i.logout){i.secret=R(),yield i.save().catch(We.error);return{auth:i,token:Ie({id:e,secret:i.secret},Ge.token,We.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 Ne.findOne({where:{token:t,state:!0}}).catch(We.error);if(i){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield Re.findOrCreate({where:{secret:t,userId:i.id},defaults:{secret:t,userId:i.id}}).catch(We.error))||[];if(r)return{auth:r,user:i}}return{error:"Access denied"}}const{error:i,decode:n}=We.verify(t);if(i)return{error:i};if(n){const{id:e,secret:t}=n;if(e&&t){const r=yield Ne.findOne({where:{id:e,state:!0}}).catch(We.error);if(r){const e=yield Re.findOne({where:{secret:t,userId:r.id}}).catch(We.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!Ye.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:fe(e,Ye.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class Je extends e{constructor(e){super(e,{cert:Ye.http,cross:we.API_HTTP_CROSS,hybrid:we.API_HTTP_HYBRID,key:Ge.http,notfound:we.API_NOTFOUND_REDIRECT,path:we.API_DEFAULT_PATH,port:we.API_HTTP_PORT,public:we.API_HTTP_PUBLIC,redirect:we.API_HTTP_REDIRECT,session:{store:new ze,name:we.API_SESSION_NAME,secret:we.API_SESSION_SECRET,cookie:{maxAge:we.API_SESSION_LIFETIME},genid:R}}),this.hash=new O(we.API_KEY_HASH)}error(e,t){Ue.error(e.message,t,we.API_CONSOLE_ERROR)}log(e,t){Ue.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return Se(this,void 0,void 0,(function*(){yield Te.sync(),yield e.listen.call(this),we.API_WEBSOCKET_START&&this.server&&(this._webSocket=new C.Server({server:this.server,verifyClient:(e,t)=>t(we.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 o=JSON.parse(n);this.emit("ws.message"+r,{data:o,message:n,req:t,user:i,ws:e})}catch(o){this.emit("ws.message"+r,{message:n,req:t,user:i,ws:e})}else{const{user:o}=yield We.user("",n.toString(),this);o&&(i=o,this.emit("ws.connection"+r,{req:t,user:i,ws:e}))}i||e.close()})))),e.on("close",(()=>{i&&this.emit("ws.close"+r,{user:i,ws:e})})),yield k(2e3),i||e.close()})))))}))}websocket(){return this._webSocket}}class Xe{static all(){return Se(this,void 0,void 0,(function*(){const e=yield qe.findAll().catch(Xe.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e,t){return Se(this,void 0,void 0,(function*(){var r;const i=null!==(r=null==t?void 0:t.id)&&void 0!==r?r:null;return((yield qe.destroy(Object.assign({where:{key:e}},{userId:i})).catch(Xe.error))||0)>0}))}static error(e){Ue.error(e.message,"api.config",we.API_CONSOLE_ERROR)}static get(e){return Se(this,arguments,void 0,(function*(e,t=""){const[r]=(yield qe.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(Xe.error))||[];return r?r.value:t}))}static set(e,t,r){return Se(this,void 0,void 0,(function*(){var i;const n=null!==(i=null==r?void 0:r.id)&&void 0!==i?i:null,[o]=(yield qe.findOrCreate(Object.assign({where:{key:e}},{userId:n})).catch(Xe.error))||[];o&&(o.value=t,yield o.save().catch(Xe.error))}))}}const $e=t((({ctx:e})=>{var t,r,i;return{userId:null!==(i=null===(r=null===(t=e.req)||void 0===t?void 0:t.user)||void 0===r?void 0:r.id)&&void 0!==i?i:null}})),Ve=t((({ctx:e})=>e.req.auth)),Ze=t((({ctx:e})=>e.req.user));class Qe{static all(e,t){return Se(this,void 0,void 0,(function*(){return yield Be.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:Ke,required:!0,include:[{model:xe,required:!0,where:{state:!0},include:[{model:Fe,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{Ue.error(e.message,"api.permission",we.API_CONSOLE_ERROR)}))}))}static get(e){return Se(this,void 0,void 0,(function*(){const t=yield Qe.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return Se(this,void 0,void 0,(function*(){const r=yield Qe.all(e,{name:t});return!!r&&r.length>0}))}}class et extends x{auth(e,t,r,i,n){return Se(this,void 0,void 0,(function*(){const{auth:o,error:s,user:d}=yield We.user(t,r,n);return s?e.error(s):o&&d?o.useragent&&o.useragent!=i?e.error("Invalid token"):(e.req.auth=o,e.req.user=d,void e.next()):e.error("Internal Server Error")}))}session(e,t,r){return Se(this,void 0,void 0,(function*(){r.auth&&r.user&&(r.useragent?r.useragent!=t&&r.regenerate(b):(r.useragent=t,r.save(b))),e.next()}))}error(e){Ue.error(e.message,"api.controller",we.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r){return Se(this,void 0,void 0,(function*(){return r?(yield Qe.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=we.API_UPLOAD_TEMP),t.size||(t.size=we.API_UPLOAD_SIZE),t.field||(t.field=we.API_UPLOAD_FIELD),d.middleware(e,t)}validation(e,t){return Se(this,void 0,void 0,(function*(){const{error:r,value:i}=yield F.object(t).parse().validateAsync(e.req.body);if(r)return e.validation(r);e.req.body=i,e.next()}))}write(e,t,r){return Se(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".write",r)}))}}Ae([Oe(0,r()),Oe(1,i(we.API_KEY_HEADER)),Oe(2,i(we.API_TOKEN_HEADER)),Oe(3,i("user-agent")),Oe(4,n()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,String,String,Je]),Ee("design:returntype",Promise)],et.prototype,"auth",null),Ae([Oe(0,r()),Oe(1,i("user-agent")),Oe(2,o()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Object]),Ee("design:returntype",Promise)],et.prototype,"session",null),Ae([Oe(0,r()),Oe(1,s()),Oe(2,Ze()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Ne]),Ee("design:returntype",Promise)],et.prototype,"permission",null),Ae([Oe(0,r()),Oe(1,s()),Oe(2,Ze()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Ne]),Ee("design:returntype",Promise)],et.prototype,"read",null),Ae([Oe(0,r()),Oe(1,s()),Ee("design:type",Function),Ee("design:paramtypes",[a,Object]),Ee("design:returntype",void 0)],et.prototype,"upload",null),Ae([Oe(0,r()),Oe(1,s()),Ee("design:type",Function),Ee("design:paramtypes",[a,Object]),Ee("design:returntype",Promise)],et.prototype,"validation",null),Ae([Oe(0,r()),Oe(1,s()),Oe(2,Ze()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Ne]),Ee("design:returntype",Promise)],et.prototype,"write",null);let tt=class extends et{constructor(){super(...arguments),this._columns=[]}_add(e){return Se(this,arguments,void 0,(function*({ctx:e,options:t,body:r,user:i}){var n;const o=null!==(n=null==i?void 0:i.id)&&void 0!==n?n:null,s=yield this.model().create(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign({},t||{}),{userId:o})).catch(this.error);if(s){const t=this.key();return e.prepare(c.OK,{[t]:s.getDataValue(t)}),s}e.error("Internal Server Error")}))}_all(e){return Se(this,arguments,void 0,(function*({ctx:e,options:t,callback:r,scope:i}){var n,o,s,d,a,u;const p=this.scope(i),l=Object.assign({},t||{});l.where=Object.assign({},l.where||{});const y=e.req.query.limit,g=N(y)?parseInt(y):we.API_MODEL_LIMIT;l.limit=g>=0?Math.min(g,we.API_MODEL_LIMIT_MAX):void 0;const h=e.req.query.offset;if(N(h)){const e=h?parseInt(h):0;l.offset=e>0?e:void 0}const v=[],m=this.columns(),_=e=>m.indexOf(e)>=0,f=null===(n=e.req.query.asc)||void 0===n?void 0:n.toString();f&&f.length&&v.push(...f.split(",").filter(_).map((e=>[e,"ASC"])));const I=null===(o=e.req.query.desc)||void 0===o?void 0:o.toString();I&&I.length&&v.push(...I.split(",").filter(_).map((e=>[e,"DESC"]))),v.length&&(l.order=v);const P=[],A=null===(s=e.req.query.search)||void 0===s?void 0:s.toString();(j(l.attributes)?l.attributes:m).filter(N).forEach((t=>{var r;if(A&&A.length&&P.push({[t]:{[_e.like]:`%${A}%`}}),"search_"+t in e.req.query){const i=null===(r=e.req.query["search_"+t])||void 0===r?void 0:r.toString();i&&i.length&&P.push({[t]:{[_e.like]:`%${i}%`}})}})),P.length&&(l.where=Object.assign(Object.assign({},l.where),{[_e.or]:[...P]}));const O=null!==(d=yield p.count(Object.assign(Object.assign({},l),{col:m[0]})).catch(this.error))&&void 0!==d?d:0,E=yield p.findAll(l).catch(this.error),S={count:O,limit:null!==(a=l.limit)&&void 0!==a?a:-1,offset:null!==(u=l.offset)&&void 0!==u?u:0};return E?(e.prepare(c.OK,Object.assign(Object.assign({},S),{records:r?yield r(E):E})),Object.assign(Object.assign({},S),{records:E})):(e.error("Internal Server Error"),Object.assign(Object.assign({},S),{records:[]}))}))}columns(){return 0==this._columns.length&&(this._columns=Object.keys(this.model().getAttributes())),this._columns}_del(e){return Se(this,arguments,void 0,(function*({ctx:e,options:t,user:r}){var i;const n=this.key(),{[n]:o}=e.req.params;if(!o)return e.error("Internal Server Error"),0;const s=null!==(i=null==r?void 0:r.id)&&void 0!==i?i:null,d=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[n]:o}),individualHooks:!0}),{userId:s})).catch(this.error);return d?(e.success("OK"),d):(e.notFound("Record not found"),0)}))}error(e){e.sql?Ue.error(e.message+"\n"+e.sql,"api.controller.sql",we.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]:o}=e.req.params,s=yield this.scope(i).findOne(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[n]:o})})).catch(this.error);return s?(e.prepare(c.OK,r?yield r(s):s.toJSON()),s):null===s?e.notFound("Record not found"):void e.error("Internal Server Error")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}_set(e){return Se(this,arguments,void 0,(function*({ctx:e,options:t,body:r,user:i}){var n,o;const s=this.key(),{[s]:d}=e.req.params,a=null!==(n=null==i?void 0:i.id)&&void 0!==n?n:null,[u]=null!==(o=yield this.model().update(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[s]:d}),individualHooks:!0}),{userId:a})).catch(this.error))&&void 0!==o?o:[];return u?(e.success("OK"),!0):(e.success("Record not changed"),!1)}))}};tt=Ae([u(et)],tt);let rt=class extends tt{model(){return je}all(e,t,r){return Se(this,void 0,void 0,(function*(){const i={};t&&(i.type=t),r&&(i.table=r),yield this._all({ctx:e,options:{attributes:{exclude:["data"]},where:i,order:[["created","DESC"]]}})}))}get(e){return Se(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}};Ae([p(),l("auth"),l("read"),Oe(0,r()),Oe(1,y("type")),Oe(2,y("table")),Ee("design:type",Function),Ee("design:paramtypes",[a,String,String]),Ee("design:returntype",Promise)],rt.prototype,"all",null),Ae([p("/:id"),l("auth"),l("read"),Oe(0,r()),Ee("design:type",Function),Ee("design:paramtypes",[a]),Ee("design:returntype",Promise)],rt.prototype,"get",null),rt=Ae([g("/audits"),u(tt)],rt);let it=class extends et{login(e,t,r,i,n){return Se(this,void 0,void 0,(function*(){var o;yield k(we.API_SLEEP_AUTH);const s=yield Ne.scope("password").findOne({where:{[_e.or]:[{email:r},{username:r}]}}).catch(this.error);if(i+=null!==(o=null==s?void 0:s.salt)&&void 0!==o?o:"",!s||s.password!=E(i))return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const d=yield ke.findOne({where:{state:!0,userId:s.id}}).catch(this.error);if(d)return e.error("Activation required"),n.emit("auth.activation",{ctx:e,register:d,user:s}),void this.emit("auth.activation",{ctx:e,register:d,user:s});if(!s.state)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e,user:s}),void this.emit("auth.failure",{ctx:e,user:s});const{auth:a,error:u,token:c}=yield We.create(s);return u?(e.error(u),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):a&&c?(a.useragent=t,yield a.save().catch(this.error),e.json({token:c}),n.emit("auth.login",{auth:a,ctx:e,user:s}),void this.emit("auth.login",{auth:a,ctx:e,user:s})):(e.error("Internal Server Error"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,r,i){return Se(this,void 0,void 0,(function*(){if(yield We.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:o,token:s}=yield We.renew(r);return o?e.error(o):n?(n.useragent=t,yield n.save().catch(this.error),e.json({token:s}),i.emit("auth.renew",{auth:n,ctx:e}),void this.emit("auth.renew",{auth:n,ctx:e})):e.error("Internal Server Error")}))}user(e,t){return Se(this,void 0,void 0,(function*(){const r=yield Qe.all(t);if(!r)return e.error("Internal Server Error");e.json(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))}))}))}};Ae([h("/login"),l("validation",{username:F.string().min(3).required(),password:F.string().min(5).required()}),Oe(0,r()),Oe(1,i("user-agent")),Oe(2,v("username")),Oe(3,v("password")),Oe(4,n()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,String,String,Je]),Ee("design:returntype",Promise)],it.prototype,"login",null),Ae([p("/logout"),l("auth"),Oe(0,r()),Oe(1,Ve()),Oe(2,Ze()),Oe(3,n()),Ee("design:type",Function),Ee("design:paramtypes",[a,Re,Ne,Je]),Ee("design:returntype",Promise)],it.prototype,"logout",null),Ae([h("/renew"),l("validation",{token:F.string().required()}),Oe(0,r()),Oe(1,i("user-agent")),Oe(2,v("token")),Oe(3,n()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,String,Je]),Ee("design:returntype",Promise)],it.prototype,"renew",null),Ae([p(),l("auth"),Oe(0,r()),Oe(1,Ze()),Ee("design:type",Function),Ee("design:paramtypes",[a,Ne]),Ee("design:returntype",Promise)],it.prototype,"user",null),it=Ae([g("/auth"),u(et)],it);let nt=class extends et{directory(){return we.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=Pe(this.directory(),t);if(!ce(r)||!le(r).isDirectory())return e.notFound("Path not Found");let i=[];return i=ye(r),i=i.map((e=>this.info(Pe(r,e)))),i=i.filter(q),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(!ce(e))return null;const t=le(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"}};Ae([p("/path/?*"),l("auth"),l("access","list"),Oe(0,r()),Ee("design:type",Function),Ee("design:paramtypes",[a]),Ee("design:returntype",Promise)],nt.prototype,"files",null),Ae([Oe(0,r()),Oe(1,s()),Oe(2,Ze()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Ne]),Ee("design:returntype",Promise)],nt.prototype,"access",null),nt=Ae([g("/files"),u(et)],nt);let ot=class extends et{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=L(),yield r.save(),e.json({token:r.token})}))}forgot(e,t,r){return Se(this,void 0,void 0,(function*(){yield k(we.API_SLEEP_FORGOT);const i=t,n=yield Ne.findOne({where:{[_e.or]:[{email:i},{username:t}]}}).catch(this.error);if(!n)return e.notFound("User not found");const o=L(),s=Date.now()+6e4*we.API_TOKEN_FORGOT,d=yield Le.create({token:o,timestamp:s,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=E(r),yield n.user.save().catch(this.error),e.success("OK"),i.emit("forgot.reset",{ctx:e,user:n.user}),this.emit("forgot.reset",{ctx:e,user:n.user})}))}find(e){return Se(this,void 0,void 0,(function*(){return yield Le.findOne({where:{token:e,state:!0},include:[{model:Ne,required:!0}]}).catch(this.error)}))}};Ae([p("/check"),l("validation",{token:F.string().required()}),Oe(0,r()),Oe(1,v("token")),Ee("design:type",Function),Ee("design:paramtypes",[a,String]),Ee("design:returntype",Promise)],ot.prototype,"check",null),Ae([h(),l("validation",{username:F.string().min(4).required()}),Oe(0,r()),Oe(1,v("username")),Oe(2,n()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Je]),Ee("design:returntype",Promise)],ot.prototype,"forgot",null),Ae([h("/reset"),l("validation",{token:F.string().required(),password:F.string().min(5).required()}),Oe(0,r()),Oe(1,v("token")),Oe(2,v("password")),Oe(3,n()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,String,Je]),Ee("design:returntype",Promise)],ot.prototype,"reset",null),ot=Ae([g("/forgot"),u(et)],ot);let st=class extends tt{constructor(){super(...arguments),this._crud={}}add(e,t){return Se(this,void 0,void 0,(function*(){yield this._add({ctx:e,user:t})}))}all(e){return Se(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}create(){return this._crud}del(e,t){return Se(this,void 0,void 0,(function*(){yield this._del({ctx:e,user:t})}))}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*(){yield this._set({ctx:e,user:t})}))}update(){return this._crud}validationAdd(e){return Se(this,void 0,void 0,(function*(){const t=this.create();if(t==this._crud)return e.error("Internal Server Error");yield this.validation(e,t)}))}validationSet(e){return Se(this,void 0,void 0,(function*(){const t=this.update();if(t==this._crud)return e.error("Internal Server Error");yield this.validation(e,t)}))}};Ae([h(),l("auth"),l("write"),l("validationAdd"),Oe(0,r()),Oe(1,Ze()),Ee("design:type",Function),Ee("design:paramtypes",[a,Ne]),Ee("design:returntype",Promise)],st.prototype,"add",null),Ae([p(),l("auth"),l("read"),Oe(0,r()),Ee("design:type",Function),Ee("design:paramtypes",[a]),Ee("design:returntype",Promise)],st.prototype,"all",null),Ae([m("/:id"),l("auth"),l("write"),Oe(0,r()),Oe(1,Ze()),Ee("design:type",Function),Ee("design:paramtypes",[a,Ne]),Ee("design:returntype",Promise)],st.prototype,"del",null),Ae([p("/:id"),l("auth"),l("read"),Oe(0,r()),Ee("design:type",Function),Ee("design:paramtypes",[a]),Ee("design:returntype",Promise)],st.prototype,"get",null),Ae([_("/:id"),l("auth"),l("write"),l("validationSet"),Oe(0,r()),Oe(1,Ze()),Ee("design:type",Function),Ee("design:paramtypes",[a,Ne]),Ee("design:returntype",Promise)],st.prototype,"set",null),Ae([Oe(0,r()),Ee("design:type",Function),Ee("design:paramtypes",[a]),Ee("design:returntype",Promise)],st.prototype,"validationAdd",null),Ae([Oe(0,r()),Ee("design:type",Function),Ee("design:paramtypes",[a]),Ee("design:returntype",Promise)],st.prototype,"validationSet",null),st=Ae([u(tt)],st);let dt=class extends st{model(){return xe}create(){return{name:F.string().required(),description:F.string().empty(""),state:F.boolean().parse().required()}}update(){return{name:F.string().empty(),description:F.string().empty(),state:F.boolean().parse().empty()}}};dt=Ae([g("/groups"),u(st)],dt);let at=class extends tt{model(){return Ke}all(e,t){return Se(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{groupId:t},include:[{model:Be,required:!0}]},callback:e=>e.map((e=>e.route))})}))}set(e,t,r,i){return Se(this,void 0,void 0,(function*(){const n=yield xe.findByPk(t,{attributes:["id"]}).catch(this.error);if(n){const t=n.id;if(yield Ke.destroy(Object.assign({where:{groupId:t}},i)),r){let e=0;for(let n=0;n<r.length;n++)e=yield Be.count({where:{id:r[n]}}),e&&(yield Ke.create({groupId:t,routeId:r[n]},Object.assign({},i)))}return e.success("OK")}if(B(n))return e.notFound("Record not found");e.error("Internal Server Error")}))}};Ae([p("/:id/routes"),l("auth"),l("read","groups"),Oe(0,r()),Oe(1,f("id")),Ee("design:type",Function),Ee("design:paramtypes",[a,String]),Ee("design:returntype",Promise)],at.prototype,"all",null),Ae([_("/:id/routes"),l("auth"),l("write","groups"),l("validation",{routes:F.array(F.number().parse())}),Oe(0,r()),Oe(1,f("id")),Oe(2,v("routes")),Oe(3,$e()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Array,Object]),Ee("design:returntype",Promise)],at.prototype,"set",null),at=Ae([g("/groups"),u(tt)],at);let ut=class extends tt{model(){return Ce}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"]]}})}))}};Ae([p(),l("auth"),l("read"),Oe(0,r()),Oe(1,y("type")),Oe(2,y("source")),Ee("design:type",Function),Ee("design:paramtypes",[a,String,String]),Ee("design:returntype",Promise)],ut.prototype,"all",null),ut=Ae([g("/logs"),u(tt)],ut);let ct=class extends et{register(e,t,r){return Se(this,void 0,void 0,(function*(){yield k(we.API_SLEEP_REGISTRY);const{name:i,date:n,email:o,username:s,password:d,confirm:a}=t,u=s||o,c=E(d);if(yield Ne.count({where:{[_e.or]:[{email:o},{username:u}]}}).catch(this.error))return e.validation("Invalid email or username");if(c!=E(a))return e.error("Invalid password");const p=yield Ne.create({name:i,email:o,username:u,password:c,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!p)return e.error("Internal Server Error");const l=yield ke.create({token:yield this.getId(),userId:p.id,state:!0}).catch(this.error);if(!l)return p.destroy(),e.error("Internal Server Error");e.success("OK"),r.emit("register.user",{ctx:e,register:l,user:p}),this.emit("register.user",{ctx:e,register:l,user:p})}))}confirm(e,t,r){return Se(this,void 0,void 0,(function*(){const i=yield ke.findOne({where:{token:t,state:!0},include:[{model:Ne,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 ke.findOne({where:{state:!0},include:[{model:Ne,required:!0,where:{[_e.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=R();return(yield ke.count({where:{token:e}}))?this.getId():e}))}};Ae([h(),l("validation",{name:F.string().required(),date:F.string().date().required(),email:F.string().email().required(),username:F.string().min(4).empty(),password:F.string().min(5).required(),confirm:F.string().min(5).required()}),Oe(0,r()),Oe(1,v()),Oe(2,n()),Ee("design:type",Function),Ee("design:paramtypes",[a,Object,Je]),Ee("design:returntype",Promise)],ct.prototype,"register",null),Ae([h("/confirm"),l("validation",{token:F.string().required()}),Oe(0,r()),Oe(1,v("token")),Oe(2,n()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Je]),Ee("design:returntype",Promise)],ct.prototype,"confirm",null),Ae([h("/send"),l("validation",{username:F.string().min(4).required()}),Oe(0,r()),Oe(1,v("username")),Oe(2,n()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Je]),Ee("design:returntype",Promise)],ct.prototype,"send",null),ct=Ae([g("/register"),u(et)],ct);let pt=class extends st{model(){return Be}create(){return{name:F.string().required(),description:F.string().empty(""),state:F.boolean().parse().required()}}update(){return{name:F.string().empty(),description:F.string().empty(),state:F.boolean().parse().empty()}}};pt=Ae([g("/routes"),u(st)],pt);let lt=class extends et{setup(e){return Se(this,void 0,void 0,(function*(){if(0==(yield Ne.count())){const e=L(),t=yield Ne.create({name:"Admin",email:"admin@localhost",username:"admin",password:E("admin"+e),salt:e,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0}),r={description:"API CORE",state:!0},i=yield xe.create(Object.assign({name:"admin"},r));yield Fe.create({userId:t.id,groupId:i.id});const n=["read","write"],o=["audits","users","groups","routes"];yield K(o,(e=>Se(this,void 0,void 0,(function*(){yield K(n,(t=>Se(this,void 0,void 0,(function*(){const n=yield Be.create(Object.assign({name:`${e}.${t}`},r));yield Ke.create({groupId:i.id,routeId:n.id})}))))}))));const s=["delete","list","read","rename","upload","write"];yield K(s,(e=>Se(this,void 0,void 0,(function*(){const t=yield Be.create(Object.assign({name:`files.${e}`},r));yield Ke.create({groupId:i.id,routeId:t.id})}))));const d=["logs"];yield K(d,(e=>Se(this,void 0,void 0,(function*(){const t=yield Be.create(Object.assign({name:`${e}.read`},r));yield Ke.create({groupId:i.id,routeId:t.id})}))))}e.success("OK")}))}};Ae([p(),Oe(0,r()),Ee("design:type",Function),Ee("design:paramtypes",[a]),Ee("design:returntype",Promise)],lt.prototype,"setup",null),lt=Ae([g("/setup"),u(et)],lt);let yt=class extends tt{model(){return Ne}constructor(){super(),this.dir=we.API_HTTP_PUBLIC+"/avatar",we.API_HTTP_PUBLIC&&ce(we.API_HTTP_PUBLIC)&&!ce(this.dir)&&ge(this.dir)}avatar(e,t,r,i){return Se(this,void 0,void 0,(function*(){if(t.length){const n=t[0].filename||"";if(n){const t=this.dir+"/"+r.avatar;if(ce(t)&&he(t).isFile()&&ve(t),r.avatar=n,yield r.save(Object.assign({},i)).catch(this.error))return e.success("OK")}}e.success("Record not changed")}))}avatar_remove(e,t,r){return Se(this,void 0,void 0,(function*(){const i=this.dir+"/"+t.avatar;t.avatar="",(yield t.save(Object.assign({},r)).catch(this.error))&&ce(i)&&ve(i),e.success("OK")}))}password(e,t,r,i,n){return Se(this,void 0,void 0,(function*(){var o;const s=yield this.scope("password").findOne({where:{id:i.id,state:!0}}).catch(this.error);return t+=null!==(o=null==s?void 0:s.salt)&&void 0!==o?o:"",s&&s.password==E(t)?(s.salt=L(),s.password=E(r+s.salt),(yield s.save(Object.assign({},n)).catch(this.error))?e.success("OK"):void e.success("Record not changed")):e.error("Record not changed")}))}token(e,t,r){return 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,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)return i.token="",yield i.save(Object.assign({},r)).catch(this.error),e.success("OK");e.notFound("Record not found")}))}token_renew(e,t,r,i){return Se(this,void 0,void 0,(function*(){const n=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(n){const t=yield this.token_new();return n.token=i.hash.encrypt(t),yield n.save(Object.assign({},r)).catch(this.error),e.json({token:t})}e.notFound("Record not found")}))}token_new(){return Se(this,void 0,void 0,(function*(){var e;const t=R();return(null!==(e=yield this.model().count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t}))}add(e,t,r){return Se(this,void 0,void 0,(function*(){const i=L();yield this._add({ctx:e,body:{password:E(t+i),salt:i},user:r})}))}all(e){return Se(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}del(e,t,r){return Se(this,void 0,void 0,(function*(){if(r.id.toString()==t)return e.notFound("Record not found");yield this._del({ctx:e,user:r})}))}get(e){return Se(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,t,r){return Se(this,void 0,void 0,(function*(){const i=L();yield this._set({ctx:e,body:t?{password:E(t+i),salt:i}:{},user:r})}))}};Ae([h("/avatar"),l("auth"),l("upload",(e=>({count:1,field:"file",path:e.controller.dir,types:["image/bmp","image/jpeg","image/png"],size:32}))),Oe(0,r()),Oe(1,I()),Oe(2,Ze()),Oe(3,$e()),Ee("design:type",Function),Ee("design:paramtypes",[a,Array,Ne,Object]),Ee("design:returntype",Promise)],yt.prototype,"avatar",null),Ae([p("/avatar/remove"),l("auth"),Oe(0,r()),Oe(1,Ze()),Oe(2,$e()),Ee("design:type",Function),Ee("design:paramtypes",[a,Ne,Object]),Ee("design:returntype",Promise)],yt.prototype,"avatar_remove",null),Ae([h("/password"),l("auth"),l("validation",{oldPassword:F.string().min(5).required(),newPassword:F.string().min(5).required()}),Oe(0,r()),Oe(1,v("oldPassword")),Oe(2,v("newPassword")),Oe(3,Ze()),Oe(4,$e()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,String,Ne,Object]),Ee("design:returntype",Promise)],yt.prototype,"password",null),Ae([p("/token"),l("auth"),Oe(0,r()),Oe(1,Ze()),Oe(2,n()),Ee("design:type",Function),Ee("design:paramtypes",[a,Ne,Je]),Ee("design:returntype",Promise)],yt.prototype,"token",null),Ae([p("/token/:id"),l("auth"),l("write"),Oe(0,r()),Oe(1,f("id")),Oe(2,n()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Je]),Ee("design:returntype",Promise)],yt.prototype,"token_get",null),Ae([p("/token/remove/:id"),l("auth"),l("write"),Oe(0,r()),Oe(1,f("id")),Oe(2,$e()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Object]),Ee("design:returntype",Promise)],yt.prototype,"token_remove",null),Ae([p("/token/renew/:id"),l("auth"),l("write"),Oe(0,r()),Oe(1,f("id")),Oe(2,$e()),Oe(3,n()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Object,Je]),Ee("design:returntype",Promise)],yt.prototype,"token_renew",null),Ae([h(),l("auth"),l("write"),l("validation",{name:F.string().required(),email:F.string().email().required(),username:F.string().min(4).required(),password:F.string().min(5).required(),description:F.string().empty(""),state:F.boolean().parse().required()}),Oe(0,r()),Oe(1,v("password")),Oe(2,Ze()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Ne]),Ee("design:returntype",Promise)],yt.prototype,"add",null),Ae([p(),l("auth"),l("read"),Oe(0,r()),Ee("design:type",Function),Ee("design:paramtypes",[a]),Ee("design:returntype",Promise)],yt.prototype,"all",null),Ae([m("/:id"),l("auth"),l("write"),Oe(0,r()),Oe(1,f("id")),Oe(2,Ze()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Ne]),Ee("design:returntype",Promise)],yt.prototype,"del",null),Ae([p("/:id"),l("auth"),l("read"),Oe(0,r()),Ee("design:type",Function),Ee("design:paramtypes",[a]),Ee("design:returntype",Promise)],yt.prototype,"get",null),Ae([_("/:id"),l("auth"),l("write"),l("validation",{name:F.string().empty(),email:F.string().email().empty(),username:F.string().min(4).empty(),password:F.string().min(5).empty().filter(""),description:F.string().empty(),state:F.boolean().parse().empty()}),Oe(0,r()),Oe(1,v("password")),Oe(2,Ze()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Ne]),Ee("design:returntype",Promise)],yt.prototype,"set",null),yt=Ae([g("/users"),u(tt),Ee("design:paramtypes",[])],yt);let gt=class extends tt{model(){return Fe}groups(e,t){return Se(this,void 0,void 0,(function*(){yield this.all(e,t.id.toString())}))}all(e,t){return Se(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{userId:t},include:[{model:xe,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,r,i){return Se(this,void 0,void 0,(function*(){const n=yield Ne.findByPk(t,{attributes:["id"]}).catch(this.error);if(n){if(yield Fe.destroy(Object.assign({where:{userId:n.id}},i)),r){let e=0;for(let t=0;t<r.length;t++)e=yield xe.count({where:{id:r[t]}}),e&&(yield Fe.create({userId:n.id,groupId:r[t]},Object.assign({},i)))}return e.success("OK")}if(B(n))return e.notFound("Record not found");e.error("Internal Server Error")}))}};Ae([p("/groups"),l("auth"),Oe(0,r()),Oe(1,Ze()),Ee("design:type",Function),Ee("design:paramtypes",[a,Ne]),Ee("design:returntype",Promise)],gt.prototype,"groups",null),Ae([p("/:id/groups"),l("auth"),l("read","users"),Oe(0,r()),Oe(1,f("id")),Ee("design:type",Function),Ee("design:paramtypes",[a,String]),Ee("design:returntype",Promise)],gt.prototype,"all",null),Ae([_("/:id/groups"),l("auth"),l("write","users"),l("validation",{groups:F.array(F.number().parse())}),Oe(0,r()),Oe(1,f("id")),Oe(2,v("groups")),Oe(3,$e()),Ee("design:type",Function),Ee("design:paramtypes",[a,String,Array,Object]),Ee("design:returntype",Promise)],gt.prototype,"set",null),gt=Ae([g("/users"),u(tt)],gt);export{Je as Application,je as Audit,rt as AuditsController,Re as Auth,it as AuthController,Xe as Config,qe as Configs,et as ControllerBase,st as CrudController,we as Env,nt as FilesController,Le as Forgot,ot as ForgotController,xe as Group,Ke as GroupRoute,dt as GroupsController,at as GroupsRoutesController,Ce as Log,Ue as Logs,ut as LogsController,be as Model,tt as ModelController,Qe as Permission,ke as Register,ct as RegisterController,$e as ReqAudit,Ve as ReqAuth,Ze as ReqUser,Be as Route,pt as RoutesController,He as Session,lt as SetupController,We as Token,Ne as User,Fe as UserGroup,yt as UsersController,gt as UsersGroupsController,De as audit,Te as conn,Ye as crt,Ge as key};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrewcaires/api",
3
- "version": "3.2.7",
3
+ "version": "4.0.1",
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",
@@ -45,31 +45,30 @@
45
45
  },
46
46
  "homepage": "https://github.com/andrewcaires/npm/tree/main/api#readme",
47
47
  "dependencies": {
48
- "@andrewcaires/express": "^1.1.10",
49
- "@andrewcaires/node": "^1.1.4",
50
- "@andrewcaires/utils.js": "^0.3.4",
48
+ "@andrewcaires/express": "^1.1.11",
49
+ "@andrewcaires/node": "^1.1.5",
50
+ "@andrewcaires/sequelize": "^1.0.2",
51
+ "@andrewcaires/utils.js": "^0.3.5",
51
52
  "cors": "^2.8.5",
52
53
  "dotenv": "^16.4.5",
53
54
  "express-session": "^1.18.0",
54
55
  "jsonwebtoken": "^9.0.2",
55
- "mariadb": "^3.3.1",
56
- "mysql2": "^3.11.0",
57
- "sequelize": "^6.37.3",
58
56
  "ws": "^8.18.0"
59
57
  },
60
58
  "devDependencies": {
61
- "@rollup/plugin-commonjs": "^26.0.1",
59
+ "@rollup/plugin-commonjs": "^28.0.0",
62
60
  "@rollup/plugin-terser": "^0.4.4",
63
- "@rollup/plugin-typescript": "^11.1.6",
61
+ "@rollup/plugin-typescript": "^12.1.0",
64
62
  "@types/cors": "^2.8.17",
65
63
  "@types/express-session": "^1.18.0",
66
- "@types/jsonwebtoken": "^9.0.6",
67
- "@types/node": "^22.1.0",
64
+ "@types/jsonwebtoken": "^9.0.7",
65
+ "@types/node": "^22.7.3",
68
66
  "@types/ws": "^8.5.12",
69
- "eslint": "^9.8.0",
70
- "rollup": "^4.19.2",
67
+ "eslint": "^9.11.1",
68
+ "mariadb": "^3.3.2",
69
+ "rollup": "^4.22.4",
71
70
  "rollup-plugin-dts": "^6.1.1",
72
- "tslib": "^2.6.3",
73
- "typescript-eslint": "^8.0.0"
71
+ "tslib": "^2.7.0",
72
+ "typescript-eslint": "^8.7.0"
74
73
  }
75
74
  }