@andrewcaires/api 3.0.12 → 3.0.14
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/README.md +15 -15
- package/dist/index.cjs.js +3 -3
- package/dist/index.d.ts +22 -19
- package/dist/index.esm.js +3 -3
- package/package.json +20 -20
package/README.md
CHANGED
|
@@ -22,7 +22,7 @@ API_DB_TYPE=mariadb
|
|
|
22
22
|
API_DB_DATABASE=database
|
|
23
23
|
API_DB_HOST=localhost
|
|
24
24
|
API_DB_USERNAME=root
|
|
25
|
-
API_DB_PASSWORD=
|
|
25
|
+
API_DB_PASSWORD=root
|
|
26
26
|
API_DB_LOG=false
|
|
27
27
|
API_DB_PORT=3306
|
|
28
28
|
|
|
@@ -30,12 +30,12 @@ API_HTTP_PORT=3000
|
|
|
30
30
|
API_HTTP_PUBLIC=/public
|
|
31
31
|
API_HTTP_CROSS=true
|
|
32
32
|
|
|
33
|
-
API_HTTP_CRT
|
|
34
|
-
API_HTTP_KEY
|
|
33
|
+
// API_HTTP_CRT=./ssl/http.crt
|
|
34
|
+
// API_HTTP_KEY=./ssl/http.key
|
|
35
35
|
|
|
36
|
-
API_TOKEN_CRT
|
|
37
|
-
API_TOKEN_KEY
|
|
38
|
-
API_TOKEN_LIFETIME=
|
|
36
|
+
// API_TOKEN_CRT=./ssl/token.crt
|
|
37
|
+
// API_TOKEN_KEY=./ssl/token.key
|
|
38
|
+
API_TOKEN_LIFETIME=1d
|
|
39
39
|
|
|
40
40
|
API_WEBSOCKET_START=false
|
|
41
41
|
```
|
|
@@ -45,7 +45,7 @@ API_WEBSOCKET_START=false
|
|
|
45
45
|
|
|
46
46
|
import {
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
Application,
|
|
49
49
|
|
|
50
50
|
AuthController,
|
|
51
51
|
GroupController,
|
|
@@ -59,16 +59,16 @@ import {
|
|
|
59
59
|
|
|
60
60
|
const main = async () => {
|
|
61
61
|
|
|
62
|
-
const app = new
|
|
62
|
+
const app = new Application(
|
|
63
63
|
[
|
|
64
64
|
|
|
65
|
-
new AuthController
|
|
66
|
-
new GroupController
|
|
67
|
-
new GroupRouteController
|
|
68
|
-
new LogsController
|
|
69
|
-
new RouteController
|
|
70
|
-
new UserController
|
|
71
|
-
new UserGroupController
|
|
65
|
+
new AuthController,
|
|
66
|
+
new GroupController,
|
|
67
|
+
new GroupRouteController,
|
|
68
|
+
new LogsController,
|
|
69
|
+
new RouteController,
|
|
70
|
+
new UserController,
|
|
71
|
+
new UserGroupController,
|
|
72
72
|
|
|
73
73
|
]
|
|
74
74
|
);
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/api v3.0.
|
|
2
|
+
* @andrewcaires/api v3.0.14
|
|
3
3
|
* Simple api for small applications using express, jsonwebtoken, sequelize and websocket
|
|
4
|
-
* (c)
|
|
4
|
+
* (c) 2024 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
6
6
|
*/
|
|
7
|
-
"use strict";var e=require("@andrewcaires/express"),t=require("@andrewcaires/utils.js"),r=require("ws"),s=require("sequelize"),o=require("dotenv"),n=require("fs"),i=require("express-session"),d=require("jsonwebtoken"),a=require("mime-types"),l=require("multer"),u=require("path"),c=require("crypto-js");function p(e,t,r,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 g(e,t){return function(r,s){t(r,s,e)}}function y(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function h(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())}))}"function"==typeof SuppressedError&&SuppressedError,o.config();class m{static getBool(e,r){return t.toBool(m.getString(e,r.toString()))}static getInt(e,t){return parseInt(m.getString(e,t.toString()))}static getMs(e,r){return t.parseMs(m.getString(e,r))}static getString(e,t){return e in process.env?process.env[e]||"":t}}m.API_CONSOLE_ERROR=m.getBool("API_CONSOLE_ERROR",!1),m.API_DEFAULT_PATH=m.getString("API_DEFAULT_PATH","/api"),m.API_DB_DATABASE=m.getString("API_DB_DATABASE",""),m.API_DB_HOST=m.getString("API_DB_HOST","127.0.0.1"),m.API_DB_PASSWORD=m.getString("API_DB_PASSWORD",""),m.API_DB_PORT=m.getInt("API_DB_PORT",3306),m.API_DB_TYPE=m.getString("API_DB_TYPE",""),m.API_DB_USERNAME=m.getString("API_DB_USERNAME","root"),m.API_DB_LOG=m.getBool("API_DB_LOG",!1),m.API_DB_PREFIX=m.getString("API_DB_PREFIX",""),m.API_DB_TIMEZONE=m.getString("API_DB_TIMEZONE","+00:00"),m.API_HTTP_CRT=m.getString("API_HTTP_CRT",""),m.API_HTTP_KEY=m.getString("API_HTTP_KEY",""),m.API_HTTP_PORT=m.getInt("API_HTTP_PORT",3e3),m.API_HTTP_PUBLIC=m.getString("API_HTTP_PUBLIC",""),m.API_HTTP_CROSS=m.getBool("API_HTTP_CROSS",!1),m.API_HTTP_HYBRID=m.getBool("API_HTTP_HYBRID",!1),m.API_HTTP_REDIRECT=m.getString("API_HTTP_REDIRECT",""),m.API_SLEEP_AUTH=m.getMs("API_SLEEP_AUTH","2s"),m.API_SLEEP_FORGOT=m.getMs("API_SLEEP_FORGOT","5s"),m.API_SLEEP_REGISTRY=m.getMs("API_SLEEP_REGISTRY","5s"),m.API_SESSION_NAME=m.getString("API_SESSION_NAME","session.id"),m.API_SESSION_LIFETIME=m.getMs("API_SESSION_LIFETIME","1d"),m.API_SESSION_SECRET=m.getString("API_SESSION_SECRET","yoursecret"),m.API_TOKEN_CRT=m.getString("API_TOKEN_CRT",""),m.API_TOKEN_KEY=m.getString("API_TOKEN_KEY",""),m.API_TOKEN_HEADER=m.getString("API_TOKEN_HEADER","authorization"),m.API_TOKEN_LIFETIME=m.getMs("API_TOKEN_LIFETIME","1d"),m.API_TOKEN_RENEW=m.getMs("API_TOKEN_RENEW","1d"),m.API_UPLOAD_COUNT=m.getInt("API_UPLOAD_COUNT",1),m.API_UPLOAD_FIELD=process.env.API_UPLOAD_FIELD||"upload",m.API_UPLOAD_SIZE=m.getInt("API_UPLOAD_SIZE",2),m.API_UPLOAD_TEMP=m.getString("API_UPLOAD_TEMP","./temp"),m.API_WEBSOCKET_START=m.getBool("API_WEBSOCKET_START",!1);class A{static connect(e){const t="connect_"+m.API_DB_TYPE.toLowerCase();if(t in A)return A[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},timezone:m.API_DB_TIMEZONE})}static connect_memory(){return new s.Sequelize("sqlite::memory:",{logging:m.API_DB_LOG,define:{timestamps:!1},timezone:m.API_DB_TIMEZONE})}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},timezone:m.API_DB_TIMEZONE})}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},timezone:m.API_DB_TIMEZONE})}static connect_sqlite(e){return new s.Sequelize({dialect:"sqlite",storage:e.database,logging:m.API_DB_LOG,define:{timestamps:!1},timezone:m.API_DB_TIMEZONE})}}const _=A.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 I extends s.Model{}I.init({secret:s.DataTypes.STRING,logout:s.DataTypes.DATE,useragent:s.DataTypes.STRING},{sequelize:_,modelName:m.API_DB_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class R extends s.Model{}R.init({token:s.DataTypes.STRING,timestamp:s.DataTypes.BIGINT,state:s.DataTypes.BOOLEAN},{sequelize:_,modelName:m.API_DB_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:_,modelName:m.API_DB_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class v extends s.Model{}v.init({},{sequelize:_,modelName:m.API_DB_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),v.removeAttribute("id");class P extends s.Model{}P.init({name:s.DataTypes.STRING,description:s.DataTypes.TEXT,state:s.DataTypes.BOOLEAN},{sequelize:_,modelName:m.API_DB_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class S extends s.Model{}S.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:_,modelName:m.API_DB_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated",defaultScope:{attributes:{exclude:["password"]}},scopes:{password:{attributes:{include:["password"]}}}});class E extends s.Model{}E.init({},{sequelize:_,modelName:m.API_DB_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),E.removeAttribute("id");class f extends s.Model{}f.init({key:s.DataTypes.STRING,value:s.DataTypes.STRING},{sequelize:_,modelName:m.API_DB_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),f.removeAttribute("id");class T extends s.Model{}T.init({type:s.DataTypes.STRING,source:s.DataTypes.STRING,message:s.DataTypes.TEXT},{sequelize:_,modelName:m.API_DB_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class w extends s.Model{}w.init({token:s.DataTypes.STRING,timestamp:s.DataTypes.BIGINT,state:s.DataTypes.BOOLEAN},{sequelize:_,modelName:m.API_DB_PREFIX+"registry",timestamps:!0,createdAt:"created",updatedAt:"updated"});class x extends s.Model{}var b;x.init({session:s.DataTypes.STRING,json:s.DataTypes.TEXT,expired:s.DataTypes.BIGINT},{sequelize:_,modelName:m.API_DB_PREFIX+"session",timestamps:!0,createdAt:"created",updatedAt:"updated"}),x.removeAttribute("id"),S.hasMany(I),I.belongsTo(S),S.hasMany(R),R.belongsTo(S),O.hasMany(v),v.belongsTo(O),P.hasMany(v),v.belongsTo(P),S.hasMany(E),E.belongsTo(S),O.hasMany(E),E.belongsTo(O),exports.LogsColor=void 0,(b=exports.LogsColor||(exports.LogsColor={})).ERROR="[31m",b.INFO="[36m",b.NONE="[37m",b.SUCCESS="[32m",b.WARNING="[33m";class C{static write(e,t,r){return h(this,void 0,void 0,(function*(){yield C.writeRaw(exports.LogsColor.NONE,"",e,t,r)}))}static error(e,t,r){return h(this,void 0,void 0,(function*(){yield C.writeRaw(exports.LogsColor.ERROR,"error",e,t,r)}))}static info(e,t,r){return h(this,void 0,void 0,(function*(){yield C.writeRaw(exports.LogsColor.INFO,"info",e,t,r)}))}static success(e,t,r){return h(this,void 0,void 0,(function*(){yield C.writeRaw(exports.LogsColor.ERROR,"success",e,t,r)}))}static warning(e,t,r){return h(this,void 0,void 0,(function*(){yield C.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),"[37m","|",o,"|",s)}static writeRaw(e,t,r,s,o){return h(this,void 0,void 0,(function*(){o&&C.writeConsole(e,t,r),_&&(yield T.create({type:t,source:s,message:r}).catch((()=>null)))}))}}const D=e=>n.existsSync(e)?n.readFileSync(e):void 0,q={http:D(m.API_HTTP_CRT),token:D(m.API_TOKEN_CRT)},N={http:D(m.API_HTTP_KEY),token:D(m.API_TOKEN_KEY)};class j extends i.Store{constructor(){super(),this.all=e=>h(this,void 0,void 0,(function*(){e=e||t.noop;const r=yield x.findAll({attributes:["session"],where:{expired:{[s.Op.gte]:Date.now()}}}).catch((t=>(e(t),null)));r&&e(null,r.map((e=>e.session))),e()})),this.clear=e=>h(this,void 0,void 0,(function*(){yield x.destroy().catch(t.noop),e&&e()})),this.destroy=(e,r)=>h(this,void 0,void 0,(function*(){yield x.destroy({where:{session:e}}).catch(t.noop),r&&r()})),this.expired=()=>h(this,void 0,void 0,(function*(){yield x.destroy({where:{expired:{[s.Op.lt]:Date.now()}}}).catch(t.noop)})),this.get=(e,r)=>h(this,void 0,void 0,(function*(){r=r||t.noop;const o=yield x.findOne({where:{session:e,expired:{[s.Op.gte]:Date.now()}}}).catch((e=>(r(e),null)));if(o){const e=JSON.parse(o.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield o.destroy().catch(t.noop),void r(null)}r(null,e)}else r(null)})),this.length=e=>h(this,void 0,void 0,(function*(){e&&e(null,(yield x.count().catch(t.noop))||0)})),this.set=(e,r,s)=>h(this,void 0,void 0,(function*(){s=s||t.noop;const o=Date.now()+m.API_SESSION_LIFETIME,n=JSON.stringify(r),[i,d]=(yield x.findOrCreate({where:{session:e},defaults:{session:e,json:n,expired:o}}).catch(t.noop))||[];i&&(d||(i.json=n,i.expired=o,yield i.save().catch(t.noop))),s()})),this.loop=t.loop(this.expired,3e4),this.loop.start()}}class M{static create(e){return h(this,void 0,void 0,(function*(){if(!N.token)return{error:"Key not found"};const{id:r}=e,s=t.uuidv4(),o=yield I.create({secret:s,userId:r}).catch(M.error);if(!o)return{error:"Internal Server Error"};return{auth:o,token:d.sign({id:r,secret:s},N.token,M.options())}}))}static destroy(e){return h(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){C.error(e.message,"api.token",m.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:m.API_TOKEN_LIFETIME+"ms"}}static renew(e){return h(this,void 0,void 0,(function*(){if(!N.token)return{error:"Key not found"};const{error:r,decode:s}=M.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 S.findOne({where:{id:e,state:!0}}).catch(M.error);if(s){const o=yield I.findOne({where:{secret:r,userId:s.id}}).catch(M.error);if(o&&!o.logout){o.secret=t.uuidv4(),yield o.save().catch(M.error);return{auth:o,token:d.sign({id:e,secret:o.secret},N.token,M.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e){return h(this,void 0,void 0,(function*(){const{error:t,decode:r}=M.verify(e);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield S.findOne({where:{id:e,state:!0}}).catch(M.error);if(r){const e=yield I.findOne({where:{secret:t,userId:r.id}}).catch(M.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!q.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:d.verify(e,q.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class F extends e.Application{constructor(e){super(e,{cert:q.http,cross:m.API_HTTP_CROSS,hybrid:m.API_HTTP_HYBRID,key:N.http,path:m.API_DEFAULT_PATH,port:m.API_HTTP_PORT,public:m.API_HTTP_PUBLIC,redirect:m.API_HTTP_REDIRECT,session:{store:new j,name:m.API_SESSION_NAME,secret:m.API_SESSION_SECRET,cookie:{maxAge:m.API_SESSION_LIFETIME},genid:t.uuidv4}})}error(e,t){C.info(e.message,t,m.API_CONSOLE_ERROR)}log(e,t){C.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return h(this,void 0,void 0,(function*(){yield _.sync(),yield e.listen.call(this),m.API_WEBSOCKET_START&&this.server&&(this._webSocket=new r.Server({server:this.server,verifyClient:(e,t)=>t(m.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,r)=>h(this,void 0,void 0,(function*(){r.url||(r.url="");const s=r.url.length<=1?"":r.url.replace(/\//g,".");let o;e.on("message",(t=>h(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 M.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 B{static all(){return h(this,void 0,void 0,(function*(){const e=yield f.findAll().catch(B.error),t={};return e&&e.forEach((e=>{t[e.key]=e.value})),t}))}static del(e){return h(this,void 0,void 0,(function*(){return((yield f.destroy({where:{key:e}}).catch(B.error))||0)>0}))}static error(e){C.error(e.message,"api.config",m.API_CONSOLE_ERROR)}static get(e){return h(this,void 0,void 0,(function*(){const t=yield f.findOne({where:{key:e}}).catch(B.error);return t&&t.value||""}))}static set(e,t){return h(this,void 0,void 0,(function*(){const[r]=(yield f.findOrCreate({where:{key:e}}).catch(B.error))||[];r&&(r.value=t,yield r.save().catch(B.error))}))}}const L=e.parameterFactory((({req:e})=>e.auth)),G=e.parameterFactory((({req:e})=>t.toArray(e.files))),k=e.parameterFactory((({req:e})=>e.user));class U{static all(e,t){return h(this,void 0,void 0,(function*(){return yield P.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:v,required:!0,include:[{model:O,required:!0,where:{state:!0},include:[{model:E,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{C.error(e.message,"api.permission",m.API_CONSOLE_ERROR)}))}))}static get(e){return h(this,void 0,void 0,(function*(){const t=yield U.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return h(this,void 0,void 0,(function*(){const r=yield U.all(e,{name:t});return!!r&&r.length>0}))}}class H extends t.EventEmitter{auth(t,r,s,o,n){return h(this,void 0,void 0,(function*(){const{auth:i,error:d,user:a}=yield M.user(s);d?e.Responses.error(r,d):i&&a?i.useragent==o?(t.auth=i,t.user=a,n()):e.Responses.error(r,"Invalid token"):e.Responses.error(r,"Internal Server Error")}))}session(e,r,s){return h(this,void 0,void 0,(function*(){r.auth&&r.user&&(r.useragent?r.useragent!=e&&r.regenerate(t.noop):(r.useragent=e,r.save(t.noop))),s()}))}error(e){C.error(e.message,"api.controller",m.API_CONSOLE_ERROR)}name(){return"api"}permission(t,r,s,o){return h(this,void 0,void 0,(function*(){o?(yield U.is(o,s))?r():e.Responses.error(t,"Unauthorized access"):e.Responses.unauthorized(t,"Access denied")}))}read(e,t,r,s){return this.permission(t,r,(s||this.name())+".read",e)}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)=>h(this,void 0,void 0,(function*(){return r(null,this.uploadFile(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 h(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)(r,s,(t=>t?e.Responses.error(s,t.message):o()))}uploadFile(e,r){const s=t.uuidv4()+"."+r;return n.existsSync(u.join(e,s))?this.uploadFile(e,r):s}validation(r,s,o,n){return h(this,void 0,void 0,(function*(){const{error:i,value:d}=yield t.Validation.object(n).parse().validateAsync(r.body);i?e.Responses.validation(s,i):(r.body=d,o())}))}write(e,t,r,s){return this.permission(e,t,(r||this.name())+".write",s)}}p([g(0,e.Req()),g(1,e.Res()),g(2,e.Headers(m.API_TOKEN_HEADER)),g(3,e.Headers("user-agent")),g(4,e.Next()),y("design:type",Function),y("design:paramtypes",[Object,Object,String,String,Function]),y("design:returntype",Promise)],H.prototype,"auth",null),p([g(0,e.Headers("user-agent")),g(1,e.Session()),g(2,e.Next()),y("design:type",Function),y("design:paramtypes",[String,Object,Function]),y("design:returntype",Promise)],H.prototype,"session",null),p([g(0,e.Res()),g(1,e.Next()),g(2,e.Argument()),g(3,k()),y("design:type",Function),y("design:paramtypes",[Object,Function,String,S]),y("design:returntype",Promise)],H.prototype,"permission",null),p([g(0,k()),g(1,e.Res()),g(2,e.Next()),g(3,e.Argument()),y("design:type",Function),y("design:paramtypes",[S,Object,Function,String]),y("design:returntype",Promise)],H.prototype,"read",null),p([g(0,e.Req()),g(1,e.Res()),g(2,e.Next()),g(3,e.Argument()),y("design:type",Function),y("design:paramtypes",[Object,Object,Function,Object]),y("design:returntype",void 0)],H.prototype,"upload",null),p([g(0,e.Req()),g(1,e.Res()),g(2,e.Next()),g(3,e.Argument()),y("design:type",Function),y("design:paramtypes",[Object,Object,Function,Object]),y("design:returntype",Promise)],H.prototype,"validation",null),p([g(0,e.Res()),g(1,e.Next()),g(2,e.Argument()),g(3,k()),y("design:type",Function),y("design:paramtypes",[Object,Function,String,S]),y("design:returntype",Promise)],H.prototype,"write",null),exports.AuthController=class extends H{login(r,s,o,n,i,d){return h(this,void 0,void 0,(function*(){yield t.sleep(m.API_SLEEP_AUTH);const a=yield S.findOne({where:{username:n,password:c.SHA256(i).toString(),state:!0}}).catch(this.error);if(!a)return e.Responses.notfound(s,"Username not found"),void d.emit("auth.failure",{req:r});const{auth:l,error:u,token:p}=yield M.create(a);return u?(e.Responses.error(s,u),void d.emit("auth.failure",{req:r})):l&&p?(e.Responses.data(s,{token:p}),l.useragent=o,yield l.save().catch(this.error),void this.emit("auth.login",{auth:l,req:r,user:a})):(e.Responses.error(s,"Internal Server Error"),void d.emit("auth.failure",{req:r}))}))}logout(t,r,s,o,n){return h(this,void 0,void 0,(function*(){if(yield M.destroy(s))return e.Responses.success(t,"Disconcerted"),void n.emit("auth.logout",{auth:s,req:r,user:o});e.Responses.unauthorized(t,"Access denied")}))}renew(t,r,s,o,n){return h(this,void 0,void 0,(function*(){const{auth:i,error:d,token:a}=yield M.renew(o);d?e.Responses.error(r,d):i?(e.Responses.data(r,{token:a}),i.useragent=s,yield i.save().catch(this.error),n.emit("auth.renew",{auth:i,req:t})):e.Responses.error(r,"Internal Server Error")}))}update(t,r,s,o){return h(this,void 0,void 0,(function*(){const n=yield S.scope("password").findOne({where:{id:o.id,password:c.SHA256(r).toString(),state:!0}}).catch(this.error);n?(n.password=c.SHA256(s).toString(),(yield n.save().catch(this.error))?e.Responses.success(t,"OK"):e.Responses.success(t,"Record not changed")):e.Responses.error(t,"Record not changed")}))}user(t,r){return h(this,void 0,void 0,(function*(){const s=yield U.all(r);s?e.Responses.data(t,Object.assign(Object.assign({},r.toJSON()),{permissions:s.map((e=>e.name))})):e.Responses.error(t,"Internal Server Error")}))}},p([e.Post("/login"),e.Middleware("validation",{username:t.Validation.string().min(4).required(),password:t.Validation.string().min(5).required()}),g(0,e.Req()),g(1,e.Res()),g(2,e.Headers("user-agent")),g(3,e.Body("username")),g(4,e.Body("password")),g(5,e.App()),y("design:type",Function),y("design:paramtypes",[Object,Object,String,String,String,F]),y("design:returntype",Promise)],exports.AuthController.prototype,"login",null),p([e.Get("/logout"),e.Middleware("auth"),g(0,e.Res()),g(1,e.Req()),g(2,L()),g(3,k()),g(4,e.App()),y("design:type",Function),y("design:paramtypes",[Object,Object,I,S,F]),y("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),p([e.Post("/renew"),e.Middleware("validation",{token:t.Validation.string().required()}),g(0,e.Req()),g(1,e.Res()),g(2,e.Headers("user-agent")),g(3,e.Body("token")),g(4,e.App()),y("design:type",Function),y("design:paramtypes",[Object,Object,String,String,F]),y("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),p([e.Post("/update"),e.Middleware("auth"),e.Middleware("validation",{oldPassword:t.Validation.string().min(5).required(),newPassword:t.Validation.string().min(5).required()}),g(0,e.Res()),g(1,e.Body("oldPassword")),g(2,e.Body("newPassword")),g(3,k()),y("design:type",Function),y("design:paramtypes",[Object,String,String,S]),y("design:returntype",Promise)],exports.AuthController.prototype,"update",null),p([e.Get(),e.Middleware("auth"),g(0,e.Res()),g(1,k()),y("design:type",Function),y("design:paramtypes",[Object,S]),y("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=p([e.Controller("/auth"),e.Extends(H)],exports.AuthController),exports.ForgotController=class extends H{check(r,s){return h(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 h(this,void 0,void 0,(function*(){const{username:o}=s.body;yield t.sleep(m.API_SLEEP_FORGOT);const n=yield S.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 R.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 h(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=c.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 h(this,void 0,void 0,(function*(){return yield R.findOne({where:{token:e,state:!0},include:[{model:S,required:!0}]}).catch(this.error)}))}},p([e.Get("/check"),e.Middleware("validation",{token:t.Validation.string().required()}),g(0,e.Res()),g(1,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),p([e.Get(),e.Middleware("validation",{username:t.Validation.string().min(4).required()}),g(0,e.Res()),g(1,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),p([e.Get("/reset"),e.Middleware("validation",{token:t.Validation.string().required(),password:t.Validation.string().min(5).required()}),g(0,e.Res()),g(1,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=p([e.Controller("/forgot"),e.Extends(H)],exports.ForgotController),exports.ModelController=class extends H{add(t,r,s,o){return h(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 h(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 h=null===(a=r.query.offset)||void 0===a?void 0:a.toString();h&&(g.offset=parseInt(h));const m=Object.keys(p.getAttributes()),A=[],_=null===(l=r.query.asc)||void 0===l?void 0:l.toString();_&&_.length&&_.split(",").forEach((e=>{m.indexOf(e)>=0&&A.push([e,"ASC"])}));const I=null===(u=r.query.desc)||void 0===u?void 0:u.toString();I&&I.length&&I.split(",").forEach((e=>{m.indexOf(e)>=0&&A.push([e,"DESC"])})),A.length&&(g.order=A);const R=[],O=t.isArray(g.attributes)?g.attributes:m,v=null===(c=r.query.search)||void 0===c?void 0:c.toString();O.forEach((e=>{var o;if(t.isString(e)&&(v&&v.length&&R.push({[e]:{[s.Op.like]:`%${v}%`}}),"search_"+e in r.query)){const t=null===(o=r.query["search_"+e])||void 0===o?void 0:o.toString();t&&t.length&&R.push({[e]:{[s.Op.like]:`%${t}%`}})}})),R.length&&(g.where=Object.assign(Object.assign({},g.where),{[s.Op.or]:[...R]}));const P=(yield p.count(Object.assign(Object.assign({},g),{col:m[0]})).catch(this.error))||0,S=yield p.findAll(g).catch(this.error);if(S)return e.Responses.data(o,{count:P,records:i?yield i(S):S}),S;e.Responses.error(o,"Internal Server Error")}))}del(t,r,s){return h(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?C.error(e.message+"\n"+e.sql,"api.controller.sql",m.API_CONSOLE_ERROR):super.error(e)}get(t,r,s,o){return h(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 h(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=p([e.Extends(H)],exports.ModelController),exports.CrudController=class extends exports.ModelController{create(){return{}}recordAdd(e,t){this.add(e,t)}recordAll(e,t){this.all(e,t)}recordDel(e,t){this.del(e,t)}recordGet(e,t){this.get(e,t)}recordSet(e,t){this.set(e,t)}update(){return{}}validationAdd(e,t,r){this.validation(e,t,r,this.create())}validationSet(e,t,r){this.validation(e,t,r,this.update())}},p([e.Post(),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationAdd"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordAdd",null),p([e.Get(),e.Middleware("auth"),e.Middleware("read"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordAll",null),p([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordDel",null),p([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordGet",null),p([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationSet"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordSet",null),p([g(0,e.Req()),g(1,e.Res()),g(2,e.Next()),y("design:type",Function),y("design:paramtypes",[Object,Object,Function]),y("design:returntype",void 0)],exports.CrudController.prototype,"validationAdd",null),p([g(0,e.Req()),g(1,e.Res()),g(2,e.Next()),y("design:type",Function),y("design:paramtypes",[Object,Object,Function]),y("design:returntype",void 0)],exports.CrudController.prototype,"validationSet",null),exports.CrudController=p([e.Extends(exports.ModelController)],exports.CrudController),exports.GroupsController=class extends exports.CrudController{model(){return 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 v}recordAll(e,t,r){return h(this,void 0,void 0,(function*(){this.all(e,t,{where:{groupId:r},include:[{model:P,required:!0}]},(e=>e.map((e=>e.route))))}))}recordSet(r,s,o){return h(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 v.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 v.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")}))}},p([e.Get("/:id/routes"),e.Middleware("auth"),e.Middleware("read","groups"),g(0,e.Req()),g(1,e.Res()),g(2,e.Params("id")),y("design:type",Function),y("design:paramtypes",[Object,Object,String]),y("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"recordAll",null),p([e.Put("/:id/routes"),e.Middleware("auth"),e.Middleware("write","groups"),e.Middleware("validation",{routes:t.Validation.array(t.Validation.number().parse())}),g(0,e.Res()),g(1,e.Params("id")),g(2,e.Body("routes")),y("design:type",Function),y("design:paramtypes",[Object,String,Array]),y("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"recordSet",null),exports.GroupsRoutesController=p([e.Controller("/groups"),e.Extends(exports.ModelController)],exports.GroupsRoutesController),exports.LogsController=class extends exports.ModelController{model(){return T}recordAll(e,t,r,s){const o={};r&&(o.type=r),s&&(o.source=s),this.all(e,t,{where:o,order:[["created","DESC"]]})}},p([e.Get(),e.Middleware("auth"),e.Middleware("read"),g(0,e.Req()),g(1,e.Res()),g(2,e.Query("type")),g(3,e.Query("source")),y("design:type",Function),y("design:paramtypes",[Object,Object,String,String]),y("design:returntype",void 0)],exports.LogsController.prototype,"recordAll",null),exports.LogsController=p([e.Controller("/logs"),e.Extends(exports.ModelController)],exports.LogsController),exports.RegisterController=class extends H{confirm(t,r){return h(this,void 0,void 0,(function*(){const s=yield w.findOne({where:{token:r,state:!0},include:[{model:S,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 h(this,void 0,void 0,(function*(){yield t.sleep(m.API_SLEEP_REGISTRY);const s=yield S.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 S.create(Object.assign(Object.assign({},o),{state:!1}));this.emit("user.register",{user:i}),e.Responses.success(r,"OK")}))}},p([e.Get("/confirm"),e.Middleware("validation",{token:t.Validation.string().required()}),g(0,e.Res()),g(1,e.Body("token")),y("design:type",Function),y("design:paramtypes",[Object,String]),y("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()}),g(0,e.Res()),g(1,e.Req()),g(2,e.Body()),g(3,e.Body("username")),y("design:type",Function),y("design:paramtypes",[Object,Object,Object,String]),y("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),exports.RegisterController=p([e.Controller("/register"),e.Extends(H)],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=p([e.Controller("/routes"),e.Extends(exports.CrudController)],exports.RoutesController),exports.SetupController=class extends H{setup(r){return h(this,void 0,void 0,(function*(){if(0==(yield S.count())){const e={description:"",state:!0},r=yield S.create(Object.assign({name:"Admin",email:"admin@localhost",username:"admin",password:"8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918",avatar:""},e)),s=yield O.create(Object.assign({name:"admin"},e));yield E.create({userId:r.id,groupId:s.id});const o=["read","write"],n=["users","groups","routes"];yield t.forEachSeries(n,(r=>h(this,void 0,void 0,(function*(){yield t.forEachSeries(o,(t=>h(this,void 0,void 0,(function*(){const o=r+"."+t,n=yield P.create(Object.assign({name:o},e));yield v.create({groupId:s.id,routeId:n.id})}))))}))));const i=yield P.create(Object.assign({name:"logs.read"},e));yield v.create({groupId:s.id,routeId:i.id})}e.Responses.success(r,"OK")}))}},p([e.Get(),g(0,e.Res()),y("design:type",Function),y("design:paramtypes",[Object]),y("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=p([e.Controller("/setup"),e.Extends(H)],exports.SetupController),exports.UsersController=class extends exports.ModelController{model(){return S}recordAdd(e,t,r){this.add(r,e,{},{password:c.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:c.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().empty(""),state:t.Validation.boolean().parse().required()}),g(0,e.Res()),g(1,e.Body("password")),g(2,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,String,Object]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordAdd",null),p([e.Get(),e.Middleware("auth"),e.Middleware("read"),g(0,e.Res()),g(1,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordAll",null),p([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),g(0,e.Res()),g(1,e.Req()),g(2,k()),g(3,e.Params("id")),y("design:type",Function),y("design:paramtypes",[Object,Object,S,String]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordDel",null),p([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),g(0,e.Res()),g(1,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordGet",null),p([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validation",{name:t.Validation.string().empty(),email:t.Validation.string().email().empty(),username:t.Validation.string().min(4).empty(),password:t.Validation.string().min(5).empty().filter(""),description:t.Validation.string().empty(),state:t.Validation.boolean().parse().empty()}),g(0,e.Res()),g(1,e.Body("password")),g(2,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,String,Object]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordSet",null),exports.UsersController=p([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersController),exports.UsersGroupsController=class extends exports.ModelController{model(){return E}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 h(this,void 0,void 0,(function*(){const n=yield S.findByPk(s,{attributes:["id"]}).catch(this.error);if(n){if(yield E.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 E.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")}))}},p([e.Get("/:id/groups"),e.Middleware("auth"),e.Middleware("read","users"),g(0,e.Res()),g(1,e.Req()),g(2,e.Params("id")),y("design:type",Function),y("design:paramtypes",[Object,Object,String]),y("design:returntype",void 0)],exports.UsersGroupsController.prototype,"recordAll",null),p([e.Put("/:id/groups"),e.Middleware("auth"),e.Middleware("write","users"),e.Middleware("validation",{groups:t.Validation.array(t.Validation.number().parse())}),g(0,e.Res()),g(1,e.Params("id")),g(2,e.Body("groups")),y("design:type",Function),y("design:paramtypes",[Object,String,Array]),y("design:returntype",Promise)],exports.UsersGroupsController.prototype,"recordSet",null),exports.UsersGroupsController=p([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersGroupsController),exports.Application=F,exports.Auth=I,exports.Config=B,exports.Configs=f,exports.ControllerBase=H,exports.Database=A,exports.Env=m,exports.Forgot=R,exports.Group=O,exports.GroupRoute=v,exports.Log=T,exports.Logs=C,exports.Permission=U,exports.Registry=w,exports.ReqAuth=L,exports.ReqFiles=G,exports.ReqUser=k,exports.Route=P,exports.Session=x,exports.Token=M,exports.User=S,exports.UserGroup=E,exports.crt=q,exports.key=N,exports.sequelize=_;
|
|
7
|
+
"use strict";var e=require("@andrewcaires/express"),t=require("@andrewcaires/utils.js"),r=require("ws"),o=require("sequelize"),s=require("dotenv"),i=require("fs"),n=require("express-session"),d=require("jsonwebtoken"),a=require("mime-types"),l=require("multer"),u=require("path"),c=require("crypto-js");function p(e,t,r,o){var s,i=arguments.length,n=i<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,o);else for(var d=e.length-1;d>=0;d--)(s=e[d])&&(n=(i<3?s(n):i>3?s(t,r,n):s(t,r))||n);return i>3&&n&&Object.defineProperty(t,r,n),n}function g(e,t){return function(r,o){t(r,o,e)}}function y(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function h(e,t,r,o){return new(r||(r=Promise))((function(s,i){function n(e){try{a(o.next(e))}catch(e){i(e)}}function d(e){try{a(o.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?s(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(n,d)}a((o=o.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,s.config();class m{static getBool(e,r){return t.toBool(m.getString(e,r.toString()))}static getInt(e,t){return parseInt(m.getString(e,t.toString()))}static getMs(e,r){return t.parseMs(m.getString(e,r))}static getString(e,t){return e in process.env?process.env[e]||"":t}}m.API_CONSOLE_ERROR=m.getBool("API_CONSOLE_ERROR",!1),m.API_DEFAULT_PATH=m.getString("API_DEFAULT_PATH","/api"),m.API_DB_DATABASE=m.getString("API_DB_DATABASE",""),m.API_DB_HOST=m.getString("API_DB_HOST","127.0.0.1"),m.API_DB_PASSWORD=m.getString("API_DB_PASSWORD",""),m.API_DB_PORT=m.getInt("API_DB_PORT",3306),m.API_DB_TYPE=m.getString("API_DB_TYPE",""),m.API_DB_USERNAME=m.getString("API_DB_USERNAME","root"),m.API_DB_LOG=m.getBool("API_DB_LOG",!1),m.API_DB_PREFIX=m.getString("API_DB_PREFIX",""),m.API_DB_TIMEZONE=m.getString("API_DB_TIMEZONE","+00:00"),m.API_HTTP_CRT=m.getString("API_HTTP_CRT",""),m.API_HTTP_KEY=m.getString("API_HTTP_KEY",""),m.API_HTTP_PORT=m.getInt("API_HTTP_PORT",3e3),m.API_HTTP_PUBLIC=m.getString("API_HTTP_PUBLIC",""),m.API_HTTP_CROSS=m.getBool("API_HTTP_CROSS",!1),m.API_HTTP_HYBRID=m.getBool("API_HTTP_HYBRID",!1),m.API_HTTP_REDIRECT=m.getString("API_HTTP_REDIRECT",""),m.API_SLEEP_AUTH=m.getMs("API_SLEEP_AUTH","2s"),m.API_SLEEP_FORGOT=m.getMs("API_SLEEP_FORGOT","5s"),m.API_SLEEP_REGISTRY=m.getMs("API_SLEEP_REGISTRY","5s"),m.API_SESSION_NAME=m.getString("API_SESSION_NAME","session.id"),m.API_SESSION_LIFETIME=m.getMs("API_SESSION_LIFETIME","1d"),m.API_SESSION_SECRET=m.getString("API_SESSION_SECRET","yoursecret"),m.API_TOKEN_CRT=m.getString("API_TOKEN_CRT",""),m.API_TOKEN_KEY=m.getString("API_TOKEN_KEY",""),m.API_TOKEN_FORGOT=m.getMs("API_TOKEN_LIFETIME","1d"),m.API_TOKEN_HEADER=m.getString("API_TOKEN_HEADER","authorization"),m.API_TOKEN_LIFETIME=m.getMs("API_TOKEN_LIFETIME","1d"),m.API_TOKEN_RENEW=m.getMs("API_TOKEN_RENEW","1d"),m.API_UPLOAD_COUNT=m.getInt("API_UPLOAD_COUNT",1),m.API_UPLOAD_FIELD=process.env.API_UPLOAD_FIELD||"upload",m.API_UPLOAD_SIZE=m.getInt("API_UPLOAD_SIZE",2),m.API_UPLOAD_TEMP=m.getString("API_UPLOAD_TEMP","./temp"),m.API_WEBSOCKET_START=m.getBool("API_WEBSOCKET_START",!1);class A{static connect(e){const t="connect_"+m.API_DB_TYPE.toLowerCase();if(t in A)return A[t](e);throw new Error("No database is connected to this API")}static connect_mariadb(e){return new o.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mariadb",logging:m.API_DB_LOG,define:{timestamps:!1},timezone:m.API_DB_TIMEZONE})}static connect_memory(){return new o.Sequelize("sqlite::memory:",{logging:m.API_DB_LOG,define:{timestamps:!1},timezone:m.API_DB_TIMEZONE})}static connect_mysql(e){return new o.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mysql",logging:m.API_DB_LOG,define:{timestamps:!1},timezone:m.API_DB_TIMEZONE})}static connect_postgres(e){return new o.Sequelize(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"postgres",logging:m.API_DB_LOG,define:{timestamps:!1},timezone:m.API_DB_TIMEZONE})}static connect_sqlite(e){return new o.Sequelize({dialect:"sqlite",storage:e.database,logging:m.API_DB_LOG,define:{timestamps:!1},timezone:m.API_DB_TIMEZONE})}}const I=A.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 _ extends o.Model{}_.init({secret:o.DataTypes.STRING,logout:o.DataTypes.DATE,useragent:o.DataTypes.STRING},{sequelize:I,modelName:m.API_DB_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class v extends o.Model{}v.init({token:o.DataTypes.STRING,timestamp:o.DataTypes.BIGINT,state:o.DataTypes.BOOLEAN},{sequelize:I,modelName:m.API_DB_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class O extends o.Model{}O.init({name:o.DataTypes.STRING,description:o.DataTypes.TEXT,state:o.DataTypes.BOOLEAN},{sequelize:I,modelName:m.API_DB_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class P extends o.Model{}P.init({},{sequelize:I,modelName:m.API_DB_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),P.removeAttribute("id");class S extends o.Model{}S.init({token:o.DataTypes.STRING,state:o.DataTypes.BOOLEAN},{sequelize:I,modelName:m.API_DB_PREFIX+"register",timestamps:!0,createdAt:"created",updatedAt:"updated"});class f extends o.Model{}f.init({name:o.DataTypes.STRING,description:o.DataTypes.TEXT,state:o.DataTypes.BOOLEAN},{sequelize:I,modelName:m.API_DB_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class E extends o.Model{}E.init({name:o.DataTypes.STRING,email:o.DataTypes.STRING,username:o.DataTypes.STRING,password:o.DataTypes.STRING,avatar:o.DataTypes.STRING,date:o.DataTypes.DATEONLY,description:o.DataTypes.TEXT,state:o.DataTypes.BOOLEAN},{sequelize:I,modelName:m.API_DB_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated",defaultScope:{attributes:{exclude:["password"]}},scopes:{password:{attributes:{include:["password"]}}}});class R extends o.Model{}R.init({},{sequelize:I,modelName:m.API_DB_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),R.removeAttribute("id");class x extends o.Model{}x.init({key:o.DataTypes.STRING,value:o.DataTypes.STRING},{sequelize:I,modelName:m.API_DB_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),x.removeAttribute("id");class T extends o.Model{}T.init({type:o.DataTypes.STRING,source:o.DataTypes.STRING,message:o.DataTypes.TEXT},{sequelize:I,modelName:m.API_DB_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class w extends o.Model{}var C;w.init({session:o.DataTypes.STRING,json:o.DataTypes.TEXT,expired:o.DataTypes.BIGINT},{sequelize:I,modelName:m.API_DB_PREFIX+"session",timestamps:!0,createdAt:"created",updatedAt:"updated"}),w.removeAttribute("id"),E.hasMany(_),_.belongsTo(E),E.hasMany(v),v.belongsTo(E),E.hasMany(S),S.belongsTo(E),O.hasMany(P),P.belongsTo(O),f.hasMany(P),P.belongsTo(f),E.hasMany(R),R.belongsTo(E),O.hasMany(R),R.belongsTo(O),exports.LogsColor=void 0,(C=exports.LogsColor||(exports.LogsColor={})).ERROR="[31m",C.INFO="[36m",C.NONE="[37m",C.SUCCESS="[32m",C.WARNING="[33m";class b{static write(e,t,r){return h(this,void 0,void 0,(function*(){yield b.writeRaw(exports.LogsColor.NONE,"",e,t,r)}))}static error(e,t,r){return h(this,void 0,void 0,(function*(){yield b.writeRaw(exports.LogsColor.ERROR,"error",e,t,r)}))}static info(e,t,r){return h(this,void 0,void 0,(function*(){yield b.writeRaw(exports.LogsColor.INFO,"info",e,t,r)}))}static success(e,t,r){return h(this,void 0,void 0,(function*(){yield b.writeRaw(exports.LogsColor.ERROR,"success",e,t,r)}))}static warning(e,t,r){return h(this,void 0,void 0,(function*(){yield b.writeRaw(exports.LogsColor.WARNING,"warning",e,t,r)}))}static writeConsole(e,r,o){const s=t.dateFormat(new Date,"%H:%M:%S");console.log(">",e,r+" ".repeat(10-r.length),"[37m","|",s,"|",o)}static writeRaw(e,t,r,o,s){return h(this,void 0,void 0,(function*(){s&&b.writeConsole(e,t,r),I&&(yield T.create({type:t,source:o,message:r}).catch((()=>null)))}))}}const D=e=>i.existsSync(e)?i.readFileSync(e):void 0,N={http:D(m.API_HTTP_CRT),token:D(m.API_TOKEN_CRT)},M={http:D(m.API_HTTP_KEY),token:D(m.API_TOKEN_KEY)};class q extends n.Store{constructor(){super(),this.all=e=>h(this,void 0,void 0,(function*(){e=e||t.noop;const r=yield w.findAll({attributes:["session"],where:{expired:{[o.Op.gte]:Date.now()}}}).catch((t=>(e(t),null)));r&&e(null,r.map((e=>e.session))),e()})),this.clear=e=>h(this,void 0,void 0,(function*(){yield w.destroy().catch(t.noop),e&&e()})),this.destroy=(e,r)=>h(this,void 0,void 0,(function*(){yield w.destroy({where:{session:e}}).catch(t.noop),r&&r()})),this.expired=()=>h(this,void 0,void 0,(function*(){yield w.destroy({where:{expired:{[o.Op.lt]:Date.now()}}}).catch(t.noop)})),this.get=(e,r)=>h(this,void 0,void 0,(function*(){r=r||t.noop;const s=yield w.findOne({where:{session:e,expired:{[o.Op.gte]:Date.now()}}}).catch((e=>(r(e),null)));if(s){const e=JSON.parse(s.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield s.destroy().catch(t.noop),void r(null)}r(null,e)}else r(null)})),this.length=e=>h(this,void 0,void 0,(function*(){e&&e(null,(yield w.count().catch(t.noop))||0)})),this.set=(e,r,o)=>h(this,void 0,void 0,(function*(){o=o||t.noop;const s=Date.now()+m.API_SESSION_LIFETIME,i=JSON.stringify(r),[n,d]=(yield w.findOrCreate({where:{session:e},defaults:{session:e,json:i,expired:s}}).catch(t.noop))||[];n&&(d||(n.json=i,n.expired=s,yield n.save().catch(t.noop))),o()})),this.loop=t.loop(this.expired,3e4),this.loop.start()}}class F{static create(e){return h(this,void 0,void 0,(function*(){if(!M.token)return{error:"Key not found"};const{id:r}=e,o=t.uuidv4(),s=yield _.create({secret:o,userId:r}).catch(F.error);if(!s)return{error:"Internal Server Error"};return{auth:s,token:d.sign({id:r,secret:o},M.token,F.options())}}))}static destroy(e){return h(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){b.error(e.message,"api.token",m.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:m.API_TOKEN_LIFETIME+"ms"}}static renew(e){return h(this,void 0,void 0,(function*(){if(!M.token)return{error:"Key not found"};const{error:r,decode:o}=F.verify(e,m.API_TOKEN_RENEW/1e3);if(r)return{error:r};if(o){const{id:e,secret:r}=o;if(e&&r){const o=yield E.findOne({where:{id:e,state:!0}}).catch(F.error);if(o){const s=yield _.findOne({where:{secret:r,userId:o.id}}).catch(F.error);if(s&&!s.logout){s.secret=t.uuidv4(),yield s.save().catch(F.error);return{auth:s,token:d.sign({id:e,secret:s.secret},M.token,F.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e){return h(this,void 0,void 0,(function*(){const{error:t,decode:r}=F.verify(e);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield E.findOne({where:{id:e,state:!0}}).catch(F.error);if(r){const e=yield _.findOne({where:{secret:t,userId:r.id}}).catch(F.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!N.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:d.verify(e,N.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class j extends e.Application{constructor(e){super(e,{cert:N.http,cross:m.API_HTTP_CROSS,hybrid:m.API_HTTP_HYBRID,key:M.http,path:m.API_DEFAULT_PATH,port:m.API_HTTP_PORT,public:m.API_HTTP_PUBLIC,redirect:m.API_HTTP_REDIRECT,session:{store:new q,name:m.API_SESSION_NAME,secret:m.API_SESSION_SECRET,cookie:{maxAge:m.API_SESSION_LIFETIME},genid:t.uuidv4}})}error(e,t){b.info(e.message,t,m.API_CONSOLE_ERROR)}log(e,t){b.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return h(this,void 0,void 0,(function*(){yield I.sync(),yield e.listen.call(this),m.API_WEBSOCKET_START&&this.server&&(this._webSocket=new r.Server({server:this.server,verifyClient:(e,t)=>t(m.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,r)=>h(this,void 0,void 0,(function*(){r.url||(r.url="");const o=r.url.length<=1?"":r.url.replace(/\//g,".");let s;e.on("message",(t=>h(this,void 0,void 0,(function*(){if(s)try{const i=JSON.parse(t);this.emit("ws.message"+o,{data:i,message:t,req:r,user:s,ws:e})}catch(i){this.emit("ws.message"+o,{message:t,req:r,user:s,ws:e})}else{const{user:i}=yield F.user(t.toString());i&&(s=i,this.emit("ws.connection"+o,{req:r,user:s,ws:e}))}s||e.close()})))),e.on("close",(()=>{s&&this.emit("ws.close"+o,{user:s,ws:e})})),yield t.sleep(2e3),s||e.close()})))))}))}websocket(){return this._webSocket}}class B{static all(){return h(this,void 0,void 0,(function*(){const e=yield x.findAll().catch(B.error),t={};return e&&e.forEach((e=>{t[e.key]=e.value})),t}))}static del(e){return h(this,void 0,void 0,(function*(){return((yield x.destroy({where:{key:e}}).catch(B.error))||0)>0}))}static error(e){b.error(e.message,"api.config",m.API_CONSOLE_ERROR)}static get(e){return h(this,void 0,void 0,(function*(){const t=yield x.findOne({where:{key:e}}).catch(B.error);return t&&t.value||""}))}static set(e,t){return h(this,void 0,void 0,(function*(){const[r]=(yield x.findOrCreate({where:{key:e}}).catch(B.error))||[];r&&(r.value=t,yield r.save().catch(B.error))}))}}const L=e.parameterFactory((({req:e})=>e.auth)),k=e.parameterFactory((({req:e})=>t.toArray(e.files))),G=e.parameterFactory((({req:e})=>e.user));class H{static all(e,t){return h(this,void 0,void 0,(function*(){return yield f.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:P,required:!0,include:[{model:O,required:!0,where:{state:!0},include:[{model:R,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{b.error(e.message,"api.permission",m.API_CONSOLE_ERROR)}))}))}static get(e){return h(this,void 0,void 0,(function*(){const t=yield H.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return h(this,void 0,void 0,(function*(){const r=yield H.all(e,{name:t});return!!r&&r.length>0}))}}class U extends t.EventEmitter{auth(t,r,o,s,i){return h(this,void 0,void 0,(function*(){const{auth:n,error:d,user:a}=yield F.user(o);d?e.Responses.error(r,d):n&&a?n.useragent==s?(t.auth=n,t.user=a,i()):e.Responses.error(r,"Invalid token"):e.Responses.error(r,"Internal Server Error")}))}session(e,r,o){return h(this,void 0,void 0,(function*(){r.auth&&r.user&&(r.useragent?r.useragent!=e&&r.regenerate(t.noop):(r.useragent=e,r.save(t.noop))),o()}))}error(e){b.error(e.message,"api.controller",m.API_CONSOLE_ERROR)}name(){return"api"}permission(t,r,o,s){return h(this,void 0,void 0,(function*(){s?(yield H.is(s,o))?r():e.Responses.error(t,"Unauthorized access"):e.Responses.unauthorized(t,"Access denied")}))}read(e,t,r,o){return this.permission(t,r,(o||this.name())+".read",e)}upload(r,o,s,i){const n=(null==i?void 0:i.path)||m.API_UPLOAD_TEMP,d=l.diskStorage({destination:(e,t,r)=>r(null,n),filename:(e,t,r)=>h(this,void 0,void 0,(function*(){return r(null,this.uploadFile(n,a.extension(t.mimetype)||"bin"))}))}),u=1e6*((null==i?void 0:i.size)||m.API_UPLOAD_SIZE),c=l({storage:d,fileFilter(e,r,o){var s;return h(this,void 0,void 0,(function*(){const e=null===(s=null==i?void 0:i.types)||void 0===s?void 0:s.indexOf(r.mimetype);return t.isNumber(e)&&e<0?o(new Error("File type not allowed")):o(null,!0)}))},limits:{fileSize:u}}),p=(null==i?void 0:i.count)||m.API_UPLOAD_COUNT,g=(null==i?void 0:i.field)||m.API_UPLOAD_FIELD;c.array(g,p)(r,o,(t=>t?e.Responses.error(o,t.message):s()))}uploadFile(e,r){const o=t.uuidv4()+"."+r;return i.existsSync(u.join(e,o))?this.uploadFile(e,r):o}validation(r,o,s,i){return h(this,void 0,void 0,(function*(){const{error:n,value:d}=yield t.Validation.object(i).parse().validateAsync(r.body);n?e.Responses.validation(o,n):(r.body=d,s())}))}write(e,t,r,o){return this.permission(e,t,(r||this.name())+".write",o)}}p([g(0,e.Req()),g(1,e.Res()),g(2,e.Headers(m.API_TOKEN_HEADER)),g(3,e.Headers("user-agent")),g(4,e.Next()),y("design:type",Function),y("design:paramtypes",[Object,Object,String,String,Function]),y("design:returntype",Promise)],U.prototype,"auth",null),p([g(0,e.Headers("user-agent")),g(1,e.Session()),g(2,e.Next()),y("design:type",Function),y("design:paramtypes",[String,Object,Function]),y("design:returntype",Promise)],U.prototype,"session",null),p([g(0,e.Res()),g(1,e.Next()),g(2,e.Argument()),g(3,G()),y("design:type",Function),y("design:paramtypes",[Object,Function,String,E]),y("design:returntype",Promise)],U.prototype,"permission",null),p([g(0,G()),g(1,e.Res()),g(2,e.Next()),g(3,e.Argument()),y("design:type",Function),y("design:paramtypes",[E,Object,Function,String]),y("design:returntype",Promise)],U.prototype,"read",null),p([g(0,e.Req()),g(1,e.Res()),g(2,e.Next()),g(3,e.Argument()),y("design:type",Function),y("design:paramtypes",[Object,Object,Function,Object]),y("design:returntype",void 0)],U.prototype,"upload",null),p([g(0,e.Req()),g(1,e.Res()),g(2,e.Next()),g(3,e.Argument()),y("design:type",Function),y("design:paramtypes",[Object,Object,Function,Object]),y("design:returntype",Promise)],U.prototype,"validation",null),p([g(0,e.Res()),g(1,e.Next()),g(2,e.Argument()),g(3,G()),y("design:type",Function),y("design:paramtypes",[Object,Function,String,E]),y("design:returntype",Promise)],U.prototype,"write",null),exports.AuthController=class extends U{login(e,r,s,i,n){return h(this,void 0,void 0,(function*(){yield t.sleep(m.API_SLEEP_AUTH);const d=s,a=yield E.findOne({where:{[o.Op.or]:[{email:d},{username:s}],[o.Op.and]:[{password:c.SHA256(i).toString()}]}}).catch(this.error);if(!a)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const l=yield S.findOne({where:{state:!0,userId:a.id}}).catch(this.error);if(l)return e.error("Activation required"),n.emit("auth.activation",{ctx:e,register:l,user:a}),void this.emit("auth.activation",{ctx:e,register:l,user:a});if(!a.state)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const{auth:u,error:p,token:g}=yield F.create(a);return p?(e.error(p),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):u&&g?(e.data({token:g}),u.useragent=r,yield u.save().catch(this.error),n.emit("auth.login",{auth:u,ctx:e,user:a}),void this.emit("auth.login",{auth:u,ctx:e,user:a})):(e.error("Internal Server Error"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,r,o){return h(this,void 0,void 0,(function*(){if(yield F.destroy(t))return e.success("Disconcerted"),o.emit("auth.logout",{auth:t,ctx:e,user:r}),void this.emit("auth.logout",{auth:t,ctx:e,user:r});e.unauthorized("Access denied")}))}renew(e,t,r,o){return h(this,void 0,void 0,(function*(){const{auth:s,error:i,token:n}=yield F.renew(r);i?e.error(i):s?(e.data({token:n}),s.useragent=t,yield s.save().catch(this.error),o.emit("auth.renew",{auth:s,ctx:e}),this.emit("auth.renew",{auth:s,ctx:e})):e.error("Internal Server Error")}))}update(e,t,r,o){return h(this,void 0,void 0,(function*(){const s=yield E.scope("password").findOne({where:{id:o.id,password:c.SHA256(t).toString(),state:!0}}).catch(this.error);s?(s.password=c.SHA256(r).toString(),(yield s.save().catch(this.error))?e.success("OK"):e.success("Record not changed")):e.error("Record not changed")}))}user(e,t){return h(this,void 0,void 0,(function*(){const r=yield H.all(t);r?e.data(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))})):e.error("Internal Server Error")}))}},p([e.Post("/login"),e.Middleware("validation",{username:t.Validation.string().min(3).required(),password:t.Validation.string().min(5).required()}),g(0,e.Ctx()),g(1,e.Headers("user-agent")),g(2,e.Body("username")),g(3,e.Body("password")),g(4,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,String,String,String,j]),y("design:returntype",Promise)],exports.AuthController.prototype,"login",null),p([e.Get("/logout"),e.Middleware("auth"),g(0,e.Ctx()),g(1,L()),g(2,G()),g(3,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,_,E,j]),y("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),p([e.Post("/renew"),e.Middleware("validation",{token:t.Validation.string().required()}),g(0,e.Ctx()),g(1,e.Headers("user-agent")),g(2,e.Body("token")),g(3,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,String,String,j]),y("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),p([e.Post("/update"),e.Middleware("auth"),e.Middleware("validation",{oldPassword:t.Validation.string().min(5).required(),newPassword:t.Validation.string().min(5).required()}),g(0,e.Ctx()),g(1,e.Body("oldPassword")),g(2,e.Body("newPassword")),g(3,G()),y("design:type",Function),y("design:paramtypes",[e.Context,String,String,E]),y("design:returntype",Promise)],exports.AuthController.prototype,"update",null),p([e.Get(),e.Middleware("auth"),g(0,e.Ctx()),g(1,G()),y("design:type",Function),y("design:paramtypes",[e.Context,E]),y("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=p([e.Controller("/auth"),e.Extends(U)],exports.AuthController),exports.ForgotController=class extends U{check(r,o){return h(this,void 0,void 0,(function*(){const{token:s}=o.body,i=yield this.findOne(s);i&&i.user?(i.token=t.uniqueID(),yield i.save(),e.Responses.data(r,{token:i.token})):e.Responses.notfound(r,"User not found")}))}forgot(e,r,s){return h(this,void 0,void 0,(function*(){yield t.sleep(m.API_SLEEP_FORGOT);const i=r,n=yield E.findOne({where:{[o.Op.or]:[{email:i},{username:r}]}}).catch(this.error);if(!n)return void e.notFound("User not found");const d=t.uniqueID(),a=Date.now()+6e4*m.API_TOKEN_FORGOT,l=yield v.create({token:d,timestamp:a,state:!0,userId:n.id});s.emit("forgot.send",{ctx:e,forgot:l,user:n}),this.emit("forgot.send",{ctx:e,forgot:l,user:n}),e.success("OK")}))}reset(e,t,r,o){return h(this,void 0,void 0,(function*(){const s=yield this.findOne(t);s?(s.state=!1,yield s.save().catch(this.error),s.user.password=c.SHA256(r).toString(),yield s.user.save().catch(this.error),o.emit("forgot.reset",{ctx:e,user:s.user}),this.emit("forgot.reset",{ctx:e,user:s.user}),e.success("OK")):e.notFound("User not found")}))}findOne(e){return h(this,void 0,void 0,(function*(){return yield v.findOne({where:{token:e,state:!0},include:[{model:E,required:!0}]}).catch(this.error)}))}},p([e.Get("/check"),e.Middleware("validation",{token:t.Validation.string().required()}),g(0,e.Res()),g(1,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),p([e.Post(),e.Middleware("validation",{username:t.Validation.string().min(4).required()}),g(0,e.Ctx()),g(1,e.Body("username")),g(2,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,String,j]),y("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),p([e.Post("/reset"),e.Middleware("validation",{token:t.Validation.string().required(),password:t.Validation.string().min(5).required()}),g(0,e.Ctx()),g(1,e.Body("token")),g(2,e.Body("password")),g(3,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,String,String,j]),y("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=p([e.Controller("/forgot"),e.Extends(U)],exports.ForgotController),exports.ModelController=class extends U{add(t,r,o,s){return h(this,void 0,void 0,(function*(){const i=yield this.model().create(Object.assign(Object.assign({},t.body),s||{}),o||{}).catch(this.error);if(i){const t=this.key();return e.Responses.data(r,{[t]:i.getDataValue(t)}),i}e.Responses.error(r,"Internal Server Error")}))}all(r,s,i,n){var d,a,l,u,c;return h(this,void 0,void 0,(function*(){const p=this.model(),g=Object.assign({},i||{});g.where=Object.assign({},g.where||{});const y=null===(d=r.query.limit)||void 0===d?void 0:d.toString();y&&(g.limit=parseInt(y));const h=null===(a=r.query.offset)||void 0===a?void 0:a.toString();h&&(g.offset=parseInt(h));const m=Object.keys(p.getAttributes()),A=[],I=null===(l=r.query.asc)||void 0===l?void 0:l.toString();I&&I.length&&I.split(",").forEach((e=>{m.indexOf(e)>=0&&A.push([e,"ASC"])}));const _=null===(u=r.query.desc)||void 0===u?void 0:u.toString();_&&_.length&&_.split(",").forEach((e=>{m.indexOf(e)>=0&&A.push([e,"DESC"])})),A.length&&(g.order=A);const v=[],O=t.isArray(g.attributes)?g.attributes:m,P=null===(c=r.query.search)||void 0===c?void 0:c.toString();O.forEach((e=>{var s;if(t.isString(e)&&(P&&P.length&&v.push({[e]:{[o.Op.like]:`%${P}%`}}),"search_"+e in r.query)){const t=null===(s=r.query["search_"+e])||void 0===s?void 0:s.toString();t&&t.length&&v.push({[e]:{[o.Op.like]:`%${t}%`}})}})),v.length&&(g.where=Object.assign(Object.assign({},g.where),{[o.Op.or]:[...v]}));const S=(yield p.count(Object.assign(Object.assign({},g),{col:m[0]})).catch(this.error))||0,f=yield p.findAll(g).catch(this.error);if(f)return e.Responses.data(s,{count:S,records:n?yield n(f):f}),f;e.Responses.error(s,"Internal Server Error")}))}del(t,r,o){return h(this,void 0,void 0,(function*(){const s=this.key(),{[s]:i}=t.params;if(!i)return e.Responses.error(r,"Internal Server Error"),0;const n=yield this.model().destroy(Object.assign(Object.assign({},o||{}),{where:Object.assign(Object.assign({},(o||{}).where),{[s]:i})})).catch(this.error);return n?(e.Responses.success(r,"OK"),n):(e.Responses.notfound(r,"Record not found"),0)}))}error(e){e.sql?b.error(e.message+"\n"+e.sql,"api.controller.sql",m.API_CONSOLE_ERROR):super.error(e)}get(t,r,o,s){return h(this,void 0,void 0,(function*(){const i=this.key(),{[i]:n}=t.params,d=yield this.model().findOne(Object.assign(Object.assign({},o||{}),{where:Object.assign(Object.assign({},(o||{}).where),{[i]:n})})).catch(this.error);if(d)return e.Responses.data(r,s?yield s(d):d.toJSON()),d;null!==d?e.Responses.error(r,"Internal Server Error"):e.Responses.notfound(r,"Record not found")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}set(t,r,o,s){return h(this,void 0,void 0,(function*(){const i=this.key(),{[i]:n}=t.params,[d]=(yield this.model().update(Object.assign(Object.assign({},t.body),s||{}),Object.assign(Object.assign({},o||{}),{where:Object.assign(Object.assign({},(o||{}).where),{[i]:n})})).catch(this.error))||[];return d?(e.Responses.success(r,"OK"),!0):(e.Responses.success(r,"Record not changed"),!1)}))}},exports.ModelController=p([e.Extends(U)],exports.ModelController),exports.CrudController=class extends exports.ModelController{create(){return{}}recordAdd(e,t){this.add(e,t)}recordAll(e,t){this.all(e,t)}recordDel(e,t){this.del(e,t)}recordGet(e,t){this.get(e,t)}recordSet(e,t){this.set(e,t)}update(){return{}}validationAdd(e,t,r){this.validation(e,t,r,this.create())}validationSet(e,t,r){this.validation(e,t,r,this.update())}},p([e.Post(),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationAdd"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordAdd",null),p([e.Get(),e.Middleware("auth"),e.Middleware("read"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordAll",null),p([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordDel",null),p([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordGet",null),p([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validationSet"),g(0,e.Req()),g(1,e.Res()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.CrudController.prototype,"recordSet",null),p([g(0,e.Req()),g(1,e.Res()),g(2,e.Next()),y("design:type",Function),y("design:paramtypes",[Object,Object,Function]),y("design:returntype",void 0)],exports.CrudController.prototype,"validationAdd",null),p([g(0,e.Req()),g(1,e.Res()),g(2,e.Next()),y("design:type",Function),y("design:paramtypes",[Object,Object,Function]),y("design:returntype",void 0)],exports.CrudController.prototype,"validationSet",null),exports.CrudController=p([e.Extends(exports.ModelController)],exports.CrudController),exports.GroupsController=class extends exports.CrudController{model(){return 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 P}recordAll(e,t,r){return h(this,void 0,void 0,(function*(){this.all(e,t,{where:{groupId:r},include:[{model:f,required:!0}]},(e=>e.map((e=>e.route))))}))}recordSet(r,o,s){return h(this,void 0,void 0,(function*(){const i=yield O.findByPk(o,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield P.destroy({where:{groupId:t}}),s){let e=0;for(let r=0;r<s.length;r++)e=yield f.count({where:{id:s[r]}}),e&&(yield P.create({groupId:t,routeId:s[r]}))}e.Responses.success(r,"OK")}else t.isNull(i)?e.Responses.notfound(r,"Record not found"):e.Responses.error(r,"Internal Server Error")}))}},p([e.Get("/:id/routes"),e.Middleware("auth"),e.Middleware("read","groups"),g(0,e.Req()),g(1,e.Res()),g(2,e.Params("id")),y("design:type",Function),y("design:paramtypes",[Object,Object,String]),y("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"recordAll",null),p([e.Put("/:id/routes"),e.Middleware("auth"),e.Middleware("write","groups"),e.Middleware("validation",{routes:t.Validation.array(t.Validation.number().parse())}),g(0,e.Res()),g(1,e.Params("id")),g(2,e.Body("routes")),y("design:type",Function),y("design:paramtypes",[Object,String,Array]),y("design:returntype",Promise)],exports.GroupsRoutesController.prototype,"recordSet",null),exports.GroupsRoutesController=p([e.Controller("/groups"),e.Extends(exports.ModelController)],exports.GroupsRoutesController),exports.LogsController=class extends exports.ModelController{model(){return T}recordAll(e,t,r,o){const s={};r&&(s.type=r),o&&(s.source=o),this.all(e,t,{where:s,order:[["created","DESC"]]})}},p([e.Get(),e.Middleware("auth"),e.Middleware("read"),g(0,e.Req()),g(1,e.Res()),g(2,e.Query("type")),g(3,e.Query("source")),y("design:type",Function),y("design:paramtypes",[Object,Object,String,String]),y("design:returntype",void 0)],exports.LogsController.prototype,"recordAll",null),exports.LogsController=p([e.Controller("/logs"),e.Extends(exports.ModelController)],exports.LogsController),exports.RegisterController=class extends U{register(e,r,s){return h(this,void 0,void 0,(function*(){yield t.sleep(m.API_SLEEP_REGISTRY);const{name:i,date:n,email:d,username:a,password:l,confirm:u}=r,p=a||d,g=c.SHA256(l).toString();if(yield E.count({where:{[o.Op.or]:[{email:d},{username:p}]}}).catch(this.error))return void e.validation("Invalid email or username");if(g!=c.SHA256(u).toString())return void e.error("Invalid password");const y=yield E.create({name:i,date:n,email:d,username:p,password:g,state:!1}).catch(this.error);if(!y)return void e.error("Internal Server Error");const h=yield S.create({token:yield this.getId(),userId:y.id,state:!0}).catch(this.error);if(!h)return y.destroy(),void e.error("Internal Server Error");e.success("OK"),s.emit("register.user",{ctx:e,register:h,user:y}),this.emit("register.user",{ctx:e,register:h,user:y})}))}confirm(e,t,r){return h(this,void 0,void 0,(function*(){const o=yield S.findOne({where:{token:t,state:!0},include:[{model:E,required:!0}]}).catch(this.error);o?(o.state=!1,yield o.save().catch(this.error),o.user.state=!0,yield o.user.save().catch(this.error),e.success("OK"),r.emit("register.confirm",{ctx:e,register:o,user:o.user}),this.emit("register.confirm",{ctx:e,register:o,user:o.user})):e.notFound("User not found")}))}send(e,t,r){return h(this,void 0,void 0,(function*(){const s=t,i=yield S.findOne({where:{state:!0},include:[{model:E,required:!0,where:{[o.Op.or]:[{email:s},{username:t}]}}]}).catch(this.error);i?(e.success("OK"),r.emit("register.send",{ctx:e,register:i,user:i.user}),this.emit("register.send",{ctx:e,register:i,user:i.user})):e.notFound("User not found")}))}getId(){return h(this,void 0,void 0,(function*(){const e=t.uuidv4();return(yield S.count({where:{token:e}}))?this.getId():e}))}},p([e.Post(),e.Middleware("validation",{name:t.Validation.string().required(),date:t.Validation.string().date().required(),email:t.Validation.string().email().required(),username:t.Validation.string().empty(),password:t.Validation.string().min(5).required(),confirm:t.Validation.string().min(5).required()}),g(0,e.Ctx()),g(1,e.Body()),g(2,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,Object,j]),y("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),p([e.Post("/confirm"),e.Middleware("validation",{token:t.Validation.string().required()}),g(0,e.Ctx()),g(1,e.Body("token")),g(2,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,String,j]),y("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),p([e.Post("/send"),e.Middleware("validation",{username:t.Validation.string().required()}),g(0,e.Ctx()),g(1,e.Body("username")),g(2,e.App()),y("design:type",Function),y("design:paramtypes",[e.Context,String,j]),y("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=p([e.Controller("/register"),e.Extends(U)],exports.RegisterController),exports.RoutesController=class extends exports.CrudController{model(){return f}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 U{setup(r){return h(this,void 0,void 0,(function*(){if(0==(yield E.count())){const e={description:"",state:!0},r=yield E.create(Object.assign({name:"Admin",email:"admin@localhost",username:"admin",password:"8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918",avatar:""},e)),o=yield O.create(Object.assign({name:"admin"},e));yield R.create({userId:r.id,groupId:o.id});const s=["read","write"],i=["users","groups","routes"];yield t.forEachSeries(i,(r=>h(this,void 0,void 0,(function*(){yield t.forEachSeries(s,(t=>h(this,void 0,void 0,(function*(){const s=r+"."+t,i=yield f.create(Object.assign({name:s},e));yield P.create({groupId:o.id,routeId:i.id})}))))}))));const n=yield f.create(Object.assign({name:"logs.read"},e));yield P.create({groupId:o.id,routeId:n.id})}e.Responses.success(r,"OK")}))}},p([e.Get(),g(0,e.Res()),y("design:type",Function),y("design:paramtypes",[Object]),y("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=p([e.Controller("/setup"),e.Extends(U)],exports.SetupController),exports.UsersController=class extends exports.ModelController{model(){return E}recordAdd(e,t,r){this.add(r,e,{},{password:c.SHA256(t).toString()})}recordAll(e,t){this.all(t,e)}recordDel(t,r,o,s){o&&o.id.toString()!=s?this.del(r,t):e.Responses.error(t,"Internal Server Error")}recordGet(e,t){this.get(t,e)}recordSet(e,t,r){this.set(r,e,{where:{}},t?{password:c.SHA256(t).toString()}:{})}},p([e.Post(),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validation",{name:t.Validation.string().required(),email:t.Validation.string().email().required(),username:t.Validation.string().min(4).required(),password:t.Validation.string().min(5).required(),description:t.Validation.string().empty(""),state:t.Validation.boolean().parse().required()}),g(0,e.Res()),g(1,e.Body("password")),g(2,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,String,Object]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordAdd",null),p([e.Get(),e.Middleware("auth"),e.Middleware("read"),g(0,e.Res()),g(1,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordAll",null),p([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("write"),g(0,e.Res()),g(1,e.Req()),g(2,G()),g(3,e.Params("id")),y("design:type",Function),y("design:paramtypes",[Object,Object,E,String]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordDel",null),p([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),g(0,e.Res()),g(1,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,Object]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordGet",null),p([e.Put("/:id"),e.Middleware("auth"),e.Middleware("write"),e.Middleware("validation",{name:t.Validation.string().empty(),email:t.Validation.string().email().empty(),username:t.Validation.string().min(4).empty(),password:t.Validation.string().min(5).empty().filter(""),description:t.Validation.string().empty(),state:t.Validation.boolean().parse().empty()}),g(0,e.Res()),g(1,e.Body("password")),g(2,e.Req()),y("design:type",Function),y("design:paramtypes",[Object,String,Object]),y("design:returntype",void 0)],exports.UsersController.prototype,"recordSet",null),exports.UsersController=p([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersController),exports.UsersGroupsController=class extends exports.ModelController{model(){return R}recordAll(e,t,r){this.all(t,e,{where:{userId:r},include:[{model:O,required:!0}]},(e=>e.map((e=>e.group))))}recordSet(r,o,s){return h(this,void 0,void 0,(function*(){const i=yield E.findByPk(o,{attributes:["id"]}).catch(this.error);if(i){if(yield R.destroy({where:{userId:i.id}}),s){let e=0;for(let t=0;t<s.length;t++)e=yield O.count({where:{id:s[t]}}),e&&(yield R.create({userId:i.id,groupId:s[t]}))}e.Responses.success(r,"OK")}else t.isNull(i)?e.Responses.notfound(r,"Record not found"):e.Responses.error(r,"Internal Server Error")}))}},p([e.Get("/:id/groups"),e.Middleware("auth"),e.Middleware("read","users"),g(0,e.Res()),g(1,e.Req()),g(2,e.Params("id")),y("design:type",Function),y("design:paramtypes",[Object,Object,String]),y("design:returntype",void 0)],exports.UsersGroupsController.prototype,"recordAll",null),p([e.Put("/:id/groups"),e.Middleware("auth"),e.Middleware("write","users"),e.Middleware("validation",{groups:t.Validation.array(t.Validation.number().parse())}),g(0,e.Res()),g(1,e.Params("id")),g(2,e.Body("groups")),y("design:type",Function),y("design:paramtypes",[Object,String,Array]),y("design:returntype",Promise)],exports.UsersGroupsController.prototype,"recordSet",null),exports.UsersGroupsController=p([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersGroupsController),exports.Application=j,exports.Auth=_,exports.Config=B,exports.Configs=x,exports.ControllerBase=U,exports.Database=A,exports.Env=m,exports.Forgot=v,exports.Group=O,exports.GroupRoute=P,exports.Log=T,exports.Logs=b,exports.Permission=H,exports.Register=S,exports.ReqAuth=L,exports.ReqFiles=k,exports.ReqUser=G,exports.Route=f,exports.Session=w,exports.Token=F,exports.User=E,exports.UserGroup=R,exports.crt=N,exports.key=M,exports.sequelize=I;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/api v3.0.
|
|
2
|
+
* @andrewcaires/api v3.0.14
|
|
3
3
|
* Simple api for small applications using express, jsonwebtoken, sequelize and websocket
|
|
4
|
-
* (c)
|
|
4
|
+
* (c) 2024 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
6
6
|
*/
|
|
7
|
-
import { IStore, Application as Application$1 } from '@andrewcaires/express';
|
|
7
|
+
import { IStore, Application as Application$1, Context } from '@andrewcaires/express';
|
|
8
8
|
import WebSocket from 'ws';
|
|
9
9
|
import { TypeObjectAny, EventEmitter, TypeObject, ValidationBase, TypeObjectString } from '@andrewcaires/utils.js';
|
|
10
10
|
import { Request, Response, NextFunction } from 'express';
|
|
@@ -48,6 +48,7 @@ declare class User extends Model {
|
|
|
48
48
|
username: string;
|
|
49
49
|
password: string;
|
|
50
50
|
avatar: string;
|
|
51
|
+
date: string;
|
|
51
52
|
description: string;
|
|
52
53
|
state: boolean;
|
|
53
54
|
users_groups: Array<UserGroup>;
|
|
@@ -82,10 +83,9 @@ declare class Log extends Model {
|
|
|
82
83
|
message: string;
|
|
83
84
|
}
|
|
84
85
|
|
|
85
|
-
declare class
|
|
86
|
+
declare class Register extends Model {
|
|
86
87
|
id: number;
|
|
87
88
|
token: string;
|
|
88
|
-
timestamp: number;
|
|
89
89
|
state: boolean;
|
|
90
90
|
user: User;
|
|
91
91
|
userId: number;
|
|
@@ -163,17 +163,17 @@ declare class Config {
|
|
|
163
163
|
}
|
|
164
164
|
|
|
165
165
|
declare class AuthController extends ControllerBase {
|
|
166
|
-
protected login(
|
|
167
|
-
protected logout(
|
|
168
|
-
protected renew(
|
|
169
|
-
protected update(
|
|
170
|
-
protected user(
|
|
166
|
+
protected login(ctx: Context, useragent: string, username: string, password: string, app: Application): Promise<void>;
|
|
167
|
+
protected logout(ctx: Context, auth: Auth, user: User, app: Application): Promise<void>;
|
|
168
|
+
protected renew(ctx: Context, useragent: string, old: string, app: Application): Promise<void>;
|
|
169
|
+
protected update(ctx: Context, oldPassword: string, newPassword: string, user: User): Promise<void>;
|
|
170
|
+
protected user(ctx: Context, user: User): Promise<void>;
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
declare class ForgotController extends ControllerBase {
|
|
174
174
|
check(res: Response, req: Request): Promise<void>;
|
|
175
|
-
forgot(
|
|
176
|
-
reset(
|
|
175
|
+
forgot(ctx: Context, username: string, app: Application): Promise<void>;
|
|
176
|
+
reset(ctx: Context, token: string, password: string, app: Application): Promise<void>;
|
|
177
177
|
private findOne;
|
|
178
178
|
}
|
|
179
179
|
|
|
@@ -221,8 +221,10 @@ declare class LogsController extends ModelController<Log> {
|
|
|
221
221
|
}
|
|
222
222
|
|
|
223
223
|
declare class RegisterController extends ControllerBase {
|
|
224
|
-
|
|
225
|
-
|
|
224
|
+
protected register(ctx: Context, body: TypeObjectAny, app: Application): Promise<void>;
|
|
225
|
+
confirm(ctx: Context, token: string, app: Application): Promise<void>;
|
|
226
|
+
send(ctx: Context, username: string, app: Application): Promise<void>;
|
|
227
|
+
private getId;
|
|
226
228
|
}
|
|
227
229
|
|
|
228
230
|
declare class RoutesController extends CrudController<Route> {
|
|
@@ -287,6 +289,7 @@ declare class Env {
|
|
|
287
289
|
static readonly API_SESSION_SECRET: string;
|
|
288
290
|
static readonly API_TOKEN_CRT: string;
|
|
289
291
|
static readonly API_TOKEN_KEY: string;
|
|
292
|
+
static readonly API_TOKEN_FORGOT: number;
|
|
290
293
|
static readonly API_TOKEN_HEADER: string;
|
|
291
294
|
static readonly API_TOKEN_LIFETIME: number;
|
|
292
295
|
static readonly API_TOKEN_RENEW: number;
|
|
@@ -295,10 +298,10 @@ declare class Env {
|
|
|
295
298
|
static readonly API_UPLOAD_SIZE: number;
|
|
296
299
|
static readonly API_UPLOAD_TEMP: string;
|
|
297
300
|
static readonly API_WEBSOCKET_START: boolean;
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
301
|
+
protected static getBool(key: string, value: boolean): boolean;
|
|
302
|
+
protected static getInt(key: string, value: number): number;
|
|
303
|
+
protected static getMs(key: string, value: string): number;
|
|
304
|
+
protected static getString(key: string, value: string): string;
|
|
302
305
|
}
|
|
303
306
|
|
|
304
307
|
declare const ReqAuth: (key?: string | undefined) => ParameterDecorator;
|
|
@@ -348,4 +351,4 @@ declare class Token {
|
|
|
348
351
|
private static verify;
|
|
349
352
|
}
|
|
350
353
|
|
|
351
|
-
export { Application, Auth, AuthController, Config, Configs, ControllerBase, CrudController, Database, Env, Forgot, ForgotController, Group, GroupRoute, GroupsController, GroupsRoutesController, type IDatabaseOptions, type ITokenParameters, type IUploadOptions, Log, Logs, LogsColor, LogsController, type LogsTypes, ModelController, Permission,
|
|
354
|
+
export { Application, Auth, AuthController, Config, Configs, ControllerBase, CrudController, Database, Env, Forgot, ForgotController, Group, GroupRoute, GroupsController, GroupsRoutesController, type IDatabaseOptions, type ITokenParameters, type IUploadOptions, Log, Logs, LogsColor, LogsController, type LogsTypes, ModelController, Permission, Register, RegisterController, ReqAuth, ReqFiles, ReqUser, Route, RoutesController, Session, SetupController, Token, User, UserGroup, UsersController, UsersGroupsController, crt, key, sequelize };
|
package/dist/index.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/api v3.0.
|
|
2
|
+
* @andrewcaires/api v3.0.14
|
|
3
3
|
* Simple api for small applications using express, jsonwebtoken, sequelize and websocket
|
|
4
|
-
* (c)
|
|
4
|
+
* (c) 2024 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
6
6
|
*/
|
|
7
|
-
import{Application as e,parameterFactory as t,Req as r,Res as i,Headers as n,Next as s,Session as o,Argument as d,Responses as a,Post as c,Middleware as u,Body as l,App as p,Get as g,Controller as m,Extends as y,Delete as h,Put as _,Params as I,Query as O}from"@andrewcaires/express";import{toBool as A,parseMs as v,dateFormat as P,noop as f,loop as E,uuidv4 as S,sleep as T,toArray as b,EventEmitter as w,isNumber as R,Validation as j,uniqueID as N,isArray as D,isString as F,isNull as B,forEachSeries as q}from"@andrewcaires/utils.js";import k from"ws";import{Sequelize as L,DataTypes as x,Model as C,Op as K}from"sequelize";import{config as G}from"dotenv";import{existsSync as M,readFileSync as H}from"fs";import{Store as U}from"express-session";import{verify as z,sign as X}from"jsonwebtoken";import{extension as Y}from"mime-types";import W from"multer";import{join as Z}from"path";import{SHA256 as J}from"crypto-js";function $(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o}function V(e,t){return function(r,i){t(r,i,e)}}function Q(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function ee(e,t,r,i){return new(r||(r=Promise))((function(n,s){function o(e){try{a(i.next(e))}catch(e){s(e)}}function d(e){try{a(i.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,d)}a((i=i.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,G();class te{static getBool(e,t){return A(te.getString(e,t.toString()))}static getInt(e,t){return parseInt(te.getString(e,t.toString()))}static getMs(e,t){return v(te.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}te.API_CONSOLE_ERROR=te.getBool("API_CONSOLE_ERROR",!1),te.API_DEFAULT_PATH=te.getString("API_DEFAULT_PATH","/api"),te.API_DB_DATABASE=te.getString("API_DB_DATABASE",""),te.API_DB_HOST=te.getString("API_DB_HOST","127.0.0.1"),te.API_DB_PASSWORD=te.getString("API_DB_PASSWORD",""),te.API_DB_PORT=te.getInt("API_DB_PORT",3306),te.API_DB_TYPE=te.getString("API_DB_TYPE",""),te.API_DB_USERNAME=te.getString("API_DB_USERNAME","root"),te.API_DB_LOG=te.getBool("API_DB_LOG",!1),te.API_DB_PREFIX=te.getString("API_DB_PREFIX",""),te.API_DB_TIMEZONE=te.getString("API_DB_TIMEZONE","+00:00"),te.API_HTTP_CRT=te.getString("API_HTTP_CRT",""),te.API_HTTP_KEY=te.getString("API_HTTP_KEY",""),te.API_HTTP_PORT=te.getInt("API_HTTP_PORT",3e3),te.API_HTTP_PUBLIC=te.getString("API_HTTP_PUBLIC",""),te.API_HTTP_CROSS=te.getBool("API_HTTP_CROSS",!1),te.API_HTTP_HYBRID=te.getBool("API_HTTP_HYBRID",!1),te.API_HTTP_REDIRECT=te.getString("API_HTTP_REDIRECT",""),te.API_SLEEP_AUTH=te.getMs("API_SLEEP_AUTH","2s"),te.API_SLEEP_FORGOT=te.getMs("API_SLEEP_FORGOT","5s"),te.API_SLEEP_REGISTRY=te.getMs("API_SLEEP_REGISTRY","5s"),te.API_SESSION_NAME=te.getString("API_SESSION_NAME","session.id"),te.API_SESSION_LIFETIME=te.getMs("API_SESSION_LIFETIME","1d"),te.API_SESSION_SECRET=te.getString("API_SESSION_SECRET","yoursecret"),te.API_TOKEN_CRT=te.getString("API_TOKEN_CRT",""),te.API_TOKEN_KEY=te.getString("API_TOKEN_KEY",""),te.API_TOKEN_HEADER=te.getString("API_TOKEN_HEADER","authorization"),te.API_TOKEN_LIFETIME=te.getMs("API_TOKEN_LIFETIME","1d"),te.API_TOKEN_RENEW=te.getMs("API_TOKEN_RENEW","1d"),te.API_UPLOAD_COUNT=te.getInt("API_UPLOAD_COUNT",1),te.API_UPLOAD_FIELD=process.env.API_UPLOAD_FIELD||"upload",te.API_UPLOAD_SIZE=te.getInt("API_UPLOAD_SIZE",2),te.API_UPLOAD_TEMP=te.getString("API_UPLOAD_TEMP","./temp"),te.API_WEBSOCKET_START=te.getBool("API_WEBSOCKET_START",!1);class re{static connect(e){const t="connect_"+te.API_DB_TYPE.toLowerCase();if(t in re)return re[t](e);throw new Error("No database is connected to this API")}static connect_mariadb(e){return new L(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mariadb",logging:te.API_DB_LOG,define:{timestamps:!1},timezone:te.API_DB_TIMEZONE})}static connect_memory(){return new L("sqlite::memory:",{logging:te.API_DB_LOG,define:{timestamps:!1},timezone:te.API_DB_TIMEZONE})}static connect_mysql(e){return new L(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mysql",logging:te.API_DB_LOG,define:{timestamps:!1},timezone:te.API_DB_TIMEZONE})}static connect_postgres(e){return new L(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"postgres",logging:te.API_DB_LOG,define:{timestamps:!1},timezone:te.API_DB_TIMEZONE})}static connect_sqlite(e){return new L({dialect:"sqlite",storage:e.database,logging:te.API_DB_LOG,define:{timestamps:!1},timezone:te.API_DB_TIMEZONE})}}const ie=re.connect({database:te.API_DB_DATABASE,username:te.API_DB_USERNAME,password:te.API_DB_PASSWORD,hostname:te.API_DB_HOST,hostport:te.API_DB_PORT});class ne extends C{}ne.init({secret:x.STRING,logout:x.DATE,useragent:x.STRING},{sequelize:ie,modelName:te.API_DB_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class se extends C{}se.init({token:x.STRING,timestamp:x.BIGINT,state:x.BOOLEAN},{sequelize:ie,modelName:te.API_DB_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class oe extends C{}oe.init({name:x.STRING,description:x.TEXT,state:x.BOOLEAN},{sequelize:ie,modelName:te.API_DB_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class de extends C{}de.init({},{sequelize:ie,modelName:te.API_DB_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),de.removeAttribute("id");class ae extends C{}ae.init({name:x.STRING,description:x.TEXT,state:x.BOOLEAN},{sequelize:ie,modelName:te.API_DB_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class ce extends C{}ce.init({name:x.STRING,email:x.STRING,username:x.STRING,password:x.STRING,avatar:x.STRING,description:x.TEXT,state:x.BOOLEAN},{sequelize:ie,modelName:te.API_DB_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated",defaultScope:{attributes:{exclude:["password"]}},scopes:{password:{attributes:{include:["password"]}}}});class ue extends C{}ue.init({},{sequelize:ie,modelName:te.API_DB_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),ue.removeAttribute("id");class le extends C{}le.init({key:x.STRING,value:x.STRING},{sequelize:ie,modelName:te.API_DB_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),le.removeAttribute("id");class pe extends C{}pe.init({type:x.STRING,source:x.STRING,message:x.TEXT},{sequelize:ie,modelName:te.API_DB_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class ge extends C{}ge.init({token:x.STRING,timestamp:x.BIGINT,state:x.BOOLEAN},{sequelize:ie,modelName:te.API_DB_PREFIX+"registry",timestamps:!0,createdAt:"created",updatedAt:"updated"});class me extends C{}var ye;me.init({session:x.STRING,json:x.TEXT,expired:x.BIGINT},{sequelize:ie,modelName:te.API_DB_PREFIX+"session",timestamps:!0,createdAt:"created",updatedAt:"updated"}),me.removeAttribute("id"),ce.hasMany(ne),ne.belongsTo(ce),ce.hasMany(se),se.belongsTo(ce),oe.hasMany(de),de.belongsTo(oe),ae.hasMany(de),de.belongsTo(ae),ce.hasMany(ue),ue.belongsTo(ce),oe.hasMany(ue),ue.belongsTo(oe),function(e){e.ERROR="[31m",e.INFO="[36m",e.NONE="[37m",e.SUCCESS="[32m",e.WARNING="[33m"}(ye||(ye={}));class he{static write(e,t,r){return ee(this,void 0,void 0,(function*(){yield he.writeRaw(ye.NONE,"",e,t,r)}))}static error(e,t,r){return ee(this,void 0,void 0,(function*(){yield he.writeRaw(ye.ERROR,"error",e,t,r)}))}static info(e,t,r){return ee(this,void 0,void 0,(function*(){yield he.writeRaw(ye.INFO,"info",e,t,r)}))}static success(e,t,r){return ee(this,void 0,void 0,(function*(){yield he.writeRaw(ye.ERROR,"success",e,t,r)}))}static warning(e,t,r){return ee(this,void 0,void 0,(function*(){yield he.writeRaw(ye.WARNING,"warning",e,t,r)}))}static writeConsole(e,t,r){const i=P(new Date,"%H:%M:%S");console.log(">",e,t+" ".repeat(10-t.length),"[37m","|",i,"|",r)}static writeRaw(e,t,r,i,n){return ee(this,void 0,void 0,(function*(){n&&he.writeConsole(e,t,r),ie&&(yield pe.create({type:t,source:i,message:r}).catch((()=>null)))}))}}const _e=e=>M(e)?H(e):void 0,Ie={http:_e(te.API_HTTP_CRT),token:_e(te.API_TOKEN_CRT)},Oe={http:_e(te.API_HTTP_KEY),token:_e(te.API_TOKEN_KEY)};class Ae extends U{constructor(){super(),this.all=e=>ee(this,void 0,void 0,(function*(){e=e||f;const t=yield me.findAll({attributes:["session"],where:{expired:{[K.gte]:Date.now()}}}).catch((t=>(e(t),null)));t&&e(null,t.map((e=>e.session))),e()})),this.clear=e=>ee(this,void 0,void 0,(function*(){yield me.destroy().catch(f),e&&e()})),this.destroy=(e,t)=>ee(this,void 0,void 0,(function*(){yield me.destroy({where:{session:e}}).catch(f),t&&t()})),this.expired=()=>ee(this,void 0,void 0,(function*(){yield me.destroy({where:{expired:{[K.lt]:Date.now()}}}).catch(f)})),this.get=(e,t)=>ee(this,void 0,void 0,(function*(){t=t||f;const r=yield me.findOne({where:{session:e,expired:{[K.gte]:Date.now()}}}).catch((e=>(t(e),null)));if(r){const e=JSON.parse(r.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield r.destroy().catch(f),void t(null)}t(null,e)}else t(null)})),this.length=e=>ee(this,void 0,void 0,(function*(){e&&e(null,(yield me.count().catch(f))||0)})),this.set=(e,t,r)=>ee(this,void 0,void 0,(function*(){r=r||f;const i=Date.now()+te.API_SESSION_LIFETIME,n=JSON.stringify(t),[s,o]=(yield me.findOrCreate({where:{session:e},defaults:{session:e,json:n,expired:i}}).catch(f))||[];s&&(o||(s.json=n,s.expired=i,yield s.save().catch(f))),r()})),this.loop=E(this.expired,3e4),this.loop.start()}}class ve{static create(e){return ee(this,void 0,void 0,(function*(){if(!Oe.token)return{error:"Key not found"};const{id:t}=e,r=S(),i=yield ne.create({secret:r,userId:t}).catch(ve.error);if(!i)return{error:"Internal Server Error"};return{auth:i,token:X({id:t,secret:r},Oe.token,ve.options())}}))}static destroy(e){return ee(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){he.error(e.message,"api.token",te.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:te.API_TOKEN_LIFETIME+"ms"}}static renew(e){return ee(this,void 0,void 0,(function*(){if(!Oe.token)return{error:"Key not found"};const{error:t,decode:r}=ve.verify(e,te.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield ce.findOne({where:{id:e,state:!0}}).catch(ve.error);if(r){const i=yield ne.findOne({where:{secret:t,userId:r.id}}).catch(ve.error);if(i&&!i.logout){i.secret=S(),yield i.save().catch(ve.error);return{auth:i,token:X({id:e,secret:i.secret},Oe.token,ve.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e){return ee(this,void 0,void 0,(function*(){const{error:t,decode:r}=ve.verify(e);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield ce.findOne({where:{id:e,state:!0}}).catch(ve.error);if(r){const e=yield ne.findOne({where:{secret:t,userId:r.id}}).catch(ve.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!Ie.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:z(e,Ie.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class Pe extends e{constructor(e){super(e,{cert:Ie.http,cross:te.API_HTTP_CROSS,hybrid:te.API_HTTP_HYBRID,key:Oe.http,path:te.API_DEFAULT_PATH,port:te.API_HTTP_PORT,public:te.API_HTTP_PUBLIC,redirect:te.API_HTTP_REDIRECT,session:{store:new Ae,name:te.API_SESSION_NAME,secret:te.API_SESSION_SECRET,cookie:{maxAge:te.API_SESSION_LIFETIME},genid:S}})}error(e,t){he.info(e.message,t,te.API_CONSOLE_ERROR)}log(e,t){he.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return ee(this,void 0,void 0,(function*(){yield ie.sync(),yield e.listen.call(this),te.API_WEBSOCKET_START&&this.server&&(this._webSocket=new k.Server({server:this.server,verifyClient:(e,t)=>t(te.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>ee(this,void 0,void 0,(function*(){t.url||(t.url="");const r=t.url.length<=1?"":t.url.replace(/\//g,".");let i;e.on("message",(n=>ee(this,void 0,void 0,(function*(){if(i)try{const s=JSON.parse(n);this.emit("ws.message"+r,{data:s,message:n,req:t,user:i,ws:e})}catch(s){this.emit("ws.message"+r,{message:n,req:t,user:i,ws:e})}else{const{user:s}=yield ve.user(n.toString());s&&(i=s,this.emit("ws.connection"+r,{req:t,user:i,ws:e}))}i||e.close()})))),e.on("close",(()=>{i&&this.emit("ws.close"+r,{user:i,ws:e})})),yield T(2e3),i||e.close()})))))}))}websocket(){return this._webSocket}}class fe{static all(){return ee(this,void 0,void 0,(function*(){const e=yield le.findAll().catch(fe.error),t={};return e&&e.forEach((e=>{t[e.key]=e.value})),t}))}static del(e){return ee(this,void 0,void 0,(function*(){return((yield le.destroy({where:{key:e}}).catch(fe.error))||0)>0}))}static error(e){he.error(e.message,"api.config",te.API_CONSOLE_ERROR)}static get(e){return ee(this,void 0,void 0,(function*(){const t=yield le.findOne({where:{key:e}}).catch(fe.error);return t&&t.value||""}))}static set(e,t){return ee(this,void 0,void 0,(function*(){const[r]=(yield le.findOrCreate({where:{key:e}}).catch(fe.error))||[];r&&(r.value=t,yield r.save().catch(fe.error))}))}}const Ee=t((({req:e})=>e.auth)),Se=t((({req:e})=>b(e.files))),Te=t((({req:e})=>e.user));class be{static all(e,t){return ee(this,void 0,void 0,(function*(){return yield ae.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:de,required:!0,include:[{model:oe,required:!0,where:{state:!0},include:[{model:ue,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{he.error(e.message,"api.permission",te.API_CONSOLE_ERROR)}))}))}static get(e){return ee(this,void 0,void 0,(function*(){const t=yield be.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return ee(this,void 0,void 0,(function*(){const r=yield be.all(e,{name:t});return!!r&&r.length>0}))}}class we extends w{auth(e,t,r,i,n){return ee(this,void 0,void 0,(function*(){const{auth:s,error:o,user:d}=yield ve.user(r);o?a.error(t,o):s&&d?s.useragent==i?(e.auth=s,e.user=d,n()):a.error(t,"Invalid token"):a.error(t,"Internal Server Error")}))}session(e,t,r){return ee(this,void 0,void 0,(function*(){t.auth&&t.user&&(t.useragent?t.useragent!=e&&t.regenerate(f):(t.useragent=e,t.save(f))),r()}))}error(e){he.error(e.message,"api.controller",te.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r,i){return ee(this,void 0,void 0,(function*(){i?(yield be.is(i,r))?t():a.error(e,"Unauthorized access"):a.unauthorized(e,"Access denied")}))}read(e,t,r,i){return this.permission(t,r,(i||this.name())+".read",e)}upload(e,t,r,i){const n=(null==i?void 0:i.path)||te.API_UPLOAD_TEMP,s=W.diskStorage({destination:(e,t,r)=>r(null,n),filename:(e,t,r)=>ee(this,void 0,void 0,(function*(){return r(null,this.uploadFile(n,Y(t.mimetype)||"bin"))}))}),o=1e6*((null==i?void 0:i.size)||te.API_UPLOAD_SIZE),d=W({storage:s,fileFilter(e,t,r){var n;return ee(this,void 0,void 0,(function*(){const e=null===(n=null==i?void 0:i.types)||void 0===n?void 0:n.indexOf(t.mimetype);return R(e)&&e<0?r(new Error("File type not allowed")):r(null,!0)}))},limits:{fileSize:o}}),c=(null==i?void 0:i.count)||te.API_UPLOAD_COUNT,u=(null==i?void 0:i.field)||te.API_UPLOAD_FIELD;d.array(u,c)(e,t,(e=>e?a.error(t,e.message):r()))}uploadFile(e,t){const r=S()+"."+t;return M(Z(e,r))?this.uploadFile(e,t):r}validation(e,t,r,i){return ee(this,void 0,void 0,(function*(){const{error:n,value:s}=yield j.object(i).parse().validateAsync(e.body);n?a.validation(t,n):(e.body=s,r())}))}write(e,t,r,i){return this.permission(e,t,(r||this.name())+".write",i)}}$([V(0,r()),V(1,i()),V(2,n(te.API_TOKEN_HEADER)),V(3,n("user-agent")),V(4,s()),Q("design:type",Function),Q("design:paramtypes",[Object,Object,String,String,Function]),Q("design:returntype",Promise)],we.prototype,"auth",null),$([V(0,n("user-agent")),V(1,o()),V(2,s()),Q("design:type",Function),Q("design:paramtypes",[String,Object,Function]),Q("design:returntype",Promise)],we.prototype,"session",null),$([V(0,i()),V(1,s()),V(2,d()),V(3,Te()),Q("design:type",Function),Q("design:paramtypes",[Object,Function,String,ce]),Q("design:returntype",Promise)],we.prototype,"permission",null),$([V(0,Te()),V(1,i()),V(2,s()),V(3,d()),Q("design:type",Function),Q("design:paramtypes",[ce,Object,Function,String]),Q("design:returntype",Promise)],we.prototype,"read",null),$([V(0,r()),V(1,i()),V(2,s()),V(3,d()),Q("design:type",Function),Q("design:paramtypes",[Object,Object,Function,Object]),Q("design:returntype",void 0)],we.prototype,"upload",null),$([V(0,r()),V(1,i()),V(2,s()),V(3,d()),Q("design:type",Function),Q("design:paramtypes",[Object,Object,Function,Object]),Q("design:returntype",Promise)],we.prototype,"validation",null),$([V(0,i()),V(1,s()),V(2,d()),V(3,Te()),Q("design:type",Function),Q("design:paramtypes",[Object,Function,String,ce]),Q("design:returntype",Promise)],we.prototype,"write",null);let Re=class extends we{login(e,t,r,i,n,s){return ee(this,void 0,void 0,(function*(){yield T(te.API_SLEEP_AUTH);const o=yield ce.findOne({where:{username:i,password:J(n).toString(),state:!0}}).catch(this.error);if(!o)return a.notfound(t,"Username not found"),void s.emit("auth.failure",{req:e});const{auth:d,error:c,token:u}=yield ve.create(o);return c?(a.error(t,c),void s.emit("auth.failure",{req:e})):d&&u?(a.data(t,{token:u}),d.useragent=r,yield d.save().catch(this.error),void this.emit("auth.login",{auth:d,req:e,user:o})):(a.error(t,"Internal Server Error"),void s.emit("auth.failure",{req:e}))}))}logout(e,t,r,i,n){return ee(this,void 0,void 0,(function*(){if(yield ve.destroy(r))return a.success(e,"Disconcerted"),void n.emit("auth.logout",{auth:r,req:t,user:i});a.unauthorized(e,"Access denied")}))}renew(e,t,r,i,n){return ee(this,void 0,void 0,(function*(){const{auth:s,error:o,token:d}=yield ve.renew(i);o?a.error(t,o):s?(a.data(t,{token:d}),s.useragent=r,yield s.save().catch(this.error),n.emit("auth.renew",{auth:s,req:e})):a.error(t,"Internal Server Error")}))}update(e,t,r,i){return ee(this,void 0,void 0,(function*(){const n=yield ce.scope("password").findOne({where:{id:i.id,password:J(t).toString(),state:!0}}).catch(this.error);n?(n.password=J(r).toString(),(yield n.save().catch(this.error))?a.success(e,"OK"):a.success(e,"Record not changed")):a.error(e,"Record not changed")}))}user(e,t){return ee(this,void 0,void 0,(function*(){const r=yield be.all(t);r?a.data(e,Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))})):a.error(e,"Internal Server Error")}))}};$([c("/login"),u("validation",{username:j.string().min(4).required(),password:j.string().min(5).required()}),V(0,r()),V(1,i()),V(2,n("user-agent")),V(3,l("username")),V(4,l("password")),V(5,p()),Q("design:type",Function),Q("design:paramtypes",[Object,Object,String,String,String,Pe]),Q("design:returntype",Promise)],Re.prototype,"login",null),$([g("/logout"),u("auth"),V(0,i()),V(1,r()),V(2,Ee()),V(3,Te()),V(4,p()),Q("design:type",Function),Q("design:paramtypes",[Object,Object,ne,ce,Pe]),Q("design:returntype",Promise)],Re.prototype,"logout",null),$([c("/renew"),u("validation",{token:j.string().required()}),V(0,r()),V(1,i()),V(2,n("user-agent")),V(3,l("token")),V(4,p()),Q("design:type",Function),Q("design:paramtypes",[Object,Object,String,String,Pe]),Q("design:returntype",Promise)],Re.prototype,"renew",null),$([c("/update"),u("auth"),u("validation",{oldPassword:j.string().min(5).required(),newPassword:j.string().min(5).required()}),V(0,i()),V(1,l("oldPassword")),V(2,l("newPassword")),V(3,Te()),Q("design:type",Function),Q("design:paramtypes",[Object,String,String,ce]),Q("design:returntype",Promise)],Re.prototype,"update",null),$([g(),u("auth"),V(0,i()),V(1,Te()),Q("design:type",Function),Q("design:paramtypes",[Object,ce]),Q("design:returntype",Promise)],Re.prototype,"user",null),Re=$([m("/auth"),y(we)],Re);let je=class extends we{check(e,t){return ee(this,void 0,void 0,(function*(){const{token:r}=t.body,i=yield this.findOne(r);i&&i.user?(i.token=N(),yield i.save(),a.data(e,{token:i.token})):a.notfound(e,"User not found")}))}forgot(e,t){return ee(this,void 0,void 0,(function*(){const{username:r}=t.body;yield T(te.API_SLEEP_FORGOT);const i=yield ce.findOne({where:{username:r}}).catch(this.error);if(!i)return void a.notfound(e,"User not found");const n=N(),s=Date.now()+6e4*te.API_TOKEN_LIFETIME,o=yield se.create({token:n,timestamp:s,state:!0,userId:i.id});this.emit("forgot",{forgot:o,req:t,user:i}),a.success(e,"OK")}))}reset(e,t){return ee(this,void 0,void 0,(function*(){const{token:r,password:i}=t.body,n=yield this.findOne(r);n?(n.state=!1,yield n.save().catch(this.error),n.user.password=J(i).toString(),yield n.user.save().catch(this.error),this.emit("forgot.reset",{req:t,user:n.user}),a.success(e,"OK")):a.notfound(e,"User not found")}))}findOne(e){return ee(this,void 0,void 0,(function*(){return yield se.findOne({where:{token:e,state:!0},include:[{model:ce,required:!0}]}).catch(this.error)}))}};$([g("/check"),u("validation",{token:j.string().required()}),V(0,i()),V(1,r()),Q("design:type",Function),Q("design:paramtypes",[Object,Object]),Q("design:returntype",Promise)],je.prototype,"check",null),$([g(),u("validation",{username:j.string().min(4).required()}),V(0,i()),V(1,r()),Q("design:type",Function),Q("design:paramtypes",[Object,Object]),Q("design:returntype",Promise)],je.prototype,"forgot",null),$([g("/reset"),u("validation",{token:j.string().required(),password:j.string().min(5).required()}),V(0,i()),V(1,r()),Q("design:type",Function),Q("design:paramtypes",[Object,Object]),Q("design:returntype",Promise)],je.prototype,"reset",null),je=$([m("/forgot"),y(we)],je);let Ne=class extends we{add(e,t,r,i){return ee(this,void 0,void 0,(function*(){const n=yield this.model().create(Object.assign(Object.assign({},e.body),i||{}),r||{}).catch(this.error);if(n){const e=this.key();return a.data(t,{[e]:n.getDataValue(e)}),n}a.error(t,"Internal Server Error")}))}all(e,t,r,i){var n,s,o,d,c;return ee(this,void 0,void 0,(function*(){const u=this.model(),l=Object.assign({},r||{});l.where=Object.assign({},l.where||{});const p=null===(n=e.query.limit)||void 0===n?void 0:n.toString();p&&(l.limit=parseInt(p));const g=null===(s=e.query.offset)||void 0===s?void 0:s.toString();g&&(l.offset=parseInt(g));const m=Object.keys(u.getAttributes()),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 _=null===(d=e.query.desc)||void 0===d?void 0:d.toString();_&&_.length&&_.split(",").forEach((e=>{m.indexOf(e)>=0&&y.push([e,"DESC"])})),y.length&&(l.order=y);const I=[],O=D(l.attributes)?l.attributes:m,A=null===(c=e.query.search)||void 0===c?void 0:c.toString();O.forEach((t=>{var r;if(F(t)&&(A&&A.length&&I.push({[t]:{[K.like]:`%${A}%`}}),"search_"+t in e.query)){const i=null===(r=e.query["search_"+t])||void 0===r?void 0:r.toString();i&&i.length&&I.push({[t]:{[K.like]:`%${i}%`}})}})),I.length&&(l.where=Object.assign(Object.assign({},l.where),{[K.or]:[...I]}));const v=(yield u.count(Object.assign(Object.assign({},l),{col:m[0]})).catch(this.error))||0,P=yield u.findAll(l).catch(this.error);if(P)return a.data(t,{count:v,records:i?yield i(P):P}),P;a.error(t,"Internal Server Error")}))}del(e,t,r){return ee(this,void 0,void 0,(function*(){const i=this.key(),{[i]:n}=e.params;if(!n)return a.error(t,"Internal Server Error"),0;const s=yield this.model().destroy(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[i]:n})})).catch(this.error);return s?(a.success(t,"OK"),s):(a.notfound(t,"Record not found"),0)}))}error(e){e.sql?he.error(e.message+"\n"+e.sql,"api.controller.sql",te.API_CONSOLE_ERROR):super.error(e)}get(e,t,r,i){return ee(this,void 0,void 0,(function*(){const n=this.key(),{[n]:s}=e.params,o=yield this.model().findOne(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[n]:s})})).catch(this.error);if(o)return a.data(t,i?yield i(o):o.toJSON()),o;null!==o?a.error(t,"Internal Server Error"):a.notfound(t,"Record not found")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}set(e,t,r,i){return ee(this,void 0,void 0,(function*(){const n=this.key(),{[n]:s}=e.params,[o]=(yield this.model().update(Object.assign(Object.assign({},e.body),i||{}),Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[n]:s})})).catch(this.error))||[];return o?(a.success(t,"OK"),!0):(a.success(t,"Record not changed"),!1)}))}};Ne=$([y(we)],Ne);let De=class extends Ne{create(){return{}}recordAdd(e,t){this.add(e,t)}recordAll(e,t){this.all(e,t)}recordDel(e,t){this.del(e,t)}recordGet(e,t){this.get(e,t)}recordSet(e,t){this.set(e,t)}update(){return{}}validationAdd(e,t,r){this.validation(e,t,r,this.create())}validationSet(e,t,r){this.validation(e,t,r,this.update())}};$([c(),u("auth"),u("write"),u("validationAdd"),V(0,r()),V(1,i()),Q("design:type",Function),Q("design:paramtypes",[Object,Object]),Q("design:returntype",void 0)],De.prototype,"recordAdd",null),$([g(),u("auth"),u("read"),V(0,r()),V(1,i()),Q("design:type",Function),Q("design:paramtypes",[Object,Object]),Q("design:returntype",void 0)],De.prototype,"recordAll",null),$([h("/:id"),u("auth"),u("write"),V(0,r()),V(1,i()),Q("design:type",Function),Q("design:paramtypes",[Object,Object]),Q("design:returntype",void 0)],De.prototype,"recordDel",null),$([g("/:id"),u("auth"),u("read"),V(0,r()),V(1,i()),Q("design:type",Function),Q("design:paramtypes",[Object,Object]),Q("design:returntype",void 0)],De.prototype,"recordGet",null),$([_("/:id"),u("auth"),u("write"),u("validationSet"),V(0,r()),V(1,i()),Q("design:type",Function),Q("design:paramtypes",[Object,Object]),Q("design:returntype",void 0)],De.prototype,"recordSet",null),$([V(0,r()),V(1,i()),V(2,s()),Q("design:type",Function),Q("design:paramtypes",[Object,Object,Function]),Q("design:returntype",void 0)],De.prototype,"validationAdd",null),$([V(0,r()),V(1,i()),V(2,s()),Q("design:type",Function),Q("design:paramtypes",[Object,Object,Function]),Q("design:returntype",void 0)],De.prototype,"validationSet",null),De=$([y(Ne)],De);let Fe=class extends De{model(){return oe}create(){return{name:j.string().required(),description:j.string().empty(""),state:j.boolean().parse().required()}}update(){return{name:j.string().empty(),description:j.string().empty(),state:j.boolean().parse().empty()}}};Fe=$([m("/groups"),y(De)],Fe);let Be=class extends Ne{model(){return de}recordAll(e,t,r){return ee(this,void 0,void 0,(function*(){this.all(e,t,{where:{groupId:r},include:[{model:ae,required:!0}]},(e=>e.map((e=>e.route))))}))}recordSet(e,t,r){return ee(this,void 0,void 0,(function*(){const i=yield oe.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield de.destroy({where:{groupId:t}}),r){let e=0;for(let i=0;i<r.length;i++)e=yield ae.count({where:{id:r[i]}}),e&&(yield de.create({groupId:t,routeId:r[i]}))}a.success(e,"OK")}else B(i)?a.notfound(e,"Record not found"):a.error(e,"Internal Server Error")}))}};$([g("/:id/routes"),u("auth"),u("read","groups"),V(0,r()),V(1,i()),V(2,I("id")),Q("design:type",Function),Q("design:paramtypes",[Object,Object,String]),Q("design:returntype",Promise)],Be.prototype,"recordAll",null),$([_("/:id/routes"),u("auth"),u("write","groups"),u("validation",{routes:j.array(j.number().parse())}),V(0,i()),V(1,I("id")),V(2,l("routes")),Q("design:type",Function),Q("design:paramtypes",[Object,String,Array]),Q("design:returntype",Promise)],Be.prototype,"recordSet",null),Be=$([m("/groups"),y(Ne)],Be);let qe=class extends Ne{model(){return pe}recordAll(e,t,r,i){const n={};r&&(n.type=r),i&&(n.source=i),this.all(e,t,{where:n,order:[["created","DESC"]]})}};$([g(),u("auth"),u("read"),V(0,r()),V(1,i()),V(2,O("type")),V(3,O("source")),Q("design:type",Function),Q("design:paramtypes",[Object,Object,String,String]),Q("design:returntype",void 0)],qe.prototype,"recordAll",null),qe=$([m("/logs"),y(Ne)],qe);let ke=class extends we{confirm(e,t){return ee(this,void 0,void 0,(function*(){const r=yield ge.findOne({where:{token:t,state:!0},include:[{model:ce,required:!0}]}).catch(this.error);r?(r.user.state=!0,yield r.user.save().catch(this.error),this.emit("user.confirm",{user:r.user}),a.success(e,"OK")):a.notfound(e,"User not found")}))}register(e,t,r,i){return ee(this,void 0,void 0,(function*(){yield T(te.API_SLEEP_REGISTRY);const t=yield ce.findOne({where:{username:i}}).catch(this.error);if(t)return void a.error(e,"Invalid Username");if(!B(t))return void a.error(e,"Internal Server Error");const n=yield ce.create(Object.assign(Object.assign({},r),{state:!1}));this.emit("user.register",{user:n}),a.success(e,"OK")}))}};$([g("/confirm"),u("validation",{token:j.string().required()}),V(0,i()),V(1,l("token")),Q("design:type",Function),Q("design:paramtypes",[Object,String]),Q("design:returntype",Promise)],ke.prototype,"confirm",null),$([g(),u("validation",{name:j.string().required(),email:j.string().email().required(),username:j.string().min(4).required(),password:j.string().min(5).required()}),V(0,i()),V(1,r()),V(2,l()),V(3,l("username")),Q("design:type",Function),Q("design:paramtypes",[Object,Object,Object,String]),Q("design:returntype",Promise)],ke.prototype,"register",null),ke=$([m("/register"),y(we)],ke);let Le=class extends De{model(){return ae}create(){return{name:j.string().required(),description:j.string().empty(""),state:j.boolean().parse().required()}}update(){return{name:j.string().empty(),description:j.string().empty(),state:j.boolean().parse().empty()}}};Le=$([m("/routes"),y(De)],Le);let xe=class extends we{setup(e){return ee(this,void 0,void 0,(function*(){if(0==(yield ce.count())){const e={description:"",state:!0},t=yield ce.create(Object.assign({name:"Admin",email:"admin@localhost",username:"admin",password:"8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918",avatar:""},e)),r=yield oe.create(Object.assign({name:"admin"},e));yield ue.create({userId:t.id,groupId:r.id});const i=["read","write"],n=["users","groups","routes"];yield q(n,(t=>ee(this,void 0,void 0,(function*(){yield q(i,(i=>ee(this,void 0,void 0,(function*(){const n=t+"."+i,s=yield ae.create(Object.assign({name:n},e));yield de.create({groupId:r.id,routeId:s.id})}))))}))));const s=yield ae.create(Object.assign({name:"logs.read"},e));yield de.create({groupId:r.id,routeId:s.id})}a.success(e,"OK")}))}};$([g(),V(0,i()),Q("design:type",Function),Q("design:paramtypes",[Object]),Q("design:returntype",Promise)],xe.prototype,"setup",null),xe=$([m("/setup"),y(we)],xe);let Ce=class extends Ne{model(){return ce}recordAdd(e,t,r){this.add(r,e,{},{password:J(t).toString()})}recordAll(e,t){this.all(t,e)}recordDel(e,t,r,i){r&&r.id.toString()!=i?this.del(t,e):a.error(e,"Internal Server Error")}recordGet(e,t){this.get(t,e)}recordSet(e,t,r){this.set(r,e,{where:{}},t?{password:J(t).toString()}:{})}};$([c(),u("auth"),u("write"),u("validation",{name:j.string().required(),email:j.string().email().required(),username:j.string().min(4).required(),password:j.string().min(5).required(),description:j.string().empty(""),state:j.boolean().parse().required()}),V(0,i()),V(1,l("password")),V(2,r()),Q("design:type",Function),Q("design:paramtypes",[Object,String,Object]),Q("design:returntype",void 0)],Ce.prototype,"recordAdd",null),$([g(),u("auth"),u("read"),V(0,i()),V(1,r()),Q("design:type",Function),Q("design:paramtypes",[Object,Object]),Q("design:returntype",void 0)],Ce.prototype,"recordAll",null),$([h("/:id"),u("auth"),u("write"),V(0,i()),V(1,r()),V(2,Te()),V(3,I("id")),Q("design:type",Function),Q("design:paramtypes",[Object,Object,ce,String]),Q("design:returntype",void 0)],Ce.prototype,"recordDel",null),$([g("/:id"),u("auth"),u("read"),V(0,i()),V(1,r()),Q("design:type",Function),Q("design:paramtypes",[Object,Object]),Q("design:returntype",void 0)],Ce.prototype,"recordGet",null),$([_("/:id"),u("auth"),u("write"),u("validation",{name:j.string().empty(),email:j.string().email().empty(),username:j.string().min(4).empty(),password:j.string().min(5).empty().filter(""),description:j.string().empty(),state:j.boolean().parse().empty()}),V(0,i()),V(1,l("password")),V(2,r()),Q("design:type",Function),Q("design:paramtypes",[Object,String,Object]),Q("design:returntype",void 0)],Ce.prototype,"recordSet",null),Ce=$([m("/users"),y(Ne)],Ce);let Ke=class extends Ne{model(){return ue}recordAll(e,t,r){this.all(t,e,{where:{userId:r},include:[{model:oe,required:!0}]},(e=>e.map((e=>e.group))))}recordSet(e,t,r){return ee(this,void 0,void 0,(function*(){const i=yield ce.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){if(yield ue.destroy({where:{userId:i.id}}),r){let e=0;for(let t=0;t<r.length;t++)e=yield oe.count({where:{id:r[t]}}),e&&(yield ue.create({userId:i.id,groupId:r[t]}))}a.success(e,"OK")}else B(i)?a.notfound(e,"Record not found"):a.error(e,"Internal Server Error")}))}};$([g("/:id/groups"),u("auth"),u("read","users"),V(0,i()),V(1,r()),V(2,I("id")),Q("design:type",Function),Q("design:paramtypes",[Object,Object,String]),Q("design:returntype",void 0)],Ke.prototype,"recordAll",null),$([_("/:id/groups"),u("auth"),u("write","users"),u("validation",{groups:j.array(j.number().parse())}),V(0,i()),V(1,I("id")),V(2,l("groups")),Q("design:type",Function),Q("design:paramtypes",[Object,String,Array]),Q("design:returntype",Promise)],Ke.prototype,"recordSet",null),Ke=$([m("/users"),y(Ne)],Ke);export{Pe as Application,ne as Auth,Re as AuthController,fe as Config,le as Configs,we as ControllerBase,De as CrudController,re as Database,te as Env,se as Forgot,je as ForgotController,oe as Group,de as GroupRoute,Fe as GroupsController,Be as GroupsRoutesController,pe as Log,he as Logs,ye as LogsColor,qe as LogsController,Ne as ModelController,be as Permission,ke as RegisterController,ge as Registry,Ee as ReqAuth,Se as ReqFiles,Te as ReqUser,ae as Route,Le as RoutesController,me as Session,xe as SetupController,ve as Token,ce as User,ue as UserGroup,Ce as UsersController,Ke as UsersGroupsController,Ie as crt,Oe as key,ie as sequelize};
|
|
7
|
+
import{Application as e,parameterFactory as t,Req as r,Res as i,Headers as n,Next as s,Session as o,Argument as d,Responses as a,Post as c,Middleware as u,Ctx as l,Body as p,App as g,Get as m,Controller as h,Extends as y,Context as I,Delete as _,Put as v,Params as O,Query as f}from"@andrewcaires/express";import{toBool as A,parseMs as P,dateFormat as S,noop as E,loop as T,uuidv4 as w,sleep as b,toArray as R,EventEmitter as N,isNumber as D,Validation as j,uniqueID as F,isArray as B,isString as x,isNull as k,forEachSeries as q}from"@andrewcaires/utils.js";import L from"ws";import{Sequelize as C,DataTypes as K,Model as M,Op as G}from"sequelize";import{config as H}from"dotenv";import{existsSync as U,readFileSync as z}from"fs";import{Store as X}from"express-session";import{verify as Y,sign as W}from"jsonwebtoken";import{extension as Z}from"mime-types";import J from"multer";import{join as $}from"path";import{SHA256 as V}from"crypto-js";function Q(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o}function ee(e,t){return function(r,i){t(r,i,e)}}function te(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function re(e,t,r,i){return new(r||(r=Promise))((function(n,s){function o(e){try{a(i.next(e))}catch(e){s(e)}}function d(e){try{a(i.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,d)}a((i=i.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,H();class ie{static getBool(e,t){return A(ie.getString(e,t.toString()))}static getInt(e,t){return parseInt(ie.getString(e,t.toString()))}static getMs(e,t){return P(ie.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}ie.API_CONSOLE_ERROR=ie.getBool("API_CONSOLE_ERROR",!1),ie.API_DEFAULT_PATH=ie.getString("API_DEFAULT_PATH","/api"),ie.API_DB_DATABASE=ie.getString("API_DB_DATABASE",""),ie.API_DB_HOST=ie.getString("API_DB_HOST","127.0.0.1"),ie.API_DB_PASSWORD=ie.getString("API_DB_PASSWORD",""),ie.API_DB_PORT=ie.getInt("API_DB_PORT",3306),ie.API_DB_TYPE=ie.getString("API_DB_TYPE",""),ie.API_DB_USERNAME=ie.getString("API_DB_USERNAME","root"),ie.API_DB_LOG=ie.getBool("API_DB_LOG",!1),ie.API_DB_PREFIX=ie.getString("API_DB_PREFIX",""),ie.API_DB_TIMEZONE=ie.getString("API_DB_TIMEZONE","+00:00"),ie.API_HTTP_CRT=ie.getString("API_HTTP_CRT",""),ie.API_HTTP_KEY=ie.getString("API_HTTP_KEY",""),ie.API_HTTP_PORT=ie.getInt("API_HTTP_PORT",3e3),ie.API_HTTP_PUBLIC=ie.getString("API_HTTP_PUBLIC",""),ie.API_HTTP_CROSS=ie.getBool("API_HTTP_CROSS",!1),ie.API_HTTP_HYBRID=ie.getBool("API_HTTP_HYBRID",!1),ie.API_HTTP_REDIRECT=ie.getString("API_HTTP_REDIRECT",""),ie.API_SLEEP_AUTH=ie.getMs("API_SLEEP_AUTH","2s"),ie.API_SLEEP_FORGOT=ie.getMs("API_SLEEP_FORGOT","5s"),ie.API_SLEEP_REGISTRY=ie.getMs("API_SLEEP_REGISTRY","5s"),ie.API_SESSION_NAME=ie.getString("API_SESSION_NAME","session.id"),ie.API_SESSION_LIFETIME=ie.getMs("API_SESSION_LIFETIME","1d"),ie.API_SESSION_SECRET=ie.getString("API_SESSION_SECRET","yoursecret"),ie.API_TOKEN_CRT=ie.getString("API_TOKEN_CRT",""),ie.API_TOKEN_KEY=ie.getString("API_TOKEN_KEY",""),ie.API_TOKEN_FORGOT=ie.getMs("API_TOKEN_LIFETIME","1d"),ie.API_TOKEN_HEADER=ie.getString("API_TOKEN_HEADER","authorization"),ie.API_TOKEN_LIFETIME=ie.getMs("API_TOKEN_LIFETIME","1d"),ie.API_TOKEN_RENEW=ie.getMs("API_TOKEN_RENEW","1d"),ie.API_UPLOAD_COUNT=ie.getInt("API_UPLOAD_COUNT",1),ie.API_UPLOAD_FIELD=process.env.API_UPLOAD_FIELD||"upload",ie.API_UPLOAD_SIZE=ie.getInt("API_UPLOAD_SIZE",2),ie.API_UPLOAD_TEMP=ie.getString("API_UPLOAD_TEMP","./temp"),ie.API_WEBSOCKET_START=ie.getBool("API_WEBSOCKET_START",!1);class ne{static connect(e){const t="connect_"+ie.API_DB_TYPE.toLowerCase();if(t in ne)return ne[t](e);throw new Error("No database is connected to this API")}static connect_mariadb(e){return new C(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mariadb",logging:ie.API_DB_LOG,define:{timestamps:!1},timezone:ie.API_DB_TIMEZONE})}static connect_memory(){return new C("sqlite::memory:",{logging:ie.API_DB_LOG,define:{timestamps:!1},timezone:ie.API_DB_TIMEZONE})}static connect_mysql(e){return new C(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"mysql",logging:ie.API_DB_LOG,define:{timestamps:!1},timezone:ie.API_DB_TIMEZONE})}static connect_postgres(e){return new C(e.database,e.username,e.password,{host:e.hostname,port:e.hostport,dialect:"postgres",logging:ie.API_DB_LOG,define:{timestamps:!1},timezone:ie.API_DB_TIMEZONE})}static connect_sqlite(e){return new C({dialect:"sqlite",storage:e.database,logging:ie.API_DB_LOG,define:{timestamps:!1},timezone:ie.API_DB_TIMEZONE})}}const se=ne.connect({database:ie.API_DB_DATABASE,username:ie.API_DB_USERNAME,password:ie.API_DB_PASSWORD,hostname:ie.API_DB_HOST,hostport:ie.API_DB_PORT});class oe extends M{}oe.init({secret:K.STRING,logout:K.DATE,useragent:K.STRING},{sequelize:se,modelName:ie.API_DB_PREFIX+"auth",timestamps:!0,createdAt:"created",updatedAt:"updated"});class de extends M{}de.init({token:K.STRING,timestamp:K.BIGINT,state:K.BOOLEAN},{sequelize:se,modelName:ie.API_DB_PREFIX+"forgot",timestamps:!0,createdAt:"created",updatedAt:"updated"});class ae extends M{}ae.init({name:K.STRING,description:K.TEXT,state:K.BOOLEAN},{sequelize:se,modelName:ie.API_DB_PREFIX+"group",timestamps:!0,createdAt:"created",updatedAt:"updated"});class ce extends M{}ce.init({},{sequelize:se,modelName:ie.API_DB_PREFIX+"groups_routes",timestamps:!0,createdAt:"created",updatedAt:!1}),ce.removeAttribute("id");class ue extends M{}ue.init({token:K.STRING,state:K.BOOLEAN},{sequelize:se,modelName:ie.API_DB_PREFIX+"register",timestamps:!0,createdAt:"created",updatedAt:"updated"});class le extends M{}le.init({name:K.STRING,description:K.TEXT,state:K.BOOLEAN},{sequelize:se,modelName:ie.API_DB_PREFIX+"route",timestamps:!0,createdAt:"created",updatedAt:"updated"});class pe extends M{}pe.init({name:K.STRING,email:K.STRING,username:K.STRING,password:K.STRING,avatar:K.STRING,date:K.DATEONLY,description:K.TEXT,state:K.BOOLEAN},{sequelize:se,modelName:ie.API_DB_PREFIX+"user",timestamps:!0,createdAt:"created",updatedAt:"updated",defaultScope:{attributes:{exclude:["password"]}},scopes:{password:{attributes:{include:["password"]}}}});class ge extends M{}ge.init({},{sequelize:se,modelName:ie.API_DB_PREFIX+"users_groups",timestamps:!0,createdAt:"created",updatedAt:!1}),ge.removeAttribute("id");class me extends M{}me.init({key:K.STRING,value:K.STRING},{sequelize:se,modelName:ie.API_DB_PREFIX+"configs",timestamps:!0,createdAt:"created",updatedAt:"updated"}),me.removeAttribute("id");class he extends M{}he.init({type:K.STRING,source:K.STRING,message:K.TEXT},{sequelize:se,modelName:ie.API_DB_PREFIX+"log",timestamps:!0,createdAt:"created",updatedAt:!1});class ye extends M{}var Ie;ye.init({session:K.STRING,json:K.TEXT,expired:K.BIGINT},{sequelize:se,modelName:ie.API_DB_PREFIX+"session",timestamps:!0,createdAt:"created",updatedAt:"updated"}),ye.removeAttribute("id"),pe.hasMany(oe),oe.belongsTo(pe),pe.hasMany(de),de.belongsTo(pe),pe.hasMany(ue),ue.belongsTo(pe),ae.hasMany(ce),ce.belongsTo(ae),le.hasMany(ce),ce.belongsTo(le),pe.hasMany(ge),ge.belongsTo(pe),ae.hasMany(ge),ge.belongsTo(ae),function(e){e.ERROR="[31m",e.INFO="[36m",e.NONE="[37m",e.SUCCESS="[32m",e.WARNING="[33m"}(Ie||(Ie={}));class _e{static write(e,t,r){return re(this,void 0,void 0,(function*(){yield _e.writeRaw(Ie.NONE,"",e,t,r)}))}static error(e,t,r){return re(this,void 0,void 0,(function*(){yield _e.writeRaw(Ie.ERROR,"error",e,t,r)}))}static info(e,t,r){return re(this,void 0,void 0,(function*(){yield _e.writeRaw(Ie.INFO,"info",e,t,r)}))}static success(e,t,r){return re(this,void 0,void 0,(function*(){yield _e.writeRaw(Ie.ERROR,"success",e,t,r)}))}static warning(e,t,r){return re(this,void 0,void 0,(function*(){yield _e.writeRaw(Ie.WARNING,"warning",e,t,r)}))}static writeConsole(e,t,r){const i=S(new Date,"%H:%M:%S");console.log(">",e,t+" ".repeat(10-t.length),"[37m","|",i,"|",r)}static writeRaw(e,t,r,i,n){return re(this,void 0,void 0,(function*(){n&&_e.writeConsole(e,t,r),se&&(yield he.create({type:t,source:i,message:r}).catch((()=>null)))}))}}const ve=e=>U(e)?z(e):void 0,Oe={http:ve(ie.API_HTTP_CRT),token:ve(ie.API_TOKEN_CRT)},fe={http:ve(ie.API_HTTP_KEY),token:ve(ie.API_TOKEN_KEY)};class Ae extends X{constructor(){super(),this.all=e=>re(this,void 0,void 0,(function*(){e=e||E;const t=yield ye.findAll({attributes:["session"],where:{expired:{[G.gte]:Date.now()}}}).catch((t=>(e(t),null)));t&&e(null,t.map((e=>e.session))),e()})),this.clear=e=>re(this,void 0,void 0,(function*(){yield ye.destroy().catch(E),e&&e()})),this.destroy=(e,t)=>re(this,void 0,void 0,(function*(){yield ye.destroy({where:{session:e}}).catch(E),t&&t()})),this.expired=()=>re(this,void 0,void 0,(function*(){yield ye.destroy({where:{expired:{[G.lt]:Date.now()}}}).catch(E)})),this.get=(e,t)=>re(this,void 0,void 0,(function*(){t=t||E;const r=yield ye.findOne({where:{session:e,expired:{[G.gte]:Date.now()}}}).catch((e=>(t(e),null)));if(r){const e=JSON.parse(r.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield r.destroy().catch(E),void t(null)}t(null,e)}else t(null)})),this.length=e=>re(this,void 0,void 0,(function*(){e&&e(null,(yield ye.count().catch(E))||0)})),this.set=(e,t,r)=>re(this,void 0,void 0,(function*(){r=r||E;const i=Date.now()+ie.API_SESSION_LIFETIME,n=JSON.stringify(t),[s,o]=(yield ye.findOrCreate({where:{session:e},defaults:{session:e,json:n,expired:i}}).catch(E))||[];s&&(o||(s.json=n,s.expired=i,yield s.save().catch(E))),r()})),this.loop=T(this.expired,3e4),this.loop.start()}}class Pe{static create(e){return re(this,void 0,void 0,(function*(){if(!fe.token)return{error:"Key not found"};const{id:t}=e,r=w(),i=yield oe.create({secret:r,userId:t}).catch(Pe.error);if(!i)return{error:"Internal Server Error"};return{auth:i,token:W({id:t,secret:r},fe.token,Pe.options())}}))}static destroy(e){return re(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){_e.error(e.message,"api.token",ie.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:ie.API_TOKEN_LIFETIME+"ms"}}static renew(e){return re(this,void 0,void 0,(function*(){if(!fe.token)return{error:"Key not found"};const{error:t,decode:r}=Pe.verify(e,ie.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield pe.findOne({where:{id:e,state:!0}}).catch(Pe.error);if(r){const i=yield oe.findOne({where:{secret:t,userId:r.id}}).catch(Pe.error);if(i&&!i.logout){i.secret=w(),yield i.save().catch(Pe.error);return{auth:i,token:W({id:e,secret:i.secret},fe.token,Pe.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e){return re(this,void 0,void 0,(function*(){const{error:t,decode:r}=Pe.verify(e);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield pe.findOne({where:{id:e,state:!0}}).catch(Pe.error);if(r){const e=yield oe.findOne({where:{secret:t,userId:r.id}}).catch(Pe.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!Oe.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:Y(e,Oe.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class Se extends e{constructor(e){super(e,{cert:Oe.http,cross:ie.API_HTTP_CROSS,hybrid:ie.API_HTTP_HYBRID,key:fe.http,path:ie.API_DEFAULT_PATH,port:ie.API_HTTP_PORT,public:ie.API_HTTP_PUBLIC,redirect:ie.API_HTTP_REDIRECT,session:{store:new Ae,name:ie.API_SESSION_NAME,secret:ie.API_SESSION_SECRET,cookie:{maxAge:ie.API_SESSION_LIFETIME},genid:w}})}error(e,t){_e.info(e.message,t,ie.API_CONSOLE_ERROR)}log(e,t){_e.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return re(this,void 0,void 0,(function*(){yield se.sync(),yield e.listen.call(this),ie.API_WEBSOCKET_START&&this.server&&(this._webSocket=new L.Server({server:this.server,verifyClient:(e,t)=>t(ie.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>re(this,void 0,void 0,(function*(){t.url||(t.url="");const r=t.url.length<=1?"":t.url.replace(/\//g,".");let i;e.on("message",(n=>re(this,void 0,void 0,(function*(){if(i)try{const s=JSON.parse(n);this.emit("ws.message"+r,{data:s,message:n,req:t,user:i,ws:e})}catch(s){this.emit("ws.message"+r,{message:n,req:t,user:i,ws:e})}else{const{user:s}=yield Pe.user(n.toString());s&&(i=s,this.emit("ws.connection"+r,{req:t,user:i,ws:e}))}i||e.close()})))),e.on("close",(()=>{i&&this.emit("ws.close"+r,{user:i,ws:e})})),yield b(2e3),i||e.close()})))))}))}websocket(){return this._webSocket}}class Ee{static all(){return re(this,void 0,void 0,(function*(){const e=yield me.findAll().catch(Ee.error),t={};return e&&e.forEach((e=>{t[e.key]=e.value})),t}))}static del(e){return re(this,void 0,void 0,(function*(){return((yield me.destroy({where:{key:e}}).catch(Ee.error))||0)>0}))}static error(e){_e.error(e.message,"api.config",ie.API_CONSOLE_ERROR)}static get(e){return re(this,void 0,void 0,(function*(){const t=yield me.findOne({where:{key:e}}).catch(Ee.error);return t&&t.value||""}))}static set(e,t){return re(this,void 0,void 0,(function*(){const[r]=(yield me.findOrCreate({where:{key:e}}).catch(Ee.error))||[];r&&(r.value=t,yield r.save().catch(Ee.error))}))}}const Te=t((({req:e})=>e.auth)),we=t((({req:e})=>R(e.files))),be=t((({req:e})=>e.user));class Re{static all(e,t){return re(this,void 0,void 0,(function*(){return yield le.findAll({where:Object.assign(Object.assign({},t),{state:!0}),include:[{model:ce,required:!0,include:[{model:ae,required:!0,where:{state:!0},include:[{model:ge,required:!0,where:{userId:e.id}}]}]}]}).catch((e=>{_e.error(e.message,"api.permission",ie.API_CONSOLE_ERROR)}))}))}static get(e){return re(this,void 0,void 0,(function*(){const t=yield Re.all(e);return t?t.map((e=>e.name)):[]}))}static is(e,t){return re(this,void 0,void 0,(function*(){const r=yield Re.all(e,{name:t});return!!r&&r.length>0}))}}class Ne extends N{auth(e,t,r,i,n){return re(this,void 0,void 0,(function*(){const{auth:s,error:o,user:d}=yield Pe.user(r);o?a.error(t,o):s&&d?s.useragent==i?(e.auth=s,e.user=d,n()):a.error(t,"Invalid token"):a.error(t,"Internal Server Error")}))}session(e,t,r){return re(this,void 0,void 0,(function*(){t.auth&&t.user&&(t.useragent?t.useragent!=e&&t.regenerate(E):(t.useragent=e,t.save(E))),r()}))}error(e){_e.error(e.message,"api.controller",ie.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r,i){return re(this,void 0,void 0,(function*(){i?(yield Re.is(i,r))?t():a.error(e,"Unauthorized access"):a.unauthorized(e,"Access denied")}))}read(e,t,r,i){return this.permission(t,r,(i||this.name())+".read",e)}upload(e,t,r,i){const n=(null==i?void 0:i.path)||ie.API_UPLOAD_TEMP,s=J.diskStorage({destination:(e,t,r)=>r(null,n),filename:(e,t,r)=>re(this,void 0,void 0,(function*(){return r(null,this.uploadFile(n,Z(t.mimetype)||"bin"))}))}),o=1e6*((null==i?void 0:i.size)||ie.API_UPLOAD_SIZE),d=J({storage:s,fileFilter(e,t,r){var n;return re(this,void 0,void 0,(function*(){const e=null===(n=null==i?void 0:i.types)||void 0===n?void 0:n.indexOf(t.mimetype);return D(e)&&e<0?r(new Error("File type not allowed")):r(null,!0)}))},limits:{fileSize:o}}),c=(null==i?void 0:i.count)||ie.API_UPLOAD_COUNT,u=(null==i?void 0:i.field)||ie.API_UPLOAD_FIELD;d.array(u,c)(e,t,(e=>e?a.error(t,e.message):r()))}uploadFile(e,t){const r=w()+"."+t;return U($(e,r))?this.uploadFile(e,t):r}validation(e,t,r,i){return re(this,void 0,void 0,(function*(){const{error:n,value:s}=yield j.object(i).parse().validateAsync(e.body);n?a.validation(t,n):(e.body=s,r())}))}write(e,t,r,i){return this.permission(e,t,(r||this.name())+".write",i)}}Q([ee(0,r()),ee(1,i()),ee(2,n(ie.API_TOKEN_HEADER)),ee(3,n("user-agent")),ee(4,s()),te("design:type",Function),te("design:paramtypes",[Object,Object,String,String,Function]),te("design:returntype",Promise)],Ne.prototype,"auth",null),Q([ee(0,n("user-agent")),ee(1,o()),ee(2,s()),te("design:type",Function),te("design:paramtypes",[String,Object,Function]),te("design:returntype",Promise)],Ne.prototype,"session",null),Q([ee(0,i()),ee(1,s()),ee(2,d()),ee(3,be()),te("design:type",Function),te("design:paramtypes",[Object,Function,String,pe]),te("design:returntype",Promise)],Ne.prototype,"permission",null),Q([ee(0,be()),ee(1,i()),ee(2,s()),ee(3,d()),te("design:type",Function),te("design:paramtypes",[pe,Object,Function,String]),te("design:returntype",Promise)],Ne.prototype,"read",null),Q([ee(0,r()),ee(1,i()),ee(2,s()),ee(3,d()),te("design:type",Function),te("design:paramtypes",[Object,Object,Function,Object]),te("design:returntype",void 0)],Ne.prototype,"upload",null),Q([ee(0,r()),ee(1,i()),ee(2,s()),ee(3,d()),te("design:type",Function),te("design:paramtypes",[Object,Object,Function,Object]),te("design:returntype",Promise)],Ne.prototype,"validation",null),Q([ee(0,i()),ee(1,s()),ee(2,d()),ee(3,be()),te("design:type",Function),te("design:paramtypes",[Object,Function,String,pe]),te("design:returntype",Promise)],Ne.prototype,"write",null);let De=class extends Ne{login(e,t,r,i,n){return re(this,void 0,void 0,(function*(){yield b(ie.API_SLEEP_AUTH);const s=r,o=yield pe.findOne({where:{[G.or]:[{email:s},{username:r}],[G.and]:[{password:V(i).toString()}]}}).catch(this.error);if(!o)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const d=yield ue.findOne({where:{state:!0,userId:o.id}}).catch(this.error);if(d)return e.error("Activation required"),n.emit("auth.activation",{ctx:e,register:d,user:o}),void this.emit("auth.activation",{ctx:e,register:d,user:o});if(!o.state)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const{auth:a,error:c,token:u}=yield Pe.create(o);return c?(e.error(c),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):a&&u?(e.data({token:u}),a.useragent=t,yield a.save().catch(this.error),n.emit("auth.login",{auth:a,ctx:e,user:o}),void this.emit("auth.login",{auth:a,ctx:e,user:o})):(e.error("Internal Server Error"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,r,i){return re(this,void 0,void 0,(function*(){if(yield Pe.destroy(t))return e.success("Disconcerted"),i.emit("auth.logout",{auth:t,ctx:e,user:r}),void this.emit("auth.logout",{auth:t,ctx:e,user:r});e.unauthorized("Access denied")}))}renew(e,t,r,i){return re(this,void 0,void 0,(function*(){const{auth:n,error:s,token:o}=yield Pe.renew(r);s?e.error(s):n?(e.data({token:o}),n.useragent=t,yield n.save().catch(this.error),i.emit("auth.renew",{auth:n,ctx:e}),this.emit("auth.renew",{auth:n,ctx:e})):e.error("Internal Server Error")}))}update(e,t,r,i){return re(this,void 0,void 0,(function*(){const n=yield pe.scope("password").findOne({where:{id:i.id,password:V(t).toString(),state:!0}}).catch(this.error);n?(n.password=V(r).toString(),(yield n.save().catch(this.error))?e.success("OK"):e.success("Record not changed")):e.error("Record not changed")}))}user(e,t){return re(this,void 0,void 0,(function*(){const r=yield Re.all(t);r?e.data(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.name))})):e.error("Internal Server Error")}))}};Q([c("/login"),u("validation",{username:j.string().min(3).required(),password:j.string().min(5).required()}),ee(0,l()),ee(1,n("user-agent")),ee(2,p("username")),ee(3,p("password")),ee(4,g()),te("design:type",Function),te("design:paramtypes",[I,String,String,String,Se]),te("design:returntype",Promise)],De.prototype,"login",null),Q([m("/logout"),u("auth"),ee(0,l()),ee(1,Te()),ee(2,be()),ee(3,g()),te("design:type",Function),te("design:paramtypes",[I,oe,pe,Se]),te("design:returntype",Promise)],De.prototype,"logout",null),Q([c("/renew"),u("validation",{token:j.string().required()}),ee(0,l()),ee(1,n("user-agent")),ee(2,p("token")),ee(3,g()),te("design:type",Function),te("design:paramtypes",[I,String,String,Se]),te("design:returntype",Promise)],De.prototype,"renew",null),Q([c("/update"),u("auth"),u("validation",{oldPassword:j.string().min(5).required(),newPassword:j.string().min(5).required()}),ee(0,l()),ee(1,p("oldPassword")),ee(2,p("newPassword")),ee(3,be()),te("design:type",Function),te("design:paramtypes",[I,String,String,pe]),te("design:returntype",Promise)],De.prototype,"update",null),Q([m(),u("auth"),ee(0,l()),ee(1,be()),te("design:type",Function),te("design:paramtypes",[I,pe]),te("design:returntype",Promise)],De.prototype,"user",null),De=Q([h("/auth"),y(Ne)],De);let je=class extends Ne{check(e,t){return re(this,void 0,void 0,(function*(){const{token:r}=t.body,i=yield this.findOne(r);i&&i.user?(i.token=F(),yield i.save(),a.data(e,{token:i.token})):a.notfound(e,"User not found")}))}forgot(e,t,r){return re(this,void 0,void 0,(function*(){yield b(ie.API_SLEEP_FORGOT);const i=t,n=yield pe.findOne({where:{[G.or]:[{email:i},{username:t}]}}).catch(this.error);if(!n)return void e.notFound("User not found");const s=F(),o=Date.now()+6e4*ie.API_TOKEN_FORGOT,d=yield de.create({token:s,timestamp:o,state:!0,userId:n.id});r.emit("forgot.send",{ctx:e,forgot:d,user:n}),this.emit("forgot.send",{ctx:e,forgot:d,user:n}),e.success("OK")}))}reset(e,t,r,i){return re(this,void 0,void 0,(function*(){const n=yield this.findOne(t);n?(n.state=!1,yield n.save().catch(this.error),n.user.password=V(r).toString(),yield n.user.save().catch(this.error),i.emit("forgot.reset",{ctx:e,user:n.user}),this.emit("forgot.reset",{ctx:e,user:n.user}),e.success("OK")):e.notFound("User not found")}))}findOne(e){return re(this,void 0,void 0,(function*(){return yield de.findOne({where:{token:e,state:!0},include:[{model:pe,required:!0}]}).catch(this.error)}))}};Q([m("/check"),u("validation",{token:j.string().required()}),ee(0,i()),ee(1,r()),te("design:type",Function),te("design:paramtypes",[Object,Object]),te("design:returntype",Promise)],je.prototype,"check",null),Q([c(),u("validation",{username:j.string().min(4).required()}),ee(0,l()),ee(1,p("username")),ee(2,g()),te("design:type",Function),te("design:paramtypes",[I,String,Se]),te("design:returntype",Promise)],je.prototype,"forgot",null),Q([c("/reset"),u("validation",{token:j.string().required(),password:j.string().min(5).required()}),ee(0,l()),ee(1,p("token")),ee(2,p("password")),ee(3,g()),te("design:type",Function),te("design:paramtypes",[I,String,String,Se]),te("design:returntype",Promise)],je.prototype,"reset",null),je=Q([h("/forgot"),y(Ne)],je);let Fe=class extends Ne{add(e,t,r,i){return re(this,void 0,void 0,(function*(){const n=yield this.model().create(Object.assign(Object.assign({},e.body),i||{}),r||{}).catch(this.error);if(n){const e=this.key();return a.data(t,{[e]:n.getDataValue(e)}),n}a.error(t,"Internal Server Error")}))}all(e,t,r,i){var n,s,o,d,c;return re(this,void 0,void 0,(function*(){const u=this.model(),l=Object.assign({},r||{});l.where=Object.assign({},l.where||{});const p=null===(n=e.query.limit)||void 0===n?void 0:n.toString();p&&(l.limit=parseInt(p));const g=null===(s=e.query.offset)||void 0===s?void 0:s.toString();g&&(l.offset=parseInt(g));const m=Object.keys(u.getAttributes()),h=[],y=null===(o=e.query.asc)||void 0===o?void 0:o.toString();y&&y.length&&y.split(",").forEach((e=>{m.indexOf(e)>=0&&h.push([e,"ASC"])}));const I=null===(d=e.query.desc)||void 0===d?void 0:d.toString();I&&I.length&&I.split(",").forEach((e=>{m.indexOf(e)>=0&&h.push([e,"DESC"])})),h.length&&(l.order=h);const _=[],v=B(l.attributes)?l.attributes:m,O=null===(c=e.query.search)||void 0===c?void 0:c.toString();v.forEach((t=>{var r;if(x(t)&&(O&&O.length&&_.push({[t]:{[G.like]:`%${O}%`}}),"search_"+t in e.query)){const i=null===(r=e.query["search_"+t])||void 0===r?void 0:r.toString();i&&i.length&&_.push({[t]:{[G.like]:`%${i}%`}})}})),_.length&&(l.where=Object.assign(Object.assign({},l.where),{[G.or]:[..._]}));const f=(yield u.count(Object.assign(Object.assign({},l),{col:m[0]})).catch(this.error))||0,A=yield u.findAll(l).catch(this.error);if(A)return a.data(t,{count:f,records:i?yield i(A):A}),A;a.error(t,"Internal Server Error")}))}del(e,t,r){return re(this,void 0,void 0,(function*(){const i=this.key(),{[i]:n}=e.params;if(!n)return a.error(t,"Internal Server Error"),0;const s=yield this.model().destroy(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[i]:n})})).catch(this.error);return s?(a.success(t,"OK"),s):(a.notfound(t,"Record not found"),0)}))}error(e){e.sql?_e.error(e.message+"\n"+e.sql,"api.controller.sql",ie.API_CONSOLE_ERROR):super.error(e)}get(e,t,r,i){return re(this,void 0,void 0,(function*(){const n=this.key(),{[n]:s}=e.params,o=yield this.model().findOne(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[n]:s})})).catch(this.error);if(o)return a.data(t,i?yield i(o):o.toJSON()),o;null!==o?a.error(t,"Internal Server Error"):a.notfound(t,"Record not found")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}set(e,t,r,i){return re(this,void 0,void 0,(function*(){const n=this.key(),{[n]:s}=e.params,[o]=(yield this.model().update(Object.assign(Object.assign({},e.body),i||{}),Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[n]:s})})).catch(this.error))||[];return o?(a.success(t,"OK"),!0):(a.success(t,"Record not changed"),!1)}))}};Fe=Q([y(Ne)],Fe);let Be=class extends Fe{create(){return{}}recordAdd(e,t){this.add(e,t)}recordAll(e,t){this.all(e,t)}recordDel(e,t){this.del(e,t)}recordGet(e,t){this.get(e,t)}recordSet(e,t){this.set(e,t)}update(){return{}}validationAdd(e,t,r){this.validation(e,t,r,this.create())}validationSet(e,t,r){this.validation(e,t,r,this.update())}};Q([c(),u("auth"),u("write"),u("validationAdd"),ee(0,r()),ee(1,i()),te("design:type",Function),te("design:paramtypes",[Object,Object]),te("design:returntype",void 0)],Be.prototype,"recordAdd",null),Q([m(),u("auth"),u("read"),ee(0,r()),ee(1,i()),te("design:type",Function),te("design:paramtypes",[Object,Object]),te("design:returntype",void 0)],Be.prototype,"recordAll",null),Q([_("/:id"),u("auth"),u("write"),ee(0,r()),ee(1,i()),te("design:type",Function),te("design:paramtypes",[Object,Object]),te("design:returntype",void 0)],Be.prototype,"recordDel",null),Q([m("/:id"),u("auth"),u("read"),ee(0,r()),ee(1,i()),te("design:type",Function),te("design:paramtypes",[Object,Object]),te("design:returntype",void 0)],Be.prototype,"recordGet",null),Q([v("/:id"),u("auth"),u("write"),u("validationSet"),ee(0,r()),ee(1,i()),te("design:type",Function),te("design:paramtypes",[Object,Object]),te("design:returntype",void 0)],Be.prototype,"recordSet",null),Q([ee(0,r()),ee(1,i()),ee(2,s()),te("design:type",Function),te("design:paramtypes",[Object,Object,Function]),te("design:returntype",void 0)],Be.prototype,"validationAdd",null),Q([ee(0,r()),ee(1,i()),ee(2,s()),te("design:type",Function),te("design:paramtypes",[Object,Object,Function]),te("design:returntype",void 0)],Be.prototype,"validationSet",null),Be=Q([y(Fe)],Be);let xe=class extends Be{model(){return ae}create(){return{name:j.string().required(),description:j.string().empty(""),state:j.boolean().parse().required()}}update(){return{name:j.string().empty(),description:j.string().empty(),state:j.boolean().parse().empty()}}};xe=Q([h("/groups"),y(Be)],xe);let ke=class extends Fe{model(){return ce}recordAll(e,t,r){return re(this,void 0,void 0,(function*(){this.all(e,t,{where:{groupId:r},include:[{model:le,required:!0}]},(e=>e.map((e=>e.route))))}))}recordSet(e,t,r){return re(this,void 0,void 0,(function*(){const i=yield ae.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield ce.destroy({where:{groupId:t}}),r){let e=0;for(let i=0;i<r.length;i++)e=yield le.count({where:{id:r[i]}}),e&&(yield ce.create({groupId:t,routeId:r[i]}))}a.success(e,"OK")}else k(i)?a.notfound(e,"Record not found"):a.error(e,"Internal Server Error")}))}};Q([m("/:id/routes"),u("auth"),u("read","groups"),ee(0,r()),ee(1,i()),ee(2,O("id")),te("design:type",Function),te("design:paramtypes",[Object,Object,String]),te("design:returntype",Promise)],ke.prototype,"recordAll",null),Q([v("/:id/routes"),u("auth"),u("write","groups"),u("validation",{routes:j.array(j.number().parse())}),ee(0,i()),ee(1,O("id")),ee(2,p("routes")),te("design:type",Function),te("design:paramtypes",[Object,String,Array]),te("design:returntype",Promise)],ke.prototype,"recordSet",null),ke=Q([h("/groups"),y(Fe)],ke);let qe=class extends Fe{model(){return he}recordAll(e,t,r,i){const n={};r&&(n.type=r),i&&(n.source=i),this.all(e,t,{where:n,order:[["created","DESC"]]})}};Q([m(),u("auth"),u("read"),ee(0,r()),ee(1,i()),ee(2,f("type")),ee(3,f("source")),te("design:type",Function),te("design:paramtypes",[Object,Object,String,String]),te("design:returntype",void 0)],qe.prototype,"recordAll",null),qe=Q([h("/logs"),y(Fe)],qe);let Le=class extends Ne{register(e,t,r){return re(this,void 0,void 0,(function*(){yield b(ie.API_SLEEP_REGISTRY);const{name:i,date:n,email:s,username:o,password:d,confirm:a}=t,c=o||s,u=V(d).toString();if(yield pe.count({where:{[G.or]:[{email:s},{username:c}]}}).catch(this.error))return void e.validation("Invalid email or username");if(u!=V(a).toString())return void e.error("Invalid password");const l=yield pe.create({name:i,date:n,email:s,username:c,password:u,state:!1}).catch(this.error);if(!l)return void e.error("Internal Server Error");const p=yield ue.create({token:yield this.getId(),userId:l.id,state:!0}).catch(this.error);if(!p)return l.destroy(),void e.error("Internal Server Error");e.success("OK"),r.emit("register.user",{ctx:e,register:p,user:l}),this.emit("register.user",{ctx:e,register:p,user:l})}))}confirm(e,t,r){return re(this,void 0,void 0,(function*(){const i=yield ue.findOne({where:{token:t,state:!0},include:[{model:pe,required:!0}]}).catch(this.error);i?(i.state=!1,yield i.save().catch(this.error),i.user.state=!0,yield i.user.save().catch(this.error),e.success("OK"),r.emit("register.confirm",{ctx:e,register:i,user:i.user}),this.emit("register.confirm",{ctx:e,register:i,user:i.user})):e.notFound("User not found")}))}send(e,t,r){return re(this,void 0,void 0,(function*(){const i=t,n=yield ue.findOne({where:{state:!0},include:[{model:pe,required:!0,where:{[G.or]:[{email:i},{username:t}]}}]}).catch(this.error);n?(e.success("OK"),r.emit("register.send",{ctx:e,register:n,user:n.user}),this.emit("register.send",{ctx:e,register:n,user:n.user})):e.notFound("User not found")}))}getId(){return re(this,void 0,void 0,(function*(){const e=w();return(yield ue.count({where:{token:e}}))?this.getId():e}))}};Q([c(),u("validation",{name:j.string().required(),date:j.string().date().required(),email:j.string().email().required(),username:j.string().empty(),password:j.string().min(5).required(),confirm:j.string().min(5).required()}),ee(0,l()),ee(1,p()),ee(2,g()),te("design:type",Function),te("design:paramtypes",[I,Object,Se]),te("design:returntype",Promise)],Le.prototype,"register",null),Q([c("/confirm"),u("validation",{token:j.string().required()}),ee(0,l()),ee(1,p("token")),ee(2,g()),te("design:type",Function),te("design:paramtypes",[I,String,Se]),te("design:returntype",Promise)],Le.prototype,"confirm",null),Q([c("/send"),u("validation",{username:j.string().required()}),ee(0,l()),ee(1,p("username")),ee(2,g()),te("design:type",Function),te("design:paramtypes",[I,String,Se]),te("design:returntype",Promise)],Le.prototype,"send",null),Le=Q([h("/register"),y(Ne)],Le);let Ce=class extends Be{model(){return le}create(){return{name:j.string().required(),description:j.string().empty(""),state:j.boolean().parse().required()}}update(){return{name:j.string().empty(),description:j.string().empty(),state:j.boolean().parse().empty()}}};Ce=Q([h("/routes"),y(Be)],Ce);let Ke=class extends Ne{setup(e){return re(this,void 0,void 0,(function*(){if(0==(yield pe.count())){const e={description:"",state:!0},t=yield pe.create(Object.assign({name:"Admin",email:"admin@localhost",username:"admin",password:"8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918",avatar:""},e)),r=yield ae.create(Object.assign({name:"admin"},e));yield ge.create({userId:t.id,groupId:r.id});const i=["read","write"],n=["users","groups","routes"];yield q(n,(t=>re(this,void 0,void 0,(function*(){yield q(i,(i=>re(this,void 0,void 0,(function*(){const n=t+"."+i,s=yield le.create(Object.assign({name:n},e));yield ce.create({groupId:r.id,routeId:s.id})}))))}))));const s=yield le.create(Object.assign({name:"logs.read"},e));yield ce.create({groupId:r.id,routeId:s.id})}a.success(e,"OK")}))}};Q([m(),ee(0,i()),te("design:type",Function),te("design:paramtypes",[Object]),te("design:returntype",Promise)],Ke.prototype,"setup",null),Ke=Q([h("/setup"),y(Ne)],Ke);let Me=class extends Fe{model(){return pe}recordAdd(e,t,r){this.add(r,e,{},{password:V(t).toString()})}recordAll(e,t){this.all(t,e)}recordDel(e,t,r,i){r&&r.id.toString()!=i?this.del(t,e):a.error(e,"Internal Server Error")}recordGet(e,t){this.get(t,e)}recordSet(e,t,r){this.set(r,e,{where:{}},t?{password:V(t).toString()}:{})}};Q([c(),u("auth"),u("write"),u("validation",{name:j.string().required(),email:j.string().email().required(),username:j.string().min(4).required(),password:j.string().min(5).required(),description:j.string().empty(""),state:j.boolean().parse().required()}),ee(0,i()),ee(1,p("password")),ee(2,r()),te("design:type",Function),te("design:paramtypes",[Object,String,Object]),te("design:returntype",void 0)],Me.prototype,"recordAdd",null),Q([m(),u("auth"),u("read"),ee(0,i()),ee(1,r()),te("design:type",Function),te("design:paramtypes",[Object,Object]),te("design:returntype",void 0)],Me.prototype,"recordAll",null),Q([_("/:id"),u("auth"),u("write"),ee(0,i()),ee(1,r()),ee(2,be()),ee(3,O("id")),te("design:type",Function),te("design:paramtypes",[Object,Object,pe,String]),te("design:returntype",void 0)],Me.prototype,"recordDel",null),Q([m("/:id"),u("auth"),u("read"),ee(0,i()),ee(1,r()),te("design:type",Function),te("design:paramtypes",[Object,Object]),te("design:returntype",void 0)],Me.prototype,"recordGet",null),Q([v("/:id"),u("auth"),u("write"),u("validation",{name:j.string().empty(),email:j.string().email().empty(),username:j.string().min(4).empty(),password:j.string().min(5).empty().filter(""),description:j.string().empty(),state:j.boolean().parse().empty()}),ee(0,i()),ee(1,p("password")),ee(2,r()),te("design:type",Function),te("design:paramtypes",[Object,String,Object]),te("design:returntype",void 0)],Me.prototype,"recordSet",null),Me=Q([h("/users"),y(Fe)],Me);let Ge=class extends Fe{model(){return ge}recordAll(e,t,r){this.all(t,e,{where:{userId:r},include:[{model:ae,required:!0}]},(e=>e.map((e=>e.group))))}recordSet(e,t,r){return re(this,void 0,void 0,(function*(){const i=yield pe.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){if(yield ge.destroy({where:{userId:i.id}}),r){let e=0;for(let t=0;t<r.length;t++)e=yield ae.count({where:{id:r[t]}}),e&&(yield ge.create({userId:i.id,groupId:r[t]}))}a.success(e,"OK")}else k(i)?a.notfound(e,"Record not found"):a.error(e,"Internal Server Error")}))}};Q([m("/:id/groups"),u("auth"),u("read","users"),ee(0,i()),ee(1,r()),ee(2,O("id")),te("design:type",Function),te("design:paramtypes",[Object,Object,String]),te("design:returntype",void 0)],Ge.prototype,"recordAll",null),Q([v("/:id/groups"),u("auth"),u("write","users"),u("validation",{groups:j.array(j.number().parse())}),ee(0,i()),ee(1,O("id")),ee(2,p("groups")),te("design:type",Function),te("design:paramtypes",[Object,String,Array]),te("design:returntype",Promise)],Ge.prototype,"recordSet",null),Ge=Q([h("/users"),y(Fe)],Ge);export{Se as Application,oe as Auth,De as AuthController,Ee as Config,me as Configs,Ne as ControllerBase,Be as CrudController,ne as Database,ie as Env,de as Forgot,je as ForgotController,ae as Group,ce as GroupRoute,xe as GroupsController,ke as GroupsRoutesController,he as Log,_e as Logs,Ie as LogsColor,qe as LogsController,Fe as ModelController,Re as Permission,ue as Register,Le as RegisterController,Te as ReqAuth,we as ReqFiles,be as ReqUser,le as Route,Ce as RoutesController,ye as Session,Ke as SetupController,Pe as Token,pe as User,ge as UserGroup,Me as UsersController,Ge as UsersGroupsController,Oe as crt,fe as key,se as sequelize};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andrewcaires/api",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.14",
|
|
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",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
],
|
|
20
20
|
"scripts": {
|
|
21
21
|
"build": "rollup --bundleConfigAsCjs -c rollup.config.js",
|
|
22
|
-
"dev": "ts-node-dev --respawn --transpile-only ./src/dev.ts"
|
|
22
|
+
"dev": "ts-node-dev --clear --respawn --transpile-only ./src/dev.ts"
|
|
23
23
|
},
|
|
24
24
|
"repository": {
|
|
25
25
|
"type": "git",
|
|
@@ -45,38 +45,38 @@
|
|
|
45
45
|
},
|
|
46
46
|
"homepage": "https://github.com/andrewcaires/npm/tree/main/api#readme",
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@andrewcaires/express": "^1.
|
|
49
|
-
"@andrewcaires/utils.js": "^0.2.
|
|
48
|
+
"@andrewcaires/express": "^1.1.3",
|
|
49
|
+
"@andrewcaires/utils.js": "^0.2.26",
|
|
50
50
|
"cors": "^2.8.5",
|
|
51
51
|
"crypto-js": "^4.2.0",
|
|
52
|
-
"dotenv": "^16.
|
|
53
|
-
"express": "^4.
|
|
54
|
-
"express-session": "^1.
|
|
52
|
+
"dotenv": "^16.4.5",
|
|
53
|
+
"express": "^4.19.2",
|
|
54
|
+
"express-session": "^1.18.0",
|
|
55
55
|
"jsonwebtoken": "^9.0.2",
|
|
56
|
-
"mariadb": "^3.
|
|
56
|
+
"mariadb": "^3.3.0",
|
|
57
57
|
"mime-types": "^2.1.35",
|
|
58
58
|
"multer": "^1.4.5-lts.1",
|
|
59
|
-
"mysql2": "^3.
|
|
60
|
-
"sequelize": "^6.
|
|
61
|
-
"ws": "^8.
|
|
59
|
+
"mysql2": "^3.9.7",
|
|
60
|
+
"sequelize": "^6.37.3",
|
|
61
|
+
"ws": "^8.17.0"
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
64
|
"@rollup/plugin-commonjs": "^25.0.7",
|
|
65
65
|
"@rollup/plugin-terser": "^0.4.4",
|
|
66
|
-
"@rollup/plugin-typescript": "^11.1.
|
|
66
|
+
"@rollup/plugin-typescript": "^11.1.6",
|
|
67
67
|
"@types/cors": "^2.8.17",
|
|
68
|
-
"@types/crypto-js": "^4.2.
|
|
68
|
+
"@types/crypto-js": "^4.2.2",
|
|
69
69
|
"@types/express": "^4.17.21",
|
|
70
|
-
"@types/express-session": "^1.
|
|
71
|
-
"@types/jsonwebtoken": "^9.0.
|
|
70
|
+
"@types/express-session": "^1.18.0",
|
|
71
|
+
"@types/jsonwebtoken": "^9.0.6",
|
|
72
72
|
"@types/mime-types": "^2.1.4",
|
|
73
73
|
"@types/multer": "^1.4.11",
|
|
74
|
-
"@types/node": "^20.
|
|
74
|
+
"@types/node": "^20.12.8",
|
|
75
75
|
"@types/ws": "^8.5.10",
|
|
76
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
77
|
-
"@typescript-eslint/parser": "^
|
|
78
|
-
"eslint": "^8.
|
|
79
|
-
"rollup": "^4.
|
|
76
|
+
"@typescript-eslint/eslint-plugin": "^7.8.0",
|
|
77
|
+
"@typescript-eslint/parser": "^7.8.0",
|
|
78
|
+
"eslint": "^8.57.0",
|
|
79
|
+
"rollup": "^4.17.2",
|
|
80
80
|
"rollup-plugin-dts": "^6.1.0",
|
|
81
81
|
"ts-node-dev": "^2.0.0",
|
|
82
82
|
"tslib": "^2.6.2"
|