@andrewcaires/api 3.0.9 → 3.0.10

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.9
2
+ * @andrewcaires/api v3.0.10
3
3
  * Simple api for small applications using express, jsonwebtoken, sequelize and websocket
4
4
  * (c) 2023 Andrew Caires
5
5
  * @license: MIT
6
6
  */
7
- "use strict";var e=require("@andrewcaires/express"),t=require("@andrewcaires/utils.js"),r=require("ws"),s=require("sequelize"),o=require("dotenv"),n=require("fs"),i=require("jsonwebtoken"),a=require("crypto-js"),d=require("mime-types"),l=require("multer"),u=require("path");function p(e,t,r,s){var o,n=arguments.length,i=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(o=e[a])&&(i=(n<3?o(i):n>3?o(t,r,i):o(t,r))||i);return n>3&&i&&Object.defineProperty(t,r,i),i}function c(e,t){return function(r,s){t(r,s,e)}}function g(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function y(e,t,r,s){return new(r||(r=Promise))((function(o,n){function i(e){try{d(s.next(e))}catch(e){n(e)}}function a(e){try{d(s.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(i,a)}d((s=s.apply(e,t||[])).next())}))}o.config();class m{}m.API_CONSOLE_ERROR=t.toBool(process.env.API_CONSOLE_ERROR||"false"),m.API_DB_DATABASE=process.env.API_DB_DATABASE||"",m.API_DB_HOST=process.env.API_DB_HOST||"127.0.0.1",m.API_DB_PASSWORD=process.env.API_DB_PASSWORD||"",m.API_DB_PORT=parseInt(process.env.API_DB_PORT||"3306"),m.API_DB_TYPE=process.env.API_DB_TYPE||"",m.API_DB_USERNAME=process.env.API_DB_USERNAME||"root",m.API_DB_LOG=t.toBool(process.env.API_DB_LOG||"false"),m.API_TABLE_PREFIX=process.env.API_TABLE_PREFIX||"",m.API_HTTP_CRT=process.env.API_HTTP_CRT||"",m.API_HTTP_KEY=process.env.API_HTTP_KEY||"",m.API_HTTP_PORT=parseInt(process.env.API_HTTP_PORT||"3000"),m.API_HTTP_PUBLIC=process.env.API_HTTP_PUBLIC||"",m.API_HTTP_CROSS=t.toBool(process.env.API_HTTP_CROSS||"false"),m.API_HTTP_HYBRID=t.toBool(process.env.API_HTTP_HYBRID||"false"),m.API_SLEEP_AUTH=parseInt(process.env.API_SLEEP_AUTH||"1000"),m.API_SLEEP_FORGOT=parseInt(process.env.API_SLEEP_FORGOT||"5000"),m.API_SLEEP_REGISTRY=parseInt(process.env.API_SLEEP_REGISTRY||"5000"),m.API_TOKEN_CRT=process.env.API_TOKEN_CRT||"",m.API_TOKEN_KEY=process.env.API_TOKEN_KEY||"",m.API_TOKEN_HEADER=process.env.API_TOKEN_HEADER||"authorization",m.API_TOKEN_LIFETIME=parseInt(process.env.API_TOKEN_LIFETIME||"15"),m.API_UPLOAD_COUNT=parseInt(process.env.API_UPLOAD_COUNT||"1"),m.API_UPLOAD_FIELD=process.env.API_UPLOAD_FIELD||"upload",m.API_UPLOAD_SIZE=parseInt(process.env.API_UPLOAD_SIZE||"2"),m.API_UPLOAD_TEMP=process.env.API_UPLOAD_TEMP||"./temp",m.API_WEBSOCKET_START=t.toBool(process.env.API_WEBSOCKET_START||"false");class h{static connect(e){const t="connect_"+m.API_DB_TYPE.toLowerCase();if(t in h)return h[t](e);throw new Error("No database is connected to this API")}static connect_mariadb(e){return new s.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mariadb",logging:m.API_DB_LOG,define:{timestamps:!1}})}static connect_memory(){return new s.Sequelize("sqlite::memory:",{logging:m.API_DB_LOG,define:{timestamps:!1}})}static connect_mysql(e){return new s.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mysql",logging:m.API_DB_LOG,define:{timestamps:!1}})}static connect_postgres(e){return new s.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"postgres",logging:m.API_DB_LOG,define:{timestamps:!1}})}static connect_sqlite(e){return new s.Sequelize({dialect:"sqlite",storage:e.database,logging:m.API_DB_LOG,define:{timestamps:!1}})}}const R=h.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 A extends s.Model{}A.init({login:s.DataTypes.BIGINT,logout:s.DataTypes.BIGINT,secret:s.DataTypes.STRING,timestamp:s.DataTypes.BIGINT,useragent:s.DataTypes.STRING},{sequelize:R,modelName:m.API_TABLE_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class v extends s.Model{}v.init({token:s.DataTypes.STRING,timestamp:s.DataTypes.BIGINT,state:s.DataTypes.BOOLEAN},{sequelize:R,modelName:m.API_TABLE_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class O extends s.Model{}O.init({name:s.DataTypes.STRING,description:s.DataTypes.TEXT,state:s.DataTypes.BOOLEAN},{sequelize:R,modelName:m.API_TABLE_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class I extends s.Model{}I.init({},{sequelize:R,modelName:m.API_TABLE_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),I.removeAttribute("id");class _ extends s.Model{}_.init({name:s.DataTypes.STRING,description:s.DataTypes.TEXT,state:s.DataTypes.BOOLEAN},{sequelize:R,modelName:m.API_TABLE_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class P extends s.Model{}P.init({name:s.DataTypes.STRING,email:s.DataTypes.STRING,username:s.DataTypes.STRING,password:s.DataTypes.STRING,avatar:s.DataTypes.STRING,description:s.DataTypes.TEXT,state:s.DataTypes.BOOLEAN},{sequelize:R,modelName:m.API_TABLE_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated"});class f extends s.Model{}f.init({},{sequelize:R,modelName:m.API_TABLE_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),f.removeAttribute("id");class T extends s.Model{}T.init({key:s.DataTypes.STRING,value:s.DataTypes.STRING},{sequelize:R,modelName:m.API_TABLE_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),T.removeAttribute("id");class E extends s.Model{}E.init({type:s.DataTypes.STRING,source:s.DataTypes.STRING,message:s.DataTypes.TEXT},{sequelize:R,modelName:m.API_TABLE_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class x extends s.Model{}var b;x.init({token:s.DataTypes.STRING,timestamp:s.DataTypes.BIGINT,state:s.DataTypes.BOOLEAN},{sequelize:R,modelName:m.API_TABLE_PREFIX+"registry",timestamps:!0,createdAt:"created",updatedAt:"updated"}),P.hasMany(A),A.belongsTo(P),P.hasMany(v),v.belongsTo(P),O.hasMany(I),I.belongsTo(O),_.hasMany(I),I.belongsTo(_),P.hasMany(f),f.belongsTo(P),O.hasMany(f),f.belongsTo(O),exports.LogsColor=void 0,(b=exports.LogsColor||(exports.LogsColor={})).ERROR="",b.INFO="",b.NONE="",b.SUCCESS="",b.WARNING="";class w{static write(e,t,r){return y(this,void 0,void 0,(function*(){yield w.writeRaw(exports.LogsColor.NONE,"",e,t,r)}))}static error(e,t,r){return y(this,void 0,void 0,(function*(){yield w.writeRaw(exports.LogsColor.ERROR,"error",e,t,r)}))}static info(e,t,r){return y(this,void 0,void 0,(function*(){yield w.writeRaw(exports.LogsColor.INFO,"info",e,t,r)}))}static success(e,t,r){return y(this,void 0,void 0,(function*(){yield w.writeRaw(exports.LogsColor.ERROR,"success",e,t,r)}))}static warning(e,t,r){return y(this,void 0,void 0,(function*(){yield w.writeRaw(exports.LogsColor.WARNING,"warning",e,t,r)}))}static writeConsole(e,r,s){const o=t.dateFormat(new Date,"%H:%M:%S");console.log(">",e,r+" ".repeat(10-r.length),"","|",o,"|",s)}static writeRaw(e,t,r,s,o){return y(this,void 0,void 0,(function*(){o&&w.writeConsole(e,t,r),R&&(yield E.create({type:t,source:s,message:r}).catch((()=>null)))}))}}const S=e=>n.existsSync(e)?n.readFileSync(e):void 0,C={http:S(m.API_HTTP_CRT),token:S(m.API_TOKEN_CRT)},q={http:S(m.API_HTTP_KEY),token:S(m.API_TOKEN_KEY)};class j{static error(e){w.error(e.message,"api.token",m.API_CONSOLE_ERROR)}static sign(e){return q.token?{token:i.sign(e,q.token,{algorithm:"RS256"})}:{error:"Invalid Secret"}}static user(e){return y(this,void 0,void 0,(function*(){const{error:t,decode:r}=j.verify(e);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&r){const r=yield P.findOne({where:{id:e,state:!0}}).catch(j.error);if(r){const e=yield A.findOne({where:{secret:t,userId:r.id}}).catch(j.error);if(e){const t=Date.now();if(t>e.timestamp)return e.logout=t,yield e.save(),{error:"Expired token"};if(e.timestamp=t+6e4*m.API_TOKEN_LIFETIME,!e.logout)return yield e.save(),{auth:e,user:r}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e){if(!C.token)return{error:"Invalid Secret"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:i.verify(e,C.token)}}catch(e){return{error:"Invalid Token"}}}}class D extends e.Application{constructor(e){super(e,{cert:C.http,cross:m.API_HTTP_CROSS,hybrid:m.API_HTTP_HYBRID,key:q.http,path:"/api",port:m.API_HTTP_PORT,public:m.API_HTTP_PUBLIC})}error(e,t){w.info(e.message,t,m.API_CONSOLE_ERROR)}log(e,t){w.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return y(this,void 0,void 0,(function*(){yield R.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)=>y(this,void 0,void 0,(function*(){r.url||(r.url="");const s=r.url.length<=1?"":r.url.replace(/\//g,".");let o;e.on("message",(t=>y(this,void 0,void 0,(function*(){if(o)try{const n=JSON.parse(t);this.emit("ws.message"+s,{data:n,message:t,req:r,user:o,ws:e})}catch(n){this.emit("ws.message"+s,{message:t,req:r,user:o,ws:e})}else{const{user:n}=yield j.user(t.toString());n&&(o=n,this.emit("ws.connection"+s,{req:r,user:o,ws:e}))}o||e.close()})))),e.on("close",(()=>{o&&this.emit("ws.close"+s,{user:o,ws:e})})),yield t.sleep(2e3),o||e.close()})))))}))}websocket(){return this._webSocket}}class N{static all(){return y(this,void 0,void 0,(function*(){const e=yield T.findAll().catch(N.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 T.destroy({where:{key:e}}).catch(N.error))||0)>0}))}static error(e){w.error(e.message,"api.config",m.API_CONSOLE_ERROR)}static get(e){return y(this,void 0,void 0,(function*(){const t=yield T.findOne({where:{key:e}}).catch(N.error);return t&&t.value||""}))}static set(e,t){return y(this,void 0,void 0,(function*(){const[r]=(yield T.findOrCreate({where:{key:e}}).catch(N.error))||[];r&&(r.value=t,yield r.save().catch(N.error))}))}}class M{static all(e,t){return y(this,void 0,void 0,(function*(){return yield _.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:I,required:!0,include:[{model:O,required:!0,where:{state:!0},include:[{model:f,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{w.error(e.message,"api.permission",m.API_CONSOLE_ERROR)}))}))}static get(e){return y(this,void 0,void 0,(function*(){const t=yield M.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return y(this,void 0,void 0,(function*(){const r=yield M.all(e,{name:t});return!!r&&r.length>0}))}}const F=e.parameterFactory((({req:e})=>e.auth)),L=e.parameterFactory((({req:e})=>t.toArray(e.files))),B=e.parameterFactory((({req:e})=>e.user)),G=(e,r)=>{const s=t.uuidv4()+"."+r;return n.existsSync(u.join(e,s))?G(e,r):s};class k extends t.EventEmitter{auth(t,r,s,o,n){return y(this,void 0,void 0,(function*(){const{auth:i,error:a,user:d}=yield j.user(s);return a?e.Responses.error(t,a):i&&d?(o&&(i.useragent=o),yield i.save(),r.auth=i,r.user=d,n()):e.Responses.error(t,"Internal Server Error")}))}error(e){w.error(e.message,"api.controller",m.API_CONSOLE_ERROR)}name(){return"api"}permission(t,r,s,o){return y(this,void 0,void 0,(function*(){return r?(yield M.is(r,o))?s():e.Responses.error(t,"Unauthorized access"):e.Responses.unauthorized(t,"Access denied")}))}read(e,t,r,s){return this.permission(e,t,r,(s||this.name())+".read")}upload(r,s,o,n){const i=(null==n?void 0:n.path)||m.API_UPLOAD_TEMP,a=l.diskStorage({destination:(e,t,r)=>r(null,i),filename:(e,t,r)=>y(this,void 0,void 0,(function*(){return r(null,G(i,d.extension(t.mimetype)||"bin"))}))}),u=1e6*((null==n?void 0:n.size)||m.API_UPLOAD_SIZE),p=l({storage:a,fileFilter(e,r,s){var o;return y(this,void 0,void 0,(function*(){const e=null===(o=null==n?void 0:n.types)||void 0===o?void 0:o.indexOf(r.mimetype);return t.isNumber(e)&&e<0?s(new Error("File type not allowed")):s(null,!0)}))},limits:{fileSize:u}}),c=(null==n?void 0:n.count)||m.API_UPLOAD_COUNT,g=(null==n?void 0:n.field)||m.API_UPLOAD_FIELD;p.array(g,c)(s,r,(t=>t?e.Responses.error(r,t.message):o()))}validation(r,s,o,n){return y(this,void 0,void 0,(function*(){const{error:i,value:a}=yield t.Validation.object(n).parse().validateAsync(s.body);return i?e.Responses.validation(r,i):(s.body=a,o())}))}write(e,t,r,s){return this.permission(e,t,r,(s||this.name())+".write")}}p([c(0,e.Res()),c(1,e.Req()),c(2,e.Headers(m.API_TOKEN_HEADER)),c(3,e.Headers("user-agent")),c(4,e.Next()),g("design:type",Function),g("design:paramtypes",[Object,Object,String,String,Function]),g("design:returntype",Promise)],k.prototype,"auth",null),p([c(0,e.Res()),c(1,B()),c(2,e.Next()),c(3,e.Argument()),g("design:type",Function),g("design:paramtypes",[Object,P,Function,String]),g("design:returntype",Promise)],k.prototype,"permission",null),p([c(0,e.Res()),c(1,B()),c(2,e.Next()),c(3,e.Argument()),g("design:type",Function),g("design:paramtypes",[Object,P,Function,String]),g("design:returntype",Promise)],k.prototype,"read",null),p([c(0,e.Res()),c(1,e.Req()),c(2,e.Next()),c(3,e.Argument()),g("design:type",Function),g("design:paramtypes",[Object,Object,Function,Object]),g("design:returntype",void 0)],k.prototype,"upload",null),p([c(0,e.Res()),c(1,e.Req()),c(2,e.Next()),c(3,e.Argument()),g("design:type",Function),g("design:paramtypes",[Object,Object,Function,Object]),g("design:returntype",Promise)],k.prototype,"validation",null),p([c(0,e.Res()),c(1,B()),c(2,e.Next()),c(3,e.Argument()),g("design:type",Function),g("design:paramtypes",[Object,P,Function,String]),g("design:returntype",Promise)],k.prototype,"write",null),exports.AuthController=class extends k{constructor(){super(...arguments),this.attributes=["id","name","email","username","avatar"]}login(r,s,o,n){return y(this,void 0,void 0,(function*(){yield t.sleep(m.API_SLEEP_AUTH);const{username:i,password:d}=s.body,l=yield P.findOne({where:{username:i}}).catch(this.error);if(!l)return n.emit("auth.failure",{req:s}),e.Responses.notfound(r,"Username not found");if(!l.state)return n.emit("auth.failure",{req:s}),e.Responses.error(r,"Username is disabled");const u=a.SHA256(d).toString();if(l.password!=u)return n.emit("auth.failure",{req:s}),e.Responses.error(r,"Invalid password");const p=l.id,c=t.uniqueID(),{error:g,token:y}=j.sign({id:p,secret:c});if(g)return n.emit("auth.failure",{req:s}),e.Responses.error(r,g);if(y){const t=Date.now(),n=t+6e4*m.API_TOKEN_LIFETIME,i=yield A.create({login:t,secret:c,timestamp:n,useragent:o,userId:p}).catch(this.error);if(i)return this.emit("auth.login",{auth:i,req:s,user:l}),e.Responses.data(r,{token:y})}return n.emit("auth.failure",{req:s}),e.Responses.error(r,"Internal Server Error")}))}logout(t,r,s,o,n){return y(this,void 0,void 0,(function*(){return s&&o&&!s.logout?(s.logout=Date.now(),s.timestamp=s.logout,yield s.save(),n.emit("auth.logout",{auth:s,req:r,user:o}),e.Responses.success(t,"Disconcerted")):e.Responses.unauthorized(t,"Access denied")}))}user(r,s){return y(this,void 0,void 0,(function*(){const o=s.user;if(!o)return e.Responses.unauthorized(r,"Access denied");const n=yield M.all(o);if(n){const s=n.map((e=>e.name));return e.Responses.data(r,Object.assign(Object.assign({},t.allowedObject(this.attributes,o.toJSON())),{permissions:s}))}return e.Responses.error(r,"Internal Server Error")}))}},p([e.Post("/login"),e.Middleware("validation",{username:t.Validation.string().min(4).required(),password:t.Validation.string().min(5).required()}),c(0,e.Res()),c(1,e.Req()),c(2,e.Headers("user-agent")),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[Object,Object,String,D]),g("design:returntype",Promise)],exports.AuthController.prototype,"login",null),p([e.Get("/logout"),e.Middleware("auth"),c(0,e.Res()),c(1,e.Req()),c(2,F()),c(3,B()),c(4,e.App()),g("design:type",Function),g("design:paramtypes",[Object,Object,A,P,D]),g("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),p([e.Get(),e.Middleware("auth"),c(0,e.Res()),c(1,e.Req()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=p([e.Controller("/auth"),e.Extends(k)],exports.AuthController),exports.ForgotController=class extends k{check(r,s){return y(this,void 0,void 0,(function*(){const{token:o}=s.body,n=yield this.findOne(o);return n&&n.user?(n.token=t.uniqueID(),yield n.save(),e.Responses.data(r,{token:n.token})):e.Responses.notfound(r,"User not found")}))}forgot(r,s){return y(this,void 0,void 0,(function*(){const{username:o}=s.body;yield t.sleep(m.API_SLEEP_FORGOT);const n=yield P.findOne({where:{username:o}}).catch(this.error);if(!n)return e.Responses.notfound(r,"User not found");const i=t.uniqueID(),a=Date.now()+6e4*m.API_TOKEN_LIFETIME,d=yield v.create({token:i,timestamp:a,state:!0,userId:n.id});return this.emit("forgot",{forgot:d,req:s,user:n}),e.Responses.success(r,"OK")}))}reset(t,r){return y(this,void 0,void 0,(function*(){const{token:s,password:o}=r.body,n=yield this.findOne(s);return n?(n.state=!1,yield n.save().catch(this.error),n.user.password=a.SHA256(o).toString(),yield n.user.save().catch(this.error),this.emit("forgot.reset",{req:r,user:n.user}),e.Responses.success(t,"OK")):e.Responses.notfound(t,"User not found")}))}findOne(e){return y(this,void 0,void 0,(function*(){return yield v.findOne({where:{token:e,state:!0},include:[{model:P,required:!0}]}).catch(this.error)}))}},p([e.Get("/check"),e.Middleware("validation",{token:t.Validation.string().required()}),c(0,e.Res()),c(1,e.Req()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),p([e.Get(),e.Middleware("validation",{username:t.Validation.string().min(4).required()}),c(0,e.Res()),c(1,e.Req()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),p([e.Get("/reset"),e.Middleware("validation",{token:t.Validation.string().required(),password:t.Validation.string().min(5).required()}),c(0,e.Res()),c(1,e.Req()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=p([e.Controller("/forgot"),e.Extends(k)],exports.ForgotController),exports.ModelController=class extends k{add(t,r,s,o){return y(this,void 0,void 0,(function*(){const n=yield this.model().create(Object.assign(Object.assign({},t.body),o||{}),s||{}).catch(this.error);if(n){const t=n.id;return e.Responses.data(r,{id:t}),n}e.Responses.error(r,"Internal Server Error")}))}all(r,o,n,i){var a,d,l,u,p;return y(this,void 0,void 0,(function*(){const c=this.model(),g=Object.assign({},n||{});g.where=Object.assign({},g.where||{});const y=null===(a=r.query.limit)||void 0===a?void 0:a.toString();y&&(g.limit=parseInt(y));const m=null===(d=r.query.offset)||void 0===d?void 0:d.toString();m&&(g.offset=parseInt(m));const h=Object.keys(c.getAttributes()),R=[],A=null===(l=r.query.asc)||void 0===l?void 0:l.toString();A&&A.length&&A.split(",").forEach((e=>{h.indexOf(e)>=0&&R.push([e,"ASC"])}));const v=null===(u=r.query.desc)||void 0===u?void 0:u.toString();v&&v.length&&v.split(",").forEach((e=>{h.indexOf(e)>=0&&R.push([e,"DESC"])})),R.length&&(g.order=R);const O=[],I=t.isArray(g.attributes)?g.attributes:h,_=null===(p=r.query.search)||void 0===p?void 0:p.toString();I.forEach((e=>{var o;if(t.isString(e)&&(_&&_.length&&O.push({[e]:{[s.Op.like]:`%${_}%`}}),"search_"+e in r.query)){const t=null===(o=r.query["search_"+e])||void 0===o?void 0:o.toString();t&&t.length&&O.push({[e]:{[s.Op.like]:`%${t}%`}})}})),O.length&&(g.where=Object.assign(Object.assign({},g.where),{[s.Op.or]:[...O]}));const P=yield c.count(Object.assign(Object.assign({},g),{col:h[0]})).catch(this.error),f=yield c.findAll(g).catch(this.error);if(f)return e.Responses.data(o,{count:P,records:i?i(f):f}),f;e.Responses.error(o,"Internal Server Error")}))}del(t,r,s){return y(this,void 0,void 0,(function*(){const{id:o}=t.params;if(!o)return e.Responses.error(r,"Internal Server Error"),0;const n=yield this.model().destroy(Object.assign(Object.assign({},s||{}),{where:{id:o}})).catch(this.error);return n?(e.Responses.success(r,"OK"),n):(e.Responses.notfound(r,"Record not found"),0)}))}error(e){e.sql?w.error(e.message+"\n"+e.sql,"api.controller.sql",m.API_CONSOLE_ERROR):super.error(e)}get(t,r,s,o){return y(this,void 0,void 0,(function*(){const n=Object.assign({},s||{});n.where=n.where?Object.assign({},n.where):{};const{id:i}=t.params,a=yield this.model().findByPk(i,n).catch(this.error);if(a)return e.Responses.data(r,o?o(a):a.toJSON()),a;null!==a?e.Responses.error(r,"Internal Server Error"):e.Responses.notfound(r,"Record not found")}))}name(){return this.model().tableName}set(t,r,s,o){return y(this,void 0,void 0,(function*(){const{id:n}=t.params,[i]=(yield this.model().update(Object.assign(Object.assign({},t.body),o||{}),Object.assign(Object.assign({},s||{}),{where:Object.assign(Object.assign({},(s||{}).where),{id:n})})).catch(this.error))||[];return i?(e.Responses.success(r,"OK"),!0):(e.Responses.success(r,"Record not changed"),!1)}))}},exports.ModelController=p([e.Extends(k)],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(t,e,r,this.create())}validationSet(e,t,r){this.validation(t,e,r,this.update())}},p([e.Post(),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationAdd"),c(0,e.Req()),c(1,e.Res()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",void 0)],exports.CrudController.prototype,"recordAdd",null),p([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Req()),c(1,e.Res()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",void 0)],exports.CrudController.prototype,"recordAll",null),p([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Req()),c(1,e.Res()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",void 0)],exports.CrudController.prototype,"recordDel",null),p([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Req()),c(1,e.Res()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",void 0)],exports.CrudController.prototype,"recordGet",null),p([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationSet"),c(0,e.Req()),c(1,e.Res()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",void 0)],exports.CrudController.prototype,"recordSet",null),p([c(0,e.Req()),c(1,e.Res()),c(2,e.Next()),g("design:type",Function),g("design:paramtypes",[Object,Object,Function]),g("design:returntype",void 0)],exports.CrudController.prototype,"validationAdd",null),p([c(0,e.Req()),c(1,e.Res()),c(2,e.Next()),g("design:type",Function),g("design:paramtypes",[Object,Object,Function]),g("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 O}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 I}recordAll(e,t,r){return y(this,void 0,void 0,(function*(){this.all(t,e,{where:{groupId:r},include:[{model:_,required:!0}]},(e=>e.map((e=>e.route))))}))}recordSet(r,s,o){return y(this,void 0,void 0,(function*(){const n=yield O.findByPk(s,{attributes:["id"]}).catch(this.error);if(n){const t=n.id;if(yield I.destroy({where:{groupId:t}}),o){let e=0;for(let r=0;r<o.length;r++)e=yield _.count({where:{id:o[r]}}),e&&(yield I.create({groupId:t,routeId:o[r]}))}return e.Responses.success(r,"OK")}return t.isNull(n)?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"),c(0,e.Res()),c(1,e.Req()),c(2,e.Params("id")),g("design:type",Function),g("design:paramtypes",[Object,Object,String]),g("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())}),c(0,e.Res()),c(1,e.Params("id")),c(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=p([e.Controller("/groups"),e.Extends(exports.ModelController)],exports.GroupsRoutesController),exports.LogsController=class extends exports.ModelController{model(){return E}recordAll(e,t){const{source:r,type:s}=t.query,o=r&&s?{source:r,type:s}:r?{source:r}:s?{type:s}:{};this.all(t,e,{where:o,order:[["created","DESC"]]})}},p([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Res()),c(1,e.Req()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("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 k{confirm(t,r){return y(this,void 0,void 0,(function*(){const s=yield x.findOne({where:{token:r,state:!0},include:[{model:P,required:!0}]}).catch(this.error);return s?(s.user.state=!0,yield s.user.save().catch(this.error),this.emit("user.confirm",{user:s.user}),e.Responses.success(t,"OK")):e.Responses.notfound(t,"User not found")}))}register(r,s,o,n){return y(this,void 0,void 0,(function*(){yield t.sleep(m.API_SLEEP_REGISTRY);const s=yield P.findOne({where:{username:n}}).catch(this.error);if(s)return e.Responses.error(r,"Invalid Username");if(!t.isNull(s))return e.Responses.error(r,"Internal Server Error");const i=yield P.create(Object.assign(Object.assign({},o),{state:!1}));return this.emit("user.register",{user:i}),e.Responses.success(r,"OK")}))}},p([e.Get("/confirm"),e.Middleware("validation",{token:t.Validation.string().required()}),c(0,e.Res()),c(1,e.Body("token")),g("design:type",Function),g("design:paramtypes",[Object,String]),g("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),p([e.Get(),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()}),c(0,e.Res()),c(1,e.Req()),c(2,e.Body()),c(3,e.Body("username")),g("design:type",Function),g("design:paramtypes",[Object,Object,Object,String]),g("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),exports.RegisterController=p([e.Controller("/register"),e.Extends(k)],exports.RegisterController),exports.RoutesController=class extends exports.CrudController{model(){return _}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 k{setup(r){return y(this,void 0,void 0,(function*(){if(0==(yield P.count())){const e={description:"",state:!0},r=yield P.create(Object.assign({name:"Admin",email:"admin@localhost",username:"admin",password:"8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918",avatar:""},e)),s=yield O.create(Object.assign({name:"admin"},e));yield f.create({userId:r.id,groupId:s.id});const o=["read","write"],n=["users","groups","routes"];yield t.forEachSeries(n,(r=>y(this,void 0,void 0,(function*(){yield t.forEachSeries(o,(t=>y(this,void 0,void 0,(function*(){const o=r+"."+t,n=yield _.create(Object.assign({name:o},e));yield I.create({groupId:s.id,routeId:n.id})}))))}))));const i=yield _.create(Object.assign({name:"logs.read"},e));yield I.create({groupId:s.id,routeId:i.id})}return e.Responses.success(r,"OK")}))}},p([e.Get(),c(0,e.Res()),g("design:type",Function),g("design:paramtypes",[Object]),g("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=p([e.Controller("/setup"),e.Extends(k)],exports.SetupController),exports.UsersController=class extends exports.ModelController{constructor(){super(...arguments),this.attributes=["id","name","email","username","avatar","description","state","created","updated"]}model(){return P}recordAdd(e,t,r){this.add(r,e,{},{password:a.SHA256(t).toString()})}recordAll(e,t){this.all(t,e,{attributes:this.attributes})}recordDel(t,r,s,o){if(!s||s.id.toString()==o)return e.Responses.error(t,"Internal Server Error");this.del(r,t)}recordGet(e,t){this.get(t,e,{attributes:this.attributes})}recordSet(e,t,r){this.set(r,e,{where:{}},t?{password:a.SHA256(t).toString()}:{})}},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().required(),state:t.Validation.boolean().parse().required()}),c(0,e.Res()),c(1,e.Body("password")),c(2,e.Req()),g("design:type",Function),g("design:paramtypes",[Object,String,Object]),g("design:returntype",void 0)],exports.UsersController.prototype,"recordAdd",null),p([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Res()),c(1,e.Req()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("design:returntype",void 0)],exports.UsersController.prototype,"recordAll",null),p([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),c(0,e.Res()),c(1,e.Req()),c(2,B()),c(3,e.Params("id")),g("design:type",Function),g("design:paramtypes",[Object,Object,P,String]),g("design:returntype",Object)],exports.UsersController.prototype,"recordDel",null),p([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Res()),c(1,e.Req()),g("design:type",Function),g("design:paramtypes",[Object,Object]),g("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()}),c(0,e.Res()),c(1,e.Body("password")),c(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=p([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersController),exports.UsersGroupsController=class extends exports.ModelController{model(){return f}recordAll(e,t,r){this.all(t,e,{where:{userId:r},include:[{model:O,required:!0}]},(e=>e.map((e=>e.group))))}recordSet(r,s,o){return y(this,void 0,void 0,(function*(){const n=yield P.findByPk(s,{attributes:["id"]}).catch(this.error);if(n){if(yield f.destroy({where:{userId:n.id}}),o){let e=0;for(let t=0;t<o.length;t++)e=yield O.count({where:{id:o[t]}}),e&&(yield f.create({userId:n.id,groupId:o[t]}))}return e.Responses.success(r,"OK")}return t.isNull(n)?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"),c(0,e.Res()),c(1,e.Req()),c(2,e.Params("id")),g("design:type",Function),g("design:paramtypes",[Object,Object,String]),g("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())}),c(0,e.Res()),c(1,e.Params("id")),c(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=p([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersGroupsController),exports.Application=D,exports.Auth=A,exports.Config=N,exports.Configs=T,exports.ControllerBase=k,exports.Database=h,exports.Env=m,exports.Forgot=v,exports.Group=O,exports.GroupRoute=I,exports.Log=E,exports.Logs=w,exports.Permission=M,exports.Registry=x,exports.ReqAuth=F,exports.ReqFiles=L,exports.ReqUser=B,exports.Route=_,exports.Token=j,exports.User=P,exports.UserGroup=f,exports.crt=C,exports.key=q,exports.sequelize=R;
7
+ "use strict";var e=require("@andrewcaires/express"),t=require("@andrewcaires/utils.js"),r=require("ws"),s=require("sequelize"),o=require("dotenv"),n=require("fs"),i=require("jsonwebtoken"),d=require("crypto-js"),a=require("mime-types"),l=require("multer"),u=require("path");function c(e,t,r,s){var o,n=arguments.length,i=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,s);else for(var d=e.length-1;d>=0;d--)(o=e[d])&&(i=(n<3?o(i):n>3?o(t,r,i):o(t,r))||i);return n>3&&i&&Object.defineProperty(t,r,i),i}function p(e,t){return function(r,s){t(r,s,e)}}function g(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function y(e,t,r,s){return new(r||(r=Promise))((function(o,n){function i(e){try{a(s.next(e))}catch(e){n(e)}}function d(e){try{a(s.throw(e))}catch(e){n(e)}}function a(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(i,d)}a((s=s.apply(e,t||[])).next())}))}o.config();class m{}m.API_CONSOLE_ERROR=t.toBool(process.env.API_CONSOLE_ERROR||"false"),m.API_DB_DATABASE=process.env.API_DB_DATABASE||"",m.API_DB_HOST=process.env.API_DB_HOST||"127.0.0.1",m.API_DB_PASSWORD=process.env.API_DB_PASSWORD||"",m.API_DB_PORT=parseInt(process.env.API_DB_PORT||"3306"),m.API_DB_TYPE=process.env.API_DB_TYPE||"",m.API_DB_USERNAME=process.env.API_DB_USERNAME||"root",m.API_DB_LOG=t.toBool(process.env.API_DB_LOG||"false"),m.API_TABLE_PREFIX=process.env.API_TABLE_PREFIX||"",m.API_HTTP_CRT=process.env.API_HTTP_CRT||"",m.API_HTTP_KEY=process.env.API_HTTP_KEY||"",m.API_HTTP_PORT=parseInt(process.env.API_HTTP_PORT||"3000"),m.API_HTTP_PUBLIC=process.env.API_HTTP_PUBLIC||"",m.API_HTTP_CROSS=t.toBool(process.env.API_HTTP_CROSS||"false"),m.API_HTTP_HYBRID=t.toBool(process.env.API_HTTP_HYBRID||"false"),m.API_SLEEP_AUTH=t.parseMs(process.env.API_SLEEP_AUTH||"2s"),m.API_SLEEP_FORGOT=t.parseMs(process.env.API_SLEEP_FORGOT||"5s"),m.API_SLEEP_REGISTRY=t.parseMs(process.env.API_SLEEP_REGISTRY||"5s"),m.API_TOKEN_CRT=process.env.API_TOKEN_CRT||"",m.API_TOKEN_KEY=process.env.API_TOKEN_KEY||"",m.API_TOKEN_HEADER=process.env.API_TOKEN_HEADER||"authorization",m.API_TOKEN_LIFETIME=t.parseMs(process.env.API_TOKEN_LIFETIME||"1d"),m.API_TOKEN_RENEW=t.parseMs(process.env.API_TOKEN_RENEW||"1d"),m.API_UPLOAD_COUNT=parseInt(process.env.API_UPLOAD_COUNT||"1"),m.API_UPLOAD_FIELD=process.env.API_UPLOAD_FIELD||"upload",m.API_UPLOAD_SIZE=parseInt(process.env.API_UPLOAD_SIZE||"2"),m.API_UPLOAD_TEMP=process.env.API_UPLOAD_TEMP||"./temp",m.API_WEBSOCKET_START=t.toBool(process.env.API_WEBSOCKET_START||"false");class h{static connect(e){const t="connect_"+m.API_DB_TYPE.toLowerCase();if(t in h)return h[t](e);throw new Error("No database is connected to this API")}static connect_mariadb(e){return new s.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mariadb",logging:m.API_DB_LOG,define:{timestamps:!1}})}static connect_memory(){return new s.Sequelize("sqlite::memory:",{logging:m.API_DB_LOG,define:{timestamps:!1}})}static connect_mysql(e){return new s.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mysql",logging:m.API_DB_LOG,define:{timestamps:!1}})}static connect_postgres(e){return new s.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"postgres",logging:m.API_DB_LOG,define:{timestamps:!1}})}static connect_sqlite(e){return new s.Sequelize({dialect:"sqlite",storage:e.database,logging:m.API_DB_LOG,define:{timestamps:!1}})}}const v=h.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 R extends s.Model{}R.init({secret:s.DataTypes.STRING,logout:s.DataTypes.DATE,useragent:s.DataTypes.STRING},{sequelize:v,modelName:m.API_TABLE_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class A extends s.Model{}A.init({token:s.DataTypes.STRING,timestamp:s.DataTypes.BIGINT,state:s.DataTypes.BOOLEAN},{sequelize:v,modelName:m.API_TABLE_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class O extends s.Model{}O.init({name:s.DataTypes.STRING,description:s.DataTypes.TEXT,state:s.DataTypes.BOOLEAN},{sequelize:v,modelName:m.API_TABLE_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class _ extends s.Model{}_.init({},{sequelize:v,modelName:m.API_TABLE_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),_.removeAttribute("id");class P extends s.Model{}P.init({name:s.DataTypes.STRING,description:s.DataTypes.TEXT,state:s.DataTypes.BOOLEAN},{sequelize:v,modelName:m.API_TABLE_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class f extends s.Model{}f.init({name:s.DataTypes.STRING,email:s.DataTypes.STRING,username:s.DataTypes.STRING,password:s.DataTypes.STRING,avatar:s.DataTypes.STRING,description:s.DataTypes.TEXT,state:s.DataTypes.BOOLEAN},{sequelize:v,modelName:m.API_TABLE_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated",defaultScope:{attributes:{exclude:["password"]}},scopes:{password:{attributes:{include:["password"]}}}});class I extends s.Model{}I.init({},{sequelize:v,modelName:m.API_TABLE_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),I.removeAttribute("id");class E extends s.Model{}E.init({key:s.DataTypes.STRING,value:s.DataTypes.STRING},{sequelize:v,modelName:m.API_TABLE_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),E.removeAttribute("id");class w extends s.Model{}w.init({type:s.DataTypes.STRING,source:s.DataTypes.STRING,message:s.DataTypes.TEXT},{sequelize:v,modelName:m.API_TABLE_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class T extends s.Model{}var x;T.init({token:s.DataTypes.STRING,timestamp:s.DataTypes.BIGINT,state:s.DataTypes.BOOLEAN},{sequelize:v,modelName:m.API_TABLE_PREFIX+"registry",timestamps:!0,createdAt:"created",updatedAt:"updated"}),f.hasMany(R),R.belongsTo(f),f.hasMany(A),A.belongsTo(f),O.hasMany(_),_.belongsTo(O),P.hasMany(_),_.belongsTo(P),f.hasMany(I),I.belongsTo(f),O.hasMany(I),I.belongsTo(O),exports.LogsColor=void 0,(x=exports.LogsColor||(exports.LogsColor={})).ERROR="",x.INFO="",x.NONE="",x.SUCCESS="",x.WARNING="";class S{static write(e,t,r){return y(this,void 0,void 0,(function*(){yield S.writeRaw(exports.LogsColor.NONE,"",e,t,r)}))}static error(e,t,r){return y(this,void 0,void 0,(function*(){yield S.writeRaw(exports.LogsColor.ERROR,"error",e,t,r)}))}static info(e,t,r){return y(this,void 0,void 0,(function*(){yield S.writeRaw(exports.LogsColor.INFO,"info",e,t,r)}))}static success(e,t,r){return y(this,void 0,void 0,(function*(){yield S.writeRaw(exports.LogsColor.ERROR,"success",e,t,r)}))}static warning(e,t,r){return y(this,void 0,void 0,(function*(){yield S.writeRaw(exports.LogsColor.WARNING,"warning",e,t,r)}))}static writeConsole(e,r,s){const o=t.dateFormat(new Date,"%H:%M:%S");console.log(">",e,r+" ".repeat(10-r.length),"","|",o,"|",s)}static writeRaw(e,t,r,s,o){return y(this,void 0,void 0,(function*(){o&&S.writeConsole(e,t,r),v&&(yield w.create({type:t,source:s,message:r}).catch((()=>null)))}))}}const b=e=>n.existsSync(e)?n.readFileSync(e):void 0,C={http:b(m.API_HTTP_CRT),token:b(m.API_TOKEN_CRT)},q={http:b(m.API_HTTP_KEY),token:b(m.API_TOKEN_KEY)};class j{static create(e){return y(this,void 0,void 0,(function*(){if(!q.token)return{error:"Key not found"};const{id:r}=e,s=t.uuidv4(),o=yield R.create({secret:s,userId:r}).catch(j.error);return o?{auth:o,token:i.sign({id:r,secret:s},q.token,{algorithm:"RS256",expiresIn:m.API_TOKEN_LIFETIME+"ms"})}:{error:"Internal Server Error"}}))}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){S.error(e.message,"api.token",m.API_CONSOLE_ERROR)}static renew(e){return y(this,void 0,void 0,(function*(){if(!q.token)return{error:"Key not found"};const{error:r,decode:s}=j.verify(e,m.API_TOKEN_RENEW/1e3);if(r)return{error:r};if(s){const{id:e,secret:r}=s;if(e&&r){const s=yield f.findOne({where:{id:e,state:!0}}).catch(j.error);if(s){const o=yield R.findOne({where:{secret:r,userId:s.id}}).catch(j.error);if(o&&!o.logout)return o.secret=t.uuidv4(),yield o.save().catch(j.error),{auth:o,token:i.sign({id:e,secret:o.secret},q.token,{algorithm:"RS256",expiresIn:m.API_TOKEN_LIFETIME+"ms"})}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e){return y(this,void 0,void 0,(function*(){const{error:t,decode:r}=j.verify(e);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield f.findOne({where:{id:e,state:!0}}).catch(j.error);if(r){const e=yield R.findOne({where:{secret:t,userId:r.id}}).catch(j.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!C.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:i.verify(e,C.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class D extends e.Application{constructor(e){super(e,{cert:C.http,cross:m.API_HTTP_CROSS,hybrid:m.API_HTTP_HYBRID,key:q.http,path:"/api",port:m.API_HTTP_PORT,public:m.API_HTTP_PUBLIC})}error(e,t){S.info(e.message,t,m.API_CONSOLE_ERROR)}log(e,t){S.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),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)=>y(this,void 0,void 0,(function*(){r.url||(r.url="");const s=r.url.length<=1?"":r.url.replace(/\//g,".");let o;e.on("message",(t=>y(this,void 0,void 0,(function*(){if(o)try{const n=JSON.parse(t);this.emit("ws.message"+s,{data:n,message:t,req:r,user:o,ws:e})}catch(n){this.emit("ws.message"+s,{message:t,req:r,user:o,ws:e})}else{const{user:n}=yield j.user(t.toString());n&&(o=n,this.emit("ws.connection"+s,{req:r,user:o,ws:e}))}o||e.close()})))),e.on("close",(()=>{o&&this.emit("ws.close"+s,{user:o,ws:e})})),yield t.sleep(2e3),o||e.close()})))))}))}websocket(){return this._webSocket}}class M{static all(){return y(this,void 0,void 0,(function*(){const e=yield E.findAll().catch(M.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(M.error))||0)>0}))}static error(e){S.error(e.message,"api.config",m.API_CONSOLE_ERROR)}static get(e){return y(this,void 0,void 0,(function*(){const t=yield E.findOne({where:{key:e}}).catch(M.error);return t&&t.value||""}))}static set(e,t){return y(this,void 0,void 0,(function*(){const[r]=(yield E.findOrCreate({where:{key:e}}).catch(M.error))||[];r&&(r.value=t,yield r.save().catch(M.error))}))}}class N{static all(e,t){return y(this,void 0,void 0,(function*(){return yield P.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:_,required:!0,include:[{model:O,required:!0,where:{state:!0},include:[{model:I,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{S.error(e.message,"api.permission",m.API_CONSOLE_ERROR)}))}))}static get(e){return y(this,void 0,void 0,(function*(){const t=yield N.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return y(this,void 0,void 0,(function*(){const r=yield N.all(e,{name:t});return!!r&&r.length>0}))}}const F=e.parameterFactory((({req:e})=>e.auth)),L=e.parameterFactory((({req:e})=>t.toArray(e.files))),B=e.parameterFactory((({req:e})=>e.user)),G=(e,r)=>{const s=t.uuidv4()+"."+r;return n.existsSync(u.join(e,s))?G(e,r):s};class k extends t.EventEmitter{auth(t,r,s,o,n){return y(this,void 0,void 0,(function*(){const{auth:i,error:d,user:a}=yield j.user(s);d?e.Responses.error(t,d):i&&a?(o&&(i.useragent=o),r.auth=i,r.user=a,yield i.save(),n()):e.Responses.error(t,"Internal Server Error")}))}error(e){S.error(e.message,"api.controller",m.API_CONSOLE_ERROR)}name(){return"api"}permission(t,r,s,o){return y(this,void 0,void 0,(function*(){r?(yield N.is(r,o))?s():e.Responses.error(t,"Unauthorized access"):e.Responses.unauthorized(t,"Access denied")}))}read(e,t,r,s){return this.permission(e,t,r,(s||this.name())+".read")}upload(r,s,o,n){const i=(null==n?void 0:n.path)||m.API_UPLOAD_TEMP,d=l.diskStorage({destination:(e,t,r)=>r(null,i),filename:(e,t,r)=>y(this,void 0,void 0,(function*(){return r(null,G(i,a.extension(t.mimetype)||"bin"))}))}),u=1e6*((null==n?void 0:n.size)||m.API_UPLOAD_SIZE),c=l({storage:d,fileFilter(e,r,s){var o;return y(this,void 0,void 0,(function*(){const e=null===(o=null==n?void 0:n.types)||void 0===o?void 0:o.indexOf(r.mimetype);return t.isNumber(e)&&e<0?s(new Error("File type not allowed")):s(null,!0)}))},limits:{fileSize:u}}),p=(null==n?void 0:n.count)||m.API_UPLOAD_COUNT,g=(null==n?void 0:n.field)||m.API_UPLOAD_FIELD;c.array(g,p)(s,r,(t=>t?e.Responses.error(r,t.message):o()))}validation(r,s,o,n){return y(this,void 0,void 0,(function*(){const{error:i,value:d}=yield t.Validation.object(n).parse().validateAsync(s.body);i?e.Responses.validation(r,i):(s.body=d,o())}))}write(e,t,r,s){return this.permission(e,t,r,(s||this.name())+".write")}}c([p(0,e.Res()),p(1,e.Req()),p(2,e.Headers(m.API_TOKEN_HEADER)),p(3,e.Headers("user-agent")),p(4,e.Next()),g("design:type",Function),g("design:paramtypes",[Object,Object,String,String,Function]),g("design:returntype",Promise)],k.prototype,"auth",null),c([p(0,e.Res()),p(1,B()),p(2,e.Next()),p(3,e.Argument()),g("design:type",Function),g("design:paramtypes",[Object,f,Function,String]),g("design:returntype",Promise)],k.prototype,"permission",null),c([p(0,e.Res()),p(1,B()),p(2,e.Next()),p(3,e.Argument()),g("design:type",Function),g("design:paramtypes",[Object,f,Function,String]),g("design:returntype",Promise)],k.prototype,"read",null),c([p(0,e.Res()),p(1,e.Req()),p(2,e.Next()),p(3,e.Argument()),g("design:type",Function),g("design:paramtypes",[Object,Object,Function,Object]),g("design:returntype",void 0)],k.prototype,"upload",null),c([p(0,e.Res()),p(1,e.Req()),p(2,e.Next()),p(3,e.Argument()),g("design:type",Function),g("design:paramtypes",[Object,Object,Function,Object]),g("design:returntype",Promise)],k.prototype,"validation",null),c([p(0,e.Res()),p(1,B()),p(2,e.Next()),p(3,e.Argument()),g("design:type",Function),g("design:paramtypes",[Object,f,Function,String]),g("design:returntype",Promise)],k.prototype,"write",null),exports.AuthController=class extends k{login(r,s,o,n){return y(this,void 0,void 0,(function*(){yield t.sleep(m.API_SLEEP_AUTH);const{username:i,password:a}=s.body,l=yield f.findOne({where:{username:i,password:d.SHA256(a).toString(),state:!0}}).catch(this.error);if(!l)return n.emit("auth.failure",{req:s}),void e.Responses.notfound(r,"Username not found");const{auth:u,error:c,token:p}=yield j.create(l);return c?(n.emit("auth.failure",{req:s}),void e.Responses.error(r,c)):u&&p?(u.useragent=o,yield u.save().catch(this.error),this.emit("auth.login",{auth:u,req:s,user:l}),void e.Responses.data(r,{token:p})):(n.emit("auth.failure",{req:s}),void e.Responses.error(r,"Internal Server Error"))}))}logout(t,r,s,o,n){return y(this,void 0,void 0,(function*(){if(yield j.destroy(s))return n.emit("auth.logout",{auth:s,req:r,user:o}),void e.Responses.success(t,"Disconcerted");e.Responses.unauthorized(t,"Access denied")}))}renew(t,r,s,o,n){return y(this,void 0,void 0,(function*(){const{auth:i,error:d,token:a}=yield j.renew(s);if(!d)return i?(i.useragent=o,yield i.save().catch(this.error),n.emit("auth.renew",{auth:i,req:r}),void e.Responses.data(t,{token:a})):void e.Responses.error(t,"Internal Server Error");e.Responses.error(t,d)}))}update(t,r,s,o){return y(this,void 0,void 0,(function*(){if(o){if(yield f.scope("password").findOne({where:{id:o.id,password:s,state:!0}}).catch(this.error)){r.newPassword&&(r.password=d.SHA256(r.newPassword).toString()),delete r.newPassword,delete r.oldPassword;const[s]=(yield f.update(r,{where:{id:o.id}}).catch(this.error))||[];return s?void e.Responses.success(t,"OK"):void e.Responses.success(t,"Record not changed")}e.Responses.error(t,"Record not changed")}else e.Responses.error(t,"Internal Server Error")}))}user(t,r,s,o){return y(this,void 0,void 0,(function*(){r.useragent=o,yield r.save().catch(this.error);const n=yield N.all(s);n?e.Responses.data(t,Object.assign(Object.assign({},s.toJSON()),{permissions:n.map((e=>e.name))})):e.Responses.error(t,"Internal Server Error")}))}},c([e.Post("/login"),e.Middleware("validation",{username:t.Validation.string().min(4).required(),password:t.Validation.string().min(5).required()}),p(0,e.Res()),p(1,e.Req()),p(2,e.Headers("user-agent")),p(3,e.App()),g("design:type",Function),g("design:paramtypes",[Object,Object,String,D]),g("design:returntype",Promise)],exports.AuthController.prototype,"login",null),c([e.Get("/logout"),e.Middleware("auth"),p(0,e.Res()),p(1,e.Req()),p(2,F()),p(3,B()),p(4,e.App()),g("design:type",Function),g("design:paramtypes",[Object,Object,R,f,D]),g("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),c([e.Post("/renew"),e.Middleware("validation",{token:t.Validation.string().required()}),p(0,e.Res()),p(1,e.Req()),p(2,e.Body("token")),p(3,e.Headers("user-agent")),p(4,e.App()),g("design:type",Function),g("design:paramtypes",[Object,Object,String,String,D]),g("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),c([e.Post("/update"),e.Middleware("auth"),e.Middleware("validation",{name:t.Validation.string().empty(),newPassword:t.Validation.string().min(5).empty().filter(""),oldPassword:t.Validation.string().min(5).empty().filter(""),avatar:t.Validation.string().empty()}),p(0,e.Res()),p(1,e.Body()),p(2,e.Body("oldPassword")),p(3,B()),g("design:type",Function),g("design:paramtypes",[Object,Object,String,f]),g("design:returntype",Promise)],exports.AuthController.prototype,"update",null),c([e.Get(),e.Middleware("auth"),p(0,e.Res()),p(1,F()),p(2,B()),p(3,e.Headers("user-agent")),g("design:type",Function),g("design:paramtypes",[Object,R,f,String]),g("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=c([e.Controller("/auth"),e.Extends(k)],exports.AuthController),exports.ForgotController=class extends k{check(r,s){return y(this,void 0,void 0,(function*(){const{token:o}=s.body,n=yield this.findOne(o);n&&n.user?(n.token=t.uniqueID(),yield n.save(),e.Responses.data(r,{token:n.token})):e.Responses.notfound(r,"User not found")}))}forgot(r,s){return y(this,void 0,void 0,(function*(){const{username:o}=s.body;yield t.sleep(m.API_SLEEP_FORGOT);const n=yield f.findOne({where:{username:o}}).catch(this.error);if(!n)return void e.Responses.notfound(r,"User not found");const i=t.uniqueID(),d=Date.now()+6e4*m.API_TOKEN_LIFETIME,a=yield A.create({token:i,timestamp:d,state:!0,userId:n.id});this.emit("forgot",{forgot:a,req:s,user:n}),e.Responses.success(r,"OK")}))}reset(t,r){return y(this,void 0,void 0,(function*(){const{token:s,password:o}=r.body,n=yield this.findOne(s);n?(n.state=!1,yield n.save().catch(this.error),n.user.password=d.SHA256(o).toString(),yield n.user.save().catch(this.error),this.emit("forgot.reset",{req:r,user:n.user}),e.Responses.success(t,"OK")):e.Responses.notfound(t,"User not found")}))}findOne(e){return y(this,void 0,void 0,(function*(){return yield A.findOne({where:{token:e,state:!0},include:[{model:f,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.Get(),e.Middleware("validation",{username:t.Validation.string().min(4).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,"forgot",null),c([e.Get("/reset"),e.Middleware("validation",{token:t.Validation.string().required(),password:t.Validation.string().min(5).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,"reset",null),exports.ForgotController=c([e.Controller("/forgot"),e.Extends(k)],exports.ForgotController),exports.ModelController=class extends k{add(t,r,s,o){return y(this,void 0,void 0,(function*(){const n=yield this.model().create(Object.assign(Object.assign({},t.body),o||{}),s||{}).catch(this.error);if(n){const t=this.key();return e.Responses.data(r,{[t]:n.getDataValue(t)}),n}e.Responses.error(r,"Internal Server Error")}))}all(r,o,n,i){var d,a,l,u,c;return y(this,void 0,void 0,(function*(){const p=this.model(),g=Object.assign({},n||{});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 m=null===(a=r.query.offset)||void 0===a?void 0:a.toString();m&&(g.offset=parseInt(m));const h=Object.keys(p.getAttributes()),v=[],R=null===(l=r.query.asc)||void 0===l?void 0:l.toString();R&&R.length&&R.split(",").forEach((e=>{h.indexOf(e)>=0&&v.push([e,"ASC"])}));const A=null===(u=r.query.desc)||void 0===u?void 0:u.toString();A&&A.length&&A.split(",").forEach((e=>{h.indexOf(e)>=0&&v.push([e,"DESC"])})),v.length&&(g.order=v);const O=[],_=t.isArray(g.attributes)?g.attributes:h,P=null===(c=r.query.search)||void 0===c?void 0:c.toString();_.forEach((e=>{var o;if(t.isString(e)&&(P&&P.length&&O.push({[e]:{[s.Op.like]:`%${P}%`}}),"search_"+e in r.query)){const t=null===(o=r.query["search_"+e])||void 0===o?void 0:o.toString();t&&t.length&&O.push({[e]:{[s.Op.like]:`%${t}%`}})}})),O.length&&(g.where=Object.assign(Object.assign({},g.where),{[s.Op.or]:[...O]}));const f=(yield p.count(Object.assign(Object.assign({},g),{col:h[0]})).catch(this.error))||0,I=yield p.findAll(g).catch(this.error);if(I)return e.Responses.data(o,{count:f,records:i?yield i(I):I}),I;e.Responses.error(o,"Internal Server Error")}))}del(t,r,s){return y(this,void 0,void 0,(function*(){const o=this.key(),{[o]:n}=t.params;if(!n)return e.Responses.error(r,"Internal Server Error"),0;const i=yield this.model().destroy(Object.assign(Object.assign({},s||{}),{where:Object.assign(Object.assign({},(s||{}).where),{[o]:n})})).catch(this.error);return i?(e.Responses.success(r,"OK"),i):(e.Responses.notfound(r,"Record not found"),0)}))}error(e){e.sql?S.error(e.message+"\n"+e.sql,"api.controller.sql",m.API_CONSOLE_ERROR):super.error(e)}get(t,r,s,o){return y(this,void 0,void 0,(function*(){const n=this.key(),{[n]:i}=t.params,d=yield this.model().findOne(Object.assign(Object.assign({},s||{}),{where:Object.assign(Object.assign({},(s||{}).where),{[n]:i})})).catch(this.error);if(d)return e.Responses.data(r,o?yield o(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,s,o){return y(this,void 0,void 0,(function*(){const n=this.key(),{[n]:i}=t.params,[d]=(yield this.model().update(Object.assign(Object.assign({},t.body),o||{}),Object.assign(Object.assign({},s||{}),{where:Object.assign(Object.assign({},(s||{}).where),{[n]:i})})).catch(this.error))||[];return d?(e.Responses.success(r,"OK"),!0):(e.Responses.success(r,"Record not changed"),!1)}))}},exports.ModelController=c([e.Extends(k)],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(t,e,r,this.create())}validationSet(e,t,r){this.validation(t,e,r,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.Req()),p(1,e.Res()),p(2,e.Next()),g("design:type",Function),g("design:paramtypes",[Object,Object,Function]),g("design:returntype",void 0)],exports.CrudController.prototype,"validationAdd",null),c([p(0,e.Req()),p(1,e.Res()),p(2,e.Next()),g("design:type",Function),g("design:paramtypes",[Object,Object,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 O}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 _}recordAll(e,t,r){return y(this,void 0,void 0,(function*(){this.all(t,e,{where:{groupId:r},include:[{model:P,required:!0}]},(e=>e.map((e=>e.route))))}))}recordSet(r,s,o){return y(this,void 0,void 0,(function*(){const n=yield O.findByPk(s,{attributes:["id"]}).catch(this.error);if(n){const t=n.id;if(yield _.destroy({where:{groupId:t}}),o){let e=0;for(let r=0;r<o.length;r++)e=yield P.count({where:{id:o[r]}}),e&&(yield _.create({groupId:t,routeId:o[r]}))}e.Responses.success(r,"OK")}else t.isNull(n)?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.Res()),p(1,e.Req()),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 w}recordAll(e,t){const{source:r,type:s}=t.query,o=r&&s?{source:r,type:s}:r?{source:r}:s?{type:s}:{};this.all(t,e,{where:o,order:[["created","DESC"]]})}},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.LogsController.prototype,"recordAll",null),exports.LogsController=c([e.Controller("/logs"),e.Extends(exports.ModelController)],exports.LogsController),exports.RegisterController=class extends k{confirm(t,r){return y(this,void 0,void 0,(function*(){const s=yield T.findOne({where:{token:r,state:!0},include:[{model:f,required:!0}]}).catch(this.error);s?(s.user.state=!0,yield s.user.save().catch(this.error),this.emit("user.confirm",{user:s.user}),e.Responses.success(t,"OK")):e.Responses.notfound(t,"User not found")}))}register(r,s,o,n){return y(this,void 0,void 0,(function*(){yield t.sleep(m.API_SLEEP_REGISTRY);const s=yield f.findOne({where:{username:n}}).catch(this.error);if(s)return void e.Responses.error(r,"Invalid Username");if(!t.isNull(s))return void e.Responses.error(r,"Internal Server Error");const i=yield f.create(Object.assign(Object.assign({},o),{state:!1}));this.emit("user.register",{user:i}),e.Responses.success(r,"OK")}))}},c([e.Get("/confirm"),e.Middleware("validation",{token:t.Validation.string().required()}),p(0,e.Res()),p(1,e.Body("token")),g("design:type",Function),g("design:paramtypes",[Object,String]),g("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),c([e.Get(),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()}),p(0,e.Res()),p(1,e.Req()),p(2,e.Body()),p(3,e.Body("username")),g("design:type",Function),g("design:paramtypes",[Object,Object,Object,String]),g("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),exports.RegisterController=c([e.Controller("/register"),e.Extends(k)],exports.RegisterController),exports.RoutesController=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.RoutesController=c([e.Controller("/routes"),e.Extends(exports.CrudController)],exports.RoutesController),exports.SetupController=class extends k{setup(r){return y(this,void 0,void 0,(function*(){if(0==(yield f.count())){const e={description:"",state:!0},r=yield f.create(Object.assign({name:"Admin",email:"admin@localhost",username:"admin",password:"8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918",avatar:""},e)),s=yield O.create(Object.assign({name:"admin"},e));yield I.create({userId:r.id,groupId:s.id});const o=["read","write"],n=["users","groups","routes"];yield t.forEachSeries(n,(r=>y(this,void 0,void 0,(function*(){yield t.forEachSeries(o,(t=>y(this,void 0,void 0,(function*(){const o=r+"."+t,n=yield P.create(Object.assign({name:o},e));yield _.create({groupId:s.id,routeId:n.id})}))))}))));const i=yield P.create(Object.assign({name:"logs.read"},e));yield _.create({groupId:s.id,routeId:i.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(k)],exports.SetupController),exports.UsersController=class extends exports.ModelController{model(){return f}recordAdd(e,t,r){this.add(r,e,{},{password:d.SHA256(t).toString()})}recordAll(e,t){this.all(t,e)}recordDel(t,r,s,o){s&&s.id.toString()!=o?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:d.SHA256(t).toString()}:{})}},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,B()),p(3,e.Params("id")),g("design:type",Function),g("design:paramtypes",[Object,Object,f,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)],exports.UsersController),exports.UsersGroupsController=class extends exports.ModelController{model(){return I}recordAll(e,t,r){this.all(t,e,{where:{userId:r},include:[{model:O,required:!0}]},(e=>e.map((e=>e.group))))}recordSet(r,s,o){return y(this,void 0,void 0,(function*(){const n=yield f.findByPk(s,{attributes:["id"]}).catch(this.error);if(n){if(yield I.destroy({where:{userId:n.id}}),o){let e=0;for(let t=0;t<o.length;t++)e=yield O.count({where:{id:o[t]}}),e&&(yield I.create({userId:n.id,groupId:o[t]}))}e.Responses.success(r,"OK")}else t.isNull(n)?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=D,exports.Auth=R,exports.Config=M,exports.Configs=E,exports.ControllerBase=k,exports.Database=h,exports.Env=m,exports.Forgot=A,exports.Group=O,exports.GroupRoute=_,exports.Log=w,exports.Logs=S,exports.Permission=N,exports.Registry=T,exports.ReqAuth=F,exports.ReqFiles=L,exports.ReqUser=B,exports.Route=P,exports.Token=j,exports.User=f,exports.UserGroup=I,exports.crt=C,exports.key=q,exports.sequelize=v;
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  /*!
2
- * @andrewcaires/api v3.0.9
2
+ * @andrewcaires/api v3.0.10
3
3
  * Simple api for small applications using express, jsonwebtoken, sequelize and websocket
4
4
  * (c) 2023 Andrew Caires
5
5
  * @license: MIT
6
6
  */
7
- import { ResponseJson, Application as Application$1 } from '@andrewcaires/express';
7
+ import { Application as Application$1 } from '@andrewcaires/express';
8
8
  import WebSocket from 'ws';
9
9
  import { EventEmitter, TypeObject, ValidationBase, TypeObjectString, TypeObjectAny } from '@andrewcaires/utils.js';
10
10
  import { Response, Request, NextFunction } from 'express';
@@ -55,10 +55,8 @@ declare class User extends Model {
55
55
 
56
56
  declare class Auth extends Model {
57
57
  id: number;
58
- login: number;
59
- logout: number;
60
58
  secret: string;
61
- timestamp: number;
59
+ logout: Date;
62
60
  useragent: string;
63
61
  user: User;
64
62
  userId: number;
@@ -98,17 +96,17 @@ interface UploadOptions {
98
96
  field?: string;
99
97
  path?: string;
100
98
  size?: number;
101
- types?: string[];
99
+ types?: Array<string>;
102
100
  }
103
101
  declare abstract class ControllerBase extends EventEmitter {
104
- auth(res: Response, req: Request, token: string, useragent: string, next: NextFunction): Promise<ResponseJson | void>;
102
+ auth(res: Response, req: Request, token: string, useragent: string, next: NextFunction): Promise<void>;
105
103
  error(error: any): void;
106
104
  protected name(): string;
107
- permission(res: Response, user: User, next: NextFunction, name: string): Promise<ResponseJson | void>;
108
- read(res: Response, user: User, next: NextFunction, name: string): Promise<ResponseJson | void>;
105
+ permission(res: Response, user: User, next: NextFunction, name: string): Promise<void>;
106
+ read(res: Response, user: User, next: NextFunction, name: string): Promise<void>;
109
107
  upload(res: Response, req: Request, next: NextFunction, options: UploadOptions): void;
110
- validation(res: Response, req: Request, next: NextFunction, options: TypeObject<ValidationBase>): Promise<ResponseJson | void>;
111
- write(res: Response, user: User, next: NextFunction, name: string): Promise<ResponseJson | void>;
108
+ validation(res: Response, req: Request, next: NextFunction, options: TypeObject<ValidationBase>): Promise<void>;
109
+ write(res: Response, user: User, next: NextFunction, name: string): Promise<void>;
112
110
  }
113
111
 
114
112
  declare class Application extends Application$1 {
@@ -129,27 +127,29 @@ declare class Config {
129
127
  }
130
128
 
131
129
  declare class AuthController extends ControllerBase {
132
- readonly attributes: string[];
133
- protected login(res: Response, req: Request, useragent: string, app: Application): Promise<ResponseJson>;
134
- protected logout(res: Response, req: Request, auth: Auth, user: User, app: Application): Promise<ResponseJson>;
135
- protected user(res: Response, req: Request): Promise<ResponseJson>;
130
+ protected login(res: Response, req: Request, useragent: string, app: Application): Promise<void>;
131
+ protected logout(res: Response, req: Request, auth: Auth, user: User, app: Application): Promise<void>;
132
+ protected renew(res: Response, req: Request, old: string, useragent: string, app: Application): Promise<void>;
133
+ protected update(res: Response, body: TypeObjectAny, password: string, user: User): Promise<void>;
134
+ protected user(res: Response, auth: Auth, user: User, useragent: string): Promise<void>;
136
135
  }
137
136
 
138
137
  declare class ForgotController extends ControllerBase {
139
- check(res: Response, req: Request): Promise<ResponseJson>;
140
- forgot(res: Response, req: Request): Promise<ResponseJson>;
141
- reset(res: Response, req: Request): Promise<ResponseJson>;
138
+ check(res: Response, req: Request): Promise<void>;
139
+ forgot(res: Response, req: Request): Promise<void>;
140
+ reset(res: Response, req: Request): Promise<void>;
142
141
  private findOne;
143
142
  }
144
143
 
145
- type FnRecord<M> = (records: M) => any;
146
- type FnRecords<M> = (records: Array<M>) => Array<any>;
144
+ type FnRecord<M> = (records: M) => any | Promise<any>;
145
+ type FnRecords<M> = (records: Array<M>) => Array<any> | Promise<Array<any>>;
147
146
  declare abstract class ModelController<M extends Model<M>> extends ControllerBase {
148
147
  protected add(req: Request, res: Response, options?: CreateOptions<Attributes<M>>, body?: TypeObjectAny): Promise<M | void>;
149
- protected all(req: Request, res: Response, options?: FindOptions<Attributes<M>>, fn?: FnRecords<M>): Promise<Array<M> | void>;
148
+ protected all(req: Request, res: Response, options?: FindOptions<Attributes<M>>, callback?: FnRecords<M>): Promise<Array<M> | void>;
150
149
  protected del(req: Request, res: Response, options?: FindOptions<Attributes<M>>): Promise<number>;
151
150
  error(error: any): void;
152
- protected get(req: Request, res: Response, options?: FindOptions<Attributes<M>>, fn?: FnRecord<M>): Promise<M | void>;
151
+ protected get(req: Request, res: Response, options?: FindOptions<Attributes<M>>, callback?: FnRecord<M>): Promise<M | void>;
152
+ key(): string;
153
153
  abstract model(): ModelStatic<M>;
154
154
  protected name(): string;
155
155
  protected set(req: Request, res: Response, options?: UpdateOptions<Attributes<M>>, body?: TypeObjectAny): Promise<boolean>;
@@ -176,7 +176,7 @@ declare class GroupsController extends CrudController<Group> {
176
176
  declare class GroupsRoutesController extends ModelController<GroupRoute> {
177
177
  model(): typeof GroupRoute;
178
178
  recordAll(res: Response, req: Request, groupId: string): Promise<void>;
179
- recordSet(res: Response, id: string, routes: Array<number>): Promise<ResponseJson>;
179
+ recordSet(res: Response, id: string, routes: Array<number>): Promise<void>;
180
180
  }
181
181
 
182
182
  declare class LogsController extends ModelController<Log> {
@@ -185,8 +185,8 @@ declare class LogsController extends ModelController<Log> {
185
185
  }
186
186
 
187
187
  declare class RegisterController extends ControllerBase {
188
- confirm(res: Response, token: string): Promise<ResponseJson>;
189
- register(res: Response, req: Request, body: any, username: string): Promise<ResponseJson>;
188
+ confirm(res: Response, token: string): Promise<void>;
189
+ register(res: Response, req: Request, body: any, username: string): Promise<void>;
190
190
  }
191
191
 
192
192
  declare class RoutesController extends CrudController<Route> {
@@ -196,15 +196,14 @@ declare class RoutesController extends CrudController<Route> {
196
196
  }
197
197
 
198
198
  declare class SetupController extends ControllerBase {
199
- protected setup(res: Response): Promise<ResponseJson>;
199
+ protected setup(res: Response): Promise<void>;
200
200
  }
201
201
 
202
202
  declare class UsersController extends ModelController<User> {
203
- private readonly attributes;
204
203
  model(): typeof User;
205
204
  recordAdd(res: Response, password: string, req: Request): void;
206
205
  protected recordAll(res: Response, req: Request): void;
207
- protected recordDel(res: Response, req: Request, user: User, id: string): ResponseJson | void;
206
+ protected recordDel(res: Response, req: Request, user: User, id: string): void;
208
207
  protected recordGet(res: Response, req: Request): void;
209
208
  protected recordSet(res: Response, password: string, req: Request): void;
210
209
  }
@@ -212,7 +211,7 @@ declare class UsersController extends ModelController<User> {
212
211
  declare class UsersGroupsController extends ModelController<UserGroup> {
213
212
  model(): typeof UserGroup;
214
213
  recordAll(res: Response, req: Request, userId: string): void;
215
- recordSet(res: Response, id: string, groups: Array<number>): Promise<ResponseJson>;
214
+ recordSet(res: Response, id: string, groups: Array<number>): Promise<void>;
216
215
  }
217
216
 
218
217
  interface DatabaseOptions {
@@ -255,6 +254,7 @@ declare class Env {
255
254
  static readonly API_TOKEN_KEY: string;
256
255
  static readonly API_TOKEN_HEADER: string;
257
256
  static readonly API_TOKEN_LIFETIME: number;
257
+ static readonly API_TOKEN_RENEW: number;
258
258
  static readonly API_UPLOAD_COUNT: number;
259
259
  static readonly API_UPLOAD_FIELD: string;
260
260
  static readonly API_UPLOAD_SIZE: number;
@@ -307,24 +307,21 @@ declare const key: {
307
307
  token: Buffer | undefined;
308
308
  };
309
309
 
310
- interface TokenSign {
311
- error?: string;
312
- token?: string;
313
- }
314
- interface TokenUser {
310
+ interface TokenParameters {
315
311
  auth?: Auth;
312
+ decode?: TypeObjectAny;
316
313
  error?: string;
314
+ forgot?: Forgot;
315
+ token?: string;
317
316
  user?: User;
318
317
  }
319
- interface TokenVerify {
320
- error?: string;
321
- decode?: TypeObject<string | number | boolean>;
322
- }
323
318
  declare class Token {
319
+ static create(user: User): Promise<TokenParameters>;
320
+ static destroy(auth?: Auth): Promise<boolean>;
324
321
  private static error;
325
- static sign(payload: TypeObject<string | number>): TokenSign;
326
- static user(token: string): Promise<TokenUser>;
327
- static verify(token: string): TokenVerify;
322
+ static renew(token: string): Promise<TokenParameters>;
323
+ static user(token: string): Promise<TokenParameters>;
324
+ private static verify;
328
325
  }
329
326
 
330
327
  export { Application, Auth, AuthController, Config, Configs, ControllerBase, CrudController, Database, DatabaseOptions, Env, Forgot, ForgotController, Group, GroupRoute, GroupsController, GroupsRoutesController, Log, Logs, LogsColor, LogsController, LogsTypes, ModelController, Permission, RegisterController, Registry, ReqAuth, ReqFiles, ReqUser, Route, RoutesController, 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.9
2
+ * @andrewcaires/api v3.0.10
3
3
  * Simple api for small applications using express, jsonwebtoken, sequelize and websocket
4
4
  * (c) 2023 Andrew Caires
5
5
  * @license: MIT
6
6
  */
7
- import{Application as e,parameterFactory as t,Res as r,Req as n,Headers as i,Next as s,Argument as o,Responses as d,Post as a,Middleware as c,App as u,Get as l,Controller as p,Extends as m,Delete as g,Put as y,Params as h,Body as v}from"@andrewcaires/express";import{toBool as O,dateFormat as _,sleep as I,toArray as A,EventEmitter as f,isNumber as P,Validation as E,uuidv4 as b,uniqueID as T,allowedObject as S,isArray as R,isString as w,isNull as j,forEachSeries as N}from"@andrewcaires/utils.js";import q from"ws";import{Sequelize as F,DataTypes as D,Model as L,Op as B}from"sequelize";import{config as k}from"dotenv";import{existsSync as G,readFileSync as C}from"fs";import{sign as x,verify as K}from"jsonwebtoken";import{SHA256 as U}from"crypto-js";import H from"mime-types";import z from"multer";import{join as M}from"path";function X(e,t,r,n){var i,s=arguments.length,o=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,n);else for(var d=e.length-1;d>=0;d--)(i=e[d])&&(o=(s<3?i(o):s>3?i(t,r,o):i(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o}function Y(e,t){return function(r,n){t(r,n,e)}}function W(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function J(e,t,r,n){return new(r||(r=Promise))((function(i,s){function o(e){try{a(n.next(e))}catch(e){s(e)}}function d(e){try{a(n.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,d)}a((n=n.apply(e,t||[])).next())}))}k();class Z{}Z.API_CONSOLE_ERROR=O(process.env.API_CONSOLE_ERROR||"false"),Z.API_DB_DATABASE=process.env.API_DB_DATABASE||"",Z.API_DB_HOST=process.env.API_DB_HOST||"127.0.0.1",Z.API_DB_PASSWORD=process.env.API_DB_PASSWORD||"",Z.API_DB_PORT=parseInt(process.env.API_DB_PORT||"3306"),Z.API_DB_TYPE=process.env.API_DB_TYPE||"",Z.API_DB_USERNAME=process.env.API_DB_USERNAME||"root",Z.API_DB_LOG=O(process.env.API_DB_LOG||"false"),Z.API_TABLE_PREFIX=process.env.API_TABLE_PREFIX||"",Z.API_HTTP_CRT=process.env.API_HTTP_CRT||"",Z.API_HTTP_KEY=process.env.API_HTTP_KEY||"",Z.API_HTTP_PORT=parseInt(process.env.API_HTTP_PORT||"3000"),Z.API_HTTP_PUBLIC=process.env.API_HTTP_PUBLIC||"",Z.API_HTTP_CROSS=O(process.env.API_HTTP_CROSS||"false"),Z.API_HTTP_HYBRID=O(process.env.API_HTTP_HYBRID||"false"),Z.API_SLEEP_AUTH=parseInt(process.env.API_SLEEP_AUTH||"1000"),Z.API_SLEEP_FORGOT=parseInt(process.env.API_SLEEP_FORGOT||"5000"),Z.API_SLEEP_REGISTRY=parseInt(process.env.API_SLEEP_REGISTRY||"5000"),Z.API_TOKEN_CRT=process.env.API_TOKEN_CRT||"",Z.API_TOKEN_KEY=process.env.API_TOKEN_KEY||"",Z.API_TOKEN_HEADER=process.env.API_TOKEN_HEADER||"authorization",Z.API_TOKEN_LIFETIME=parseInt(process.env.API_TOKEN_LIFETIME||"15"),Z.API_UPLOAD_COUNT=parseInt(process.env.API_UPLOAD_COUNT||"1"),Z.API_UPLOAD_FIELD=process.env.API_UPLOAD_FIELD||"upload",Z.API_UPLOAD_SIZE=parseInt(process.env.API_UPLOAD_SIZE||"2"),Z.API_UPLOAD_TEMP=process.env.API_UPLOAD_TEMP||"./temp",Z.API_WEBSOCKET_START=O(process.env.API_WEBSOCKET_START||"false");class ${static connect(e){const t="connect_"+Z.API_DB_TYPE.toLowerCase();if(t in $)return $[t](e);throw new Error("No database is connected to this API")}static connect_mariadb(e){return new F(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mariadb",logging:Z.API_DB_LOG,define:{timestamps:!1}})}static connect_memory(){return new F("sqlite::memory:",{logging:Z.API_DB_LOG,define:{timestamps:!1}})}static connect_mysql(e){return new F(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mysql",logging:Z.API_DB_LOG,define:{timestamps:!1}})}static connect_postgres(e){return new F(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"postgres",logging:Z.API_DB_LOG,define:{timestamps:!1}})}static connect_sqlite(e){return new F({dialect:"sqlite",storage:e.database,logging:Z.API_DB_LOG,define:{timestamps:!1}})}}const Q=$.connect({database:Z.API_DB_DATABASE,username:Z.API_DB_USERNAME,password:Z.API_DB_PASSWORD,hostname:Z.API_DB_HOST,hostport:Z.API_DB_PORT});class V extends L{}V.init({login:D.BIGINT,logout:D.BIGINT,secret:D.STRING,timestamp:D.BIGINT,useragent:D.STRING},{sequelize:Q,modelName:Z.API_TABLE_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class ee extends L{}ee.init({token:D.STRING,timestamp:D.BIGINT,state:D.BOOLEAN},{sequelize:Q,modelName:Z.API_TABLE_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class te extends L{}te.init({name:D.STRING,description:D.TEXT,state:D.BOOLEAN},{sequelize:Q,modelName:Z.API_TABLE_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class re extends L{}re.init({},{sequelize:Q,modelName:Z.API_TABLE_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),re.removeAttribute("id");class ne extends L{}ne.init({name:D.STRING,description:D.TEXT,state:D.BOOLEAN},{sequelize:Q,modelName:Z.API_TABLE_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class ie extends L{}ie.init({name:D.STRING,email:D.STRING,username:D.STRING,password:D.STRING,avatar:D.STRING,description:D.TEXT,state:D.BOOLEAN},{sequelize:Q,modelName:Z.API_TABLE_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated"});class se extends L{}se.init({},{sequelize:Q,modelName:Z.API_TABLE_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),se.removeAttribute("id");class oe extends L{}oe.init({key:D.STRING,value:D.STRING},{sequelize:Q,modelName:Z.API_TABLE_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),oe.removeAttribute("id");class de extends L{}de.init({type:D.STRING,source:D.STRING,message:D.TEXT},{sequelize:Q,modelName:Z.API_TABLE_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class ae extends L{}var ce;ae.init({token:D.STRING,timestamp:D.BIGINT,state:D.BOOLEAN},{sequelize:Q,modelName:Z.API_TABLE_PREFIX+"registry",timestamps:!0,createdAt:"created",updatedAt:"updated"}),ie.hasMany(V),V.belongsTo(ie),ie.hasMany(ee),ee.belongsTo(ie),te.hasMany(re),re.belongsTo(te),ne.hasMany(re),re.belongsTo(ne),ie.hasMany(se),se.belongsTo(ie),te.hasMany(se),se.belongsTo(te),function(e){e.ERROR="",e.INFO="",e.NONE="",e.SUCCESS="",e.WARNING=""}(ce||(ce={}));class ue{static write(e,t,r){return J(this,void 0,void 0,(function*(){yield ue.writeRaw(ce.NONE,"",e,t,r)}))}static error(e,t,r){return J(this,void 0,void 0,(function*(){yield ue.writeRaw(ce.ERROR,"error",e,t,r)}))}static info(e,t,r){return J(this,void 0,void 0,(function*(){yield ue.writeRaw(ce.INFO,"info",e,t,r)}))}static success(e,t,r){return J(this,void 0,void 0,(function*(){yield ue.writeRaw(ce.ERROR,"success",e,t,r)}))}static warning(e,t,r){return J(this,void 0,void 0,(function*(){yield ue.writeRaw(ce.WARNING,"warning",e,t,r)}))}static writeConsole(e,t,r){const n=_(new Date,"%H:%M:%S");console.log(">",e,t+" ".repeat(10-t.length),"","|",n,"|",r)}static writeRaw(e,t,r,n,i){return J(this,void 0,void 0,(function*(){i&&ue.writeConsole(e,t,r),Q&&(yield de.create({type:t,source:n,message:r}).catch((()=>null)))}))}}const le=e=>G(e)?C(e):void 0,pe={http:le(Z.API_HTTP_CRT),token:le(Z.API_TOKEN_CRT)},me={http:le(Z.API_HTTP_KEY),token:le(Z.API_TOKEN_KEY)};class ge{static error(e){ue.error(e.message,"api.token",Z.API_CONSOLE_ERROR)}static sign(e){return me.token?{token:x(e,me.token,{algorithm:"RS256"})}:{error:"Invalid Secret"}}static user(e){return J(this,void 0,void 0,(function*(){const{error:t,decode:r}=ge.verify(e);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&r){const r=yield ie.findOne({where:{id:e,state:!0}}).catch(ge.error);if(r){const e=yield V.findOne({where:{secret:t,userId:r.id}}).catch(ge.error);if(e){const t=Date.now();if(t>e.timestamp)return e.logout=t,yield e.save(),{error:"Expired token"};if(e.timestamp=t+6e4*Z.API_TOKEN_LIFETIME,!e.logout)return yield e.save(),{auth:e,user:r}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e){if(!pe.token)return{error:"Invalid Secret"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:K(e,pe.token)}}catch(e){return{error:"Invalid Token"}}}}class ye extends e{constructor(e){super(e,{cert:pe.http,cross:Z.API_HTTP_CROSS,hybrid:Z.API_HTTP_HYBRID,key:me.http,path:"/api",port:Z.API_HTTP_PORT,public:Z.API_HTTP_PUBLIC})}error(e,t){ue.info(e.message,t,Z.API_CONSOLE_ERROR)}log(e,t){ue.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return J(this,void 0,void 0,(function*(){yield Q.sync(),yield e.listen.call(this),Z.API_WEBSOCKET_START&&this.server&&(this._webSocket=new q.Server({server:this.server,verifyClient:(e,t)=>t(Z.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>J(this,void 0,void 0,(function*(){t.url||(t.url="");const r=t.url.length<=1?"":t.url.replace(/\//g,".");let n;e.on("message",(i=>J(this,void 0,void 0,(function*(){if(n)try{const s=JSON.parse(i);this.emit("ws.message"+r,{data:s,message:i,req:t,user:n,ws:e})}catch(s){this.emit("ws.message"+r,{message:i,req:t,user:n,ws:e})}else{const{user:s}=yield ge.user(i.toString());s&&(n=s,this.emit("ws.connection"+r,{req:t,user:n,ws:e}))}n||e.close()})))),e.on("close",(()=>{n&&this.emit("ws.close"+r,{user:n,ws:e})})),yield I(2e3),n||e.close()})))))}))}websocket(){return this._webSocket}}class he{static all(){return J(this,void 0,void 0,(function*(){const e=yield oe.findAll().catch(he.error),t={};return e&&e.forEach((e=>{t[e.key]=e.value})),t}))}static del(e){return J(this,void 0,void 0,(function*(){return((yield oe.destroy({where:{key:e}}).catch(he.error))||0)>0}))}static error(e){ue.error(e.message,"api.config",Z.API_CONSOLE_ERROR)}static get(e){return J(this,void 0,void 0,(function*(){const t=yield oe.findOne({where:{key:e}}).catch(he.error);return t&&t.value||""}))}static set(e,t){return J(this,void 0,void 0,(function*(){const[r]=(yield oe.findOrCreate({where:{key:e}}).catch(he.error))||[];r&&(r.value=t,yield r.save().catch(he.error))}))}}class ve{static all(e,t){return J(this,void 0,void 0,(function*(){return yield ne.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:re,required:!0,include:[{model:te,required:!0,where:{state:!0},include:[{model:se,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{ue.error(e.message,"api.permission",Z.API_CONSOLE_ERROR)}))}))}static get(e){return J(this,void 0,void 0,(function*(){const t=yield ve.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return J(this,void 0,void 0,(function*(){const r=yield ve.all(e,{name:t});return!!r&&r.length>0}))}}const Oe=t((({req:e})=>e.auth)),_e=t((({req:e})=>A(e.files))),Ie=t((({req:e})=>e.user)),Ae=(e,t)=>{const r=b()+"."+t;return G(M(e,r))?Ae(e,t):r};class fe extends f{auth(e,t,r,n,i){return J(this,void 0,void 0,(function*(){const{auth:s,error:o,user:a}=yield ge.user(r);return o?d.error(e,o):s&&a?(n&&(s.useragent=n),yield s.save(),t.auth=s,t.user=a,i()):d.error(e,"Internal Server Error")}))}error(e){ue.error(e.message,"api.controller",Z.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r,n){return J(this,void 0,void 0,(function*(){return t?(yield ve.is(t,n))?r():d.error(e,"Unauthorized access"):d.unauthorized(e,"Access denied")}))}read(e,t,r,n){return this.permission(e,t,r,(n||this.name())+".read")}upload(e,t,r,n){const i=(null==n?void 0:n.path)||Z.API_UPLOAD_TEMP,s=z.diskStorage({destination:(e,t,r)=>r(null,i),filename:(e,t,r)=>J(this,void 0,void 0,(function*(){return r(null,Ae(i,H.extension(t.mimetype)||"bin"))}))}),o=1e6*((null==n?void 0:n.size)||Z.API_UPLOAD_SIZE),a=z({storage:s,fileFilter(e,t,r){var i;return J(this,void 0,void 0,(function*(){const e=null===(i=null==n?void 0:n.types)||void 0===i?void 0:i.indexOf(t.mimetype);return P(e)&&e<0?r(new Error("File type not allowed")):r(null,!0)}))},limits:{fileSize:o}}),c=(null==n?void 0:n.count)||Z.API_UPLOAD_COUNT,u=(null==n?void 0:n.field)||Z.API_UPLOAD_FIELD;a.array(u,c)(t,e,(t=>t?d.error(e,t.message):r()))}validation(e,t,r,n){return J(this,void 0,void 0,(function*(){const{error:i,value:s}=yield E.object(n).parse().validateAsync(t.body);return i?d.validation(e,i):(t.body=s,r())}))}write(e,t,r,n){return this.permission(e,t,r,(n||this.name())+".write")}}X([Y(0,r()),Y(1,n()),Y(2,i(Z.API_TOKEN_HEADER)),Y(3,i("user-agent")),Y(4,s()),W("design:type",Function),W("design:paramtypes",[Object,Object,String,String,Function]),W("design:returntype",Promise)],fe.prototype,"auth",null),X([Y(0,r()),Y(1,Ie()),Y(2,s()),Y(3,o()),W("design:type",Function),W("design:paramtypes",[Object,ie,Function,String]),W("design:returntype",Promise)],fe.prototype,"permission",null),X([Y(0,r()),Y(1,Ie()),Y(2,s()),Y(3,o()),W("design:type",Function),W("design:paramtypes",[Object,ie,Function,String]),W("design:returntype",Promise)],fe.prototype,"read",null),X([Y(0,r()),Y(1,n()),Y(2,s()),Y(3,o()),W("design:type",Function),W("design:paramtypes",[Object,Object,Function,Object]),W("design:returntype",void 0)],fe.prototype,"upload",null),X([Y(0,r()),Y(1,n()),Y(2,s()),Y(3,o()),W("design:type",Function),W("design:paramtypes",[Object,Object,Function,Object]),W("design:returntype",Promise)],fe.prototype,"validation",null),X([Y(0,r()),Y(1,Ie()),Y(2,s()),Y(3,o()),W("design:type",Function),W("design:paramtypes",[Object,ie,Function,String]),W("design:returntype",Promise)],fe.prototype,"write",null);let Pe=class extends fe{constructor(){super(...arguments),this.attributes=["id","name","email","username","avatar"]}login(e,t,r,n){return J(this,void 0,void 0,(function*(){yield I(Z.API_SLEEP_AUTH);const{username:i,password:s}=t.body,o=yield ie.findOne({where:{username:i}}).catch(this.error);if(!o)return n.emit("auth.failure",{req:t}),d.notfound(e,"Username not found");if(!o.state)return n.emit("auth.failure",{req:t}),d.error(e,"Username is disabled");const a=U(s).toString();if(o.password!=a)return n.emit("auth.failure",{req:t}),d.error(e,"Invalid password");const c=o.id,u=T(),{error:l,token:p}=ge.sign({id:c,secret:u});if(l)return n.emit("auth.failure",{req:t}),d.error(e,l);if(p){const n=Date.now(),i=n+6e4*Z.API_TOKEN_LIFETIME,s=yield V.create({login:n,secret:u,timestamp:i,useragent:r,userId:c}).catch(this.error);if(s)return this.emit("auth.login",{auth:s,req:t,user:o}),d.data(e,{token:p})}return n.emit("auth.failure",{req:t}),d.error(e,"Internal Server Error")}))}logout(e,t,r,n,i){return J(this,void 0,void 0,(function*(){return r&&n&&!r.logout?(r.logout=Date.now(),r.timestamp=r.logout,yield r.save(),i.emit("auth.logout",{auth:r,req:t,user:n}),d.success(e,"Disconcerted")):d.unauthorized(e,"Access denied")}))}user(e,t){return J(this,void 0,void 0,(function*(){const r=t.user;if(!r)return d.unauthorized(e,"Access denied");const n=yield ve.all(r);if(n){const t=n.map((e=>e.name));return d.data(e,Object.assign(Object.assign({},S(this.attributes,r.toJSON())),{permissions:t}))}return d.error(e,"Internal Server Error")}))}};X([a("/login"),c("validation",{username:E.string().min(4).required(),password:E.string().min(5).required()}),Y(0,r()),Y(1,n()),Y(2,i("user-agent")),Y(3,u()),W("design:type",Function),W("design:paramtypes",[Object,Object,String,ye]),W("design:returntype",Promise)],Pe.prototype,"login",null),X([l("/logout"),c("auth"),Y(0,r()),Y(1,n()),Y(2,Oe()),Y(3,Ie()),Y(4,u()),W("design:type",Function),W("design:paramtypes",[Object,Object,V,ie,ye]),W("design:returntype",Promise)],Pe.prototype,"logout",null),X([l(),c("auth"),Y(0,r()),Y(1,n()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",Promise)],Pe.prototype,"user",null),Pe=X([p("/auth"),m(fe)],Pe);let Ee=class extends fe{check(e,t){return J(this,void 0,void 0,(function*(){const{token:r}=t.body,n=yield this.findOne(r);return n&&n.user?(n.token=T(),yield n.save(),d.data(e,{token:n.token})):d.notfound(e,"User not found")}))}forgot(e,t){return J(this,void 0,void 0,(function*(){const{username:r}=t.body;yield I(Z.API_SLEEP_FORGOT);const n=yield ie.findOne({where:{username:r}}).catch(this.error);if(!n)return d.notfound(e,"User not found");const i=T(),s=Date.now()+6e4*Z.API_TOKEN_LIFETIME,o=yield ee.create({token:i,timestamp:s,state:!0,userId:n.id});return this.emit("forgot",{forgot:o,req:t,user:n}),d.success(e,"OK")}))}reset(e,t){return J(this,void 0,void 0,(function*(){const{token:r,password:n}=t.body,i=yield this.findOne(r);return i?(i.state=!1,yield i.save().catch(this.error),i.user.password=U(n).toString(),yield i.user.save().catch(this.error),this.emit("forgot.reset",{req:t,user:i.user}),d.success(e,"OK")):d.notfound(e,"User not found")}))}findOne(e){return J(this,void 0,void 0,(function*(){return yield ee.findOne({where:{token:e,state:!0},include:[{model:ie,required:!0}]}).catch(this.error)}))}};X([l("/check"),c("validation",{token:E.string().required()}),Y(0,r()),Y(1,n()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",Promise)],Ee.prototype,"check",null),X([l(),c("validation",{username:E.string().min(4).required()}),Y(0,r()),Y(1,n()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",Promise)],Ee.prototype,"forgot",null),X([l("/reset"),c("validation",{token:E.string().required(),password:E.string().min(5).required()}),Y(0,r()),Y(1,n()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",Promise)],Ee.prototype,"reset",null),Ee=X([p("/forgot"),m(fe)],Ee);let be=class extends fe{add(e,t,r,n){return J(this,void 0,void 0,(function*(){const i=yield this.model().create(Object.assign(Object.assign({},e.body),n||{}),r||{}).catch(this.error);if(i){const e=i.id;return d.data(t,{id:e}),i}d.error(t,"Internal Server Error")}))}all(e,t,r,n){var i,s,o,a,c;return J(this,void 0,void 0,(function*(){const u=this.model(),l=Object.assign({},r||{});l.where=Object.assign({},l.where||{});const p=null===(i=e.query.limit)||void 0===i?void 0:i.toString();p&&(l.limit=parseInt(p));const m=null===(s=e.query.offset)||void 0===s?void 0:s.toString();m&&(l.offset=parseInt(m));const g=Object.keys(u.getAttributes()),y=[],h=null===(o=e.query.asc)||void 0===o?void 0:o.toString();h&&h.length&&h.split(",").forEach((e=>{g.indexOf(e)>=0&&y.push([e,"ASC"])}));const v=null===(a=e.query.desc)||void 0===a?void 0:a.toString();v&&v.length&&v.split(",").forEach((e=>{g.indexOf(e)>=0&&y.push([e,"DESC"])})),y.length&&(l.order=y);const O=[],_=R(l.attributes)?l.attributes:g,I=null===(c=e.query.search)||void 0===c?void 0:c.toString();_.forEach((t=>{var r;if(w(t)&&(I&&I.length&&O.push({[t]:{[B.like]:`%${I}%`}}),"search_"+t in e.query)){const n=null===(r=e.query["search_"+t])||void 0===r?void 0:r.toString();n&&n.length&&O.push({[t]:{[B.like]:`%${n}%`}})}})),O.length&&(l.where=Object.assign(Object.assign({},l.where),{[B.or]:[...O]}));const A=yield u.count(Object.assign(Object.assign({},l),{col:g[0]})).catch(this.error),f=yield u.findAll(l).catch(this.error);if(f)return d.data(t,{count:A,records:n?n(f):f}),f;d.error(t,"Internal Server Error")}))}del(e,t,r){return J(this,void 0,void 0,(function*(){const{id:n}=e.params;if(!n)return d.error(t,"Internal Server Error"),0;const i=yield this.model().destroy(Object.assign(Object.assign({},r||{}),{where:{id:n}})).catch(this.error);return i?(d.success(t,"OK"),i):(d.notfound(t,"Record not found"),0)}))}error(e){e.sql?ue.error(e.message+"\n"+e.sql,"api.controller.sql",Z.API_CONSOLE_ERROR):super.error(e)}get(e,t,r,n){return J(this,void 0,void 0,(function*(){const i=Object.assign({},r||{});i.where=i.where?Object.assign({},i.where):{};const{id:s}=e.params,o=yield this.model().findByPk(s,i).catch(this.error);if(o)return d.data(t,n?n(o):o.toJSON()),o;null!==o?d.error(t,"Internal Server Error"):d.notfound(t,"Record not found")}))}name(){return this.model().tableName}set(e,t,r,n){return J(this,void 0,void 0,(function*(){const{id:i}=e.params,[s]=(yield this.model().update(Object.assign(Object.assign({},e.body),n||{}),Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{id:i})})).catch(this.error))||[];return s?(d.success(t,"OK"),!0):(d.success(t,"Record not changed"),!1)}))}};be=X([m(fe)],be);let Te=class extends be{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(t,e,r,this.create())}validationSet(e,t,r){this.validation(t,e,r,this.update())}};X([a(),c("auth"),c("write"),c("validationAdd"),Y(0,n()),Y(1,r()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Te.prototype,"recordAdd",null),X([l(),c("auth"),c("read"),Y(0,n()),Y(1,r()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Te.prototype,"recordAll",null),X([g("/:id"),c("auth"),c("write"),Y(0,n()),Y(1,r()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Te.prototype,"recordDel",null),X([l("/:id"),c("auth"),c("read"),Y(0,n()),Y(1,r()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Te.prototype,"recordGet",null),X([y("/:id"),c("auth"),c("write"),c("validationSet"),Y(0,n()),Y(1,r()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Te.prototype,"recordSet",null),X([Y(0,n()),Y(1,r()),Y(2,s()),W("design:type",Function),W("design:paramtypes",[Object,Object,Function]),W("design:returntype",void 0)],Te.prototype,"validationAdd",null),X([Y(0,n()),Y(1,r()),Y(2,s()),W("design:type",Function),W("design:paramtypes",[Object,Object,Function]),W("design:returntype",void 0)],Te.prototype,"validationSet",null),Te=X([m(be)],Te);let Se=class extends Te{model(){return te}create(){return{name:E.string().required(),description:E.string().empty(""),state:E.boolean().parse().required()}}update(){return{name:E.string().empty(),description:E.string().empty(),state:E.boolean().parse().empty()}}};Se=X([p("/groups"),m(Te)],Se);let Re=class extends be{model(){return re}recordAll(e,t,r){return J(this,void 0,void 0,(function*(){this.all(t,e,{where:{groupId:r},include:[{model:ne,required:!0}]},(e=>e.map((e=>e.route))))}))}recordSet(e,t,r){return J(this,void 0,void 0,(function*(){const n=yield te.findByPk(t,{attributes:["id"]}).catch(this.error);if(n){const t=n.id;if(yield re.destroy({where:{groupId:t}}),r){let e=0;for(let n=0;n<r.length;n++)e=yield ne.count({where:{id:r[n]}}),e&&(yield re.create({groupId:t,routeId:r[n]}))}return d.success(e,"OK")}return j(n)?d.notfound(e,"Record not found"):d.error(e,"Internal Server Error")}))}};X([l("/:id/routes"),c("auth"),c("read","groups"),Y(0,r()),Y(1,n()),Y(2,h("id")),W("design:type",Function),W("design:paramtypes",[Object,Object,String]),W("design:returntype",Promise)],Re.prototype,"recordAll",null),X([y("/:id/routes"),c("auth"),c("write","groups"),c("validation",{routes:E.array(E.number().parse())}),Y(0,r()),Y(1,h("id")),Y(2,v("routes")),W("design:type",Function),W("design:paramtypes",[Object,String,Array]),W("design:returntype",Promise)],Re.prototype,"recordSet",null),Re=X([p("/groups"),m(be)],Re);let we=class extends be{model(){return de}recordAll(e,t){const{source:r,type:n}=t.query,i=r&&n?{source:r,type:n}:r?{source:r}:n?{type:n}:{};this.all(t,e,{where:i,order:[["created","DESC"]]})}};X([l(),c("auth"),c("read"),Y(0,r()),Y(1,n()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],we.prototype,"recordAll",null),we=X([p("/logs"),m(be)],we);let je=class extends fe{confirm(e,t){return J(this,void 0,void 0,(function*(){const r=yield ae.findOne({where:{token:t,state:!0},include:[{model:ie,required:!0}]}).catch(this.error);return r?(r.user.state=!0,yield r.user.save().catch(this.error),this.emit("user.confirm",{user:r.user}),d.success(e,"OK")):d.notfound(e,"User not found")}))}register(e,t,r,n){return J(this,void 0,void 0,(function*(){yield I(Z.API_SLEEP_REGISTRY);const t=yield ie.findOne({where:{username:n}}).catch(this.error);if(t)return d.error(e,"Invalid Username");if(!j(t))return d.error(e,"Internal Server Error");const i=yield ie.create(Object.assign(Object.assign({},r),{state:!1}));return this.emit("user.register",{user:i}),d.success(e,"OK")}))}};X([l("/confirm"),c("validation",{token:E.string().required()}),Y(0,r()),Y(1,v("token")),W("design:type",Function),W("design:paramtypes",[Object,String]),W("design:returntype",Promise)],je.prototype,"confirm",null),X([l(),c("validation",{name:E.string().required(),email:E.string().email().required(),username:E.string().min(4).required(),password:E.string().min(5).required()}),Y(0,r()),Y(1,n()),Y(2,v()),Y(3,v("username")),W("design:type",Function),W("design:paramtypes",[Object,Object,Object,String]),W("design:returntype",Promise)],je.prototype,"register",null),je=X([p("/register"),m(fe)],je);let Ne=class extends Te{model(){return ne}create(){return{name:E.string().required(),description:E.string().empty(""),state:E.boolean().parse().required()}}update(){return{name:E.string().empty(),description:E.string().empty(),state:E.boolean().parse().empty()}}};Ne=X([p("/routes"),m(Te)],Ne);let qe=class extends fe{setup(e){return J(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 te.create(Object.assign({name:"admin"},e));yield se.create({userId:t.id,groupId:r.id});const n=["read","write"],i=["users","groups","routes"];yield N(i,(t=>J(this,void 0,void 0,(function*(){yield N(n,(n=>J(this,void 0,void 0,(function*(){const i=t+"."+n,s=yield ne.create(Object.assign({name:i},e));yield re.create({groupId:r.id,routeId:s.id})}))))}))));const s=yield ne.create(Object.assign({name:"logs.read"},e));yield re.create({groupId:r.id,routeId:s.id})}return d.success(e,"OK")}))}};X([l(),Y(0,r()),W("design:type",Function),W("design:paramtypes",[Object]),W("design:returntype",Promise)],qe.prototype,"setup",null),qe=X([p("/setup"),m(fe)],qe);let Fe=class extends be{constructor(){super(...arguments),this.attributes=["id","name","email","username","avatar","description","state","created","updated"]}model(){return ie}recordAdd(e,t,r){this.add(r,e,{},{password:U(t).toString()})}recordAll(e,t){this.all(t,e,{attributes:this.attributes})}recordDel(e,t,r,n){if(!r||r.id.toString()==n)return d.error(e,"Internal Server Error");this.del(t,e)}recordGet(e,t){this.get(t,e,{attributes:this.attributes})}recordSet(e,t,r){this.set(r,e,{where:{}},t?{password:U(t).toString()}:{})}};X([a(),c("auth"),c("write"),c("validation",{name:E.string().required(),email:E.string().email().required(),username:E.string().min(4).required(),password:E.string().min(5).required(),description:E.string().required(),state:E.boolean().parse().required()}),Y(0,r()),Y(1,v("password")),Y(2,n()),W("design:type",Function),W("design:paramtypes",[Object,String,Object]),W("design:returntype",void 0)],Fe.prototype,"recordAdd",null),X([l(),c("auth"),c("read"),Y(0,r()),Y(1,n()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Fe.prototype,"recordAll",null),X([g("/:id"),c("auth"),c("write"),Y(0,r()),Y(1,n()),Y(2,Ie()),Y(3,h("id")),W("design:type",Function),W("design:paramtypes",[Object,Object,ie,String]),W("design:returntype",Object)],Fe.prototype,"recordDel",null),X([l("/:id"),c("auth"),c("read"),Y(0,r()),Y(1,n()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Fe.prototype,"recordGet",null),X([y("/:id"),c("auth"),c("write"),c("validation",{name:E.string().empty(),email:E.string().email().empty(),username:E.string().min(4).empty(),password:E.string().min(5).empty().filter(""),description:E.string().empty(),state:E.boolean().parse().empty()}),Y(0,r()),Y(1,v("password")),Y(2,n()),W("design:type",Function),W("design:paramtypes",[Object,String,Object]),W("design:returntype",void 0)],Fe.prototype,"recordSet",null),Fe=X([p("/users"),m(be)],Fe);let De=class extends be{model(){return se}recordAll(e,t,r){this.all(t,e,{where:{userId:r},include:[{model:te,required:!0}]},(e=>e.map((e=>e.group))))}recordSet(e,t,r){return J(this,void 0,void 0,(function*(){const n=yield ie.findByPk(t,{attributes:["id"]}).catch(this.error);if(n){if(yield se.destroy({where:{userId:n.id}}),r){let e=0;for(let t=0;t<r.length;t++)e=yield te.count({where:{id:r[t]}}),e&&(yield se.create({userId:n.id,groupId:r[t]}))}return d.success(e,"OK")}return j(n)?d.notfound(e,"Record not found"):d.error(e,"Internal Server Error")}))}};X([l("/:id/groups"),c("auth"),c("read","users"),Y(0,r()),Y(1,n()),Y(2,h("id")),W("design:type",Function),W("design:paramtypes",[Object,Object,String]),W("design:returntype",void 0)],De.prototype,"recordAll",null),X([y("/:id/groups"),c("auth"),c("write","users"),c("validation",{groups:E.array(E.number().parse())}),Y(0,r()),Y(1,h("id")),Y(2,v("groups")),W("design:type",Function),W("design:paramtypes",[Object,String,Array]),W("design:returntype",Promise)],De.prototype,"recordSet",null),De=X([p("/users"),m(be)],De);export{ye as Application,V as Auth,Pe as AuthController,he as Config,oe as Configs,fe as ControllerBase,Te as CrudController,$ as Database,Z as Env,ee as Forgot,Ee as ForgotController,te as Group,re as GroupRoute,Se as GroupsController,Re as GroupsRoutesController,de as Log,ue as Logs,ce as LogsColor,we as LogsController,be as ModelController,ve as Permission,je as RegisterController,ae as Registry,Oe as ReqAuth,_e as ReqFiles,Ie as ReqUser,ne as Route,Ne as RoutesController,qe as SetupController,ge as Token,ie as User,se as UserGroup,Fe as UsersController,De as UsersGroupsController,pe as crt,me as key,Q as sequelize};
7
+ import{Application as e,parameterFactory as t,Res as r,Req as n,Headers as i,Next as s,Argument as o,Responses as d,Post as a,Middleware as c,App as u,Get as l,Body as p,Controller as g,Extends as m,Delete as y,Put as h,Params as v}from"@andrewcaires/express";import{toBool as O,parseMs as f,dateFormat as _,uuidv4 as A,sleep as I,toArray as P,EventEmitter as E,isNumber as b,Validation as T,uniqueID as S,isArray as w,isString as R,isNull as j,forEachSeries as N}from"@andrewcaires/utils.js";import q from"ws";import{Sequelize as F,DataTypes as D,Model as L,Op as k}from"sequelize";import{config as B}from"dotenv";import{existsSync as K,readFileSync as C}from"fs";import{verify as G,sign as x}from"jsonwebtoken";import{SHA256 as U}from"crypto-js";import H from"mime-types";import M from"multer";import{join as z}from"path";function X(e,t,r,n){var i,s=arguments.length,o=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,n);else for(var d=e.length-1;d>=0;d--)(i=e[d])&&(o=(s<3?i(o):s>3?i(t,r,o):i(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o}function Y(e,t){return function(r,n){t(r,n,e)}}function W(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function J(e,t,r,n){return new(r||(r=Promise))((function(i,s){function o(e){try{a(n.next(e))}catch(e){s(e)}}function d(e){try{a(n.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,d)}a((n=n.apply(e,t||[])).next())}))}B();class Z{}Z.API_CONSOLE_ERROR=O(process.env.API_CONSOLE_ERROR||"false"),Z.API_DB_DATABASE=process.env.API_DB_DATABASE||"",Z.API_DB_HOST=process.env.API_DB_HOST||"127.0.0.1",Z.API_DB_PASSWORD=process.env.API_DB_PASSWORD||"",Z.API_DB_PORT=parseInt(process.env.API_DB_PORT||"3306"),Z.API_DB_TYPE=process.env.API_DB_TYPE||"",Z.API_DB_USERNAME=process.env.API_DB_USERNAME||"root",Z.API_DB_LOG=O(process.env.API_DB_LOG||"false"),Z.API_TABLE_PREFIX=process.env.API_TABLE_PREFIX||"",Z.API_HTTP_CRT=process.env.API_HTTP_CRT||"",Z.API_HTTP_KEY=process.env.API_HTTP_KEY||"",Z.API_HTTP_PORT=parseInt(process.env.API_HTTP_PORT||"3000"),Z.API_HTTP_PUBLIC=process.env.API_HTTP_PUBLIC||"",Z.API_HTTP_CROSS=O(process.env.API_HTTP_CROSS||"false"),Z.API_HTTP_HYBRID=O(process.env.API_HTTP_HYBRID||"false"),Z.API_SLEEP_AUTH=f(process.env.API_SLEEP_AUTH||"2s"),Z.API_SLEEP_FORGOT=f(process.env.API_SLEEP_FORGOT||"5s"),Z.API_SLEEP_REGISTRY=f(process.env.API_SLEEP_REGISTRY||"5s"),Z.API_TOKEN_CRT=process.env.API_TOKEN_CRT||"",Z.API_TOKEN_KEY=process.env.API_TOKEN_KEY||"",Z.API_TOKEN_HEADER=process.env.API_TOKEN_HEADER||"authorization",Z.API_TOKEN_LIFETIME=f(process.env.API_TOKEN_LIFETIME||"1d"),Z.API_TOKEN_RENEW=f(process.env.API_TOKEN_RENEW||"1d"),Z.API_UPLOAD_COUNT=parseInt(process.env.API_UPLOAD_COUNT||"1"),Z.API_UPLOAD_FIELD=process.env.API_UPLOAD_FIELD||"upload",Z.API_UPLOAD_SIZE=parseInt(process.env.API_UPLOAD_SIZE||"2"),Z.API_UPLOAD_TEMP=process.env.API_UPLOAD_TEMP||"./temp",Z.API_WEBSOCKET_START=O(process.env.API_WEBSOCKET_START||"false");class ${static connect(e){const t="connect_"+Z.API_DB_TYPE.toLowerCase();if(t in $)return $[t](e);throw new Error("No database is connected to this API")}static connect_mariadb(e){return new F(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mariadb",logging:Z.API_DB_LOG,define:{timestamps:!1}})}static connect_memory(){return new F("sqlite::memory:",{logging:Z.API_DB_LOG,define:{timestamps:!1}})}static connect_mysql(e){return new F(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mysql",logging:Z.API_DB_LOG,define:{timestamps:!1}})}static connect_postgres(e){return new F(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"postgres",logging:Z.API_DB_LOG,define:{timestamps:!1}})}static connect_sqlite(e){return new F({dialect:"sqlite",storage:e.database,logging:Z.API_DB_LOG,define:{timestamps:!1}})}}const V=$.connect({database:Z.API_DB_DATABASE,username:Z.API_DB_USERNAME,password:Z.API_DB_PASSWORD,hostname:Z.API_DB_HOST,hostport:Z.API_DB_PORT});class Q extends L{}Q.init({secret:D.STRING,logout:D.DATE,useragent:D.STRING},{sequelize:V,modelName:Z.API_TABLE_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class ee extends L{}ee.init({token:D.STRING,timestamp:D.BIGINT,state:D.BOOLEAN},{sequelize:V,modelName:Z.API_TABLE_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class te extends L{}te.init({name:D.STRING,description:D.TEXT,state:D.BOOLEAN},{sequelize:V,modelName:Z.API_TABLE_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class re extends L{}re.init({},{sequelize:V,modelName:Z.API_TABLE_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),re.removeAttribute("id");class ne extends L{}ne.init({name:D.STRING,description:D.TEXT,state:D.BOOLEAN},{sequelize:V,modelName:Z.API_TABLE_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class ie extends L{}ie.init({name:D.STRING,email:D.STRING,username:D.STRING,password:D.STRING,avatar:D.STRING,description:D.TEXT,state:D.BOOLEAN},{sequelize:V,modelName:Z.API_TABLE_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated",defaultScope:{attributes:{exclude:["password"]}},scopes:{password:{attributes:{include:["password"]}}}});class se extends L{}se.init({},{sequelize:V,modelName:Z.API_TABLE_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),se.removeAttribute("id");class oe extends L{}oe.init({key:D.STRING,value:D.STRING},{sequelize:V,modelName:Z.API_TABLE_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),oe.removeAttribute("id");class de extends L{}de.init({type:D.STRING,source:D.STRING,message:D.TEXT},{sequelize:V,modelName:Z.API_TABLE_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class ae extends L{}var ce;ae.init({token:D.STRING,timestamp:D.BIGINT,state:D.BOOLEAN},{sequelize:V,modelName:Z.API_TABLE_PREFIX+"registry",timestamps:!0,createdAt:"created",updatedAt:"updated"}),ie.hasMany(Q),Q.belongsTo(ie),ie.hasMany(ee),ee.belongsTo(ie),te.hasMany(re),re.belongsTo(te),ne.hasMany(re),re.belongsTo(ne),ie.hasMany(se),se.belongsTo(ie),te.hasMany(se),se.belongsTo(te),function(e){e.ERROR="",e.INFO="",e.NONE="",e.SUCCESS="",e.WARNING=""}(ce||(ce={}));class ue{static write(e,t,r){return J(this,void 0,void 0,(function*(){yield ue.writeRaw(ce.NONE,"",e,t,r)}))}static error(e,t,r){return J(this,void 0,void 0,(function*(){yield ue.writeRaw(ce.ERROR,"error",e,t,r)}))}static info(e,t,r){return J(this,void 0,void 0,(function*(){yield ue.writeRaw(ce.INFO,"info",e,t,r)}))}static success(e,t,r){return J(this,void 0,void 0,(function*(){yield ue.writeRaw(ce.ERROR,"success",e,t,r)}))}static warning(e,t,r){return J(this,void 0,void 0,(function*(){yield ue.writeRaw(ce.WARNING,"warning",e,t,r)}))}static writeConsole(e,t,r){const n=_(new Date,"%H:%M:%S");console.log(">",e,t+" ".repeat(10-t.length),"","|",n,"|",r)}static writeRaw(e,t,r,n,i){return J(this,void 0,void 0,(function*(){i&&ue.writeConsole(e,t,r),V&&(yield de.create({type:t,source:n,message:r}).catch((()=>null)))}))}}const le=e=>K(e)?C(e):void 0,pe={http:le(Z.API_HTTP_CRT),token:le(Z.API_TOKEN_CRT)},ge={http:le(Z.API_HTTP_KEY),token:le(Z.API_TOKEN_KEY)};class me{static create(e){return J(this,void 0,void 0,(function*(){if(!ge.token)return{error:"Key not found"};const{id:t}=e,r=A(),n=yield Q.create({secret:r,userId:t}).catch(me.error);return n?{auth:n,token:x({id:t,secret:r},ge.token,{algorithm:"RS256",expiresIn:Z.API_TOKEN_LIFETIME+"ms"})}:{error:"Internal Server Error"}}))}static destroy(e){return J(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){ue.error(e.message,"api.token",Z.API_CONSOLE_ERROR)}static renew(e){return J(this,void 0,void 0,(function*(){if(!ge.token)return{error:"Key not found"};const{error:t,decode:r}=me.verify(e,Z.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(me.error);if(r){const n=yield Q.findOne({where:{secret:t,userId:r.id}}).catch(me.error);if(n&&!n.logout)return n.secret=A(),yield n.save().catch(me.error),{auth:n,token:x({id:e,secret:n.secret},ge.token,{algorithm:"RS256",expiresIn:Z.API_TOKEN_LIFETIME+"ms"})}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e){return J(this,void 0,void 0,(function*(){const{error:t,decode:r}=me.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(me.error);if(r){const e=yield Q.findOne({where:{secret:t,userId:r.id}}).catch(me.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!pe.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:G(e,pe.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class ye extends e{constructor(e){super(e,{cert:pe.http,cross:Z.API_HTTP_CROSS,hybrid:Z.API_HTTP_HYBRID,key:ge.http,path:"/api",port:Z.API_HTTP_PORT,public:Z.API_HTTP_PUBLIC})}error(e,t){ue.info(e.message,t,Z.API_CONSOLE_ERROR)}log(e,t){ue.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return J(this,void 0,void 0,(function*(){yield V.sync(),yield e.listen.call(this),Z.API_WEBSOCKET_START&&this.server&&(this._webSocket=new q.Server({server:this.server,verifyClient:(e,t)=>t(Z.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>J(this,void 0,void 0,(function*(){t.url||(t.url="");const r=t.url.length<=1?"":t.url.replace(/\//g,".");let n;e.on("message",(i=>J(this,void 0,void 0,(function*(){if(n)try{const s=JSON.parse(i);this.emit("ws.message"+r,{data:s,message:i,req:t,user:n,ws:e})}catch(s){this.emit("ws.message"+r,{message:i,req:t,user:n,ws:e})}else{const{user:s}=yield me.user(i.toString());s&&(n=s,this.emit("ws.connection"+r,{req:t,user:n,ws:e}))}n||e.close()})))),e.on("close",(()=>{n&&this.emit("ws.close"+r,{user:n,ws:e})})),yield I(2e3),n||e.close()})))))}))}websocket(){return this._webSocket}}class he{static all(){return J(this,void 0,void 0,(function*(){const e=yield oe.findAll().catch(he.error),t={};return e&&e.forEach((e=>{t[e.key]=e.value})),t}))}static del(e){return J(this,void 0,void 0,(function*(){return((yield oe.destroy({where:{key:e}}).catch(he.error))||0)>0}))}static error(e){ue.error(e.message,"api.config",Z.API_CONSOLE_ERROR)}static get(e){return J(this,void 0,void 0,(function*(){const t=yield oe.findOne({where:{key:e}}).catch(he.error);return t&&t.value||""}))}static set(e,t){return J(this,void 0,void 0,(function*(){const[r]=(yield oe.findOrCreate({where:{key:e}}).catch(he.error))||[];r&&(r.value=t,yield r.save().catch(he.error))}))}}class ve{static all(e,t){return J(this,void 0,void 0,(function*(){return yield ne.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:re,required:!0,include:[{model:te,required:!0,where:{state:!0},include:[{model:se,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{ue.error(e.message,"api.permission",Z.API_CONSOLE_ERROR)}))}))}static get(e){return J(this,void 0,void 0,(function*(){const t=yield ve.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return J(this,void 0,void 0,(function*(){const r=yield ve.all(e,{name:t});return!!r&&r.length>0}))}}const Oe=t((({req:e})=>e.auth)),fe=t((({req:e})=>P(e.files))),_e=t((({req:e})=>e.user)),Ae=(e,t)=>{const r=A()+"."+t;return K(z(e,r))?Ae(e,t):r};class Ie extends E{auth(e,t,r,n,i){return J(this,void 0,void 0,(function*(){const{auth:s,error:o,user:a}=yield me.user(r);o?d.error(e,o):s&&a?(n&&(s.useragent=n),t.auth=s,t.user=a,yield s.save(),i()):d.error(e,"Internal Server Error")}))}error(e){ue.error(e.message,"api.controller",Z.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r,n){return J(this,void 0,void 0,(function*(){t?(yield ve.is(t,n))?r():d.error(e,"Unauthorized access"):d.unauthorized(e,"Access denied")}))}read(e,t,r,n){return this.permission(e,t,r,(n||this.name())+".read")}upload(e,t,r,n){const i=(null==n?void 0:n.path)||Z.API_UPLOAD_TEMP,s=M.diskStorage({destination:(e,t,r)=>r(null,i),filename:(e,t,r)=>J(this,void 0,void 0,(function*(){return r(null,Ae(i,H.extension(t.mimetype)||"bin"))}))}),o=1e6*((null==n?void 0:n.size)||Z.API_UPLOAD_SIZE),a=M({storage:s,fileFilter(e,t,r){var i;return J(this,void 0,void 0,(function*(){const e=null===(i=null==n?void 0:n.types)||void 0===i?void 0:i.indexOf(t.mimetype);return b(e)&&e<0?r(new Error("File type not allowed")):r(null,!0)}))},limits:{fileSize:o}}),c=(null==n?void 0:n.count)||Z.API_UPLOAD_COUNT,u=(null==n?void 0:n.field)||Z.API_UPLOAD_FIELD;a.array(u,c)(t,e,(t=>t?d.error(e,t.message):r()))}validation(e,t,r,n){return J(this,void 0,void 0,(function*(){const{error:i,value:s}=yield T.object(n).parse().validateAsync(t.body);i?d.validation(e,i):(t.body=s,r())}))}write(e,t,r,n){return this.permission(e,t,r,(n||this.name())+".write")}}X([Y(0,r()),Y(1,n()),Y(2,i(Z.API_TOKEN_HEADER)),Y(3,i("user-agent")),Y(4,s()),W("design:type",Function),W("design:paramtypes",[Object,Object,String,String,Function]),W("design:returntype",Promise)],Ie.prototype,"auth",null),X([Y(0,r()),Y(1,_e()),Y(2,s()),Y(3,o()),W("design:type",Function),W("design:paramtypes",[Object,ie,Function,String]),W("design:returntype",Promise)],Ie.prototype,"permission",null),X([Y(0,r()),Y(1,_e()),Y(2,s()),Y(3,o()),W("design:type",Function),W("design:paramtypes",[Object,ie,Function,String]),W("design:returntype",Promise)],Ie.prototype,"read",null),X([Y(0,r()),Y(1,n()),Y(2,s()),Y(3,o()),W("design:type",Function),W("design:paramtypes",[Object,Object,Function,Object]),W("design:returntype",void 0)],Ie.prototype,"upload",null),X([Y(0,r()),Y(1,n()),Y(2,s()),Y(3,o()),W("design:type",Function),W("design:paramtypes",[Object,Object,Function,Object]),W("design:returntype",Promise)],Ie.prototype,"validation",null),X([Y(0,r()),Y(1,_e()),Y(2,s()),Y(3,o()),W("design:type",Function),W("design:paramtypes",[Object,ie,Function,String]),W("design:returntype",Promise)],Ie.prototype,"write",null);let Pe=class extends Ie{login(e,t,r,n){return J(this,void 0,void 0,(function*(){yield I(Z.API_SLEEP_AUTH);const{username:i,password:s}=t.body,o=yield ie.findOne({where:{username:i,password:U(s).toString(),state:!0}}).catch(this.error);if(!o)return n.emit("auth.failure",{req:t}),void d.notfound(e,"Username not found");const{auth:a,error:c,token:u}=yield me.create(o);return c?(n.emit("auth.failure",{req:t}),void d.error(e,c)):a&&u?(a.useragent=r,yield a.save().catch(this.error),this.emit("auth.login",{auth:a,req:t,user:o}),void d.data(e,{token:u})):(n.emit("auth.failure",{req:t}),void d.error(e,"Internal Server Error"))}))}logout(e,t,r,n,i){return J(this,void 0,void 0,(function*(){if(yield me.destroy(r))return i.emit("auth.logout",{auth:r,req:t,user:n}),void d.success(e,"Disconcerted");d.unauthorized(e,"Access denied")}))}renew(e,t,r,n,i){return J(this,void 0,void 0,(function*(){const{auth:s,error:o,token:a}=yield me.renew(r);if(!o)return s?(s.useragent=n,yield s.save().catch(this.error),i.emit("auth.renew",{auth:s,req:t}),void d.data(e,{token:a})):void d.error(e,"Internal Server Error");d.error(e,o)}))}update(e,t,r,n){return J(this,void 0,void 0,(function*(){if(n){if(yield ie.scope("password").findOne({where:{id:n.id,password:r,state:!0}}).catch(this.error)){t.newPassword&&(t.password=U(t.newPassword).toString()),delete t.newPassword,delete t.oldPassword;const[r]=(yield ie.update(t,{where:{id:n.id}}).catch(this.error))||[];return r?void d.success(e,"OK"):void d.success(e,"Record not changed")}d.error(e,"Record not changed")}else d.error(e,"Internal Server Error")}))}user(e,t,r,n){return J(this,void 0,void 0,(function*(){t.useragent=n,yield t.save().catch(this.error);const i=yield ve.all(r);i?d.data(e,Object.assign(Object.assign({},r.toJSON()),{permissions:i.map((e=>e.name))})):d.error(e,"Internal Server Error")}))}};X([a("/login"),c("validation",{username:T.string().min(4).required(),password:T.string().min(5).required()}),Y(0,r()),Y(1,n()),Y(2,i("user-agent")),Y(3,u()),W("design:type",Function),W("design:paramtypes",[Object,Object,String,ye]),W("design:returntype",Promise)],Pe.prototype,"login",null),X([l("/logout"),c("auth"),Y(0,r()),Y(1,n()),Y(2,Oe()),Y(3,_e()),Y(4,u()),W("design:type",Function),W("design:paramtypes",[Object,Object,Q,ie,ye]),W("design:returntype",Promise)],Pe.prototype,"logout",null),X([a("/renew"),c("validation",{token:T.string().required()}),Y(0,r()),Y(1,n()),Y(2,p("token")),Y(3,i("user-agent")),Y(4,u()),W("design:type",Function),W("design:paramtypes",[Object,Object,String,String,ye]),W("design:returntype",Promise)],Pe.prototype,"renew",null),X([a("/update"),c("auth"),c("validation",{name:T.string().empty(),newPassword:T.string().min(5).empty().filter(""),oldPassword:T.string().min(5).empty().filter(""),avatar:T.string().empty()}),Y(0,r()),Y(1,p()),Y(2,p("oldPassword")),Y(3,_e()),W("design:type",Function),W("design:paramtypes",[Object,Object,String,ie]),W("design:returntype",Promise)],Pe.prototype,"update",null),X([l(),c("auth"),Y(0,r()),Y(1,Oe()),Y(2,_e()),Y(3,i("user-agent")),W("design:type",Function),W("design:paramtypes",[Object,Q,ie,String]),W("design:returntype",Promise)],Pe.prototype,"user",null),Pe=X([g("/auth"),m(Ie)],Pe);let Ee=class extends Ie{check(e,t){return J(this,void 0,void 0,(function*(){const{token:r}=t.body,n=yield this.findOne(r);n&&n.user?(n.token=S(),yield n.save(),d.data(e,{token:n.token})):d.notfound(e,"User not found")}))}forgot(e,t){return J(this,void 0,void 0,(function*(){const{username:r}=t.body;yield I(Z.API_SLEEP_FORGOT);const n=yield ie.findOne({where:{username:r}}).catch(this.error);if(!n)return void d.notfound(e,"User not found");const i=S(),s=Date.now()+6e4*Z.API_TOKEN_LIFETIME,o=yield ee.create({token:i,timestamp:s,state:!0,userId:n.id});this.emit("forgot",{forgot:o,req:t,user:n}),d.success(e,"OK")}))}reset(e,t){return J(this,void 0,void 0,(function*(){const{token:r,password:n}=t.body,i=yield this.findOne(r);i?(i.state=!1,yield i.save().catch(this.error),i.user.password=U(n).toString(),yield i.user.save().catch(this.error),this.emit("forgot.reset",{req:t,user:i.user}),d.success(e,"OK")):d.notfound(e,"User not found")}))}findOne(e){return J(this,void 0,void 0,(function*(){return yield ee.findOne({where:{token:e,state:!0},include:[{model:ie,required:!0}]}).catch(this.error)}))}};X([l("/check"),c("validation",{token:T.string().required()}),Y(0,r()),Y(1,n()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",Promise)],Ee.prototype,"check",null),X([l(),c("validation",{username:T.string().min(4).required()}),Y(0,r()),Y(1,n()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",Promise)],Ee.prototype,"forgot",null),X([l("/reset"),c("validation",{token:T.string().required(),password:T.string().min(5).required()}),Y(0,r()),Y(1,n()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",Promise)],Ee.prototype,"reset",null),Ee=X([g("/forgot"),m(Ie)],Ee);let be=class extends Ie{add(e,t,r,n){return J(this,void 0,void 0,(function*(){const i=yield this.model().create(Object.assign(Object.assign({},e.body),n||{}),r||{}).catch(this.error);if(i){const e=this.key();return d.data(t,{[e]:i.getDataValue(e)}),i}d.error(t,"Internal Server Error")}))}all(e,t,r,n){var i,s,o,a,c;return J(this,void 0,void 0,(function*(){const u=this.model(),l=Object.assign({},r||{});l.where=Object.assign({},l.where||{});const p=null===(i=e.query.limit)||void 0===i?void 0:i.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()),y=[],h=null===(o=e.query.asc)||void 0===o?void 0:o.toString();h&&h.length&&h.split(",").forEach((e=>{m.indexOf(e)>=0&&y.push([e,"ASC"])}));const v=null===(a=e.query.desc)||void 0===a?void 0:a.toString();v&&v.length&&v.split(",").forEach((e=>{m.indexOf(e)>=0&&y.push([e,"DESC"])})),y.length&&(l.order=y);const O=[],f=w(l.attributes)?l.attributes:m,_=null===(c=e.query.search)||void 0===c?void 0:c.toString();f.forEach((t=>{var r;if(R(t)&&(_&&_.length&&O.push({[t]:{[k.like]:`%${_}%`}}),"search_"+t in e.query)){const n=null===(r=e.query["search_"+t])||void 0===r?void 0:r.toString();n&&n.length&&O.push({[t]:{[k.like]:`%${n}%`}})}})),O.length&&(l.where=Object.assign(Object.assign({},l.where),{[k.or]:[...O]}));const A=(yield u.count(Object.assign(Object.assign({},l),{col:m[0]})).catch(this.error))||0,I=yield u.findAll(l).catch(this.error);if(I)return d.data(t,{count:A,records:n?yield n(I):I}),I;d.error(t,"Internal Server Error")}))}del(e,t,r){return J(this,void 0,void 0,(function*(){const n=this.key(),{[n]:i}=e.params;if(!i)return d.error(t,"Internal Server Error"),0;const s=yield this.model().destroy(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[n]:i})})).catch(this.error);return s?(d.success(t,"OK"),s):(d.notfound(t,"Record not found"),0)}))}error(e){e.sql?ue.error(e.message+"\n"+e.sql,"api.controller.sql",Z.API_CONSOLE_ERROR):super.error(e)}get(e,t,r,n){return J(this,void 0,void 0,(function*(){const i=this.key(),{[i]:s}=e.params,o=yield this.model().findOne(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[i]:s})})).catch(this.error);if(o)return d.data(t,n?yield n(o):o.toJSON()),o;null!==o?d.error(t,"Internal Server Error"):d.notfound(t,"Record not found")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}set(e,t,r,n){return J(this,void 0,void 0,(function*(){const i=this.key(),{[i]:s}=e.params,[o]=(yield this.model().update(Object.assign(Object.assign({},e.body),n||{}),Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[i]:s})})).catch(this.error))||[];return o?(d.success(t,"OK"),!0):(d.success(t,"Record not changed"),!1)}))}};be=X([m(Ie)],be);let Te=class extends be{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(t,e,r,this.create())}validationSet(e,t,r){this.validation(t,e,r,this.update())}};X([a(),c("auth"),c("write"),c("validationAdd"),Y(0,n()),Y(1,r()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Te.prototype,"recordAdd",null),X([l(),c("auth"),c("read"),Y(0,n()),Y(1,r()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Te.prototype,"recordAll",null),X([y("/:id"),c("auth"),c("write"),Y(0,n()),Y(1,r()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Te.prototype,"recordDel",null),X([l("/:id"),c("auth"),c("read"),Y(0,n()),Y(1,r()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Te.prototype,"recordGet",null),X([h("/:id"),c("auth"),c("write"),c("validationSet"),Y(0,n()),Y(1,r()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Te.prototype,"recordSet",null),X([Y(0,n()),Y(1,r()),Y(2,s()),W("design:type",Function),W("design:paramtypes",[Object,Object,Function]),W("design:returntype",void 0)],Te.prototype,"validationAdd",null),X([Y(0,n()),Y(1,r()),Y(2,s()),W("design:type",Function),W("design:paramtypes",[Object,Object,Function]),W("design:returntype",void 0)],Te.prototype,"validationSet",null),Te=X([m(be)],Te);let Se=class extends Te{model(){return te}create(){return{name:T.string().required(),description:T.string().empty(""),state:T.boolean().parse().required()}}update(){return{name:T.string().empty(),description:T.string().empty(),state:T.boolean().parse().empty()}}};Se=X([g("/groups"),m(Te)],Se);let we=class extends be{model(){return re}recordAll(e,t,r){return J(this,void 0,void 0,(function*(){this.all(t,e,{where:{groupId:r},include:[{model:ne,required:!0}]},(e=>e.map((e=>e.route))))}))}recordSet(e,t,r){return J(this,void 0,void 0,(function*(){const n=yield te.findByPk(t,{attributes:["id"]}).catch(this.error);if(n){const t=n.id;if(yield re.destroy({where:{groupId:t}}),r){let e=0;for(let n=0;n<r.length;n++)e=yield ne.count({where:{id:r[n]}}),e&&(yield re.create({groupId:t,routeId:r[n]}))}d.success(e,"OK")}else j(n)?d.notfound(e,"Record not found"):d.error(e,"Internal Server Error")}))}};X([l("/:id/routes"),c("auth"),c("read","groups"),Y(0,r()),Y(1,n()),Y(2,v("id")),W("design:type",Function),W("design:paramtypes",[Object,Object,String]),W("design:returntype",Promise)],we.prototype,"recordAll",null),X([h("/:id/routes"),c("auth"),c("write","groups"),c("validation",{routes:T.array(T.number().parse())}),Y(0,r()),Y(1,v("id")),Y(2,p("routes")),W("design:type",Function),W("design:paramtypes",[Object,String,Array]),W("design:returntype",Promise)],we.prototype,"recordSet",null),we=X([g("/groups"),m(be)],we);let Re=class extends be{model(){return de}recordAll(e,t){const{source:r,type:n}=t.query,i=r&&n?{source:r,type:n}:r?{source:r}:n?{type:n}:{};this.all(t,e,{where:i,order:[["created","DESC"]]})}};X([l(),c("auth"),c("read"),Y(0,r()),Y(1,n()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Re.prototype,"recordAll",null),Re=X([g("/logs"),m(be)],Re);let je=class extends Ie{confirm(e,t){return J(this,void 0,void 0,(function*(){const r=yield ae.findOne({where:{token:t,state:!0},include:[{model:ie,required:!0}]}).catch(this.error);r?(r.user.state=!0,yield r.user.save().catch(this.error),this.emit("user.confirm",{user:r.user}),d.success(e,"OK")):d.notfound(e,"User not found")}))}register(e,t,r,n){return J(this,void 0,void 0,(function*(){yield I(Z.API_SLEEP_REGISTRY);const t=yield ie.findOne({where:{username:n}}).catch(this.error);if(t)return void d.error(e,"Invalid Username");if(!j(t))return void d.error(e,"Internal Server Error");const i=yield ie.create(Object.assign(Object.assign({},r),{state:!1}));this.emit("user.register",{user:i}),d.success(e,"OK")}))}};X([l("/confirm"),c("validation",{token:T.string().required()}),Y(0,r()),Y(1,p("token")),W("design:type",Function),W("design:paramtypes",[Object,String]),W("design:returntype",Promise)],je.prototype,"confirm",null),X([l(),c("validation",{name:T.string().required(),email:T.string().email().required(),username:T.string().min(4).required(),password:T.string().min(5).required()}),Y(0,r()),Y(1,n()),Y(2,p()),Y(3,p("username")),W("design:type",Function),W("design:paramtypes",[Object,Object,Object,String]),W("design:returntype",Promise)],je.prototype,"register",null),je=X([g("/register"),m(Ie)],je);let Ne=class extends Te{model(){return ne}create(){return{name:T.string().required(),description:T.string().empty(""),state:T.boolean().parse().required()}}update(){return{name:T.string().empty(),description:T.string().empty(),state:T.boolean().parse().empty()}}};Ne=X([g("/routes"),m(Te)],Ne);let qe=class extends Ie{setup(e){return J(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 te.create(Object.assign({name:"admin"},e));yield se.create({userId:t.id,groupId:r.id});const n=["read","write"],i=["users","groups","routes"];yield N(i,(t=>J(this,void 0,void 0,(function*(){yield N(n,(n=>J(this,void 0,void 0,(function*(){const i=t+"."+n,s=yield ne.create(Object.assign({name:i},e));yield re.create({groupId:r.id,routeId:s.id})}))))}))));const s=yield ne.create(Object.assign({name:"logs.read"},e));yield re.create({groupId:r.id,routeId:s.id})}d.success(e,"OK")}))}};X([l(),Y(0,r()),W("design:type",Function),W("design:paramtypes",[Object]),W("design:returntype",Promise)],qe.prototype,"setup",null),qe=X([g("/setup"),m(Ie)],qe);let Fe=class extends be{model(){return ie}recordAdd(e,t,r){this.add(r,e,{},{password:U(t).toString()})}recordAll(e,t){this.all(t,e)}recordDel(e,t,r,n){r&&r.id.toString()!=n?this.del(t,e):d.error(e,"Internal Server Error")}recordGet(e,t){this.get(t,e)}recordSet(e,t,r){this.set(r,e,{where:{}},t?{password:U(t).toString()}:{})}};X([a(),c("auth"),c("write"),c("validation",{name:T.string().required(),email:T.string().email().required(),username:T.string().min(4).required(),password:T.string().min(5).required(),description:T.string().empty(""),state:T.boolean().parse().required()}),Y(0,r()),Y(1,p("password")),Y(2,n()),W("design:type",Function),W("design:paramtypes",[Object,String,Object]),W("design:returntype",void 0)],Fe.prototype,"recordAdd",null),X([l(),c("auth"),c("read"),Y(0,r()),Y(1,n()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Fe.prototype,"recordAll",null),X([y("/:id"),c("auth"),c("write"),Y(0,r()),Y(1,n()),Y(2,_e()),Y(3,v("id")),W("design:type",Function),W("design:paramtypes",[Object,Object,ie,String]),W("design:returntype",void 0)],Fe.prototype,"recordDel",null),X([l("/:id"),c("auth"),c("read"),Y(0,r()),Y(1,n()),W("design:type",Function),W("design:paramtypes",[Object,Object]),W("design:returntype",void 0)],Fe.prototype,"recordGet",null),X([h("/:id"),c("auth"),c("write"),c("validation",{name:T.string().empty(),email:T.string().email().empty(),username:T.string().min(4).empty(),password:T.string().min(5).empty().filter(""),description:T.string().empty(),state:T.boolean().parse().empty()}),Y(0,r()),Y(1,p("password")),Y(2,n()),W("design:type",Function),W("design:paramtypes",[Object,String,Object]),W("design:returntype",void 0)],Fe.prototype,"recordSet",null),Fe=X([g("/users"),m(be)],Fe);let De=class extends be{model(){return se}recordAll(e,t,r){this.all(t,e,{where:{userId:r},include:[{model:te,required:!0}]},(e=>e.map((e=>e.group))))}recordSet(e,t,r){return J(this,void 0,void 0,(function*(){const n=yield ie.findByPk(t,{attributes:["id"]}).catch(this.error);if(n){if(yield se.destroy({where:{userId:n.id}}),r){let e=0;for(let t=0;t<r.length;t++)e=yield te.count({where:{id:r[t]}}),e&&(yield se.create({userId:n.id,groupId:r[t]}))}d.success(e,"OK")}else j(n)?d.notfound(e,"Record not found"):d.error(e,"Internal Server Error")}))}};X([l("/:id/groups"),c("auth"),c("read","users"),Y(0,r()),Y(1,n()),Y(2,v("id")),W("design:type",Function),W("design:paramtypes",[Object,Object,String]),W("design:returntype",void 0)],De.prototype,"recordAll",null),X([h("/:id/groups"),c("auth"),c("write","users"),c("validation",{groups:T.array(T.number().parse())}),Y(0,r()),Y(1,v("id")),Y(2,p("groups")),W("design:type",Function),W("design:paramtypes",[Object,String,Array]),W("design:returntype",Promise)],De.prototype,"recordSet",null),De=X([g("/users"),m(be)],De);export{ye as Application,Q as Auth,Pe as AuthController,he as Config,oe as Configs,Ie as ControllerBase,Te as CrudController,$ as Database,Z as Env,ee as Forgot,Ee as ForgotController,te as Group,re as GroupRoute,Se as GroupsController,we as GroupsRoutesController,de as Log,ue as Logs,ce as LogsColor,Re as LogsController,be as ModelController,ve as Permission,je as RegisterController,ae as Registry,Oe as ReqAuth,fe as ReqFiles,_e as ReqUser,ne as Route,Ne as RoutesController,qe as SetupController,me as Token,ie as User,se as UserGroup,Fe as UsersController,De as UsersGroupsController,pe as crt,ge as key,V as sequelize};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrewcaires/api",
3
- "version": "3.0.9",
3
+ "version": "3.0.10",
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",
@@ -46,35 +46,35 @@
46
46
  "homepage": "https://github.com/andrewcaires/npm/tree/main/api#readme",
47
47
  "dependencies": {
48
48
  "@andrewcaires/express": "^1.0.5",
49
- "@andrewcaires/utils.js": "^0.2.15",
49
+ "@andrewcaires/utils.js": "^0.2.17",
50
50
  "cors": "^2.8.5",
51
51
  "crypto-js": "^4.1.1",
52
52
  "dotenv": "^16.0.3",
53
53
  "express": "^4.18.2",
54
54
  "jsonwebtoken": "^9.0.0",
55
- "mariadb": "^3.1.1",
55
+ "mariadb": "^3.1.2",
56
56
  "mime-types": "^2.1.35",
57
57
  "multer": "^1.4.5-lts.1",
58
- "mysql2": "^3.2.0",
59
- "sequelize": "^6.31.0",
58
+ "mysql2": "^3.3.0",
59
+ "sequelize": "^6.31.1",
60
60
  "ws": "^8.13.0"
61
61
  },
62
62
  "devDependencies": {
63
- "@rollup/plugin-commonjs": "^24.0.1",
63
+ "@rollup/plugin-commonjs": "^24.1.0",
64
64
  "@rollup/plugin-terser": "^0.4.1",
65
65
  "@rollup/plugin-typescript": "^11.1.0",
66
66
  "@types/cors": "^2.8.13",
67
67
  "@types/crypto-js": "^4.1.1",
68
68
  "@types/express": "^4.17.17",
69
- "@types/jsonwebtoken": "^9.0.1",
69
+ "@types/jsonwebtoken": "^9.0.2",
70
70
  "@types/mime-types": "^2.1.1",
71
71
  "@types/multer": "^1.4.7",
72
- "@types/node": "^18.15.11",
72
+ "@types/node": "^20.1.2",
73
73
  "@types/ws": "^8.5.4",
74
- "@typescript-eslint/eslint-plugin": "^5.57.1",
75
- "@typescript-eslint/parser": "^5.57.1",
76
- "eslint": "^8.38.0",
77
- "rollup": "^3.20.2",
74
+ "@typescript-eslint/eslint-plugin": "^5.59.5",
75
+ "@typescript-eslint/parser": "^5.59.5",
76
+ "eslint": "^8.40.0",
77
+ "rollup": "^3.21.6",
78
78
  "rollup-plugin-dts": "^5.3.0",
79
79
  "ts-node": "^10.9.1",
80
80
  "ts-node-dev": "^2.0.0",