@andrewcaires/api 3.0.15 → 3.0.17

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.0.15
2
+ * @andrewcaires/api v3.0.17
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/utils.js"),r=require("ws"),o=require("sequelize"),s=require("dotenv"),i=require("fs"),n=require("express-session"),d=require("jsonwebtoken"),a=require("mime-types"),l=require("multer"),u=require("path"),c=require("crypto-js");function p(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 g(e,t){return function(r,o){t(r,o,e)}}function y(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function h(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,s.config();class m{static getBool(e,r){return t.toBool(m.getString(e,r.toString()))}static getInt(e,t){return parseInt(m.getString(e,t.toString()))}static getMs(e,r){return t.parseMs(m.getString(e,r))}static getString(e,t){return e in process.env?process.env[e]||"":t}}m.API_CONSOLE_ERROR=m.getBool("API_CONSOLE_ERROR",!1),m.API_DEFAULT_PATH=m.getString("API_DEFAULT_PATH","/api"),m.API_DB_DATABASE=m.getString("API_DB_DATABASE",""),m.API_DB_HOST=m.getString("API_DB_HOST","127.0.0.1"),m.API_DB_PASSWORD=m.getString("API_DB_PASSWORD",""),m.API_DB_PORT=m.getInt("API_DB_PORT",3306),m.API_DB_TYPE=m.getString("API_DB_TYPE",""),m.API_DB_USERNAME=m.getString("API_DB_USERNAME","root"),m.API_DB_LOG=m.getBool("API_DB_LOG",!1),m.API_DB_PREFIX=m.getString("API_DB_PREFIX",""),m.API_DB_TIMEZONE=m.getString("API_DB_TIMEZONE","+00:00"),m.API_HTTP_CRT=m.getString("API_HTTP_CRT",""),m.API_HTTP_KEY=m.getString("API_HTTP_KEY",""),m.API_HTTP_PORT=m.getInt("API_HTTP_PORT",3e3),m.API_HTTP_PUBLIC=m.getString("API_HTTP_PUBLIC",""),m.API_HTTP_CROSS=m.getBool("API_HTTP_CROSS",!1),m.API_HTTP_HYBRID=m.getBool("API_HTTP_HYBRID",!1),m.API_HTTP_REDIRECT=m.getString("API_HTTP_REDIRECT",""),m.API_SLEEP_AUTH=m.getMs("API_SLEEP_AUTH","2s"),m.API_SLEEP_FORGOT=m.getMs("API_SLEEP_FORGOT","5s"),m.API_SLEEP_REGISTRY=m.getMs("API_SLEEP_REGISTRY","5s"),m.API_SESSION_NAME=m.getString("API_SESSION_NAME","session.id"),m.API_SESSION_LIFETIME=m.getMs("API_SESSION_LIFETIME","1d"),m.API_SESSION_SECRET=m.getString("API_SESSION_SECRET","yoursecret"),m.API_TOKEN_CRT=m.getString("API_TOKEN_CRT",""),m.API_TOKEN_KEY=m.getString("API_TOKEN_KEY",""),m.API_TOKEN_FORGOT=m.getMs("API_TOKEN_LIFETIME","1d"),m.API_TOKEN_HEADER=m.getString("API_TOKEN_HEADER","authorization"),m.API_TOKEN_LIFETIME=m.getMs("API_TOKEN_LIFETIME","1d"),m.API_TOKEN_RENEW=m.getMs("API_TOKEN_RENEW","1d"),m.API_UPLOAD_COUNT=m.getInt("API_UPLOAD_COUNT",1),m.API_UPLOAD_FIELD=process.env.API_UPLOAD_FIELD||"upload",m.API_UPLOAD_SIZE=m.getInt("API_UPLOAD_SIZE",2),m.API_UPLOAD_TEMP=m.getString("API_UPLOAD_TEMP","./temp"),m.API_WEBSOCKET_START=m.getBool("API_WEBSOCKET_START",!1);class I{static connect(e){const t="connect_"+m.API_DB_TYPE.toLowerCase();if(t in I)return I[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:m.API_DB_LOG,define:{timestamps:!1},timezone:m.API_DB_TIMEZONE})}static connect_memory(){return new o.Sequelize("sqlite::memory:",{logging:m.API_DB_LOG,define:{timestamps:!1},timezone:m.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:m.API_DB_LOG,define:{timestamps:!1},timezone:m.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:m.API_DB_LOG,define:{timestamps:!1},timezone:m.API_DB_TIMEZONE})}static connect_sqlite(e){return new o.Sequelize({dialect:"sqlite",storage:e.database,logging:m.API_DB_LOG,define:{timestamps:!1},timezone:m.API_DB_TIMEZONE})}}const A=I.connect({database:m.API_DB_DATABASE,username:m.API_DB_USERNAME,password:m.API_DB_PASSWORD,hostname:m.API_DB_HOST,hostport:m.API_DB_PORT});class v extends o.Model{}v.init({secret:o.DataTypes.STRING,logout:o.DataTypes.DATE,useragent:o.DataTypes.STRING},{sequelize:A,modelName:m.API_DB_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class _ extends o.Model{}_.init({token:o.DataTypes.STRING,timestamp:o.DataTypes.BIGINT,state:o.DataTypes.BOOLEAN},{sequelize:A,modelName:m.API_DB_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class P extends o.Model{}P.init({name:o.DataTypes.STRING,description:o.DataTypes.TEXT,state:o.DataTypes.BOOLEAN},{sequelize:A,modelName:m.API_DB_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class O extends o.Model{}O.init({},{sequelize:A,modelName:m.API_DB_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),O.removeAttribute("id");class f extends o.Model{}f.init({token:o.DataTypes.STRING,state:o.DataTypes.BOOLEAN},{sequelize:A,modelName:m.API_DB_PREFIX+"register",timestamps:!0,createdAt:"created",updatedAt:"updated"});class S extends o.Model{}S.init({name:o.DataTypes.STRING,description:o.DataTypes.TEXT,state:o.DataTypes.BOOLEAN},{sequelize:A,modelName:m.API_DB_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class x extends o.Model{}x.init({name:o.DataTypes.STRING,email:o.DataTypes.STRING,username:o.DataTypes.STRING,password:o.DataTypes.STRING,avatar:o.DataTypes.STRING,date:o.DataTypes.DATEONLY,description:o.DataTypes.TEXT,state:o.DataTypes.BOOLEAN},{sequelize:A,modelName:m.API_DB_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated",defaultScope:{attributes:{exclude:["password"]}},scopes:{password:{attributes:{include:["password"]}}}});class E extends o.Model{}E.init({},{sequelize:A,modelName:m.API_DB_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),E.removeAttribute("id");class R extends o.Model{}R.init({key:o.DataTypes.STRING,value:o.DataTypes.STRING},{sequelize:A,modelName:m.API_DB_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),R.removeAttribute("id");class T extends o.Model{}T.init({type:o.DataTypes.STRING,source:o.DataTypes.STRING,message:o.DataTypes.TEXT},{sequelize:A,modelName:m.API_DB_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class w extends o.Model{}var C;w.init({session:o.DataTypes.STRING,json:o.DataTypes.TEXT,expired:o.DataTypes.BIGINT},{sequelize:A,modelName:m.API_DB_PREFIX+"session",timestamps:!0,createdAt:"created",updatedAt:"updated"}),w.removeAttribute("id"),x.hasMany(v),v.belongsTo(x),x.hasMany(_),_.belongsTo(x),x.hasMany(f),f.belongsTo(x),P.hasMany(O),O.belongsTo(P),S.hasMany(O),O.belongsTo(S),x.hasMany(E),E.belongsTo(x),P.hasMany(E),E.belongsTo(P),exports.LogsColor=void 0,(C=exports.LogsColor||(exports.LogsColor={})).ERROR="",C.INFO="",C.NONE="",C.SUCCESS="",C.WARNING="";class b{static write(e,t,r){return h(this,void 0,void 0,(function*(){yield b.writeRaw(exports.LogsColor.NONE,"",e,t,r)}))}static error(e,t,r){return h(this,void 0,void 0,(function*(){yield b.writeRaw(exports.LogsColor.ERROR,"error",e,t,r)}))}static info(e,t,r){return h(this,void 0,void 0,(function*(){yield b.writeRaw(exports.LogsColor.INFO,"info",e,t,r)}))}static success(e,t,r){return h(this,void 0,void 0,(function*(){yield b.writeRaw(exports.LogsColor.ERROR,"success",e,t,r)}))}static warning(e,t,r){return h(this,void 0,void 0,(function*(){yield b.writeRaw(exports.LogsColor.WARNING,"warning",e,t,r)}))}static writeConsole(e,r,o){const s=t.dateFormat(new Date,"%H:%M:%S");console.log(">",e,r+" ".repeat(10-r.length),"","|",s,"|",o)}static writeRaw(e,t,r,o,s){return h(this,void 0,void 0,(function*(){s&&b.writeConsole(e,t,r),A&&(yield T.create({type:t,source:o,message:r}).catch((()=>null)))}))}}const D=e=>i.existsSync(e)?i.readFileSync(e):void 0,N={http:D(m.API_HTTP_CRT),token:D(m.API_TOKEN_CRT)},M={http:D(m.API_HTTP_KEY),token:D(m.API_TOKEN_KEY)};class q extends n.Store{constructor(){super(),this.all=e=>h(this,void 0,void 0,(function*(){e=e||t.noop;const r=yield w.findAll({attributes:["session"],where:{expired:{[o.Op.gte]:Date.now()}}}).catch((t=>(e(t),null)));r&&e(null,r.map((e=>e.session))),e()})),this.clear=e=>h(this,void 0,void 0,(function*(){yield w.destroy().catch(t.noop),e&&e()})),this.destroy=(e,r)=>h(this,void 0,void 0,(function*(){yield w.destroy({where:{session:e}}).catch(t.noop),r&&r()})),this.expired=()=>h(this,void 0,void 0,(function*(){yield w.destroy({where:{expired:{[o.Op.lt]:Date.now()}}}).catch(t.noop)})),this.get=(e,r)=>h(this,void 0,void 0,(function*(){r=r||t.noop;const s=yield w.findOne({where:{session:e,expired:{[o.Op.gte]:Date.now()}}}).catch((e=>(r(e),null)));if(s){const e=JSON.parse(s.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield s.destroy().catch(t.noop),void r(null)}r(null,e)}else r(null)})),this.length=e=>h(this,void 0,void 0,(function*(){e&&e(null,(yield w.count().catch(t.noop))||0)})),this.set=(e,r,o)=>h(this,void 0,void 0,(function*(){o=o||t.noop;const s=Date.now()+m.API_SESSION_LIFETIME,i=JSON.stringify(r),[n,d]=(yield w.findOrCreate({where:{session:e},defaults:{session:e,json:i,expired:s}}).catch(t.noop))||[];n&&(d||(n.json=i,n.expired=s,yield n.save().catch(t.noop))),o()})),this.loop=t.loop(this.expired,3e4),this.loop.start()}}class F{static create(e){return h(this,void 0,void 0,(function*(){if(!M.token)return{error:"Key not found"};const{id:r}=e,o=t.uuidv4(),s=yield v.create({secret:o,userId:r}).catch(F.error);if(!s)return{error:"Internal Server Error"};return{auth:s,token:d.sign({id:r,secret:o},M.token,F.options())}}))}static destroy(e){return h(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){b.error(e.message,"api.token",m.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:m.API_TOKEN_LIFETIME+"ms"}}static renew(e){return h(this,void 0,void 0,(function*(){if(!M.token)return{error:"Key not found"};const{error:r,decode:o}=F.verify(e,m.API_TOKEN_RENEW/1e3);if(r)return{error:r};if(o){const{id:e,secret:r}=o;if(e&&r){const o=yield x.findOne({where:{id:e,state:!0}}).catch(F.error);if(o){const s=yield v.findOne({where:{secret:r,userId:o.id}}).catch(F.error);if(s&&!s.logout){s.secret=t.uuidv4(),yield s.save().catch(F.error);return{auth:s,token:d.sign({id:e,secret:s.secret},M.token,F.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e){return h(this,void 0,void 0,(function*(){const{error:t,decode:r}=F.verify(e);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield x.findOne({where:{id:e,state:!0}}).catch(F.error);if(r){const e=yield v.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(!N.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:d.verify(e,N.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class B extends e.Application{constructor(e){super(e,{cert:N.http,cross:m.API_HTTP_CROSS,hybrid:m.API_HTTP_HYBRID,key:M.http,path:m.API_DEFAULT_PATH,port:m.API_HTTP_PORT,public:m.API_HTTP_PUBLIC,redirect:m.API_HTTP_REDIRECT,session:{store:new q,name:m.API_SESSION_NAME,secret:m.API_SESSION_SECRET,cookie:{maxAge:m.API_SESSION_LIFETIME},genid:t.uuidv4}})}error(e,t){b.info(e.message,t,m.API_CONSOLE_ERROR)}log(e,t){b.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return h(this,void 0,void 0,(function*(){yield A.sync(),yield e.listen.call(this),m.API_WEBSOCKET_START&&this.server&&(this._webSocket=new r.Server({server:this.server,verifyClient:(e,t)=>t(m.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,r)=>h(this,void 0,void 0,(function*(){r.url||(r.url="");const o=r.url.length<=1?"":r.url.replace(/\//g,".");let s;e.on("message",(t=>h(this,void 0,void 0,(function*(){if(s)try{const i=JSON.parse(t);this.emit("ws.message"+o,{data:i,message:t,req:r,user:s,ws:e})}catch(i){this.emit("ws.message"+o,{message:t,req:r,user:s,ws:e})}else{const{user:i}=yield F.user(t.toString());i&&(s=i,this.emit("ws.connection"+o,{req:r,user:s,ws:e}))}s||e.close()})))),e.on("close",(()=>{s&&this.emit("ws.close"+o,{user:s,ws:e})})),yield t.sleep(2e3),s||e.close()})))))}))}websocket(){return this._webSocket}}class j{static all(){return h(this,void 0,void 0,(function*(){const e=yield R.findAll().catch(j.error),t={};return e&&e.forEach((e=>{t[e.key]=e.value})),t}))}static del(e){return h(this,void 0,void 0,(function*(){return((yield R.destroy({where:{key:e}}).catch(j.error))||0)>0}))}static error(e){b.error(e.message,"api.config",m.API_CONSOLE_ERROR)}static get(e){return h(this,void 0,void 0,(function*(){const t=yield R.findOne({where:{key:e}}).catch(j.error);return t&&t.value||""}))}static set(e,t){return h(this,void 0,void 0,(function*(){const[r]=(yield R.findOrCreate({where:{key:e}}).catch(j.error))||[];r&&(r.value=t,yield r.save().catch(j.error))}))}}const L=e.parameterFactory((({req:e})=>e.auth)),k=e.parameterFactory((({req:e})=>t.toArray(e.files))),G=e.parameterFactory((({req:e})=>e.user));class U{static all(e,t){return h(this,void 0,void 0,(function*(){return yield S.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:O,required:!0,include:[{model:P,required:!0,where:{state:!0},include:[{model:E,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{b.error(e.message,"api.permission",m.API_CONSOLE_ERROR)}))}))}static get(e){return h(this,void 0,void 0,(function*(){const t=yield U.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return h(this,void 0,void 0,(function*(){const r=yield U.all(e,{name:t});return!!r&&r.length>0}))}}class H extends t.EventEmitter{auth(t,r,o,s,i){return h(this,void 0,void 0,(function*(){const{auth:n,error:d,user:a}=yield F.user(o);d?e.Responses.error(r,d):n&&a?n.useragent==s?(t.auth=n,t.user=a,i()):e.Responses.error(r,"Invalid token"):e.Responses.error(r,"Internal Server Error")}))}session(e,r,o){return h(this,void 0,void 0,(function*(){r.auth&&r.user&&(r.useragent?r.useragent!=e&&r.regenerate(t.noop):(r.useragent=e,r.save(t.noop))),o()}))}error(e){b.error(e.message,"api.controller",m.API_CONSOLE_ERROR)}name(){return"api"}permission(t,r,o,s){return h(this,void 0,void 0,(function*(){s?(yield U.is(s,o))?r():e.Responses.error(t,"Unauthorized access"):e.Responses.unauthorized(t,"Access denied")}))}read(e,t,r,o){return this.permission(t,r,(o||this.name())+".read",e)}upload(r,o,s,i){const n=(null==i?void 0:i.path)||m.API_UPLOAD_TEMP,d=l.diskStorage({destination:(e,t,r)=>r(null,n),filename:(e,t,r)=>h(this,void 0,void 0,(function*(){return r(null,this.uploadFile(n,a.extension(t.mimetype)||"bin"))}))}),u=1e6*((null==i?void 0:i.size)||m.API_UPLOAD_SIZE),c=l({storage:d,fileFilter(e,r,o){var s;return h(this,void 0,void 0,(function*(){const e=null===(s=null==i?void 0:i.types)||void 0===s?void 0:s.indexOf(r.mimetype);return t.isNumber(e)&&e<0?o(new Error("File type not allowed")):o(null,!0)}))},limits:{fileSize:u}}),p=(null==i?void 0:i.count)||m.API_UPLOAD_COUNT,g=(null==i?void 0:i.field)||m.API_UPLOAD_FIELD;c.array(g,p)(r,o,(t=>t?e.Responses.error(o,t.message):s()))}uploadFile(e,r){const o=t.uuidv4()+"."+r;return i.existsSync(u.join(e,o))?this.uploadFile(e,r):o}validation(r,o,s,i){return h(this,void 0,void 0,(function*(){const{error:n,value:d}=yield t.Validation.object(i).parse().validateAsync(r.body);n?e.Responses.validation(o,n):(r.body=d,s())}))}write(e,t,r,o){return this.permission(e,t,(r||this.name())+".write",o)}}p([g(0,e.Req()),g(1,e.Res()),g(2,e.Headers(m.API_TOKEN_HEADER)),g(3,e.Headers("user-agent")),g(4,e.Next()),y("design:type",Function),y("design:paramtypes",[Object,Object,String,String,Function]),y("design:returntype",Promise)],H.prototype,"auth",null),p([g(0,e.Headers("user-agent")),g(1,e.Session()),g(2,e.Next()),y("design:type",Function),y("design:paramtypes",[String,Object,Function]),y("design:returntype",Promise)],H.prototype,"session",null),p([g(0,e.Res()),g(1,e.Next()),g(2,e.Argument()),g(3,G()),y("design:type",Function),y("design:paramtypes",[Object,Function,String,x]),y("design:returntype",Promise)],H.prototype,"permission",null),p([g(0,G()),g(1,e.Res()),g(2,e.Next()),g(3,e.Argument()),y("design:type",Function),y("design:paramtypes",[x,Object,Function,String]),y("design:returntype",Promise)],H.prototype,"read",null),p([g(0,e.Req()),g(1,e.Res()),g(2,e.Next()),g(3,e.Argument()),y("design:type",Function),y("design:paramtypes",[Object,Object,Function,Object]),y("design:returntype",void 0)],H.prototype,"upload",null),p([g(0,e.Req()),g(1,e.Res()),g(2,e.Next()),g(3,e.Argument()),y("design:type",Function),y("design:paramtypes",[Object,Object,Function,Object]),y("design:returntype",Promise)],H.prototype,"validation",null),p([g(0,e.Res()),g(1,e.Next()),g(2,e.Argument()),g(3,G()),y("design:type",Function),y("design:paramtypes",[Object,Function,String,x]),y("design:returntype",Promise)],H.prototype,"write",null),exports.AuthController=class extends H{login(e,r,s,i,n){return h(this,void 0,void 0,(function*(){yield t.sleep(m.API_SLEEP_AUTH);const d=s,a=yield x.findOne({where:{[o.Op.or]:[{email:d},{username:s}],[o.Op.and]:[{password:c.SHA256(i).toString()}]}}).catch(this.error);if(!a)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const l=yield f.findOne({where:{state:!0,userId:a.id}}).catch(this.error);if(l)return e.error("Activation required"),n.emit("auth.activation",{ctx:e,register:l,user:a}),void this.emit("auth.activation",{ctx:e,register:l,user:a});if(!a.state)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const{auth:u,error:p,token:g}=yield F.create(a);return p?(e.error(p),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):u&&g?(e.data({token:g}),u.useragent=r,yield u.save().catch(this.error),n.emit("auth.login",{auth:u,ctx:e,user:a}),void this.emit("auth.login",{auth:u,ctx:e,user:a})):(e.error("Internal Server Error"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,r,o){return h(this,void 0,void 0,(function*(){if(yield F.destroy(t))return e.success("Disconcerted"),o.emit("auth.logout",{auth:t,ctx:e,user:r}),void this.emit("auth.logout",{auth:t,ctx:e,user:r});e.unauthorized("Access denied")}))}renew(e,t,r,o){return h(this,void 0,void 0,(function*(){const{auth:s,error:i,token:n}=yield F.renew(r);i?e.error(i):s?(e.data({token:n}),s.useragent=t,yield s.save().catch(this.error),o.emit("auth.renew",{auth:s,ctx:e}),this.emit("auth.renew",{auth:s,ctx:e})):e.error("Internal Server Error")}))}user(e,t){return h(this,void 0,void 0,(function*(){const r=yield U.all(t);r?e.data(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))})):e.error("Internal Server Error")}))}},p([e.Post("/login"),e.Middleware("validation",{username:t.Validation.string().min(3).required(),password:t.Validation.string().min(5).required()}),g(0,e.Ctx()),g(1,e.Headers("user-agent")),g(2,e.Body("username")),g(3,e.Body("password")),g(4,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,String,String,String,B]),y("design:returntype",Promise)],exports.AuthController.prototype,"login",null),p([e.Get("/logout"),e.Middleware("auth"),g(0,e.Ctx()),g(1,L()),g(2,G()),g(3,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,v,x,B]),y("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),p([e.Post("/renew"),e.Middleware("validation",{token:t.Validation.string().required()}),g(0,e.Ctx()),g(1,e.Headers("user-agent")),g(2,e.Body("token")),g(3,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,String,String,B]),y("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),p([e.Get(),e.Middleware("auth"),g(0,e.Ctx()),g(1,G()),y("design:type",Function),y("design:paramtypes",[e.Context,x]),y("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=p([e.Controller("/auth"),e.Extends(H)],exports.AuthController),exports.ForgotController=class extends H{check(r,o){return h(this,void 0,void 0,(function*(){const{token:s}=o.body,i=yield this.findOne(s);i&&i.user?(i.token=t.uniqueID(),yield i.save(),e.Responses.data(r,{token:i.token})):e.Responses.notfound(r,"User not found")}))}forgot(e,r,s){return h(this,void 0,void 0,(function*(){yield t.sleep(m.API_SLEEP_FORGOT);const i=r,n=yield x.findOne({where:{[o.Op.or]:[{email:i},{username:r}]}}).catch(this.error);if(!n)return void e.notFound("User not found");const d=t.uniqueID(),a=Date.now()+6e4*m.API_TOKEN_FORGOT,l=yield _.create({token:d,timestamp:a,state:!0,userId:n.id});s.emit("forgot.send",{ctx:e,forgot:l,user:n}),this.emit("forgot.send",{ctx:e,forgot:l,user:n}),e.success("OK")}))}reset(e,t,r,o){return h(this,void 0,void 0,(function*(){const s=yield this.findOne(t);s?(s.state=!1,yield s.save().catch(this.error),s.user.password=c.SHA256(r).toString(),yield s.user.save().catch(this.error),o.emit("forgot.reset",{ctx:e,user:s.user}),this.emit("forgot.reset",{ctx:e,user:s.user}),e.success("OK")):e.notFound("User not found")}))}findOne(e){return h(this,void 0,void 0,(function*(){return yield _.findOne({where:{token:e,state:!0},include:[{model:x,required:!0}]}).catch(this.error)}))}},p([e.Get("/check"),e.Middleware("validation",{token:t.Validation.string().required()}),g(0,e.Res()),g(1,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),p([e.Post(),e.Middleware("validation",{username:t.Validation.string().min(4).required()}),g(0,e.Ctx()),g(1,e.Body("username")),g(2,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,String,B]),y("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),p([e.Post("/reset"),e.Middleware("validation",{token:t.Validation.string().required(),password:t.Validation.string().min(5).required()}),g(0,e.Ctx()),g(1,e.Body("token")),g(2,e.Body("password")),g(3,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,String,String,B]),y("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=p([e.Controller("/forgot"),e.Extends(H)],exports.ForgotController),exports.ModelController=class extends H{add(t,r,o,s){return h(this,void 0,void 0,(function*(){const i=yield this.model().create(Object.assign(Object.assign({},t.body),s||{}),o||{}).catch(this.error);if(i){const t=this.key();return e.Responses.data(r,{[t]:i.getDataValue(t)}),i}e.Responses.error(r,"Internal Server Error")}))}all(r,s,i,n){var d,a,l,u,c;return h(this,void 0,void 0,(function*(){const p=this.model(),g=Object.assign({},i||{});g.where=Object.assign({},g.where||{});const y=null===(d=r.query.limit)||void 0===d?void 0:d.toString();y&&(g.limit=parseInt(y));const h=null===(a=r.query.offset)||void 0===a?void 0:a.toString();h&&(g.offset=parseInt(h));const m=Object.keys(p.getAttributes()),I=[],A=null===(l=r.query.asc)||void 0===l?void 0:l.toString();A&&A.length&&A.split(",").forEach((e=>{m.indexOf(e)>=0&&I.push([e,"ASC"])}));const v=null===(u=r.query.desc)||void 0===u?void 0:u.toString();v&&v.length&&v.split(",").forEach((e=>{m.indexOf(e)>=0&&I.push([e,"DESC"])})),I.length&&(g.order=I);const _=[],P=t.isArray(g.attributes)?g.attributes:m,O=null===(c=r.query.search)||void 0===c?void 0:c.toString();P.forEach((e=>{var s;if(t.isString(e)&&(O&&O.length&&_.push({[e]:{[o.Op.like]:`%${O}%`}}),"search_"+e in r.query)){const t=null===(s=r.query["search_"+e])||void 0===s?void 0:s.toString();t&&t.length&&_.push({[e]:{[o.Op.like]:`%${t}%`}})}})),_.length&&(g.where=Object.assign(Object.assign({},g.where),{[o.Op.or]:[..._]}));const f=(yield p.count(Object.assign(Object.assign({},g),{col:m[0]})).catch(this.error))||0,S=yield p.findAll(g).catch(this.error);if(S)return e.Responses.data(s,{count:f,records:n?yield n(S):S}),S;e.Responses.error(s,"Internal Server Error")}))}del(t,r,o){return h(this,void 0,void 0,(function*(){const s=this.key(),{[s]:i}=t.params;if(!i)return e.Responses.error(r,"Internal Server Error"),0;const n=yield this.model().destroy(Object.assign(Object.assign({},o||{}),{where:Object.assign(Object.assign({},(o||{}).where),{[s]:i})})).catch(this.error);return n?(e.Responses.success(r,"OK"),n):(e.Responses.notfound(r,"Record not found"),0)}))}error(e){e.sql?b.error(e.message+"\n"+e.sql,"api.controller.sql",m.API_CONSOLE_ERROR):super.error(e)}get(t,r,o,s){return h(this,void 0,void 0,(function*(){const i=this.key(),{[i]:n}=t.params,d=yield this.model().findOne(Object.assign(Object.assign({},o||{}),{where:Object.assign(Object.assign({},(o||{}).where),{[i]:n})})).catch(this.error);if(d)return e.Responses.data(r,s?yield s(d):d.toJSON()),d;null!==d?e.Responses.error(r,"Internal Server Error"):e.Responses.notfound(r,"Record not found")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}set(t,r,o,s){return h(this,void 0,void 0,(function*(){const i=this.key(),{[i]:n}=t.params,[d]=(yield this.model().update(Object.assign(Object.assign({},t.body),s||{}),Object.assign(Object.assign({},o||{}),{where:Object.assign(Object.assign({},(o||{}).where),{[i]:n})})).catch(this.error))||[];return d?(e.Responses.success(r,"OK"),!0):(e.Responses.success(r,"Record not changed"),!1)}))}},exports.ModelController=p([e.Extends(H)],exports.ModelController),exports.CrudController=class extends exports.ModelController{create(){return{}}recordAdd(e,t){this.add(e,t)}recordAll(e,t){this.all(e,t)}recordDel(e,t){this.del(e,t)}recordGet(e,t){this.get(e,t)}recordSet(e,t){this.set(e,t)}update(){return{}}validationAdd(e,t,r){this.validation(e,t,r,this.create())}validationSet(e,t,r){this.validation(e,t,r,this.update())}},p([e.Post(),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationAdd"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordAdd",null),p([e.Get(),e.Middleware("auth"),e.Middleware("read"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordAll",null),p([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordDel",null),p([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordGet",null),p([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationSet"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordSet",null),p([g(0,e.Req()),g(1,e.Res()),g(2,e.Next()),y("design:type",Function),y("design:paramtypes",[Object,Object,Function]),y("design:returntype",void 0)],exports.CrudController.prototype,"validationAdd",null),p([g(0,e.Req()),g(1,e.Res()),g(2,e.Next()),y("design:type",Function),y("design:paramtypes",[Object,Object,Function]),y("design:returntype",void 0)],exports.CrudController.prototype,"validationSet",null),exports.CrudController=p([e.Extends(exports.ModelController)],exports.CrudController),exports.GroupsController=class extends exports.CrudController{model(){return P}create(){return{name:t.Validation.string().required(),description:t.Validation.string().empty(""),state:t.Validation.boolean().parse().required()}}update(){return{name:t.Validation.string().empty(),description:t.Validation.string().empty(),state:t.Validation.boolean().parse().empty()}}},exports.GroupsController=p([e.Controller("/groups"),e.Extends(exports.CrudController)],exports.GroupsController),exports.GroupsRoutesController=class extends exports.ModelController{model(){return O}recordAll(e,t,r){return h(this,void 0,void 0,(function*(){this.all(e,t,{where:{groupId:r},include:[{model:S,required:!0}]},(e=>e.map((e=>e.route))))}))}recordSet(r,o,s){return h(this,void 0,void 0,(function*(){const i=yield P.findByPk(o,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield O.destroy({where:{groupId:t}}),s){let e=0;for(let r=0;r<s.length;r++)e=yield S.count({where:{id:s[r]}}),e&&(yield O.create({groupId:t,routeId:s[r]}))}e.Responses.success(r,"OK")}else t.isNull(i)?e.Responses.notfound(r,"Record not found"):e.Responses.error(r,"Internal Server Error")}))}},p([e.Get("/:id/routes"),e.Middleware("auth"),e.Middleware("read","groups"),g(0,e.Req()),g(1,e.Res()),g(2,e.Params("id")),y("design:type",Function),y("design:paramtypes",[Object,Object,String]),y("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"recordAll",null),p([e.Put("/:id/routes"),e.Middleware("auth"),e.Middleware("write","groups"),e.Middleware("validation",{routes:t.Validation.array(t.Validation.number().parse())}),g(0,e.Res()),g(1,e.Params("id")),g(2,e.Body("routes")),y("design:type",Function),y("design:paramtypes",[Object,String,Array]),y("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"recordSet",null),exports.GroupsRoutesController=p([e.Controller("/groups"),e.Extends(exports.ModelController)],exports.GroupsRoutesController),exports.LogsController=class extends exports.ModelController{model(){return T}recordAll(e,t,r,o){const s={};r&&(s.type=r),o&&(s.source=o),this.all(e,t,{where:s,order:[["created","DESC"]]})}},p([e.Get(),e.Middleware("auth"),e.Middleware("read"),g(0,e.Req()),g(1,e.Res()),g(2,e.Query("type")),g(3,e.Query("source")),y("design:type",Function),y("design:paramtypes",[Object,Object,String,String]),y("design:returntype",void 0)],exports.LogsController.prototype,"recordAll",null),exports.LogsController=p([e.Controller("/logs"),e.Extends(exports.ModelController)],exports.LogsController),exports.RegisterController=class extends H{register(e,r,s){return h(this,void 0,void 0,(function*(){yield t.sleep(m.API_SLEEP_REGISTRY);const{name:i,date:n,email:d,username:a,password:l,confirm:u}=r,p=a||d,g=c.SHA256(l).toString();if(yield x.count({where:{[o.Op.or]:[{email:d},{username:p}]}}).catch(this.error))return void e.validation("Invalid email or username");if(g!=c.SHA256(u).toString())return void e.error("Invalid password");const y=yield x.create({name:i,email:d,username:p,password:g,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!y)return void e.error("Internal Server Error");const h=yield f.create({token:yield this.getId(),userId:y.id,state:!0}).catch(this.error);if(!h)return y.destroy(),void 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 h(this,void 0,void 0,(function*(){const o=yield f.findOne({where:{token:t,state:!0},include:[{model:x,required:!0}]}).catch(this.error);o?(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})):e.notFound("User not found")}))}send(e,t,r){return h(this,void 0,void 0,(function*(){const s=t,i=yield f.findOne({where:{state:!0},include:[{model:x,required:!0,where:{[o.Op.or]:[{email:s},{username:t}]}}]}).catch(this.error);i?(e.success("OK"),r.emit("register.send",{ctx:e,register:i,user:i.user}),this.emit("register.send",{ctx:e,register:i,user:i.user})):e.notFound("User not found")}))}getId(){return h(this,void 0,void 0,(function*(){const e=t.uuidv4();return(yield f.count({where:{token:e}}))?this.getId():e}))}},p([e.Post(),e.Middleware("validation",{name:t.Validation.string().required(),date:t.Validation.string().date().required(),email:t.Validation.string().email().required(),username:t.Validation.string().min(4).empty(),password:t.Validation.string().min(5).required(),confirm:t.Validation.string().min(5).required()}),g(0,e.Ctx()),g(1,e.Body()),g(2,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,Object,B]),y("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),p([e.Post("/confirm"),e.Middleware("validation",{token:t.Validation.string().required()}),g(0,e.Ctx()),g(1,e.Body("token")),g(2,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,String,B]),y("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),p([e.Post("/send"),e.Middleware("validation",{username:t.Validation.string().min(4).required()}),g(0,e.Ctx()),g(1,e.Body("username")),g(2,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,String,B]),y("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=p([e.Controller("/register"),e.Extends(H)],exports.RegisterController),exports.RoutesController=class extends exports.CrudController{model(){return S}create(){return{name:t.Validation.string().required(),description:t.Validation.string().empty(""),state:t.Validation.boolean().parse().required()}}update(){return{name:t.Validation.string().empty(),description:t.Validation.string().empty(),state:t.Validation.boolean().parse().empty()}}},exports.RoutesController=p([e.Controller("/routes"),e.Extends(exports.CrudController)],exports.RoutesController),exports.SetupController=class extends H{setup(r){return h(this,void 0,void 0,(function*(){if(0==(yield x.count())){const e={description:"",state:!0},r=yield x.create(Object.assign({name:"Admin",email:"admin@localhost",username:"admin",password:"8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918",avatar:""},e)),o=yield P.create(Object.assign({name:"admin"},e));yield E.create({userId:r.id,groupId:o.id});const s=["read","write"],i=["users","groups","routes"];yield t.forEachSeries(i,(r=>h(this,void 0,void 0,(function*(){yield t.forEachSeries(s,(t=>h(this,void 0,void 0,(function*(){const s=r+"."+t,i=yield S.create(Object.assign({name:s},e));yield O.create({groupId:o.id,routeId:i.id})}))))}))));const n=yield S.create(Object.assign({name:"logs.read"},e));yield O.create({groupId:o.id,routeId:n.id})}e.Responses.success(r,"OK")}))}},p([e.Get(),g(0,e.Res()),y("design:type",Function),y("design:paramtypes",[Object]),y("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=p([e.Controller("/setup"),e.Extends(H)],exports.SetupController),exports.UsersController=class extends exports.ModelController{model(){return x}constructor(){if(super(),m.API_HTTP_PUBLIC){const e=m.API_HTTP_PUBLIC+"/avatar";i.existsSync(m.API_HTTP_PUBLIC)&&!i.existsSync(e)&&i.mkdirSync(e)}}avatar(e,r){return h(this,void 0,void 0,(function*(){if(t.isArray(e.req.files)&&e.req.files.length){const t=e.req.files[0].filename||"";if(t){const o=m.API_HTTP_PUBLIC+"/avatar/";if(i.existsSync(o+r.avatar)&&i.lstatSync(o+r.avatar).isFile()&&i.rmSync(o+r.avatar),r.avatar=t,yield r.save().catch(this.error))return void e.success("OK")}}e.success("Record not changed")}))}password(e,t,r,o){return h(this,void 0,void 0,(function*(){const s=yield x.scope("password").findOne({where:{id:o.id,password:c.SHA256(t).toString(),state:!0}}).catch(this.error);s?(s.password=c.SHA256(r).toString(),(yield s.save().catch(this.error))?e.success("OK"):e.success("Record not changed")):e.error("Record not changed")}))}recordAdd(e,t,r){this.add(r,e,{},{password:c.SHA256(t).toString()})}recordAll(e,t){this.all(t,e)}recordDel(t,r,o,s){o&&o.id.toString()!=s?this.del(r,t):e.Responses.error(t,"Internal Server Error")}recordGet(e,t){this.get(t,e)}recordSet(e,t,r){this.set(r,e,{where:{}},t?{password:c.SHA256(t).toString()}:{})}},p([e.Post("/avatar"),e.Middleware("auth"),e.Middleware("upload",{count:1,field:"file",path:m.API_HTTP_PUBLIC+"/avatar",types:["image/bmp","image/jpeg","image/png"],size:20}),g(0,e.Ctx()),g(1,G()),y("design:type",Function),y("design:paramtypes",[e.Context,x]),y("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),p([e.Post("/password"),e.Middleware("auth"),e.Middleware("validation",{oldPassword:t.Validation.string().min(5).required(),newPassword:t.Validation.string().min(5).required()}),g(0,e.Ctx()),g(1,e.Body("oldPassword")),g(2,e.Body("newPassword")),g(3,G()),y("design:type",Function),y("design:paramtypes",[e.Context,String,String,x]),y("design:returntype",Promise)],exports.UsersController.prototype,"password",null),p([e.Post(),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validation",{name:t.Validation.string().required(),email:t.Validation.string().email().required(),username:t.Validation.string().min(4).required(),password:t.Validation.string().min(5).required(),description:t.Validation.string().empty(""),state:t.Validation.boolean().parse().required()}),g(0,e.Res()),g(1,e.Body("password")),g(2,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,String,Object]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordAdd",null),p([e.Get(),e.Middleware("auth"),e.Middleware("read"),g(0,e.Res()),g(1,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordAll",null),p([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),g(0,e.Res()),g(1,e.Req()),g(2,G()),g(3,e.Params("id")),y("design:type",Function),y("design:paramtypes",[Object,Object,x,String]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordDel",null),p([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),g(0,e.Res()),g(1,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordGet",null),p([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validation",{name:t.Validation.string().empty(),email:t.Validation.string().email().empty(),username:t.Validation.string().min(4).empty(),password:t.Validation.string().min(5).empty().filter(""),description:t.Validation.string().empty(),state:t.Validation.boolean().parse().empty()}),g(0,e.Res()),g(1,e.Body("password")),g(2,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,String,Object]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordSet",null),exports.UsersController=p([e.Controller("/users"),e.Extends(exports.ModelController),y("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class extends exports.ModelController{model(){return E}recordAll(e,t,r){this.all(t,e,{where:{userId:r},include:[{model:P,required:!0}]},(e=>e.map((e=>e.group))))}recordSet(r,o,s){return h(this,void 0,void 0,(function*(){const i=yield x.findByPk(o,{attributes:["id"]}).catch(this.error);if(i){if(yield E.destroy({where:{userId:i.id}}),s){let e=0;for(let t=0;t<s.length;t++)e=yield P.count({where:{id:s[t]}}),e&&(yield E.create({userId:i.id,groupId:s[t]}))}e.Responses.success(r,"OK")}else t.isNull(i)?e.Responses.notfound(r,"Record not found"):e.Responses.error(r,"Internal Server Error")}))}},p([e.Get("/:id/groups"),e.Middleware("auth"),e.Middleware("read","users"),g(0,e.Res()),g(1,e.Req()),g(2,e.Params("id")),y("design:type",Function),y("design:paramtypes",[Object,Object,String]),y("design:returntype",void 0)],exports.UsersGroupsController.prototype,"recordAll",null),p([e.Put("/:id/groups"),e.Middleware("auth"),e.Middleware("write","users"),e.Middleware("validation",{groups:t.Validation.array(t.Validation.number().parse())}),g(0,e.Res()),g(1,e.Params("id")),g(2,e.Body("groups")),y("design:type",Function),y("design:paramtypes",[Object,String,Array]),y("design:returntype",Promise)],exports.UsersGroupsController.prototype,"recordSet",null),exports.UsersGroupsController=p([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersGroupsController),exports.Application=B,exports.Auth=v,exports.Config=j,exports.Configs=R,exports.ControllerBase=H,exports.Database=I,exports.Env=m,exports.Forgot=_,exports.Group=P,exports.GroupRoute=O,exports.Log=T,exports.Logs=b,exports.Permission=U,exports.Register=f,exports.ReqAuth=L,exports.ReqFiles=k,exports.ReqUser=G,exports.Route=S,exports.Session=w,exports.Token=F,exports.User=x,exports.UserGroup=E,exports.crt=N,exports.key=M,exports.sequelize=A;
7
+ "use strict";var e=require("@andrewcaires/express"),t=require("@andrewcaires/utils.js"),r=require("ws"),o=require("sequelize"),s=require("dotenv"),i=require("fs"),n=require("express-session"),d=require("jsonwebtoken"),a=require("multer"),l=require("path"),u=require("crypto-js");function c(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 p(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,s.config();class h{static getBool(e,r){return t.toBool(h.getString(e,r.toString()))}static getInt(e,t){return parseInt(h.getString(e,t.toString()))}static getMs(e,r){return t.parseMs(h.getString(e,r))}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_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=process.env.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 m{static connect(e){const t="connect_"+h.API_DB_TYPE.toLowerCase();if(t in m)return m[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},timezone:h.API_DB_TIMEZONE})}}const v=m.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 I extends o.Model{}I.init({secret:o.DataTypes.STRING,logout:o.DataTypes.DATE,useragent:o.DataTypes.STRING},{sequelize:v,modelName:h.API_DB_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class _ extends o.Model{}_.init({token:o.DataTypes.STRING,timestamp:o.DataTypes.BIGINT,state:o.DataTypes.BOOLEAN},{sequelize:v,modelName:h.API_DB_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class A extends o.Model{}A.init({name:o.DataTypes.STRING,description:o.DataTypes.TEXT,state:o.DataTypes.BOOLEAN},{sequelize:v,modelName:h.API_DB_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class P extends o.Model{}P.init({},{sequelize:v,modelName:h.API_DB_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),P.removeAttribute("id");class f extends o.Model{}f.init({token:o.DataTypes.STRING,state:o.DataTypes.BOOLEAN},{sequelize:v,modelName:h.API_DB_PREFIX+"register",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:v,modelName:h.API_DB_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class S extends o.Model{}S.init({name:o.DataTypes.STRING,email:o.DataTypes.STRING,username:o.DataTypes.STRING,password:o.DataTypes.STRING,avatar:o.DataTypes.STRING,date:o.DataTypes.DATEONLY,description:o.DataTypes.TEXT,state:o.DataTypes.BOOLEAN},{sequelize:v,modelName:h.API_DB_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated",defaultScope:{attributes:{exclude:["password"]}},scopes:{password:{attributes:{include:["password"]}}}});class O extends o.Model{}O.init({},{sequelize:v,modelName:h.API_DB_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),O.removeAttribute("id");class E extends o.Model{}E.init({key:o.DataTypes.STRING,value:o.DataTypes.STRING},{sequelize:v,modelName:h.API_DB_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),E.removeAttribute("id");class T extends o.Model{}T.init({type:o.DataTypes.STRING,source:o.DataTypes.STRING,message:o.DataTypes.TEXT},{sequelize:v,modelName:h.API_DB_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class C extends o.Model{}var w;C.init({session:o.DataTypes.STRING,json:o.DataTypes.TEXT,expired:o.DataTypes.BIGINT},{sequelize:v,modelName:h.API_DB_PREFIX+"session",timestamps:!0,createdAt:"created",updatedAt:"updated"}),C.removeAttribute("id"),S.hasMany(I),I.belongsTo(S),S.hasMany(_),_.belongsTo(S),S.hasMany(f),f.belongsTo(S),A.hasMany(P),P.belongsTo(A),x.hasMany(P),P.belongsTo(x),S.hasMany(O),O.belongsTo(S),A.hasMany(O),O.belongsTo(A),exports.LogsColor=void 0,(w=exports.LogsColor||(exports.LogsColor={})).ERROR="",w.INFO="",w.NONE="",w.SUCCESS="",w.WARNING="";class R{static write(e,t,r){return y(this,void 0,void 0,(function*(){yield R.writeRaw(exports.LogsColor.NONE,"",e,t,r)}))}static error(e,t,r){return y(this,void 0,void 0,(function*(){yield R.writeRaw(exports.LogsColor.ERROR,"error",e,t,r)}))}static info(e,t,r){return y(this,void 0,void 0,(function*(){yield R.writeRaw(exports.LogsColor.INFO,"info",e,t,r)}))}static success(e,t,r){return y(this,void 0,void 0,(function*(){yield R.writeRaw(exports.LogsColor.ERROR,"success",e,t,r)}))}static warning(e,t,r){return y(this,void 0,void 0,(function*(){yield R.writeRaw(exports.LogsColor.WARNING,"warning",e,t,r)}))}static writeConsole(e,r,o){const s=t.dateFormat(new Date,"%H:%M:%S");console.log(">",e,r+" ".repeat(10-r.length),"","|",s,"|",o)}static writeRaw(e,t,r,o,s){return y(this,void 0,void 0,(function*(){s&&R.writeConsole(e,t,r),v&&(yield T.create({type:t,source:o,message:r}).catch((()=>null)))}))}}const b=e=>i.existsSync(e)?i.readFileSync(e):void 0,D={http:b(h.API_HTTP_CRT),token:b(h.API_TOKEN_CRT)},N={http:b(h.API_HTTP_KEY),token:b(h.API_TOKEN_KEY)};class M extends n.Store{constructor(){super(),this.all=e=>y(this,void 0,void 0,(function*(){e=e||t.noop;const r=yield C.findAll({attributes:["session"],where:{expired:{[o.Op.gte]:Date.now()}}}).catch((t=>(e(t),null)));r&&e(null,r.map((e=>e.session))),e()})),this.clear=e=>y(this,void 0,void 0,(function*(){yield C.destroy().catch(t.noop),e&&e()})),this.destroy=(e,r)=>y(this,void 0,void 0,(function*(){yield C.destroy({where:{session:e}}).catch(t.noop),r&&r()})),this.expired=()=>y(this,void 0,void 0,(function*(){yield C.destroy({where:{expired:{[o.Op.lt]:Date.now()}}}).catch(t.noop)})),this.get=(e,r)=>y(this,void 0,void 0,(function*(){r=r||t.noop;const s=yield C.findOne({where:{session:e,expired:{[o.Op.gte]:Date.now()}}}).catch((e=>(r(e),null)));if(s){const e=JSON.parse(s.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield s.destroy().catch(t.noop),void r(null)}r(null,e)}else r(null)})),this.length=e=>y(this,void 0,void 0,(function*(){e&&e(null,(yield C.count().catch(t.noop))||0)})),this.set=(e,r,o)=>y(this,void 0,void 0,(function*(){o=o||t.noop;const s=Date.now()+h.API_SESSION_LIFETIME,i=JSON.stringify(r),[n,d]=(yield C.findOrCreate({where:{session:e},defaults:{session:e,json:i,expired:s}}).catch(t.noop))||[];n&&(d||(n.json=i,n.expired=s,yield n.save().catch(t.noop))),o()})),this.loop=t.loop(this.expired,3e4),this.loop.start()}}class F{static create(e){return y(this,void 0,void 0,(function*(){if(!N.token)return{error:"Key not found"};const{id:r}=e,o=t.uuidv4(),s=yield I.create({secret:o,userId:r}).catch(F.error);if(!s)return{error:"Internal Server Error"};return{auth:s,token:d.sign({id:r,secret:o},N.token,F.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){R.error(e.message,"api.token",h.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:h.API_TOKEN_LIFETIME+"ms"}}static renew(e){return y(this,void 0,void 0,(function*(){if(!N.token)return{error:"Key not found"};const{error:r,decode:o}=F.verify(e,h.API_TOKEN_RENEW/1e3);if(r)return{error:r};if(o){const{id:e,secret:r}=o;if(e&&r){const o=yield S.findOne({where:{id:e,state:!0}}).catch(F.error);if(o){const s=yield I.findOne({where:{secret:r,userId:o.id}}).catch(F.error);if(s&&!s.logout){s.secret=t.uuidv4(),yield s.save().catch(F.error);return{auth:s,token:d.sign({id:e,secret:s.secret},N.token,F.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e){return y(this,void 0,void 0,(function*(){const{error:t,decode:r}=F.verify(e);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield S.findOne({where:{id:e,state:!0}}).catch(F.error);if(r){const e=yield I.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(!D.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:d.verify(e,D.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class q extends e.Application{constructor(e){super(e,{cert:D.http,cross:h.API_HTTP_CROSS,hybrid:h.API_HTTP_HYBRID,key:N.http,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:t.uuidv4}})}error(e,t){R.info(e.message,t,h.API_CONSOLE_ERROR)}log(e,t){R.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return y(this,void 0,void 0,(function*(){yield v.sync(),yield e.listen.call(this),h.API_WEBSOCKET_START&&this.server&&(this._webSocket=new r.Server({server:this.server,verifyClient:(e,t)=>t(h.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,r)=>y(this,void 0,void 0,(function*(){r.url||(r.url="");const o=r.url.length<=1?"":r.url.replace(/\//g,".");let s;e.on("message",(t=>y(this,void 0,void 0,(function*(){if(s)try{const i=JSON.parse(t);this.emit("ws.message"+o,{data:i,message:t,req:r,user:s,ws:e})}catch(i){this.emit("ws.message"+o,{message:t,req:r,user:s,ws:e})}else{const{user:i}=yield F.user(t.toString());i&&(s=i,this.emit("ws.connection"+o,{req:r,user:s,ws:e}))}s||e.close()})))),e.on("close",(()=>{s&&this.emit("ws.close"+o,{user:s,ws:e})})),yield t.sleep(2e3),s||e.close()})))))}))}websocket(){return this._webSocket}}class B{static all(){return y(this,void 0,void 0,(function*(){const e=yield E.findAll().catch(B.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e){return y(this,void 0,void 0,(function*(){return((yield E.destroy({where:{key:e}}).catch(B.error))||0)>0}))}static error(e){R.error(e.message,"api.config",h.API_CONSOLE_ERROR)}static get(e,t=""){return y(this,void 0,void 0,(function*(){const r=yield E.findOne({where:{key:e}}).catch(B.error);return r?r.value:t}))}static set(e,t){return y(this,void 0,void 0,(function*(){const[r]=(yield E.findOrCreate({where:{key:e}}).catch(B.error))||[];r&&(r.value=t,yield r.save().catch(B.error))}))}}const j=e.parameterFactory((({req:e})=>e.auth)),L=e.parameterFactory((({req:e})=>t.toArray(e.files))),k=e.parameterFactory((({req:e})=>e.user));class G{static all(e,t){return y(this,void 0,void 0,(function*(){return yield x.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:P,required:!0,include:[{model:A,required:!0,where:{state:!0},include:[{model:O,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{R.error(e.message,"api.permission",h.API_CONSOLE_ERROR)}))}))}static get(e){return y(this,void 0,void 0,(function*(){const t=yield G.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return y(this,void 0,void 0,(function*(){const r=yield G.all(e,{name:t});return!!r&&r.length>0}))}}class U extends t.EventEmitter{constructor(){super(...arguments),this._uploads=t.cache()}auth(e,t,r,o){return y(this,void 0,void 0,(function*(){const{auth:s,error:i,user:n}=yield F.user(t);i?e.error(i):s&&n?s.useragent==r?(e.req.auth=s,e.req.user=n,o()):e.error("Invalid token"):e.error("Internal Server Error")}))}session(e,r,o){return y(this,void 0,void 0,(function*(){r.auth&&r.user&&(r.useragent?r.useragent!=e&&r.regenerate(t.noop):(r.useragent=e,r.save(t.noop))),o()}))}error(e){R.error(e.message,"api.controller",h.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r,o){return y(this,void 0,void 0,(function*(){o&&(yield G.is(o,r))?t():e.unauthorized("Access denied")}))}read(e,t,r,o){return y(this,void 0,void 0,(function*(){yield this.permission(e,t,(r||this.name())+".read",o)}))}upload(e,t,r){const o=this._uploads(r);o.upload||(o.upload=this.uploadMiddleware(r)),o.upload(e.req,e.res,(r=>{var o;if(r)return e.error(r.message),void(null===(o=e.res.socket)||void 0===o||o.destroy(r));t()}))}uploadFile(e,r){const o=t.uuidv4()+"."+r;return i.existsSync(l.join(e,o))?this.uploadFile(e,r):o}uploadMiddleware(e){const t=(null==e?void 0:e.path)||h.API_UPLOAD_TEMP,r=a.diskStorage({destination:(e,r,o)=>o(null,t),filename:(e,r,o)=>y(this,void 0,void 0,(function*(){return o(null,this.uploadFile(t,r.originalname.split(".").pop()||"bin"))}))}),o=(null==e?void 0:e.types)||[],s=a({storage:r,fileFilter(e,t,r){return y(this,void 0,void 0,(function*(){if(o.length){const e=t.originalname.split(".").pop()||"bin";return-1!=o.indexOf(t.mimetype)||-1!=o.indexOf(e)?r(null,!0):r(new Error("File not allowed"))}return r(null,!0)}))},limits:{fileSize:1e6*((null==e?void 0:e.size)||h.API_UPLOAD_SIZE)}});return s.array((null==e?void 0:e.field)||h.API_UPLOAD_FIELD,(null==e?void 0:e.count)||h.API_UPLOAD_COUNT)}validation(e,r,o){return y(this,void 0,void 0,(function*(){const{error:s,value:i}=yield t.Validation.object(o).parse().validateAsync(e.req.body);s?e.validation(s):(e.req.body=i,r())}))}write(e,t,r,o){return y(this,void 0,void 0,(function*(){yield this.permission(e,t,(r||this.name())+".write",o)}))}}c([p(0,e.Ctx()),p(1,e.Headers(h.API_TOKEN_HEADER)),p(2,e.Headers("user-agent")),p(3,e.Next()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,Function]),g("design:returntype",Promise)],U.prototype,"auth",null),c([p(0,e.Headers("user-agent")),p(1,e.Session()),p(2,e.Next()),g("design:type",Function),g("design:paramtypes",[String,Object,Function]),g("design:returntype",Promise)],U.prototype,"session",null),c([p(0,e.Ctx()),p(1,e.Next()),p(2,e.Argument()),p(3,k()),g("design:type",Function),g("design:paramtypes",[e.Context,Function,String,S]),g("design:returntype",Promise)],U.prototype,"permission",null),c([p(0,e.Ctx()),p(1,e.Next()),p(2,e.Argument()),p(3,k()),g("design:type",Function),g("design:paramtypes",[e.Context,Function,String,S]),g("design:returntype",Promise)],U.prototype,"read",null),c([p(0,e.Ctx()),p(1,e.Next()),p(2,e.Argument()),g("design:type",Function),g("design:paramtypes",[e.Context,Function,Object]),g("design:returntype",void 0)],U.prototype,"upload",null),c([p(0,e.Ctx()),p(1,e.Next()),p(2,e.Argument()),g("design:type",Function),g("design:paramtypes",[e.Context,Function,Object]),g("design:returntype",Promise)],U.prototype,"validation",null),c([p(0,e.Ctx()),p(1,e.Next()),p(2,e.Argument()),p(3,k()),g("design:type",Function),g("design:paramtypes",[e.Context,Function,String,S]),g("design:returntype",Promise)],U.prototype,"write",null),exports.AuthController=class extends U{login(e,r,s,i,n){return y(this,void 0,void 0,(function*(){yield t.sleep(h.API_SLEEP_AUTH);const d=s,a=yield S.findOne({where:{[o.Op.or]:[{email:d},{username:s}],[o.Op.and]:[{password:u.SHA256(i).toString()}]}}).catch(this.error);if(!a)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const l=yield f.findOne({where:{state:!0,userId:a.id}}).catch(this.error);if(l)return e.error("Activation required"),n.emit("auth.activation",{ctx:e,register:l,user:a}),void this.emit("auth.activation",{ctx:e,register:l,user:a});if(!a.state)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const{auth:c,error:p,token:g}=yield F.create(a);return p?(e.error(p),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):c&&g?(e.data({token:g}),c.useragent=r,yield c.save().catch(this.error),n.emit("auth.login",{auth:c,ctx:e,user:a}),void this.emit("auth.login",{auth:c,ctx:e,user:a})):(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 F.destroy(t))return e.success("Disconcerted"),o.emit("auth.logout",{auth:t,ctx:e,user:r}),void this.emit("auth.logout",{auth:t,ctx:e,user:r});e.unauthorized("Access denied")}))}renew(e,t,r,o){return y(this,void 0,void 0,(function*(){const{auth:s,error:i,token:n}=yield F.renew(r);i?e.error(i):s?(e.data({token:n}),s.useragent=t,yield s.save().catch(this.error),o.emit("auth.renew",{auth:s,ctx:e}),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 G.all(t);r?e.data(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))})):e.error("Internal Server Error")}))}},c([e.Post("/login"),e.Middleware("validation",{username:t.Validation.string().min(3).required(),password:t.Validation.string().min(5).required()}),p(0,e.Ctx()),p(1,e.Headers("user-agent")),p(2,e.Body("username")),p(3,e.Body("password")),p(4,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,String,q]),g("design:returntype",Promise)],exports.AuthController.prototype,"login",null),c([e.Get("/logout"),e.Middleware("auth"),p(0,e.Ctx()),p(1,j()),p(2,k()),p(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,I,S,q]),g("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),c([e.Post("/renew"),e.Middleware("validation",{token:t.Validation.string().required()}),p(0,e.Ctx()),p(1,e.Headers("user-agent")),p(2,e.Body("token")),p(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,q]),g("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),c([e.Get(),e.Middleware("auth"),p(0,e.Ctx()),p(1,k()),g("design:type",Function),g("design:paramtypes",[e.Context,S]),g("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=c([e.Controller("/auth"),e.Extends(U)],exports.AuthController),exports.FilesController=class extends U{directory(){return h.API_HTTP_PUBLIC||"./"}files(r){return y(this,void 0,void 0,(function*(){let{path:o}=r.req;o=o.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const s=l.join(this.directory(),o);if(!i.existsSync(s)||!i.statSync(s).isDirectory())return r.status(e.Status.NOT_FOUND),{message:"Path not Found"};let n=[];return n=i.readdirSync(s),n=n.map((e=>this.info(l.join(s,e)))),n=n.filter(t.isDef),Object.assign(Object.assign({},this.info(s)),{files:n})}))}access(e,t,r,o){return y(this,void 0,void 0,(function*(){yield this.permission(e,t,"files_"+this.name()+"."+r,o)}))}info(e){if(!i.existsSync(e))return null;const t=i.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()}}},c([e.Get("/path/?*"),e.Middleware("auth"),e.Middleware("access","list"),p(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.FilesController.prototype,"files",null),c([p(0,e.Ctx()),p(1,e.Next()),p(2,e.Argument()),p(3,k()),g("design:type",Function),g("design:paramtypes",[e.Context,Function,String,S]),g("design:returntype",Promise)],exports.FilesController.prototype,"access",null),exports.FilesController=c([e.Controller("/files"),e.Extends(U)],exports.FilesController),exports.ForgotController=class extends U{check(r,o){return y(this,void 0,void 0,(function*(){const{token:s}=o.body,i=yield this.findOne(s);i&&i.user?(i.token=t.uniqueID(),yield i.save(),e.Responses.data(r,{token:i.token})):e.Responses.notfound(r,"User not found")}))}forgot(e,r,s){return y(this,void 0,void 0,(function*(){yield t.sleep(h.API_SLEEP_FORGOT);const i=r,n=yield S.findOne({where:{[o.Op.or]:[{email:i},{username:r}]}}).catch(this.error);if(!n)return void e.notFound("User not found");const d=t.uniqueID(),a=Date.now()+6e4*h.API_TOKEN_FORGOT,l=yield _.create({token:d,timestamp:a,state:!0,userId:n.id});s.emit("forgot.send",{ctx:e,forgot:l,user:n}),this.emit("forgot.send",{ctx:e,forgot:l,user:n}),e.success("OK")}))}reset(e,t,r,o){return y(this,void 0,void 0,(function*(){const s=yield this.findOne(t);s?(s.state=!1,yield s.save().catch(this.error),s.user.password=u.SHA256(r).toString(),yield s.user.save().catch(this.error),o.emit("forgot.reset",{ctx:e,user:s.user}),this.emit("forgot.reset",{ctx:e,user:s.user}),e.success("OK")):e.notFound("User not found")}))}findOne(e){return y(this,void 0,void 0,(function*(){return yield _.findOne({where:{token:e,state:!0},include:[{model:S,required:!0}]}).catch(this.error)}))}},c([e.Get("/check"),e.Middleware("validation",{token:t.Validation.string().required()}),p(0,e.Res()),p(1,e.Req()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),c([e.Post(),e.Middleware("validation",{username:t.Validation.string().min(4).required()}),p(0,e.Ctx()),p(1,e.Body("username")),p(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,q]),g("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),c([e.Post("/reset"),e.Middleware("validation",{token:t.Validation.string().required(),password:t.Validation.string().min(5).required()}),p(0,e.Ctx()),p(1,e.Body("token")),p(2,e.Body("password")),p(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,q]),g("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=c([e.Controller("/forgot"),e.Extends(U)],exports.ForgotController),exports.ModelController=class extends U{add(t,r,o,s){return y(this,void 0,void 0,(function*(){const i=yield this.model().create(Object.assign(Object.assign({},t.body),s||{}),o||{}).catch(this.error);if(i){const t=this.key();return e.Responses.data(r,{[t]:i.getDataValue(t)}),i}e.Responses.error(r,"Internal Server Error")}))}all(r,s,i,n){var d,a,l,u,c;return y(this,void 0,void 0,(function*(){const p=this.model(),g=Object.assign({},i||{});g.where=Object.assign({},g.where||{});const y=null===(d=r.query.limit)||void 0===d?void 0:d.toString();y&&(g.limit=parseInt(y));const h=null===(a=r.query.offset)||void 0===a?void 0:a.toString();h&&(g.offset=parseInt(h));const m=Object.keys(p.getAttributes()),v=[],I=null===(l=r.query.asc)||void 0===l?void 0:l.toString();I&&I.length&&I.split(",").forEach((e=>{m.indexOf(e)>=0&&v.push([e,"ASC"])}));const _=null===(u=r.query.desc)||void 0===u?void 0:u.toString();_&&_.length&&_.split(",").forEach((e=>{m.indexOf(e)>=0&&v.push([e,"DESC"])})),v.length&&(g.order=v);const A=[],P=t.isArray(g.attributes)?g.attributes:m,f=null===(c=r.query.search)||void 0===c?void 0:c.toString();P.forEach((e=>{var s;if(t.isString(e)&&(f&&f.length&&A.push({[e]:{[o.Op.like]:`%${f}%`}}),"search_"+e in r.query)){const t=null===(s=r.query["search_"+e])||void 0===s?void 0:s.toString();t&&t.length&&A.push({[e]:{[o.Op.like]:`%${t}%`}})}})),A.length&&(g.where=Object.assign(Object.assign({},g.where),{[o.Op.or]:[...A]}));const x=(yield p.count(Object.assign(Object.assign({},g),{col:m[0]})).catch(this.error))||0,S=yield p.findAll(g).catch(this.error);if(S)return e.Responses.data(s,{count:x,records:n?yield n(S):S}),S;e.Responses.error(s,"Internal Server Error")}))}del(t,r,o){return y(this,void 0,void 0,(function*(){const s=this.key(),{[s]:i}=t.params;if(!i)return e.Responses.error(r,"Internal Server Error"),0;const n=yield this.model().destroy(Object.assign(Object.assign({},o||{}),{where:Object.assign(Object.assign({},(o||{}).where),{[s]:i})})).catch(this.error);return n?(e.Responses.success(r,"OK"),n):(e.Responses.notfound(r,"Record not found"),0)}))}error(e){e.sql?R.error(e.message+"\n"+e.sql,"api.controller.sql",h.API_CONSOLE_ERROR):super.error(e)}get(t,r,o,s){return y(this,void 0,void 0,(function*(){const i=this.key(),{[i]:n}=t.params,d=yield this.model().findOne(Object.assign(Object.assign({},o||{}),{where:Object.assign(Object.assign({},(o||{}).where),{[i]:n})})).catch(this.error);if(d)return e.Responses.data(r,s?yield s(d):d.toJSON()),d;null!==d?e.Responses.error(r,"Internal Server Error"):e.Responses.notfound(r,"Record not found")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}set(t,r,o,s){return y(this,void 0,void 0,(function*(){const i=this.key(),{[i]:n}=t.params,[d]=(yield this.model().update(Object.assign(Object.assign({},t.body),s||{}),Object.assign(Object.assign({},o||{}),{where:Object.assign(Object.assign({},(o||{}).where),{[i]:n})})).catch(this.error))||[];return d?(e.Responses.success(r,"OK"),!0):(e.Responses.success(r,"Record not changed"),!1)}))}},exports.ModelController=c([e.Extends(U)],exports.ModelController),exports.CrudController=class extends exports.ModelController{create(){return{}}recordAdd(e,t){this.add(e,t)}recordAll(e,t){this.all(e,t)}recordDel(e,t){this.del(e,t)}recordGet(e,t){this.get(e,t)}recordSet(e,t){this.set(e,t)}update(){return{}}validationAdd(e,t){this.validation(e,t,this.create())}validationSet(e,t){this.validation(e,t,this.update())}},c([e.Post(),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationAdd"),p(0,e.Req()),p(1,e.Res()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",void 0)],exports.CrudController.prototype,"recordAdd",null),c([e.Get(),e.Middleware("auth"),e.Middleware("read"),p(0,e.Req()),p(1,e.Res()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",void 0)],exports.CrudController.prototype,"recordAll",null),c([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),p(0,e.Req()),p(1,e.Res()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",void 0)],exports.CrudController.prototype,"recordDel",null),c([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),p(0,e.Req()),p(1,e.Res()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",void 0)],exports.CrudController.prototype,"recordGet",null),c([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationSet"),p(0,e.Req()),p(1,e.Res()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",void 0)],exports.CrudController.prototype,"recordSet",null),c([p(0,e.Ctx()),p(1,e.Next()),g("design:type",Function),g("design:paramtypes",[e.Context,Function]),g("design:returntype",void 0)],exports.CrudController.prototype,"validationAdd",null),c([p(0,e.Ctx()),p(1,e.Next()),g("design:type",Function),g("design:paramtypes",[e.Context,Function]),g("design:returntype",void 0)],exports.CrudController.prototype,"validationSet",null),exports.CrudController=c([e.Extends(exports.ModelController)],exports.CrudController),exports.GroupsController=class extends exports.CrudController{model(){return A}create(){return{name:t.Validation.string().required(),description:t.Validation.string().empty(""),state:t.Validation.boolean().parse().required()}}update(){return{name:t.Validation.string().empty(),description:t.Validation.string().empty(),state:t.Validation.boolean().parse().empty()}}},exports.GroupsController=c([e.Controller("/groups"),e.Extends(exports.CrudController)],exports.GroupsController),exports.GroupsRoutesController=class extends exports.ModelController{model(){return P}recordAll(e,t,r){return y(this,void 0,void 0,(function*(){this.all(e,t,{where:{groupId:r},include:[{model:x,required:!0}]},(e=>e.map((e=>e.route))))}))}recordSet(r,o,s){return y(this,void 0,void 0,(function*(){const i=yield A.findByPk(o,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield P.destroy({where:{groupId:t}}),s){let e=0;for(let r=0;r<s.length;r++)e=yield x.count({where:{id:s[r]}}),e&&(yield P.create({groupId:t,routeId:s[r]}))}e.Responses.success(r,"OK")}else t.isNull(i)?e.Responses.notfound(r,"Record not found"):e.Responses.error(r,"Internal Server Error")}))}},c([e.Get("/:id/routes"),e.Middleware("auth"),e.Middleware("read","groups"),p(0,e.Req()),p(1,e.Res()),p(2,e.Params("id")),g("design:type",Function),g("design:paramtypes",[Object,Object,String]),g("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"recordAll",null),c([e.Put("/:id/routes"),e.Middleware("auth"),e.Middleware("write","groups"),e.Middleware("validation",{routes:t.Validation.array(t.Validation.number().parse())}),p(0,e.Res()),p(1,e.Params("id")),p(2,e.Body("routes")),g("design:type",Function),g("design:paramtypes",[Object,String,Array]),g("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"recordSet",null),exports.GroupsRoutesController=c([e.Controller("/groups"),e.Extends(exports.ModelController)],exports.GroupsRoutesController),exports.LogsController=class extends exports.ModelController{model(){return T}recordAll(e,t,r,o){const s={};r&&(s.type=r),o&&(s.source=o),this.all(e,t,{where:s,order:[["created","DESC"]]})}},c([e.Get(),e.Middleware("auth"),e.Middleware("read"),p(0,e.Req()),p(1,e.Res()),p(2,e.Query("type")),p(3,e.Query("source")),g("design:type",Function),g("design:paramtypes",[Object,Object,String,String]),g("design:returntype",void 0)],exports.LogsController.prototype,"recordAll",null),exports.LogsController=c([e.Controller("/logs"),e.Extends(exports.ModelController)],exports.LogsController),exports.RegisterController=class extends U{register(e,r,s){return y(this,void 0,void 0,(function*(){yield t.sleep(h.API_SLEEP_REGISTRY);const{name:i,date:n,email:d,username:a,password:l,confirm:c}=r,p=a||d,g=u.SHA256(l).toString();if(yield S.count({where:{[o.Op.or]:[{email:d},{username:p}]}}).catch(this.error))return void e.validation("Invalid email or username");if(g!=u.SHA256(c).toString())return void e.error("Invalid password");const y=yield S.create({name:i,email:d,username:p,password:g,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!y)return void e.error("Internal Server Error");const m=yield f.create({token:yield this.getId(),userId:y.id,state:!0}).catch(this.error);if(!m)return y.destroy(),void 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 y(this,void 0,void 0,(function*(){const o=yield f.findOne({where:{token:t,state:!0},include:[{model:S,required:!0}]}).catch(this.error);o?(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})):e.notFound("User not found")}))}send(e,t,r){return y(this,void 0,void 0,(function*(){const s=t,i=yield f.findOne({where:{state:!0},include:[{model:S,required:!0,where:{[o.Op.or]:[{email:s},{username:t}]}}]}).catch(this.error);i?(e.success("OK"),r.emit("register.send",{ctx:e,register:i,user:i.user}),this.emit("register.send",{ctx:e,register:i,user:i.user})):e.notFound("User not found")}))}getId(){return y(this,void 0,void 0,(function*(){const e=t.uuidv4();return(yield f.count({where:{token:e}}))?this.getId():e}))}},c([e.Post(),e.Middleware("validation",{name:t.Validation.string().required(),date:t.Validation.string().date().required(),email:t.Validation.string().email().required(),username:t.Validation.string().min(4).empty(),password:t.Validation.string().min(5).required(),confirm:t.Validation.string().min(5).required()}),p(0,e.Ctx()),p(1,e.Body()),p(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,Object,q]),g("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),c([e.Post("/confirm"),e.Middleware("validation",{token:t.Validation.string().required()}),p(0,e.Ctx()),p(1,e.Body("token")),p(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,q]),g("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),c([e.Post("/send"),e.Middleware("validation",{username:t.Validation.string().min(4).required()}),p(0,e.Ctx()),p(1,e.Body("username")),p(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,q]),g("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=c([e.Controller("/register"),e.Extends(U)],exports.RegisterController),exports.RoutesController=class extends exports.CrudController{model(){return x}create(){return{name:t.Validation.string().required(),description:t.Validation.string().empty(""),state:t.Validation.boolean().parse().required()}}update(){return{name:t.Validation.string().empty(),description:t.Validation.string().empty(),state:t.Validation.boolean().parse().empty()}}},exports.RoutesController=c([e.Controller("/routes"),e.Extends(exports.CrudController)],exports.RoutesController),exports.SetupController=class extends U{setup(r){return y(this,void 0,void 0,(function*(){if(0==(yield S.count())){const e={description:"",state:!0},r=yield S.create(Object.assign({name:"Admin",email:"admin@localhost",username:"admin",password:"8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918",avatar:""},e)),o=yield A.create(Object.assign({name:"admin"},e));yield O.create({userId:r.id,groupId:o.id});const s=["read","write"],i=["users","groups","routes"];yield t.forEachSeries(i,(r=>y(this,void 0,void 0,(function*(){yield t.forEachSeries(s,(t=>y(this,void 0,void 0,(function*(){const s=r+"."+t,i=yield x.create(Object.assign({name:s},e));yield P.create({groupId:o.id,routeId:i.id})}))))}))));const n=[...s,"delete","list","rename","upload"];yield t.forEachSeries(n,(t=>y(this,void 0,void 0,(function*(){const r="files_api."+t,s=yield x.create(Object.assign({name:r},e));yield P.create({groupId:o.id,routeId:s.id})}))));const d=yield x.create(Object.assign({name:"logs.read"},e));yield P.create({groupId:o.id,routeId:d.id})}e.Responses.success(r,"OK")}))}},c([e.Get(),p(0,e.Res()),g("design:type",Function),g("design:paramtypes",[Object]),g("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=c([e.Controller("/setup"),e.Extends(U)],exports.SetupController),exports.UsersController=class extends exports.ModelController{model(){return S}constructor(){if(super(),h.API_HTTP_PUBLIC){const e=h.API_HTTP_PUBLIC+"/avatar";i.existsSync(h.API_HTTP_PUBLIC)&&!i.existsSync(e)&&i.mkdirSync(e)}}avatar(e,r){return y(this,void 0,void 0,(function*(){if(t.isArray(e.req.files)&&e.req.files.length){const t=e.req.files[0].filename||"";if(t){const o=h.API_HTTP_PUBLIC+"/avatar/";if(i.existsSync(o+r.avatar)&&i.lstatSync(o+r.avatar).isFile()&&i.rmSync(o+r.avatar),r.avatar=t,yield r.save().catch(this.error))return void e.success("OK")}}e.success("Record not changed")}))}password(e,t,r,o){return y(this,void 0,void 0,(function*(){const s=yield S.scope("password").findOne({where:{id:o.id,password:u.SHA256(t).toString(),state:!0}}).catch(this.error);s?(s.password=u.SHA256(r).toString(),(yield s.save().catch(this.error))?e.success("OK"):e.success("Record not changed")):e.error("Record not changed")}))}recordAdd(e,t,r){this.add(r,e,{},{password:u.SHA256(t).toString()})}recordAll(e,t){this.all(t,e)}recordDel(t,r,o,s){o&&o.id.toString()!=s?this.del(r,t):e.Responses.error(t,"Internal Server Error")}recordGet(e,t){this.get(t,e)}recordSet(e,t,r){this.set(r,e,{where:{}},t?{password:u.SHA256(t).toString()}:{})}},c([e.Post("/avatar"),e.Middleware("auth"),e.Middleware("upload",{count:1,field:"file",path:h.API_HTTP_PUBLIC+"/avatar",types:["image/bmp","image/jpeg","image/png"],size:20}),p(0,e.Ctx()),p(1,k()),g("design:type",Function),g("design:paramtypes",[e.Context,S]),g("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),c([e.Post("/password"),e.Middleware("auth"),e.Middleware("validation",{oldPassword:t.Validation.string().min(5).required(),newPassword:t.Validation.string().min(5).required()}),p(0,e.Ctx()),p(1,e.Body("oldPassword")),p(2,e.Body("newPassword")),p(3,k()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,S]),g("design:returntype",Promise)],exports.UsersController.prototype,"password",null),c([e.Post(),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validation",{name:t.Validation.string().required(),email:t.Validation.string().email().required(),username:t.Validation.string().min(4).required(),password:t.Validation.string().min(5).required(),description:t.Validation.string().empty(""),state:t.Validation.boolean().parse().required()}),p(0,e.Res()),p(1,e.Body("password")),p(2,e.Req()),g("design:type",Function),g("design:paramtypes",[Object,String,Object]),g("design:returntype",void 0)],exports.UsersController.prototype,"recordAdd",null),c([e.Get(),e.Middleware("auth"),e.Middleware("read"),p(0,e.Res()),p(1,e.Req()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",void 0)],exports.UsersController.prototype,"recordAll",null),c([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),p(0,e.Res()),p(1,e.Req()),p(2,k()),p(3,e.Params("id")),g("design:type",Function),g("design:paramtypes",[Object,Object,S,String]),g("design:returntype",void 0)],exports.UsersController.prototype,"recordDel",null),c([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),p(0,e.Res()),p(1,e.Req()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",void 0)],exports.UsersController.prototype,"recordGet",null),c([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validation",{name:t.Validation.string().empty(),email:t.Validation.string().email().empty(),username:t.Validation.string().min(4).empty(),password:t.Validation.string().min(5).empty().filter(""),description:t.Validation.string().empty(),state:t.Validation.boolean().parse().empty()}),p(0,e.Res()),p(1,e.Body("password")),p(2,e.Req()),g("design:type",Function),g("design:paramtypes",[Object,String,Object]),g("design:returntype",void 0)],exports.UsersController.prototype,"recordSet",null),exports.UsersController=c([e.Controller("/users"),e.Extends(exports.ModelController),g("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class extends exports.ModelController{model(){return O}recordAll(e,t,r){this.all(t,e,{where:{userId:r},include:[{model:A,required:!0}]},(e=>e.map((e=>e.group))))}recordSet(r,o,s){return y(this,void 0,void 0,(function*(){const i=yield S.findByPk(o,{attributes:["id"]}).catch(this.error);if(i){if(yield O.destroy({where:{userId:i.id}}),s){let e=0;for(let t=0;t<s.length;t++)e=yield A.count({where:{id:s[t]}}),e&&(yield O.create({userId:i.id,groupId:s[t]}))}e.Responses.success(r,"OK")}else t.isNull(i)?e.Responses.notfound(r,"Record not found"):e.Responses.error(r,"Internal Server Error")}))}},c([e.Get("/:id/groups"),e.Middleware("auth"),e.Middleware("read","users"),p(0,e.Res()),p(1,e.Req()),p(2,e.Params("id")),g("design:type",Function),g("design:paramtypes",[Object,Object,String]),g("design:returntype",void 0)],exports.UsersGroupsController.prototype,"recordAll",null),c([e.Put("/:id/groups"),e.Middleware("auth"),e.Middleware("write","users"),e.Middleware("validation",{groups:t.Validation.array(t.Validation.number().parse())}),p(0,e.Res()),p(1,e.Params("id")),p(2,e.Body("groups")),g("design:type",Function),g("design:paramtypes",[Object,String,Array]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"recordSet",null),exports.UsersGroupsController=c([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersGroupsController),exports.Application=q,exports.Auth=I,exports.Config=B,exports.Configs=E,exports.ControllerBase=U,exports.Database=m,exports.Env=h,exports.Forgot=_,exports.Group=A,exports.GroupRoute=P,exports.Log=T,exports.Logs=R,exports.Permission=G,exports.Register=f,exports.ReqAuth=j,exports.ReqFiles=L,exports.ReqUser=k,exports.Route=x,exports.Session=C,exports.Token=F,exports.User=S,exports.UserGroup=O,exports.crt=D,exports.key=N,exports.sequelize=v;
package/dist/index.d.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  /*!
2
- * @andrewcaires/api v3.0.15
2
+ * @andrewcaires/api v3.0.17
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 { IStore, Application as Application$1, Context } from '@andrewcaires/express';
7
+ import { Context, IStore, Application as Application$1 } from '@andrewcaires/express';
8
8
  import WebSocket from 'ws';
9
- import { TypeObjectAny, EventEmitter, TypeObject, ValidationBase, TypeObjectString } from '@andrewcaires/utils.js';
10
- import { Request, Response, NextFunction } from 'express';
9
+ import { TypeObjectAny, EventEmitter, TypeCallbackFunction, TypeObject, ValidationBase, TypeObjectString } from '@andrewcaires/utils.js';
11
10
  import { Model, CreateOptions, Attributes, FindOptions, ModelStatic, UpdateOptions, Sequelize, WhereOptions } from 'sequelize';
11
+ import { Response, Request } from 'express';
12
12
 
13
13
  declare class Route extends Model {
14
14
  id: number;
@@ -133,16 +133,18 @@ declare enum LogsColor {
133
133
  type LogsTypes = "error" | "info" | "success" | "warning" | "";
134
134
 
135
135
  declare abstract class ControllerBase extends EventEmitter {
136
- auth(req: Request, res: Response, token: string, useragent: string, next: NextFunction): Promise<void>;
137
- session(useragent: string, store: IStore, next: NextFunction): Promise<void>;
136
+ private _uploads;
137
+ auth(ctx: Context, token: string, useragent: string, next: TypeCallbackFunction): Promise<void>;
138
+ session(useragent: string, store: IStore, next: TypeCallbackFunction): Promise<void>;
138
139
  error(error: any): void;
139
- protected name(): string;
140
- permission(res: Response, next: NextFunction, name: string, user: User): Promise<void>;
141
- read(user: User, res: Response, next: NextFunction, name: string): Promise<void>;
142
- upload(req: Request, res: Response, next: NextFunction, options: IUploadOptions): void;
140
+ name(): string;
141
+ permission(ctx: Context, next: TypeCallbackFunction, name: string, user: User): Promise<void>;
142
+ read(ctx: Context, next: TypeCallbackFunction, name: string, user: User): Promise<void>;
143
+ upload(ctx: Context, next: TypeCallbackFunction, options: IUploadOptions): void;
143
144
  private uploadFile;
144
- validation(req: Request, res: Response, next: NextFunction, options: TypeObject<ValidationBase>): Promise<void>;
145
- write(res: Response, next: NextFunction, name: string, user: User): Promise<void>;
145
+ private uploadMiddleware;
146
+ validation(ctx: Context, next: TypeCallbackFunction, options: TypeObject<ValidationBase>): Promise<void>;
147
+ write(ctx: Context, next: TypeCallbackFunction, name: string, user: User): Promise<void>;
146
148
  }
147
149
 
148
150
  declare class Application extends Application$1 {
@@ -158,7 +160,7 @@ declare class Config {
158
160
  static all(): Promise<TypeObjectString>;
159
161
  static del(key: string): Promise<boolean>;
160
162
  private static error;
161
- static get(key: string): Promise<string>;
163
+ static get(key: string, value?: string): Promise<string>;
162
164
  static set(key: string, value: string): Promise<void>;
163
165
  }
164
166
 
@@ -169,6 +171,13 @@ declare class AuthController extends ControllerBase {
169
171
  protected user(ctx: Context, user: User): Promise<void>;
170
172
  }
171
173
 
174
+ declare class FilesController extends ControllerBase {
175
+ directory(): string;
176
+ files(ctx: Context): Promise<TypeObjectAny>;
177
+ access(ctx: Context, next: TypeCallbackFunction, name: string, user: User): Promise<void>;
178
+ private info;
179
+ }
180
+
172
181
  declare class ForgotController extends ControllerBase {
173
182
  check(res: Response, req: Request): Promise<void>;
174
183
  forgot(ctx: Context, username: string, app: Application): Promise<void>;
@@ -186,7 +195,7 @@ declare abstract class ModelController<M extends Model<M>> extends ControllerBas
186
195
  protected get(req: Request, res: Response, options?: FindOptions<Attributes<M>>, callback?: FnRecord<M>): Promise<M | void>;
187
196
  key(): string;
188
197
  abstract model(): ModelStatic<M>;
189
- protected name(): string;
198
+ name(): string;
190
199
  protected set(req: Request, res: Response, options?: UpdateOptions<Attributes<M>>, body?: TypeObjectAny): Promise<boolean>;
191
200
  }
192
201
 
@@ -198,8 +207,8 @@ declare abstract class CrudController<M extends Model<M>> extends ModelControlle
198
207
  recordGet(req: Request, res: Response): void;
199
208
  recordSet(req: Request, res: Response): void;
200
209
  update(): TypeObject<ValidationBase>;
201
- validationAdd(req: Request, res: Response, next: NextFunction): void;
202
- validationSet(req: Request, res: Response, next: NextFunction): void;
210
+ validationAdd(ctx: Context, next: TypeCallbackFunction): void;
211
+ validationSet(ctx: Context, next: TypeCallbackFunction): void;
203
212
  }
204
213
 
205
214
  declare class GroupsController extends CrudController<Group> {
@@ -353,4 +362,4 @@ declare class Token {
353
362
  private static verify;
354
363
  }
355
364
 
356
- export { Application, Auth, AuthController, Config, Configs, ControllerBase, CrudController, Database, Env, Forgot, ForgotController, Group, GroupRoute, GroupsController, GroupsRoutesController, type IDatabaseOptions, type ITokenParameters, type IUploadOptions, Log, Logs, LogsColor, LogsController, type LogsTypes, ModelController, Permission, Register, RegisterController, ReqAuth, ReqFiles, ReqUser, Route, RoutesController, Session, SetupController, Token, User, UserGroup, UsersController, UsersGroupsController, crt, key, sequelize };
365
+ export { Application, Auth, AuthController, Config, Configs, ControllerBase, CrudController, Database, Env, FilesController, Forgot, ForgotController, Group, GroupRoute, GroupsController, GroupsRoutesController, type IDatabaseOptions, type ITokenParameters, type IUploadOptions, Log, Logs, LogsColor, LogsController, type LogsTypes, ModelController, Permission, Register, RegisterController, ReqAuth, ReqFiles, ReqUser, Route, RoutesController, Session, SetupController, Token, User, UserGroup, UsersController, UsersGroupsController, crt, key, sequelize };
package/dist/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/api v3.0.15
2
+ * @andrewcaires/api v3.0.17
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,Req as r,Res as i,Headers as n,Next as s,Session as o,Argument as d,Responses as a,Post as c,Middleware as u,Ctx as l,Body as p,App as g,Get as m,Controller as h,Extends as y,Context as I,Delete as _,Put as v,Params as f,Query as P}from"@andrewcaires/express";import{toBool as A,parseMs as O,dateFormat as S,noop as E,loop as T,uuidv4 as w,sleep as b,toArray as R,EventEmitter as N,isNumber as D,Validation as j,uniqueID as F,isArray as B,isString as x,isNull as q,forEachSeries as k}from"@andrewcaires/utils.js";import L from"ws";import{Sequelize as C,DataTypes as K,Model as H,Op as M}from"sequelize";import{config as G}from"dotenv";import{existsSync as U,readFileSync as z,mkdirSync as X,lstatSync as Y,rmSync as W}from"fs";import{Store as Z}from"express-session";import{verify as J,sign as $}from"jsonwebtoken";import{extension as V}from"mime-types";import Q from"multer";import{join as ee}from"path";import{SHA256 as te}from"crypto-js";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 A(oe.getString(e,t.toString()))}static getInt(e,t){return parseInt(oe.getString(e,t.toString()))}static getMs(e,t){return O(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_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=process.env.API_UPLOAD_FIELD||"upload",oe.API_UPLOAD_SIZE=oe.getInt("API_UPLOAD_SIZE",2),oe.API_UPLOAD_TEMP=oe.getString("API_UPLOAD_TEMP","./temp"),oe.API_WEBSOCKET_START=oe.getBool("API_WEBSOCKET_START",!1);class de{static connect(e){const t="connect_"+oe.API_DB_TYPE.toLowerCase();if(t in de)return de[t](e);throw new Error("No database is connected to this API")}static connect_mariadb(e){return new C(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mariadb",logging:oe.API_DB_LOG,define:{timestamps:!1},timezone:oe.API_DB_TIMEZONE})}static connect_memory(){return new C("sqlite::memory:",{logging:oe.API_DB_LOG,define:{timestamps:!1},timezone:oe.API_DB_TIMEZONE})}static connect_mysql(e){return new C(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mysql",logging:oe.API_DB_LOG,define:{timestamps:!1},timezone:oe.API_DB_TIMEZONE})}static connect_postgres(e){return new C(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"postgres",logging:oe.API_DB_LOG,define:{timestamps:!1},timezone:oe.API_DB_TIMEZONE})}static connect_sqlite(e){return new C({dialect:"sqlite",storage:e.database,logging:oe.API_DB_LOG,define:{timestamps:!1},timezone:oe.API_DB_TIMEZONE})}}const ae=de.connect({database:oe.API_DB_DATABASE,username:oe.API_DB_USERNAME,password:oe.API_DB_PASSWORD,hostname:oe.API_DB_HOST,hostport:oe.API_DB_PORT});class ce extends H{}ce.init({secret:K.STRING,logout:K.DATE,useragent:K.STRING},{sequelize:ae,modelName:oe.API_DB_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class ue extends H{}ue.init({token:K.STRING,timestamp:K.BIGINT,state:K.BOOLEAN},{sequelize:ae,modelName:oe.API_DB_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class le extends H{}le.init({name:K.STRING,description:K.TEXT,state:K.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:K.STRING,state:K.BOOLEAN},{sequelize:ae,modelName:oe.API_DB_PREFIX+"register",timestamps:!0,createdAt:"created",updatedAt:"updated"});class me extends H{}me.init({name:K.STRING,description:K.TEXT,state:K.BOOLEAN},{sequelize:ae,modelName:oe.API_DB_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class he extends H{}he.init({name:K.STRING,email:K.STRING,username:K.STRING,password:K.STRING,avatar:K.STRING,date:K.DATEONLY,description:K.TEXT,state:K.BOOLEAN},{sequelize:ae,modelName:oe.API_DB_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated",defaultScope:{attributes:{exclude:["password"]}},scopes:{password:{attributes:{include:["password"]}}}});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 Ie extends H{}Ie.init({key:K.STRING,value:K.STRING},{sequelize:ae,modelName:oe.API_DB_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),Ie.removeAttribute("id");class _e extends H{}_e.init({type:K.STRING,source:K.STRING,message:K.TEXT},{sequelize:ae,modelName:oe.API_DB_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class ve extends H{}var fe;ve.init({session:K.STRING,json:K.TEXT,expired:K.BIGINT},{sequelize:ae,modelName:oe.API_DB_PREFIX+"session",timestamps:!0,createdAt:"created",updatedAt:"updated"}),ve.removeAttribute("id"),he.hasMany(ce),ce.belongsTo(he),he.hasMany(ue),ue.belongsTo(he),he.hasMany(ge),ge.belongsTo(he),le.hasMany(pe),pe.belongsTo(le),me.hasMany(pe),pe.belongsTo(me),he.hasMany(ye),ye.belongsTo(he),le.hasMany(ye),ye.belongsTo(le),function(e){e.ERROR="",e.INFO="",e.NONE="",e.SUCCESS="",e.WARNING=""}(fe||(fe={}));class Pe{static write(e,t,r){return se(this,void 0,void 0,(function*(){yield Pe.writeRaw(fe.NONE,"",e,t,r)}))}static error(e,t,r){return se(this,void 0,void 0,(function*(){yield Pe.writeRaw(fe.ERROR,"error",e,t,r)}))}static info(e,t,r){return se(this,void 0,void 0,(function*(){yield Pe.writeRaw(fe.INFO,"info",e,t,r)}))}static success(e,t,r){return se(this,void 0,void 0,(function*(){yield Pe.writeRaw(fe.ERROR,"success",e,t,r)}))}static warning(e,t,r){return se(this,void 0,void 0,(function*(){yield Pe.writeRaw(fe.WARNING,"warning",e,t,r)}))}static writeConsole(e,t,r){const i=S(new Date,"%H:%M:%S");console.log(">",e,t+" ".repeat(10-t.length),"","|",i,"|",r)}static writeRaw(e,t,r,i,n){return se(this,void 0,void 0,(function*(){n&&Pe.writeConsole(e,t,r),ae&&(yield _e.create({type:t,source:i,message:r}).catch((()=>null)))}))}}const Ae=e=>U(e)?z(e):void 0,Oe={http:Ae(oe.API_HTTP_CRT),token:Ae(oe.API_TOKEN_CRT)},Se={http:Ae(oe.API_HTTP_KEY),token:Ae(oe.API_TOKEN_KEY)};class Ee extends Z{constructor(){super(),this.all=e=>se(this,void 0,void 0,(function*(){e=e||E;const t=yield ve.findAll({attributes:["session"],where:{expired:{[M.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(E),e&&e()})),this.destroy=(e,t)=>se(this,void 0,void 0,(function*(){yield ve.destroy({where:{session:e}}).catch(E),t&&t()})),this.expired=()=>se(this,void 0,void 0,(function*(){yield ve.destroy({where:{expired:{[M.lt]:Date.now()}}}).catch(E)})),this.get=(e,t)=>se(this,void 0,void 0,(function*(){t=t||E;const r=yield ve.findOne({where:{session:e,expired:{[M.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(E),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(E))||0)})),this.set=(e,t,r)=>se(this,void 0,void 0,(function*(){r=r||E;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(E))||[];s&&(o||(s.json=n,s.expired=i,yield s.save().catch(E))),r()})),this.loop=T(this.expired,3e4),this.loop.start()}}class Te{static create(e){return se(this,void 0,void 0,(function*(){if(!Se.token)return{error:"Key not found"};const{id:t}=e,r=w(),i=yield ce.create({secret:r,userId:t}).catch(Te.error);if(!i)return{error:"Internal Server Error"};return{auth:i,token:$({id:t,secret:r},Se.token,Te.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){Pe.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(!Se.token)return{error:"Key not found"};const{error:t,decode:r}=Te.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 he.findOne({where:{id:e,state:!0}}).catch(Te.error);if(r){const i=yield ce.findOne({where:{secret:t,userId:r.id}}).catch(Te.error);if(i&&!i.logout){i.secret=w(),yield i.save().catch(Te.error);return{auth:i,token:$({id:e,secret:i.secret},Se.token,Te.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e){return se(this,void 0,void 0,(function*(){const{error:t,decode:r}=Te.verify(e);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield he.findOne({where:{id:e,state:!0}}).catch(Te.error);if(r){const e=yield ce.findOne({where:{secret:t,userId:r.id}}).catch(Te.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!Oe.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:J(e,Oe.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class we extends e{constructor(e){super(e,{cert:Oe.http,cross:oe.API_HTTP_CROSS,hybrid:oe.API_HTTP_HYBRID,key:Se.http,path:oe.API_DEFAULT_PATH,port:oe.API_HTTP_PORT,public:oe.API_HTTP_PUBLIC,redirect:oe.API_HTTP_REDIRECT,session:{store:new Ee,name:oe.API_SESSION_NAME,secret:oe.API_SESSION_SECRET,cookie:{maxAge:oe.API_SESSION_LIFETIME},genid:w}})}error(e,t){Pe.info(e.message,t,oe.API_CONSOLE_ERROR)}log(e,t){Pe.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 L.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 Te.user(n.toString());s&&(i=s,this.emit("ws.connection"+r,{req:t,user:i,ws:e}))}i||e.close()})))),e.on("close",(()=>{i&&this.emit("ws.close"+r,{user:i,ws:e})})),yield b(2e3),i||e.close()})))))}))}websocket(){return this._webSocket}}class be{static all(){return se(this,void 0,void 0,(function*(){const e=yield Ie.findAll().catch(be.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 Ie.destroy({where:{key:e}}).catch(be.error))||0)>0}))}static error(e){Pe.error(e.message,"api.config",oe.API_CONSOLE_ERROR)}static get(e){return se(this,void 0,void 0,(function*(){const t=yield Ie.findOne({where:{key:e}}).catch(be.error);return t&&t.value||""}))}static set(e,t){return se(this,void 0,void 0,(function*(){const[r]=(yield Ie.findOrCreate({where:{key:e}}).catch(be.error))||[];r&&(r.value=t,yield r.save().catch(be.error))}))}}const Re=t((({req:e})=>e.auth)),Ne=t((({req:e})=>R(e.files))),De=t((({req:e})=>e.user));class je{static all(e,t){return se(this,void 0,void 0,(function*(){return yield me.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=>{Pe.error(e.message,"api.permission",oe.API_CONSOLE_ERROR)}))}))}static get(e){return se(this,void 0,void 0,(function*(){const t=yield je.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return se(this,void 0,void 0,(function*(){const r=yield je.all(e,{name:t});return!!r&&r.length>0}))}}class Fe extends N{auth(e,t,r,i,n){return se(this,void 0,void 0,(function*(){const{auth:s,error:o,user:d}=yield Te.user(r);o?a.error(t,o):s&&d?s.useragent==i?(e.auth=s,e.user=d,n()):a.error(t,"Invalid token"):a.error(t,"Internal Server Error")}))}session(e,t,r){return se(this,void 0,void 0,(function*(){t.auth&&t.user&&(t.useragent?t.useragent!=e&&t.regenerate(E):(t.useragent=e,t.save(E))),r()}))}error(e){Pe.error(e.message,"api.controller",oe.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r,i){return se(this,void 0,void 0,(function*(){i?(yield je.is(i,r))?t():a.error(e,"Unauthorized access"):a.unauthorized(e,"Access denied")}))}read(e,t,r,i){return this.permission(t,r,(i||this.name())+".read",e)}upload(e,t,r,i){const n=(null==i?void 0:i.path)||oe.API_UPLOAD_TEMP,s=Q.diskStorage({destination:(e,t,r)=>r(null,n),filename:(e,t,r)=>se(this,void 0,void 0,(function*(){return r(null,this.uploadFile(n,V(t.mimetype)||"bin"))}))}),o=1e6*((null==i?void 0:i.size)||oe.API_UPLOAD_SIZE),d=Q({storage:s,fileFilter(e,t,r){var n;return se(this,void 0,void 0,(function*(){const e=null===(n=null==i?void 0:i.types)||void 0===n?void 0:n.indexOf(t.mimetype);return D(e)&&e<0?r(new Error("File type not allowed")):r(null,!0)}))},limits:{fileSize:o}}),c=(null==i?void 0:i.count)||oe.API_UPLOAD_COUNT,u=(null==i?void 0:i.field)||oe.API_UPLOAD_FIELD;d.array(u,c)(e,t,(e=>e?a.error(t,e.message):r()))}uploadFile(e,t){const r=w()+"."+t;return U(ee(e,r))?this.uploadFile(e,t):r}validation(e,t,r,i){return se(this,void 0,void 0,(function*(){const{error:n,value:s}=yield j.object(i).parse().validateAsync(e.body);n?a.validation(t,n):(e.body=s,r())}))}write(e,t,r,i){return this.permission(e,t,(r||this.name())+".write",i)}}re([ie(0,r()),ie(1,i()),ie(2,n(oe.API_TOKEN_HEADER)),ie(3,n("user-agent")),ie(4,s()),ne("design:type",Function),ne("design:paramtypes",[Object,Object,String,String,Function]),ne("design:returntype",Promise)],Fe.prototype,"auth",null),re([ie(0,n("user-agent")),ie(1,o()),ie(2,s()),ne("design:type",Function),ne("design:paramtypes",[String,Object,Function]),ne("design:returntype",Promise)],Fe.prototype,"session",null),re([ie(0,i()),ie(1,s()),ie(2,d()),ie(3,De()),ne("design:type",Function),ne("design:paramtypes",[Object,Function,String,he]),ne("design:returntype",Promise)],Fe.prototype,"permission",null),re([ie(0,De()),ie(1,i()),ie(2,s()),ie(3,d()),ne("design:type",Function),ne("design:paramtypes",[he,Object,Function,String]),ne("design:returntype",Promise)],Fe.prototype,"read",null),re([ie(0,r()),ie(1,i()),ie(2,s()),ie(3,d()),ne("design:type",Function),ne("design:paramtypes",[Object,Object,Function,Object]),ne("design:returntype",void 0)],Fe.prototype,"upload",null),re([ie(0,r()),ie(1,i()),ie(2,s()),ie(3,d()),ne("design:type",Function),ne("design:paramtypes",[Object,Object,Function,Object]),ne("design:returntype",Promise)],Fe.prototype,"validation",null),re([ie(0,i()),ie(1,s()),ie(2,d()),ie(3,De()),ne("design:type",Function),ne("design:paramtypes",[Object,Function,String,he]),ne("design:returntype",Promise)],Fe.prototype,"write",null);let Be=class extends Fe{login(e,t,r,i,n){return se(this,void 0,void 0,(function*(){yield b(oe.API_SLEEP_AUTH);const s=r,o=yield he.findOne({where:{[M.or]:[{email:s},{username:r}],[M.and]:[{password:te(i).toString()}]}}).catch(this.error);if(!o)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}),void this.emit("auth.failure",{ctx:e});const{auth:a,error:c,token:u}=yield Te.create(o);return c?(e.error(c),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):a&&u?(e.data({token:u}),a.useragent=t,yield a.save().catch(this.error),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 Te.destroy(t))return e.success("Disconcerted"),i.emit("auth.logout",{auth:t,ctx:e,user:r}),void this.emit("auth.logout",{auth:t,ctx:e,user:r});e.unauthorized("Access denied")}))}renew(e,t,r,i){return se(this,void 0,void 0,(function*(){const{auth:n,error:s,token:o}=yield Te.renew(r);s?e.error(s):n?(e.data({token:o}),n.useragent=t,yield n.save().catch(this.error),i.emit("auth.renew",{auth:n,ctx:e}),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 je.all(t);r?e.data(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))})):e.error("Internal Server Error")}))}};re([c("/login"),u("validation",{username:j.string().min(3).required(),password:j.string().min(5).required()}),ie(0,l()),ie(1,n("user-agent")),ie(2,p("username")),ie(3,p("password")),ie(4,g()),ne("design:type",Function),ne("design:paramtypes",[I,String,String,String,we]),ne("design:returntype",Promise)],Be.prototype,"login",null),re([m("/logout"),u("auth"),ie(0,l()),ie(1,Re()),ie(2,De()),ie(3,g()),ne("design:type",Function),ne("design:paramtypes",[I,ce,he,we]),ne("design:returntype",Promise)],Be.prototype,"logout",null),re([c("/renew"),u("validation",{token:j.string().required()}),ie(0,l()),ie(1,n("user-agent")),ie(2,p("token")),ie(3,g()),ne("design:type",Function),ne("design:paramtypes",[I,String,String,we]),ne("design:returntype",Promise)],Be.prototype,"renew",null),re([m(),u("auth"),ie(0,l()),ie(1,De()),ne("design:type",Function),ne("design:paramtypes",[I,he]),ne("design:returntype",Promise)],Be.prototype,"user",null),Be=re([h("/auth"),y(Fe)],Be);let xe=class extends Fe{check(e,t){return se(this,void 0,void 0,(function*(){const{token:r}=t.body,i=yield this.findOne(r);i&&i.user?(i.token=F(),yield i.save(),a.data(e,{token:i.token})):a.notfound(e,"User not found")}))}forgot(e,t,r){return se(this,void 0,void 0,(function*(){yield b(oe.API_SLEEP_FORGOT);const i=t,n=yield he.findOne({where:{[M.or]:[{email:i},{username:t}]}}).catch(this.error);if(!n)return void e.notFound("User not found");const s=F(),o=Date.now()+6e4*oe.API_TOKEN_FORGOT,d=yield ue.create({token:s,timestamp:o,state:!0,userId:n.id});r.emit("forgot.send",{ctx:e,forgot:d,user:n}),this.emit("forgot.send",{ctx:e,forgot:d,user:n}),e.success("OK")}))}reset(e,t,r,i){return se(this,void 0,void 0,(function*(){const n=yield this.findOne(t);n?(n.state=!1,yield n.save().catch(this.error),n.user.password=te(r).toString(),yield n.user.save().catch(this.error),i.emit("forgot.reset",{ctx:e,user:n.user}),this.emit("forgot.reset",{ctx:e,user:n.user}),e.success("OK")):e.notFound("User not found")}))}findOne(e){return se(this,void 0,void 0,(function*(){return yield ue.findOne({where:{token:e,state:!0},include:[{model:he,required:!0}]}).catch(this.error)}))}};re([m("/check"),u("validation",{token:j.string().required()}),ie(0,i()),ie(1,r()),ne("design:type",Function),ne("design:paramtypes",[Object,Object]),ne("design:returntype",Promise)],xe.prototype,"check",null),re([c(),u("validation",{username:j.string().min(4).required()}),ie(0,l()),ie(1,p("username")),ie(2,g()),ne("design:type",Function),ne("design:paramtypes",[I,String,we]),ne("design:returntype",Promise)],xe.prototype,"forgot",null),re([c("/reset"),u("validation",{token:j.string().required(),password:j.string().min(5).required()}),ie(0,l()),ie(1,p("token")),ie(2,p("password")),ie(3,g()),ne("design:type",Function),ne("design:paramtypes",[I,String,String,we]),ne("design:returntype",Promise)],xe.prototype,"reset",null),xe=re([h("/forgot"),y(Fe)],xe);let qe=class extends Fe{add(e,t,r,i){return se(this,void 0,void 0,(function*(){const n=yield this.model().create(Object.assign(Object.assign({},e.body),i||{}),r||{}).catch(this.error);if(n){const e=this.key();return a.data(t,{[e]:n.getDataValue(e)}),n}a.error(t,"Internal Server Error")}))}all(e,t,r,i){var n,s,o,d,c;return se(this,void 0,void 0,(function*(){const u=this.model(),l=Object.assign({},r||{});l.where=Object.assign({},l.where||{});const p=null===(n=e.query.limit)||void 0===n?void 0:n.toString();p&&(l.limit=parseInt(p));const g=null===(s=e.query.offset)||void 0===s?void 0:s.toString();g&&(l.offset=parseInt(g));const m=Object.keys(u.getAttributes()),h=[],y=null===(o=e.query.asc)||void 0===o?void 0:o.toString();y&&y.length&&y.split(",").forEach((e=>{m.indexOf(e)>=0&&h.push([e,"ASC"])}));const I=null===(d=e.query.desc)||void 0===d?void 0:d.toString();I&&I.length&&I.split(",").forEach((e=>{m.indexOf(e)>=0&&h.push([e,"DESC"])})),h.length&&(l.order=h);const _=[],v=B(l.attributes)?l.attributes:m,f=null===(c=e.query.search)||void 0===c?void 0:c.toString();v.forEach((t=>{var r;if(x(t)&&(f&&f.length&&_.push({[t]:{[M.like]:`%${f}%`}}),"search_"+t in e.query)){const i=null===(r=e.query["search_"+t])||void 0===r?void 0:r.toString();i&&i.length&&_.push({[t]:{[M.like]:`%${i}%`}})}})),_.length&&(l.where=Object.assign(Object.assign({},l.where),{[M.or]:[..._]}));const P=(yield u.count(Object.assign(Object.assign({},l),{col:m[0]})).catch(this.error))||0,A=yield u.findAll(l).catch(this.error);if(A)return a.data(t,{count:P,records:i?yield i(A):A}),A;a.error(t,"Internal Server Error")}))}del(e,t,r){return se(this,void 0,void 0,(function*(){const i=this.key(),{[i]:n}=e.params;if(!n)return a.error(t,"Internal Server Error"),0;const s=yield this.model().destroy(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[i]:n})})).catch(this.error);return s?(a.success(t,"OK"),s):(a.notfound(t,"Record not found"),0)}))}error(e){e.sql?Pe.error(e.message+"\n"+e.sql,"api.controller.sql",oe.API_CONSOLE_ERROR):super.error(e)}get(e,t,r,i){return se(this,void 0,void 0,(function*(){const n=this.key(),{[n]:s}=e.params,o=yield this.model().findOne(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[n]:s})})).catch(this.error);if(o)return a.data(t,i?yield i(o):o.toJSON()),o;null!==o?a.error(t,"Internal Server Error"):a.notfound(t,"Record not found")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}set(e,t,r,i){return se(this,void 0,void 0,(function*(){const n=this.key(),{[n]:s}=e.params,[o]=(yield this.model().update(Object.assign(Object.assign({},e.body),i||{}),Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[n]:s})})).catch(this.error))||[];return o?(a.success(t,"OK"),!0):(a.success(t,"Record not changed"),!1)}))}};qe=re([y(Fe)],qe);let ke=class extends qe{create(){return{}}recordAdd(e,t){this.add(e,t)}recordAll(e,t){this.all(e,t)}recordDel(e,t){this.del(e,t)}recordGet(e,t){this.get(e,t)}recordSet(e,t){this.set(e,t)}update(){return{}}validationAdd(e,t,r){this.validation(e,t,r,this.create())}validationSet(e,t,r){this.validation(e,t,r,this.update())}};re([c(),u("auth"),u("write"),u("validationAdd"),ie(0,r()),ie(1,i()),ne("design:type",Function),ne("design:paramtypes",[Object,Object]),ne("design:returntype",void 0)],ke.prototype,"recordAdd",null),re([m(),u("auth"),u("read"),ie(0,r()),ie(1,i()),ne("design:type",Function),ne("design:paramtypes",[Object,Object]),ne("design:returntype",void 0)],ke.prototype,"recordAll",null),re([_("/:id"),u("auth"),u("write"),ie(0,r()),ie(1,i()),ne("design:type",Function),ne("design:paramtypes",[Object,Object]),ne("design:returntype",void 0)],ke.prototype,"recordDel",null),re([m("/:id"),u("auth"),u("read"),ie(0,r()),ie(1,i()),ne("design:type",Function),ne("design:paramtypes",[Object,Object]),ne("design:returntype",void 0)],ke.prototype,"recordGet",null),re([v("/:id"),u("auth"),u("write"),u("validationSet"),ie(0,r()),ie(1,i()),ne("design:type",Function),ne("design:paramtypes",[Object,Object]),ne("design:returntype",void 0)],ke.prototype,"recordSet",null),re([ie(0,r()),ie(1,i()),ie(2,s()),ne("design:type",Function),ne("design:paramtypes",[Object,Object,Function]),ne("design:returntype",void 0)],ke.prototype,"validationAdd",null),re([ie(0,r()),ie(1,i()),ie(2,s()),ne("design:type",Function),ne("design:paramtypes",[Object,Object,Function]),ne("design:returntype",void 0)],ke.prototype,"validationSet",null),ke=re([y(qe)],ke);let Le=class extends ke{model(){return le}create(){return{name:j.string().required(),description:j.string().empty(""),state:j.boolean().parse().required()}}update(){return{name:j.string().empty(),description:j.string().empty(),state:j.boolean().parse().empty()}}};Le=re([h("/groups"),y(ke)],Le);let Ce=class extends qe{model(){return pe}recordAll(e,t,r){return se(this,void 0,void 0,(function*(){this.all(e,t,{where:{groupId:r},include:[{model:me,required:!0}]},(e=>e.map((e=>e.route))))}))}recordSet(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 me.count({where:{id:r[i]}}),e&&(yield pe.create({groupId:t,routeId:r[i]}))}a.success(e,"OK")}else q(i)?a.notfound(e,"Record not found"):a.error(e,"Internal Server Error")}))}};re([m("/:id/routes"),u("auth"),u("read","groups"),ie(0,r()),ie(1,i()),ie(2,f("id")),ne("design:type",Function),ne("design:paramtypes",[Object,Object,String]),ne("design:returntype",Promise)],Ce.prototype,"recordAll",null),re([v("/:id/routes"),u("auth"),u("write","groups"),u("validation",{routes:j.array(j.number().parse())}),ie(0,i()),ie(1,f("id")),ie(2,p("routes")),ne("design:type",Function),ne("design:paramtypes",[Object,String,Array]),ne("design:returntype",Promise)],Ce.prototype,"recordSet",null),Ce=re([h("/groups"),y(qe)],Ce);let Ke=class extends qe{model(){return _e}recordAll(e,t,r,i){const n={};r&&(n.type=r),i&&(n.source=i),this.all(e,t,{where:n,order:[["created","DESC"]]})}};re([m(),u("auth"),u("read"),ie(0,r()),ie(1,i()),ie(2,P("type")),ie(3,P("source")),ne("design:type",Function),ne("design:paramtypes",[Object,Object,String,String]),ne("design:returntype",void 0)],Ke.prototype,"recordAll",null),Ke=re([h("/logs"),y(qe)],Ke);let He=class extends Fe{register(e,t,r){return se(this,void 0,void 0,(function*(){yield b(oe.API_SLEEP_REGISTRY);const{name:i,date:n,email:s,username:o,password:d,confirm:a}=t,c=o||s,u=te(d).toString();if(yield he.count({where:{[M.or]:[{email:s},{username:c}]}}).catch(this.error))return void e.validation("Invalid email or username");if(u!=te(a).toString())return void e.error("Invalid password");const l=yield he.create({name:i,email:s,username:c,password:u,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!l)return void 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(),void 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:he,required:!0}]}).catch(this.error);i?(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})):e.notFound("User not found")}))}send(e,t,r){return se(this,void 0,void 0,(function*(){const i=t,n=yield ge.findOne({where:{state:!0},include:[{model:he,required:!0,where:{[M.or]:[{email:i},{username:t}]}}]}).catch(this.error);n?(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})):e.notFound("User not found")}))}getId(){return se(this,void 0,void 0,(function*(){const e=w();return(yield ge.count({where:{token:e}}))?this.getId():e}))}};re([c(),u("validation",{name:j.string().required(),date:j.string().date().required(),email:j.string().email().required(),username:j.string().min(4).empty(),password:j.string().min(5).required(),confirm:j.string().min(5).required()}),ie(0,l()),ie(1,p()),ie(2,g()),ne("design:type",Function),ne("design:paramtypes",[I,Object,we]),ne("design:returntype",Promise)],He.prototype,"register",null),re([c("/confirm"),u("validation",{token:j.string().required()}),ie(0,l()),ie(1,p("token")),ie(2,g()),ne("design:type",Function),ne("design:paramtypes",[I,String,we]),ne("design:returntype",Promise)],He.prototype,"confirm",null),re([c("/send"),u("validation",{username:j.string().min(4).required()}),ie(0,l()),ie(1,p("username")),ie(2,g()),ne("design:type",Function),ne("design:paramtypes",[I,String,we]),ne("design:returntype",Promise)],He.prototype,"send",null),He=re([h("/register"),y(Fe)],He);let Me=class extends ke{model(){return me}create(){return{name:j.string().required(),description:j.string().empty(""),state:j.boolean().parse().required()}}update(){return{name:j.string().empty(),description:j.string().empty(),state:j.boolean().parse().empty()}}};Me=re([h("/routes"),y(ke)],Me);let Ge=class extends Fe{setup(e){return se(this,void 0,void 0,(function*(){if(0==(yield he.count())){const e={description:"",state:!0},t=yield he.create(Object.assign({name:"Admin",email:"admin@localhost",username:"admin",password:"8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918",avatar:""},e)),r=yield le.create(Object.assign({name:"admin"},e));yield ye.create({userId:t.id,groupId:r.id});const i=["read","write"],n=["users","groups","routes"];yield k(n,(t=>se(this,void 0,void 0,(function*(){yield k(i,(i=>se(this,void 0,void 0,(function*(){const n=t+"."+i,s=yield me.create(Object.assign({name:n},e));yield pe.create({groupId:r.id,routeId:s.id})}))))}))));const s=yield me.create(Object.assign({name:"logs.read"},e));yield pe.create({groupId:r.id,routeId:s.id})}a.success(e,"OK")}))}};re([m(),ie(0,i()),ne("design:type",Function),ne("design:paramtypes",[Object]),ne("design:returntype",Promise)],Ge.prototype,"setup",null),Ge=re([h("/setup"),y(Fe)],Ge);let Ue=class extends qe{model(){return he}constructor(){if(super(),oe.API_HTTP_PUBLIC){const e=oe.API_HTTP_PUBLIC+"/avatar";U(oe.API_HTTP_PUBLIC)&&!U(e)&&X(e)}}avatar(e,t){return se(this,void 0,void 0,(function*(){if(B(e.req.files)&&e.req.files.length){const r=e.req.files[0].filename||"";if(r){const i=oe.API_HTTP_PUBLIC+"/avatar/";if(U(i+t.avatar)&&Y(i+t.avatar).isFile()&&W(i+t.avatar),t.avatar=r,yield t.save().catch(this.error))return void e.success("OK")}}e.success("Record not changed")}))}password(e,t,r,i){return se(this,void 0,void 0,(function*(){const n=yield he.scope("password").findOne({where:{id:i.id,password:te(t).toString(),state:!0}}).catch(this.error);n?(n.password=te(r).toString(),(yield n.save().catch(this.error))?e.success("OK"):e.success("Record not changed")):e.error("Record not changed")}))}recordAdd(e,t,r){this.add(r,e,{},{password:te(t).toString()})}recordAll(e,t){this.all(t,e)}recordDel(e,t,r,i){r&&r.id.toString()!=i?this.del(t,e):a.error(e,"Internal Server Error")}recordGet(e,t){this.get(t,e)}recordSet(e,t,r){this.set(r,e,{where:{}},t?{password:te(t).toString()}:{})}};re([c("/avatar"),u("auth"),u("upload",{count:1,field:"file",path:oe.API_HTTP_PUBLIC+"/avatar",types:["image/bmp","image/jpeg","image/png"],size:20}),ie(0,l()),ie(1,De()),ne("design:type",Function),ne("design:paramtypes",[I,he]),ne("design:returntype",Promise)],Ue.prototype,"avatar",null),re([c("/password"),u("auth"),u("validation",{oldPassword:j.string().min(5).required(),newPassword:j.string().min(5).required()}),ie(0,l()),ie(1,p("oldPassword")),ie(2,p("newPassword")),ie(3,De()),ne("design:type",Function),ne("design:paramtypes",[I,String,String,he]),ne("design:returntype",Promise)],Ue.prototype,"password",null),re([c(),u("auth"),u("write"),u("validation",{name:j.string().required(),email:j.string().email().required(),username:j.string().min(4).required(),password:j.string().min(5).required(),description:j.string().empty(""),state:j.boolean().parse().required()}),ie(0,i()),ie(1,p("password")),ie(2,r()),ne("design:type",Function),ne("design:paramtypes",[Object,String,Object]),ne("design:returntype",void 0)],Ue.prototype,"recordAdd",null),re([m(),u("auth"),u("read"),ie(0,i()),ie(1,r()),ne("design:type",Function),ne("design:paramtypes",[Object,Object]),ne("design:returntype",void 0)],Ue.prototype,"recordAll",null),re([_("/:id"),u("auth"),u("write"),ie(0,i()),ie(1,r()),ie(2,De()),ie(3,f("id")),ne("design:type",Function),ne("design:paramtypes",[Object,Object,he,String]),ne("design:returntype",void 0)],Ue.prototype,"recordDel",null),re([m("/:id"),u("auth"),u("read"),ie(0,i()),ie(1,r()),ne("design:type",Function),ne("design:paramtypes",[Object,Object]),ne("design:returntype",void 0)],Ue.prototype,"recordGet",null),re([v("/:id"),u("auth"),u("write"),u("validation",{name:j.string().empty(),email:j.string().email().empty(),username:j.string().min(4).empty(),password:j.string().min(5).empty().filter(""),description:j.string().empty(),state:j.boolean().parse().empty()}),ie(0,i()),ie(1,p("password")),ie(2,r()),ne("design:type",Function),ne("design:paramtypes",[Object,String,Object]),ne("design:returntype",void 0)],Ue.prototype,"recordSet",null),Ue=re([h("/users"),y(qe),ne("design:paramtypes",[])],Ue);let ze=class extends qe{model(){return ye}recordAll(e,t,r){this.all(t,e,{where:{userId:r},include:[{model:le,required:!0}]},(e=>e.map((e=>e.group))))}recordSet(e,t,r){return se(this,void 0,void 0,(function*(){const i=yield he.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]}))}a.success(e,"OK")}else q(i)?a.notfound(e,"Record not found"):a.error(e,"Internal Server Error")}))}};re([m("/:id/groups"),u("auth"),u("read","users"),ie(0,i()),ie(1,r()),ie(2,f("id")),ne("design:type",Function),ne("design:paramtypes",[Object,Object,String]),ne("design:returntype",void 0)],ze.prototype,"recordAll",null),re([v("/:id/groups"),u("auth"),u("write","users"),u("validation",{groups:j.array(j.number().parse())}),ie(0,i()),ie(1,f("id")),ie(2,p("groups")),ne("design:type",Function),ne("design:paramtypes",[Object,String,Array]),ne("design:returntype",Promise)],ze.prototype,"recordSet",null),ze=re([h("/users"),y(qe)],ze);export{we as Application,ce as Auth,Be as AuthController,be as Config,Ie as Configs,Fe as ControllerBase,ke as CrudController,de as Database,oe as Env,ue as Forgot,xe as ForgotController,le as Group,pe as GroupRoute,Le as GroupsController,Ce as GroupsRoutesController,_e as Log,Pe as Logs,fe as LogsColor,Ke as LogsController,qe as ModelController,je as Permission,ge as Register,He as RegisterController,Re as ReqAuth,Ne as ReqFiles,De as ReqUser,me as Route,Me as RoutesController,ve as Session,Ge as SetupController,Te as Token,he as User,ye as UserGroup,Ue as UsersController,ze as UsersGroupsController,Oe as crt,Se as key,ae as sequelize};
7
+ import{Application as e,parameterFactory as t,Ctx as r,Headers as i,Next as n,Session as s,Argument as o,Context as d,Post as a,Middleware as c,Body as u,App as l,Get as p,Controller as g,Extends as h,Status as m,Res as y,Req as _,Responses as I,Delete as v,Put as f,Params as P,Query as A}from"@andrewcaires/express";import{toBool as O,parseMs as S,dateFormat as E,noop as T,loop as w,uuidv4 as R,sleep as b,toArray as N,EventEmitter as D,cache as F,Validation as j,isDef as B,uniqueID as q,isArray as x,isString as k,isNull as L,forEachSeries as C}from"@andrewcaires/utils.js";import H from"ws";import{Sequelize as K,DataTypes as M,Model as U,Op as G}from"sequelize";import{config as z}from"dotenv";import{existsSync as X,readFileSync as Y,statSync as W,readdirSync as Z,mkdirSync as J,lstatSync as $,rmSync as V}from"fs";import{Store as Q}from"express-session";import{verify as ee,sign as te}from"jsonwebtoken";import re from"multer";import{join as ie}from"path";import{SHA256 as ne}from"crypto-js";function se(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 oe(e,t){return function(r,i){t(r,i,e)}}function de(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function ae(e,t,r,i){return new(r||(r=Promise))((function(n,s){function o(e){try{a(i.next(e))}catch(e){s(e)}}function d(e){try{a(i.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,d)}a((i=i.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,z();class ce{static getBool(e,t){return O(ce.getString(e,t.toString()))}static getInt(e,t){return parseInt(ce.getString(e,t.toString()))}static getMs(e,t){return S(ce.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}ce.API_CONSOLE_ERROR=ce.getBool("API_CONSOLE_ERROR",!1),ce.API_DEFAULT_PATH=ce.getString("API_DEFAULT_PATH","/api"),ce.API_DB_DATABASE=ce.getString("API_DB_DATABASE",""),ce.API_DB_HOST=ce.getString("API_DB_HOST","127.0.0.1"),ce.API_DB_PASSWORD=ce.getString("API_DB_PASSWORD",""),ce.API_DB_PORT=ce.getInt("API_DB_PORT",3306),ce.API_DB_TYPE=ce.getString("API_DB_TYPE",""),ce.API_DB_USERNAME=ce.getString("API_DB_USERNAME","root"),ce.API_DB_LOG=ce.getBool("API_DB_LOG",!1),ce.API_DB_PREFIX=ce.getString("API_DB_PREFIX",""),ce.API_DB_TIMEZONE=ce.getString("API_DB_TIMEZONE","+00:00"),ce.API_HTTP_CRT=ce.getString("API_HTTP_CRT",""),ce.API_HTTP_KEY=ce.getString("API_HTTP_KEY",""),ce.API_HTTP_PORT=ce.getInt("API_HTTP_PORT",3e3),ce.API_HTTP_PUBLIC=ce.getString("API_HTTP_PUBLIC",""),ce.API_HTTP_CROSS=ce.getBool("API_HTTP_CROSS",!1),ce.API_HTTP_HYBRID=ce.getBool("API_HTTP_HYBRID",!1),ce.API_HTTP_REDIRECT=ce.getString("API_HTTP_REDIRECT",""),ce.API_SLEEP_AUTH=ce.getMs("API_SLEEP_AUTH","2s"),ce.API_SLEEP_FORGOT=ce.getMs("API_SLEEP_FORGOT","5s"),ce.API_SLEEP_REGISTRY=ce.getMs("API_SLEEP_REGISTRY","5s"),ce.API_SESSION_NAME=ce.getString("API_SESSION_NAME","session.id"),ce.API_SESSION_LIFETIME=ce.getMs("API_SESSION_LIFETIME","1d"),ce.API_SESSION_SECRET=ce.getString("API_SESSION_SECRET","yoursecret"),ce.API_TOKEN_CRT=ce.getString("API_TOKEN_CRT",""),ce.API_TOKEN_KEY=ce.getString("API_TOKEN_KEY",""),ce.API_TOKEN_FORGOT=ce.getMs("API_TOKEN_LIFETIME","1d"),ce.API_TOKEN_HEADER=ce.getString("API_TOKEN_HEADER","authorization"),ce.API_TOKEN_LIFETIME=ce.getMs("API_TOKEN_LIFETIME","1d"),ce.API_TOKEN_RENEW=ce.getMs("API_TOKEN_RENEW","1d"),ce.API_UPLOAD_COUNT=ce.getInt("API_UPLOAD_COUNT",1),ce.API_UPLOAD_FIELD=process.env.API_UPLOAD_FIELD||"upload",ce.API_UPLOAD_SIZE=ce.getInt("API_UPLOAD_SIZE",2),ce.API_UPLOAD_TEMP=ce.getString("API_UPLOAD_TEMP","./temp"),ce.API_WEBSOCKET_START=ce.getBool("API_WEBSOCKET_START",!1);class ue{static connect(e){const t="connect_"+ce.API_DB_TYPE.toLowerCase();if(t in ue)return ue[t](e);throw new Error("No database is connected to this API")}static connect_mariadb(e){return new K(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mariadb",logging:ce.API_DB_LOG,define:{timestamps:!1},timezone:ce.API_DB_TIMEZONE})}static connect_memory(){return new K("sqlite::memory:",{logging:ce.API_DB_LOG,define:{timestamps:!1},timezone:ce.API_DB_TIMEZONE})}static connect_mysql(e){return new K(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mysql",logging:ce.API_DB_LOG,define:{timestamps:!1},timezone:ce.API_DB_TIMEZONE})}static connect_postgres(e){return new K(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"postgres",logging:ce.API_DB_LOG,define:{timestamps:!1},timezone:ce.API_DB_TIMEZONE})}static connect_sqlite(e){return new K({dialect:"sqlite",storage:e.database,logging:ce.API_DB_LOG,define:{timestamps:!1},timezone:ce.API_DB_TIMEZONE})}}const le=ue.connect({database:ce.API_DB_DATABASE,username:ce.API_DB_USERNAME,password:ce.API_DB_PASSWORD,hostname:ce.API_DB_HOST,hostport:ce.API_DB_PORT});class pe extends U{}pe.init({secret:M.STRING,logout:M.DATE,useragent:M.STRING},{sequelize:le,modelName:ce.API_DB_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class ge extends U{}ge.init({token:M.STRING,timestamp:M.BIGINT,state:M.BOOLEAN},{sequelize:le,modelName:ce.API_DB_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class he extends U{}he.init({name:M.STRING,description:M.TEXT,state:M.BOOLEAN},{sequelize:le,modelName:ce.API_DB_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class me extends U{}me.init({},{sequelize:le,modelName:ce.API_DB_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),me.removeAttribute("id");class ye extends U{}ye.init({token:M.STRING,state:M.BOOLEAN},{sequelize:le,modelName:ce.API_DB_PREFIX+"register",timestamps:!0,createdAt:"created",updatedAt:"updated"});class _e extends U{}_e.init({name:M.STRING,description:M.TEXT,state:M.BOOLEAN},{sequelize:le,modelName:ce.API_DB_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class Ie extends U{}Ie.init({name:M.STRING,email:M.STRING,username:M.STRING,password:M.STRING,avatar:M.STRING,date:M.DATEONLY,description:M.TEXT,state:M.BOOLEAN},{sequelize:le,modelName:ce.API_DB_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated",defaultScope:{attributes:{exclude:["password"]}},scopes:{password:{attributes:{include:["password"]}}}});class ve extends U{}ve.init({},{sequelize:le,modelName:ce.API_DB_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),ve.removeAttribute("id");class fe extends U{}fe.init({key:M.STRING,value:M.STRING},{sequelize:le,modelName:ce.API_DB_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),fe.removeAttribute("id");class Pe extends U{}Pe.init({type:M.STRING,source:M.STRING,message:M.TEXT},{sequelize:le,modelName:ce.API_DB_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class Ae extends U{}var Oe;Ae.init({session:M.STRING,json:M.TEXT,expired:M.BIGINT},{sequelize:le,modelName:ce.API_DB_PREFIX+"session",timestamps:!0,createdAt:"created",updatedAt:"updated"}),Ae.removeAttribute("id"),Ie.hasMany(pe),pe.belongsTo(Ie),Ie.hasMany(ge),ge.belongsTo(Ie),Ie.hasMany(ye),ye.belongsTo(Ie),he.hasMany(me),me.belongsTo(he),_e.hasMany(me),me.belongsTo(_e),Ie.hasMany(ve),ve.belongsTo(Ie),he.hasMany(ve),ve.belongsTo(he),function(e){e.ERROR="",e.INFO="",e.NONE="",e.SUCCESS="",e.WARNING=""}(Oe||(Oe={}));class Se{static write(e,t,r){return ae(this,void 0,void 0,(function*(){yield Se.writeRaw(Oe.NONE,"",e,t,r)}))}static error(e,t,r){return ae(this,void 0,void 0,(function*(){yield Se.writeRaw(Oe.ERROR,"error",e,t,r)}))}static info(e,t,r){return ae(this,void 0,void 0,(function*(){yield Se.writeRaw(Oe.INFO,"info",e,t,r)}))}static success(e,t,r){return ae(this,void 0,void 0,(function*(){yield Se.writeRaw(Oe.ERROR,"success",e,t,r)}))}static warning(e,t,r){return ae(this,void 0,void 0,(function*(){yield Se.writeRaw(Oe.WARNING,"warning",e,t,r)}))}static writeConsole(e,t,r){const i=E(new Date,"%H:%M:%S");console.log(">",e,t+" ".repeat(10-t.length),"","|",i,"|",r)}static writeRaw(e,t,r,i,n){return ae(this,void 0,void 0,(function*(){n&&Se.writeConsole(e,t,r),le&&(yield Pe.create({type:t,source:i,message:r}).catch((()=>null)))}))}}const Ee=e=>X(e)?Y(e):void 0,Te={http:Ee(ce.API_HTTP_CRT),token:Ee(ce.API_TOKEN_CRT)},we={http:Ee(ce.API_HTTP_KEY),token:Ee(ce.API_TOKEN_KEY)};class Re extends Q{constructor(){super(),this.all=e=>ae(this,void 0,void 0,(function*(){e=e||T;const t=yield Ae.findAll({attributes:["session"],where:{expired:{[G.gte]:Date.now()}}}).catch((t=>(e(t),null)));t&&e(null,t.map((e=>e.session))),e()})),this.clear=e=>ae(this,void 0,void 0,(function*(){yield Ae.destroy().catch(T),e&&e()})),this.destroy=(e,t)=>ae(this,void 0,void 0,(function*(){yield Ae.destroy({where:{session:e}}).catch(T),t&&t()})),this.expired=()=>ae(this,void 0,void 0,(function*(){yield Ae.destroy({where:{expired:{[G.lt]:Date.now()}}}).catch(T)})),this.get=(e,t)=>ae(this,void 0,void 0,(function*(){t=t||T;const r=yield Ae.findOne({where:{session:e,expired:{[G.gte]:Date.now()}}}).catch((e=>(t(e),null)));if(r){const e=JSON.parse(r.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield r.destroy().catch(T),void t(null)}t(null,e)}else t(null)})),this.length=e=>ae(this,void 0,void 0,(function*(){e&&e(null,(yield Ae.count().catch(T))||0)})),this.set=(e,t,r)=>ae(this,void 0,void 0,(function*(){r=r||T;const i=Date.now()+ce.API_SESSION_LIFETIME,n=JSON.stringify(t),[s,o]=(yield Ae.findOrCreate({where:{session:e},defaults:{session:e,json:n,expired:i}}).catch(T))||[];s&&(o||(s.json=n,s.expired=i,yield s.save().catch(T))),r()})),this.loop=w(this.expired,3e4),this.loop.start()}}class be{static create(e){return ae(this,void 0,void 0,(function*(){if(!we.token)return{error:"Key not found"};const{id:t}=e,r=R(),i=yield pe.create({secret:r,userId:t}).catch(be.error);if(!i)return{error:"Internal Server Error"};return{auth:i,token:te({id:t,secret:r},we.token,be.options())}}))}static destroy(e){return ae(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){Se.error(e.message,"api.token",ce.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:ce.API_TOKEN_LIFETIME+"ms"}}static renew(e){return ae(this,void 0,void 0,(function*(){if(!we.token)return{error:"Key not found"};const{error:t,decode:r}=be.verify(e,ce.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield Ie.findOne({where:{id:e,state:!0}}).catch(be.error);if(r){const i=yield pe.findOne({where:{secret:t,userId:r.id}}).catch(be.error);if(i&&!i.logout){i.secret=R(),yield i.save().catch(be.error);return{auth:i,token:te({id:e,secret:i.secret},we.token,be.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e){return ae(this,void 0,void 0,(function*(){const{error:t,decode:r}=be.verify(e);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield Ie.findOne({where:{id:e,state:!0}}).catch(be.error);if(r){const e=yield pe.findOne({where:{secret:t,userId:r.id}}).catch(be.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!Te.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:ee(e,Te.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class Ne extends e{constructor(e){super(e,{cert:Te.http,cross:ce.API_HTTP_CROSS,hybrid:ce.API_HTTP_HYBRID,key:we.http,path:ce.API_DEFAULT_PATH,port:ce.API_HTTP_PORT,public:ce.API_HTTP_PUBLIC,redirect:ce.API_HTTP_REDIRECT,session:{store:new Re,name:ce.API_SESSION_NAME,secret:ce.API_SESSION_SECRET,cookie:{maxAge:ce.API_SESSION_LIFETIME},genid:R}})}error(e,t){Se.info(e.message,t,ce.API_CONSOLE_ERROR)}log(e,t){Se.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return ae(this,void 0,void 0,(function*(){yield le.sync(),yield e.listen.call(this),ce.API_WEBSOCKET_START&&this.server&&(this._webSocket=new H.Server({server:this.server,verifyClient:(e,t)=>t(ce.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>ae(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=>ae(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 be.user(n.toString());s&&(i=s,this.emit("ws.connection"+r,{req:t,user:i,ws:e}))}i||e.close()})))),e.on("close",(()=>{i&&this.emit("ws.close"+r,{user:i,ws:e})})),yield b(2e3),i||e.close()})))))}))}websocket(){return this._webSocket}}class De{static all(){return ae(this,void 0,void 0,(function*(){const e=yield fe.findAll().catch(De.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e){return ae(this,void 0,void 0,(function*(){return((yield fe.destroy({where:{key:e}}).catch(De.error))||0)>0}))}static error(e){Se.error(e.message,"api.config",ce.API_CONSOLE_ERROR)}static get(e,t=""){return ae(this,void 0,void 0,(function*(){const r=yield fe.findOne({where:{key:e}}).catch(De.error);return r?r.value:t}))}static set(e,t){return ae(this,void 0,void 0,(function*(){const[r]=(yield fe.findOrCreate({where:{key:e}}).catch(De.error))||[];r&&(r.value=t,yield r.save().catch(De.error))}))}}const Fe=t((({req:e})=>e.auth)),je=t((({req:e})=>N(e.files))),Be=t((({req:e})=>e.user));class qe{static all(e,t){return ae(this,void 0,void 0,(function*(){return yield _e.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:me,required:!0,include:[{model:he,required:!0,where:{state:!0},include:[{model:ve,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{Se.error(e.message,"api.permission",ce.API_CONSOLE_ERROR)}))}))}static get(e){return ae(this,void 0,void 0,(function*(){const t=yield qe.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return ae(this,void 0,void 0,(function*(){const r=yield qe.all(e,{name:t});return!!r&&r.length>0}))}}class xe extends D{constructor(){super(...arguments),this._uploads=F()}auth(e,t,r,i){return ae(this,void 0,void 0,(function*(){const{auth:n,error:s,user:o}=yield be.user(t);s?e.error(s):n&&o?n.useragent==r?(e.req.auth=n,e.req.user=o,i()):e.error("Invalid token"):e.error("Internal Server Error")}))}session(e,t,r){return ae(this,void 0,void 0,(function*(){t.auth&&t.user&&(t.useragent?t.useragent!=e&&t.regenerate(T):(t.useragent=e,t.save(T))),r()}))}error(e){Se.error(e.message,"api.controller",ce.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r,i){return ae(this,void 0,void 0,(function*(){i&&(yield qe.is(i,r))?t():e.unauthorized("Access denied")}))}read(e,t,r,i){return ae(this,void 0,void 0,(function*(){yield this.permission(e,t,(r||this.name())+".read",i)}))}upload(e,t,r){const i=this._uploads(r);i.upload||(i.upload=this.uploadMiddleware(r)),i.upload(e.req,e.res,(r=>{var i;if(r)return e.error(r.message),void(null===(i=e.res.socket)||void 0===i||i.destroy(r));t()}))}uploadFile(e,t){const r=R()+"."+t;return X(ie(e,r))?this.uploadFile(e,t):r}uploadMiddleware(e){const t=(null==e?void 0:e.path)||ce.API_UPLOAD_TEMP,r=re.diskStorage({destination:(e,r,i)=>i(null,t),filename:(e,r,i)=>ae(this,void 0,void 0,(function*(){return i(null,this.uploadFile(t,r.originalname.split(".").pop()||"bin"))}))}),i=(null==e?void 0:e.types)||[],n=re({storage:r,fileFilter(e,t,r){return ae(this,void 0,void 0,(function*(){if(i.length){const e=t.originalname.split(".").pop()||"bin";return-1!=i.indexOf(t.mimetype)||-1!=i.indexOf(e)?r(null,!0):r(new Error("File not allowed"))}return r(null,!0)}))},limits:{fileSize:1e6*((null==e?void 0:e.size)||ce.API_UPLOAD_SIZE)}});return n.array((null==e?void 0:e.field)||ce.API_UPLOAD_FIELD,(null==e?void 0:e.count)||ce.API_UPLOAD_COUNT)}validation(e,t,r){return ae(this,void 0,void 0,(function*(){const{error:i,value:n}=yield j.object(r).parse().validateAsync(e.req.body);i?e.validation(i):(e.req.body=n,t())}))}write(e,t,r,i){return ae(this,void 0,void 0,(function*(){yield this.permission(e,t,(r||this.name())+".write",i)}))}}se([oe(0,r()),oe(1,i(ce.API_TOKEN_HEADER)),oe(2,i("user-agent")),oe(3,n()),de("design:type",Function),de("design:paramtypes",[d,String,String,Function]),de("design:returntype",Promise)],xe.prototype,"auth",null),se([oe(0,i("user-agent")),oe(1,s()),oe(2,n()),de("design:type",Function),de("design:paramtypes",[String,Object,Function]),de("design:returntype",Promise)],xe.prototype,"session",null),se([oe(0,r()),oe(1,n()),oe(2,o()),oe(3,Be()),de("design:type",Function),de("design:paramtypes",[d,Function,String,Ie]),de("design:returntype",Promise)],xe.prototype,"permission",null),se([oe(0,r()),oe(1,n()),oe(2,o()),oe(3,Be()),de("design:type",Function),de("design:paramtypes",[d,Function,String,Ie]),de("design:returntype",Promise)],xe.prototype,"read",null),se([oe(0,r()),oe(1,n()),oe(2,o()),de("design:type",Function),de("design:paramtypes",[d,Function,Object]),de("design:returntype",void 0)],xe.prototype,"upload",null),se([oe(0,r()),oe(1,n()),oe(2,o()),de("design:type",Function),de("design:paramtypes",[d,Function,Object]),de("design:returntype",Promise)],xe.prototype,"validation",null),se([oe(0,r()),oe(1,n()),oe(2,o()),oe(3,Be()),de("design:type",Function),de("design:paramtypes",[d,Function,String,Ie]),de("design:returntype",Promise)],xe.prototype,"write",null);let ke=class extends xe{login(e,t,r,i,n){return ae(this,void 0,void 0,(function*(){yield b(ce.API_SLEEP_AUTH);const s=r,o=yield Ie.findOne({where:{[G.or]:[{email:s},{username:r}],[G.and]:[{password:ne(i).toString()}]}}).catch(this.error);if(!o)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const d=yield ye.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}),void this.emit("auth.failure",{ctx:e});const{auth:a,error:c,token:u}=yield be.create(o);return c?(e.error(c),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):a&&u?(e.data({token:u}),a.useragent=t,yield a.save().catch(this.error),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 ae(this,void 0,void 0,(function*(){if(yield be.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 ae(this,void 0,void 0,(function*(){const{auth:n,error:s,token:o}=yield be.renew(r);s?e.error(s):n?(e.data({token:o}),n.useragent=t,yield n.save().catch(this.error),i.emit("auth.renew",{auth:n,ctx:e}),this.emit("auth.renew",{auth:n,ctx:e})):e.error("Internal Server Error")}))}user(e,t){return ae(this,void 0,void 0,(function*(){const r=yield qe.all(t);r?e.data(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))})):e.error("Internal Server Error")}))}};se([a("/login"),c("validation",{username:j.string().min(3).required(),password:j.string().min(5).required()}),oe(0,r()),oe(1,i("user-agent")),oe(2,u("username")),oe(3,u("password")),oe(4,l()),de("design:type",Function),de("design:paramtypes",[d,String,String,String,Ne]),de("design:returntype",Promise)],ke.prototype,"login",null),se([p("/logout"),c("auth"),oe(0,r()),oe(1,Fe()),oe(2,Be()),oe(3,l()),de("design:type",Function),de("design:paramtypes",[d,pe,Ie,Ne]),de("design:returntype",Promise)],ke.prototype,"logout",null),se([a("/renew"),c("validation",{token:j.string().required()}),oe(0,r()),oe(1,i("user-agent")),oe(2,u("token")),oe(3,l()),de("design:type",Function),de("design:paramtypes",[d,String,String,Ne]),de("design:returntype",Promise)],ke.prototype,"renew",null),se([p(),c("auth"),oe(0,r()),oe(1,Be()),de("design:type",Function),de("design:paramtypes",[d,Ie]),de("design:returntype",Promise)],ke.prototype,"user",null),ke=se([g("/auth"),h(xe)],ke);let Le=class extends xe{directory(){return ce.API_HTTP_PUBLIC||"./"}files(e){return ae(this,void 0,void 0,(function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const r=ie(this.directory(),t);if(!X(r)||!W(r).isDirectory())return e.status(m.NOT_FOUND),{message:"Path not Found"};let i=[];return i=Z(r),i=i.map((e=>this.info(ie(r,e)))),i=i.filter(B),Object.assign(Object.assign({},this.info(r)),{files:i})}))}access(e,t,r,i){return ae(this,void 0,void 0,(function*(){yield this.permission(e,t,"files_"+this.name()+"."+r,i)}))}info(e){if(!X(e))return null;const t=W(e),r=e.split("/").pop();e=e.replace(this.directory(),"/").replace(/^\/\//,"/");const i=t.isDirectory();return{name:r,path:e.replace(/^\/\//,"/"),size:t.size,extension:i?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:i,symlink:t.isSymbolicLink()}}};se([p("/path/?*"),c("auth"),c("access","list"),oe(0,r()),de("design:type",Function),de("design:paramtypes",[d]),de("design:returntype",Promise)],Le.prototype,"files",null),se([oe(0,r()),oe(1,n()),oe(2,o()),oe(3,Be()),de("design:type",Function),de("design:paramtypes",[d,Function,String,Ie]),de("design:returntype",Promise)],Le.prototype,"access",null),Le=se([g("/files"),h(xe)],Le);let Ce=class extends xe{check(e,t){return ae(this,void 0,void 0,(function*(){const{token:r}=t.body,i=yield this.findOne(r);i&&i.user?(i.token=q(),yield i.save(),I.data(e,{token:i.token})):I.notfound(e,"User not found")}))}forgot(e,t,r){return ae(this,void 0,void 0,(function*(){yield b(ce.API_SLEEP_FORGOT);const i=t,n=yield Ie.findOne({where:{[G.or]:[{email:i},{username:t}]}}).catch(this.error);if(!n)return void e.notFound("User not found");const s=q(),o=Date.now()+6e4*ce.API_TOKEN_FORGOT,d=yield ge.create({token:s,timestamp:o,state:!0,userId:n.id});r.emit("forgot.send",{ctx:e,forgot:d,user:n}),this.emit("forgot.send",{ctx:e,forgot:d,user:n}),e.success("OK")}))}reset(e,t,r,i){return ae(this,void 0,void 0,(function*(){const n=yield this.findOne(t);n?(n.state=!1,yield n.save().catch(this.error),n.user.password=ne(r).toString(),yield n.user.save().catch(this.error),i.emit("forgot.reset",{ctx:e,user:n.user}),this.emit("forgot.reset",{ctx:e,user:n.user}),e.success("OK")):e.notFound("User not found")}))}findOne(e){return ae(this,void 0,void 0,(function*(){return yield ge.findOne({where:{token:e,state:!0},include:[{model:Ie,required:!0}]}).catch(this.error)}))}};se([p("/check"),c("validation",{token:j.string().required()}),oe(0,y()),oe(1,_()),de("design:type",Function),de("design:paramtypes",[Object,Object]),de("design:returntype",Promise)],Ce.prototype,"check",null),se([a(),c("validation",{username:j.string().min(4).required()}),oe(0,r()),oe(1,u("username")),oe(2,l()),de("design:type",Function),de("design:paramtypes",[d,String,Ne]),de("design:returntype",Promise)],Ce.prototype,"forgot",null),se([a("/reset"),c("validation",{token:j.string().required(),password:j.string().min(5).required()}),oe(0,r()),oe(1,u("token")),oe(2,u("password")),oe(3,l()),de("design:type",Function),de("design:paramtypes",[d,String,String,Ne]),de("design:returntype",Promise)],Ce.prototype,"reset",null),Ce=se([g("/forgot"),h(xe)],Ce);let He=class extends xe{add(e,t,r,i){return ae(this,void 0,void 0,(function*(){const n=yield this.model().create(Object.assign(Object.assign({},e.body),i||{}),r||{}).catch(this.error);if(n){const e=this.key();return I.data(t,{[e]:n.getDataValue(e)}),n}I.error(t,"Internal Server Error")}))}all(e,t,r,i){var n,s,o,d,a;return ae(this,void 0,void 0,(function*(){const c=this.model(),u=Object.assign({},r||{});u.where=Object.assign({},u.where||{});const l=null===(n=e.query.limit)||void 0===n?void 0:n.toString();l&&(u.limit=parseInt(l));const p=null===(s=e.query.offset)||void 0===s?void 0:s.toString();p&&(u.offset=parseInt(p));const g=Object.keys(c.getAttributes()),h=[],m=null===(o=e.query.asc)||void 0===o?void 0:o.toString();m&&m.length&&m.split(",").forEach((e=>{g.indexOf(e)>=0&&h.push([e,"ASC"])}));const y=null===(d=e.query.desc)||void 0===d?void 0:d.toString();y&&y.length&&y.split(",").forEach((e=>{g.indexOf(e)>=0&&h.push([e,"DESC"])})),h.length&&(u.order=h);const _=[],v=x(u.attributes)?u.attributes:g,f=null===(a=e.query.search)||void 0===a?void 0:a.toString();v.forEach((t=>{var r;if(k(t)&&(f&&f.length&&_.push({[t]:{[G.like]:`%${f}%`}}),"search_"+t in e.query)){const i=null===(r=e.query["search_"+t])||void 0===r?void 0:r.toString();i&&i.length&&_.push({[t]:{[G.like]:`%${i}%`}})}})),_.length&&(u.where=Object.assign(Object.assign({},u.where),{[G.or]:[..._]}));const P=(yield c.count(Object.assign(Object.assign({},u),{col:g[0]})).catch(this.error))||0,A=yield c.findAll(u).catch(this.error);if(A)return I.data(t,{count:P,records:i?yield i(A):A}),A;I.error(t,"Internal Server Error")}))}del(e,t,r){return ae(this,void 0,void 0,(function*(){const i=this.key(),{[i]:n}=e.params;if(!n)return I.error(t,"Internal Server Error"),0;const s=yield this.model().destroy(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[i]:n})})).catch(this.error);return s?(I.success(t,"OK"),s):(I.notfound(t,"Record not found"),0)}))}error(e){e.sql?Se.error(e.message+"\n"+e.sql,"api.controller.sql",ce.API_CONSOLE_ERROR):super.error(e)}get(e,t,r,i){return ae(this,void 0,void 0,(function*(){const n=this.key(),{[n]:s}=e.params,o=yield this.model().findOne(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[n]:s})})).catch(this.error);if(o)return I.data(t,i?yield i(o):o.toJSON()),o;null!==o?I.error(t,"Internal Server Error"):I.notfound(t,"Record not found")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}set(e,t,r,i){return ae(this,void 0,void 0,(function*(){const n=this.key(),{[n]:s}=e.params,[o]=(yield this.model().update(Object.assign(Object.assign({},e.body),i||{}),Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[n]:s})})).catch(this.error))||[];return o?(I.success(t,"OK"),!0):(I.success(t,"Record not changed"),!1)}))}};He=se([h(xe)],He);let Ke=class extends He{create(){return{}}recordAdd(e,t){this.add(e,t)}recordAll(e,t){this.all(e,t)}recordDel(e,t){this.del(e,t)}recordGet(e,t){this.get(e,t)}recordSet(e,t){this.set(e,t)}update(){return{}}validationAdd(e,t){this.validation(e,t,this.create())}validationSet(e,t){this.validation(e,t,this.update())}};se([a(),c("auth"),c("write"),c("validationAdd"),oe(0,_()),oe(1,y()),de("design:type",Function),de("design:paramtypes",[Object,Object]),de("design:returntype",void 0)],Ke.prototype,"recordAdd",null),se([p(),c("auth"),c("read"),oe(0,_()),oe(1,y()),de("design:type",Function),de("design:paramtypes",[Object,Object]),de("design:returntype",void 0)],Ke.prototype,"recordAll",null),se([v("/:id"),c("auth"),c("write"),oe(0,_()),oe(1,y()),de("design:type",Function),de("design:paramtypes",[Object,Object]),de("design:returntype",void 0)],Ke.prototype,"recordDel",null),se([p("/:id"),c("auth"),c("read"),oe(0,_()),oe(1,y()),de("design:type",Function),de("design:paramtypes",[Object,Object]),de("design:returntype",void 0)],Ke.prototype,"recordGet",null),se([f("/:id"),c("auth"),c("write"),c("validationSet"),oe(0,_()),oe(1,y()),de("design:type",Function),de("design:paramtypes",[Object,Object]),de("design:returntype",void 0)],Ke.prototype,"recordSet",null),se([oe(0,r()),oe(1,n()),de("design:type",Function),de("design:paramtypes",[d,Function]),de("design:returntype",void 0)],Ke.prototype,"validationAdd",null),se([oe(0,r()),oe(1,n()),de("design:type",Function),de("design:paramtypes",[d,Function]),de("design:returntype",void 0)],Ke.prototype,"validationSet",null),Ke=se([h(He)],Ke);let Me=class extends Ke{model(){return he}create(){return{name:j.string().required(),description:j.string().empty(""),state:j.boolean().parse().required()}}update(){return{name:j.string().empty(),description:j.string().empty(),state:j.boolean().parse().empty()}}};Me=se([g("/groups"),h(Ke)],Me);let Ue=class extends He{model(){return me}recordAll(e,t,r){return ae(this,void 0,void 0,(function*(){this.all(e,t,{where:{groupId:r},include:[{model:_e,required:!0}]},(e=>e.map((e=>e.route))))}))}recordSet(e,t,r){return ae(this,void 0,void 0,(function*(){const i=yield he.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield me.destroy({where:{groupId:t}}),r){let e=0;for(let i=0;i<r.length;i++)e=yield _e.count({where:{id:r[i]}}),e&&(yield me.create({groupId:t,routeId:r[i]}))}I.success(e,"OK")}else L(i)?I.notfound(e,"Record not found"):I.error(e,"Internal Server Error")}))}};se([p("/:id/routes"),c("auth"),c("read","groups"),oe(0,_()),oe(1,y()),oe(2,P("id")),de("design:type",Function),de("design:paramtypes",[Object,Object,String]),de("design:returntype",Promise)],Ue.prototype,"recordAll",null),se([f("/:id/routes"),c("auth"),c("write","groups"),c("validation",{routes:j.array(j.number().parse())}),oe(0,y()),oe(1,P("id")),oe(2,u("routes")),de("design:type",Function),de("design:paramtypes",[Object,String,Array]),de("design:returntype",Promise)],Ue.prototype,"recordSet",null),Ue=se([g("/groups"),h(He)],Ue);let Ge=class extends He{model(){return Pe}recordAll(e,t,r,i){const n={};r&&(n.type=r),i&&(n.source=i),this.all(e,t,{where:n,order:[["created","DESC"]]})}};se([p(),c("auth"),c("read"),oe(0,_()),oe(1,y()),oe(2,A("type")),oe(3,A("source")),de("design:type",Function),de("design:paramtypes",[Object,Object,String,String]),de("design:returntype",void 0)],Ge.prototype,"recordAll",null),Ge=se([g("/logs"),h(He)],Ge);let ze=class extends xe{register(e,t,r){return ae(this,void 0,void 0,(function*(){yield b(ce.API_SLEEP_REGISTRY);const{name:i,date:n,email:s,username:o,password:d,confirm:a}=t,c=o||s,u=ne(d).toString();if(yield Ie.count({where:{[G.or]:[{email:s},{username:c}]}}).catch(this.error))return void e.validation("Invalid email or username");if(u!=ne(a).toString())return void e.error("Invalid password");const l=yield Ie.create({name:i,email:s,username:c,password:u,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!l)return void e.error("Internal Server Error");const p=yield ye.create({token:yield this.getId(),userId:l.id,state:!0}).catch(this.error);if(!p)return l.destroy(),void 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 ae(this,void 0,void 0,(function*(){const i=yield ye.findOne({where:{token:t,state:!0},include:[{model:Ie,required:!0}]}).catch(this.error);i?(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})):e.notFound("User not found")}))}send(e,t,r){return ae(this,void 0,void 0,(function*(){const i=t,n=yield ye.findOne({where:{state:!0},include:[{model:Ie,required:!0,where:{[G.or]:[{email:i},{username:t}]}}]}).catch(this.error);n?(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})):e.notFound("User not found")}))}getId(){return ae(this,void 0,void 0,(function*(){const e=R();return(yield ye.count({where:{token:e}}))?this.getId():e}))}};se([a(),c("validation",{name:j.string().required(),date:j.string().date().required(),email:j.string().email().required(),username:j.string().min(4).empty(),password:j.string().min(5).required(),confirm:j.string().min(5).required()}),oe(0,r()),oe(1,u()),oe(2,l()),de("design:type",Function),de("design:paramtypes",[d,Object,Ne]),de("design:returntype",Promise)],ze.prototype,"register",null),se([a("/confirm"),c("validation",{token:j.string().required()}),oe(0,r()),oe(1,u("token")),oe(2,l()),de("design:type",Function),de("design:paramtypes",[d,String,Ne]),de("design:returntype",Promise)],ze.prototype,"confirm",null),se([a("/send"),c("validation",{username:j.string().min(4).required()}),oe(0,r()),oe(1,u("username")),oe(2,l()),de("design:type",Function),de("design:paramtypes",[d,String,Ne]),de("design:returntype",Promise)],ze.prototype,"send",null),ze=se([g("/register"),h(xe)],ze);let Xe=class extends Ke{model(){return _e}create(){return{name:j.string().required(),description:j.string().empty(""),state:j.boolean().parse().required()}}update(){return{name:j.string().empty(),description:j.string().empty(),state:j.boolean().parse().empty()}}};Xe=se([g("/routes"),h(Ke)],Xe);let Ye=class extends xe{setup(e){return ae(this,void 0,void 0,(function*(){if(0==(yield Ie.count())){const e={description:"",state:!0},t=yield Ie.create(Object.assign({name:"Admin",email:"admin@localhost",username:"admin",password:"8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918",avatar:""},e)),r=yield he.create(Object.assign({name:"admin"},e));yield ve.create({userId:t.id,groupId:r.id});const i=["read","write"],n=["users","groups","routes"];yield C(n,(t=>ae(this,void 0,void 0,(function*(){yield C(i,(i=>ae(this,void 0,void 0,(function*(){const n=t+"."+i,s=yield _e.create(Object.assign({name:n},e));yield me.create({groupId:r.id,routeId:s.id})}))))}))));const s=[...i,"delete","list","rename","upload"];yield C(s,(t=>ae(this,void 0,void 0,(function*(){const i="files_api."+t,n=yield _e.create(Object.assign({name:i},e));yield me.create({groupId:r.id,routeId:n.id})}))));const o=yield _e.create(Object.assign({name:"logs.read"},e));yield me.create({groupId:r.id,routeId:o.id})}I.success(e,"OK")}))}};se([p(),oe(0,y()),de("design:type",Function),de("design:paramtypes",[Object]),de("design:returntype",Promise)],Ye.prototype,"setup",null),Ye=se([g("/setup"),h(xe)],Ye);let We=class extends He{model(){return Ie}constructor(){if(super(),ce.API_HTTP_PUBLIC){const e=ce.API_HTTP_PUBLIC+"/avatar";X(ce.API_HTTP_PUBLIC)&&!X(e)&&J(e)}}avatar(e,t){return ae(this,void 0,void 0,(function*(){if(x(e.req.files)&&e.req.files.length){const r=e.req.files[0].filename||"";if(r){const i=ce.API_HTTP_PUBLIC+"/avatar/";if(X(i+t.avatar)&&$(i+t.avatar).isFile()&&V(i+t.avatar),t.avatar=r,yield t.save().catch(this.error))return void e.success("OK")}}e.success("Record not changed")}))}password(e,t,r,i){return ae(this,void 0,void 0,(function*(){const n=yield Ie.scope("password").findOne({where:{id:i.id,password:ne(t).toString(),state:!0}}).catch(this.error);n?(n.password=ne(r).toString(),(yield n.save().catch(this.error))?e.success("OK"):e.success("Record not changed")):e.error("Record not changed")}))}recordAdd(e,t,r){this.add(r,e,{},{password:ne(t).toString()})}recordAll(e,t){this.all(t,e)}recordDel(e,t,r,i){r&&r.id.toString()!=i?this.del(t,e):I.error(e,"Internal Server Error")}recordGet(e,t){this.get(t,e)}recordSet(e,t,r){this.set(r,e,{where:{}},t?{password:ne(t).toString()}:{})}};se([a("/avatar"),c("auth"),c("upload",{count:1,field:"file",path:ce.API_HTTP_PUBLIC+"/avatar",types:["image/bmp","image/jpeg","image/png"],size:20}),oe(0,r()),oe(1,Be()),de("design:type",Function),de("design:paramtypes",[d,Ie]),de("design:returntype",Promise)],We.prototype,"avatar",null),se([a("/password"),c("auth"),c("validation",{oldPassword:j.string().min(5).required(),newPassword:j.string().min(5).required()}),oe(0,r()),oe(1,u("oldPassword")),oe(2,u("newPassword")),oe(3,Be()),de("design:type",Function),de("design:paramtypes",[d,String,String,Ie]),de("design:returntype",Promise)],We.prototype,"password",null),se([a(),c("auth"),c("write"),c("validation",{name:j.string().required(),email:j.string().email().required(),username:j.string().min(4).required(),password:j.string().min(5).required(),description:j.string().empty(""),state:j.boolean().parse().required()}),oe(0,y()),oe(1,u("password")),oe(2,_()),de("design:type",Function),de("design:paramtypes",[Object,String,Object]),de("design:returntype",void 0)],We.prototype,"recordAdd",null),se([p(),c("auth"),c("read"),oe(0,y()),oe(1,_()),de("design:type",Function),de("design:paramtypes",[Object,Object]),de("design:returntype",void 0)],We.prototype,"recordAll",null),se([v("/:id"),c("auth"),c("write"),oe(0,y()),oe(1,_()),oe(2,Be()),oe(3,P("id")),de("design:type",Function),de("design:paramtypes",[Object,Object,Ie,String]),de("design:returntype",void 0)],We.prototype,"recordDel",null),se([p("/:id"),c("auth"),c("read"),oe(0,y()),oe(1,_()),de("design:type",Function),de("design:paramtypes",[Object,Object]),de("design:returntype",void 0)],We.prototype,"recordGet",null),se([f("/:id"),c("auth"),c("write"),c("validation",{name:j.string().empty(),email:j.string().email().empty(),username:j.string().min(4).empty(),password:j.string().min(5).empty().filter(""),description:j.string().empty(),state:j.boolean().parse().empty()}),oe(0,y()),oe(1,u("password")),oe(2,_()),de("design:type",Function),de("design:paramtypes",[Object,String,Object]),de("design:returntype",void 0)],We.prototype,"recordSet",null),We=se([g("/users"),h(He),de("design:paramtypes",[])],We);let Ze=class extends He{model(){return ve}recordAll(e,t,r){this.all(t,e,{where:{userId:r},include:[{model:he,required:!0}]},(e=>e.map((e=>e.group))))}recordSet(e,t,r){return ae(this,void 0,void 0,(function*(){const i=yield Ie.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){if(yield ve.destroy({where:{userId:i.id}}),r){let e=0;for(let t=0;t<r.length;t++)e=yield he.count({where:{id:r[t]}}),e&&(yield ve.create({userId:i.id,groupId:r[t]}))}I.success(e,"OK")}else L(i)?I.notfound(e,"Record not found"):I.error(e,"Internal Server Error")}))}};se([p("/:id/groups"),c("auth"),c("read","users"),oe(0,y()),oe(1,_()),oe(2,P("id")),de("design:type",Function),de("design:paramtypes",[Object,Object,String]),de("design:returntype",void 0)],Ze.prototype,"recordAll",null),se([f("/:id/groups"),c("auth"),c("write","users"),c("validation",{groups:j.array(j.number().parse())}),oe(0,y()),oe(1,P("id")),oe(2,u("groups")),de("design:type",Function),de("design:paramtypes",[Object,String,Array]),de("design:returntype",Promise)],Ze.prototype,"recordSet",null),Ze=se([g("/users"),h(He)],Ze);export{Ne as Application,pe as Auth,ke as AuthController,De as Config,fe as Configs,xe as ControllerBase,Ke as CrudController,ue as Database,ce as Env,Le as FilesController,ge as Forgot,Ce as ForgotController,he as Group,me as GroupRoute,Me as GroupsController,Ue as GroupsRoutesController,Pe as Log,Se as Logs,Oe as LogsColor,Ge as LogsController,He as ModelController,qe as Permission,ye as Register,ze as RegisterController,Fe as ReqAuth,je as ReqFiles,Be as ReqUser,_e as Route,Xe as RoutesController,Ae as Session,Ye as SetupController,be as Token,Ie as User,ve as UserGroup,We as UsersController,Ze as UsersGroupsController,Te as crt,we as key,le as sequelize};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrewcaires/api",
3
- "version": "3.0.15",
3
+ "version": "3.0.17",
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,8 +45,8 @@
45
45
  },
46
46
  "homepage": "https://github.com/andrewcaires/npm/tree/main/api#readme",
47
47
  "dependencies": {
48
- "@andrewcaires/express": "^1.1.3",
49
- "@andrewcaires/utils.js": "^0.2.26",
48
+ "@andrewcaires/express": "^1.1.4",
49
+ "@andrewcaires/utils.js": "^0.2.27",
50
50
  "cors": "^2.8.5",
51
51
  "crypto-js": "^4.2.0",
52
52
  "dotenv": "^16.4.5",
@@ -54,7 +54,6 @@
54
54
  "express-session": "^1.18.0",
55
55
  "jsonwebtoken": "^9.0.2",
56
56
  "mariadb": "^3.3.0",
57
- "mime-types": "^2.1.35",
58
57
  "multer": "^1.4.5-lts.1",
59
58
  "mysql2": "^3.9.7",
60
59
  "sequelize": "^6.37.3",
@@ -69,16 +68,15 @@
69
68
  "@types/express": "^4.17.21",
70
69
  "@types/express-session": "^1.18.0",
71
70
  "@types/jsonwebtoken": "^9.0.6",
72
- "@types/mime-types": "^2.1.4",
73
71
  "@types/multer": "^1.4.11",
74
- "@types/node": "^20.12.11",
72
+ "@types/node": "^20.12.12",
75
73
  "@types/ws": "^8.5.10",
76
- "@typescript-eslint/eslint-plugin": "^7.8.0",
77
- "@typescript-eslint/parser": "^7.8.0",
74
+ "@typescript-eslint/eslint-plugin": "^7.10.0",
75
+ "@typescript-eslint/parser": "^7.10.0",
78
76
  "eslint": "^8.57.0",
79
77
  "rollup": "^4.17.2",
80
- "rollup-plugin-dts": "^6.1.0",
78
+ "rollup-plugin-dts": "^6.1.1",
81
79
  "ts-node-dev": "^2.0.0",
82
80
  "tslib": "^2.6.2"
83
81
  }
84
- }
82
+ }