@andrewcaires/api 4.0.4 → 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/api v4.0.4
2
+ * @andrewcaires/api v4.1.1
3
3
  * Simple api for small applications using express, jsonwebtoken, sequelize and websocket
4
4
  * (c) 2024 Andrew Caires
5
5
  * @license: MIT
6
6
  */
7
- "use strict";var e=require("@andrewcaires/express"),t=require("@andrewcaires/node"),r=require("@andrewcaires/utils.js"),o=require("ws"),s=require("@andrewcaires/sequelize"),i=require("dotenv"),n=require("fs"),d=require("express-session"),a=require("sequelize"),p=require("jsonwebtoken"),l=require("path");function u(e,t,r,o){var s,i=arguments.length,n=i<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,o);else for(var d=e.length-1;d>=0;d--)(s=e[d])&&(n=(i<3?s(n):i>3?s(t,r,n):s(t,r))||n);return i>3&&n&&Object.defineProperty(t,r,n),n}function c(e,t){return function(r,o){t(r,o,e)}}function g(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function y(e,t,r,o){return new(r||(r=Promise))((function(s,i){function n(e){try{a(o.next(e))}catch(e){i(e)}}function d(e){try{a(o.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?s(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(n,d)}a((o=o.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,i.config();class x{static getBool(e,t){return r.toBool(x.getString(e,t.toString()))}static getInt(e,t){return parseInt(x.getString(e,t.toString()))}static getMs(e,t){return r.parseMs(x.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}x.API_CONSOLE_ERROR=x.getBool("API_CONSOLE_ERROR",!1),x.API_DEFAULT_PATH=x.getString("API_DEFAULT_PATH","/api"),x.API_DB_DATABASE=x.getString("API_DB_DATABASE",""),x.API_DB_HOST=x.getString("API_DB_HOST","127.0.0.1"),x.API_DB_PASSWORD=x.getString("API_DB_PASSWORD",""),x.API_DB_PORT=x.getInt("API_DB_PORT",3306),x.API_DB_TYPE=x.getString("API_DB_TYPE",""),x.API_DB_USERNAME=x.getString("API_DB_USERNAME","root"),x.API_DB_LOG=x.getBool("API_DB_LOG",!1),x.API_DB_AUDIT=x.getBool("API_DB_AUDIT",!0),x.API_DB_PREFIX=x.getString("API_DB_PREFIX",""),x.API_DB_TIMEZONE=x.getString("API_DB_TIMEZONE","+00:00"),x.API_HTTP_CRT=x.getString("API_HTTP_CRT",""),x.API_HTTP_KEY=x.getString("API_HTTP_KEY",""),x.API_HTTP_PORT=x.getInt("API_HTTP_PORT",3e3),x.API_HTTP_PUBLIC=x.getString("API_HTTP_PUBLIC",""),x.API_HTTP_CROSS=x.getBool("API_HTTP_CROSS",!1),x.API_HTTP_HYBRID=x.getBool("API_HTTP_HYBRID",!1),x.API_HTTP_NOTFOUND=x.getString("API_HTTP_NOTFOUND",""),x.API_HTTP_REDIRECT=x.getString("API_HTTP_REDIRECT",""),x.API_KEY_HASH=x.getString("API_KEY_HASH",""),x.API_KEY_HEADER=x.getString("API_KEY_HEADER","api_key"),x.API_MODEL_LIMIT=x.getInt("API_MODEL_LIMIT",10),x.API_MODEL_LIMIT_MAX=x.getInt("API_MODEL_LIMIT_MAX",500),x.API_SLEEP_AUTH=x.getMs("API_SLEEP_AUTH","2s"),x.API_SLEEP_FORGOT=x.getMs("API_SLEEP_FORGOT","5s"),x.API_SLEEP_REGISTRY=x.getMs("API_SLEEP_REGISTRY","5s"),x.API_SESSION_NAME=x.getString("API_SESSION_NAME","session.id"),x.API_SESSION_LIFETIME=x.getMs("API_SESSION_LIFETIME","1d"),x.API_SESSION_SECRET=x.getString("API_SESSION_SECRET","yoursecret"),x.API_TOKEN_CRT=x.getString("API_TOKEN_CRT",""),x.API_TOKEN_KEY=x.getString("API_TOKEN_KEY",""),x.API_TOKEN_FORGOT=x.getMs("API_TOKEN_LIFETIME","1d"),x.API_TOKEN_HEADER=x.getString("API_TOKEN_HEADER","authorization"),x.API_TOKEN_LIFETIME=x.getMs("API_TOKEN_LIFETIME","1d"),x.API_TOKEN_RENEW=x.getMs("API_TOKEN_RENEW","1d"),x.API_UPLOAD_COUNT=x.getInt("API_UPLOAD_COUNT",1),x.API_UPLOAD_FIELD=x.getString("API_UPLOAD_FIELD","upload"),x.API_UPLOAD_SIZE=x.getInt("API_UPLOAD_SIZE",2),x.API_UPLOAD_TEMP=x.getString("API_UPLOAD_TEMP","./temp"),x.API_WEBSOCKET_START=x.getBool("API_WEBSOCKET_START",!1);const h=new s.Connection({type:x.API_DB_TYPE,database:x.API_DB_DATABASE,username:x.API_DB_USERNAME,password:x.API_DB_PASSWORD,hostname:x.API_DB_HOST,hostport:x.API_DB_PORT,logging:x.API_DB_LOG,prefix:x.API_DB_PREFIX});class v extends s.Model{}const m=(e,t,r)=>{var o,s,i,n;return{type:e,model:null!==(o=null==t?void 0:t.getTableName())&&void 0!==o?o:null,user_ip:null!==(s=null==r?void 0:r.audit_user_ip)&&void 0!==s?s:null,user_agent:null!==(i=null==r?void 0:r.audit_user_agent)&&void 0!==i?i:null,user_id:null!==(n=null==r?void 0:r.audit_user_id)&&void 0!==n?n:null,state:!0}},_={afterCreate:(e,t)=>y(void 0,void 0,void 0,(function*(){var o;if(!x.API_DB_AUDIT)return;const s=r.isObject(e)?e.constructor:null,i=null!==(o=null==s?void 0:s.primaryKeyAttribute)&&void 0!==o?o:null;yield exports.Audit.create(Object.assign(Object.assign({},m("CREATE",s,t)),{record:i?e.getDataValue(i):null,data:e.toJSON()})).catch(r.noop)})),afterUpdate:(e,t)=>y(void 0,void 0,void 0,(function*(){var o;if(!x.API_DB_AUDIT)return;const s=r.isObject(e)?e.constructor:null,i=null!==(o=null==s?void 0:s.primaryKeyAttribute)&&void 0!==o?o:null,n=e.changed();n&&n.forEach((t=>e.getDataValue(t))),yield exports.Audit.create(Object.assign(Object.assign({},m("UPDATE",s,t)),{record:i?e.getDataValue(i):null,data:e.toJSON(),previously:e.previous()})).catch(r.noop)})),afterDestroy:(e,t)=>y(void 0,void 0,void 0,(function*(){var o;if(!x.API_DB_AUDIT)return;const s=r.isObject(e)?e.constructor:null,i=null!==(o=null==s?void 0:s.primaryKeyAttribute)&&void 0!==o?o:null;yield exports.Audit.create(Object.assign(Object.assign({},m("DELETE",s,t)),{record:i?e.getDataValue(i):null,data:JSON.stringify(e.toJSON())})).catch(r.noop)}))};exports.Auth=class extends v{},u([s.Id(),g("design:type",Number)],exports.Auth.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Auth.prototype,"secret",void 0),u([s.FullDate(),g("design:type",Date)],exports.Auth.prototype,"logout",void 0),u([s.String(),g("design:type",s.String)],exports.Auth.prototype,"user_agent",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Auth.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Auth.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Auth.prototype,"deleted_at",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Auth.prototype,"user_id",void 0),exports.Auth=u([s.Database(h),s.ModelName("auth")],exports.Auth),exports.Register=class extends v{},u([s.Id(),g("design:type",Number)],exports.Register.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Register.prototype,"token",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Register.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Register.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Register.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Register.prototype,"deleted_at",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Register.prototype,"user_id",void 0),exports.Register=u([s.Database(h),s.ModelName("register")],exports.Register),exports.Group=class extends v{},u([s.Id(),g("design:type",Number)],exports.Group.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Group.prototype,"name",void 0),u([s.Text(),g("design:type",s.String)],exports.Group.prototype,"description",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Group.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Group.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Group.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Group.prototype,"deleted_at",void 0),u([s.HasMany((()=>exports.UserGroup),"group_id"),g("design:type",Array)],exports.Group.prototype,"groups_routes",void 0),u([s.HasMany((()=>exports.UserGroup),"group_id"),g("design:type",Array)],exports.Group.prototype,"users_groups",void 0),exports.Group=u([s.Database(h),s.ModelName("group"),s.Hooks(_)],exports.Group),exports.UserGroup=class extends v{},u([s.CreatedAt,g("design:type",Date)],exports.UserGroup.prototype,"created_at",void 0),u([s.BelongsTo((()=>exports.Group)),g("design:type",Number)],exports.UserGroup.prototype,"group_id",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.UserGroup.prototype,"user_id",void 0),exports.UserGroup=u([s.Database(h),s.ModelName("users_groups"),s.Hooks(_)],exports.UserGroup),exports.User=class extends v{},u([s.Id(),g("design:type",Number)],exports.User.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"name",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"email",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"username",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"password",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"salt",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"token",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"avatar",void 0),u([s.DateOnly(),g("design:type",s.String)],exports.User.prototype,"date",void 0),u([s.Text(),g("design:type",s.String)],exports.User.prototype,"description",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.User.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.User.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.User.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.User.prototype,"deleted_at",void 0),u([s.HasMany((()=>exports.Audit),"user_id"),g("design:type",Array)],exports.User.prototype,"audits",void 0),u([s.HasMany((()=>exports.Auth),"user_id"),g("design:type",Array)],exports.User.prototype,"auths",void 0),u([s.HasMany((()=>exports.Register),"user_id"),g("design:type",Array)],exports.User.prototype,"registers",void 0),u([s.HasMany((()=>exports.UserGroup),"user_id"),g("design:type",Array)],exports.User.prototype,"users_groups",void 0),exports.User=u([s.Database(h),s.ModelName("user"),s.DefaultScope({attributes:{exclude:["password","salt","token"]}}),s.Scopes({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),s.Hooks(_)],exports.User),exports.Audit=class extends v{},u([s.Id(),g("design:type",Number)],exports.Audit.prototype,"id",void 0),u([s.Enum("CREATE","DELETE","UPDATE"),g("design:type",s.String)],exports.Audit.prototype,"type",void 0),u([s.String(),g("design:type",s.String)],exports.Audit.prototype,"model",void 0),u([s.String(),g("design:type",s.String)],exports.Audit.prototype,"record",void 0),u([s.String(),g("design:type",s.String)],exports.Audit.prototype,"user_ip",void 0),u([s.String(),g("design:type",s.String)],exports.Audit.prototype,"user_agent",void 0),u([s.Json(),g("design:type",Object)],exports.Audit.prototype,"data",void 0),u([s.Json(),g("design:type",Object)],exports.Audit.prototype,"previously",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Audit.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Audit.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Audit.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Audit.prototype,"deleted_at",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Audit.prototype,"user_id",void 0),exports.Audit=u([s.Database(h),s.ModelName("audit")],exports.Audit),exports.Configs=class extends v{},u([s.String(),g("design:type",s.String)],exports.Configs.prototype,"key",void 0),u([s.String(),g("design:type",s.String)],exports.Configs.prototype,"value",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Configs.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Configs.prototype,"updated_at",void 0),exports.Configs=u([s.Database(h),s.ModelName("configs"),s.Hooks(_)],exports.Configs),exports.Forgot=class extends v{},u([s.Id(),g("design:type",Number)],exports.Forgot.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Forgot.prototype,"token",void 0),u([s.BigInt(),g("design:type",Number)],exports.Forgot.prototype,"timestamp",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Forgot.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Forgot.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Forgot.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Forgot.prototype,"deleted_at",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Forgot.prototype,"user_id",void 0),exports.Forgot=u([s.Database(h),s.ModelName("forgot")],exports.Forgot),exports.Permission=class extends v{},u([s.Id(),g("design:type",Number)],exports.Permission.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Permission.prototype,"name",void 0),u([s.String(),s.Unique(!0),g("design:type",s.String)],exports.Permission.prototype,"route",void 0),u([s.Text(),g("design:type",s.String)],exports.Permission.prototype,"description",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Permission.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Permission.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Permission.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Permission.prototype,"deleted_at",void 0),u([s.HasMany((()=>exports.GroupPermission),"permission_id"),g("design:type",Array)],exports.Permission.prototype,"groups_permissions",void 0),exports.Permission=u([s.Database(h),s.ModelName("permission"),s.Hooks(_)],exports.Permission),exports.GroupPermission=class extends v{},u([s.CreatedAt,g("design:type",Date)],exports.GroupPermission.prototype,"created_at",void 0),u([s.BelongsTo((()=>exports.Group)),g("design:type",Number)],exports.GroupPermission.prototype,"group_id",void 0),u([s.BelongsTo((()=>exports.Permission)),g("design:type",Number)],exports.GroupPermission.prototype,"permission_id",void 0),exports.GroupPermission=u([s.Database(h),s.ModelName("groups_permissions"),s.Hooks(_)],exports.GroupPermission),exports.Log=class extends v{},u([s.Id(),g("design:type",Number)],exports.Log.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Log.prototype,"type",void 0),u([s.String(),g("design:type",s.String)],exports.Log.prototype,"source",void 0),u([s.Text(),g("design:type",s.String)],exports.Log.prototype,"message",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Log.prototype,"created_at",void 0),exports.Log=u([s.Database(h),s.ModelName("log")],exports.Log),exports.Session=class extends v{},u([s.String(),g("design:type",s.String)],exports.Session.prototype,"session",void 0),u([s.Text(),g("design:type",s.String)],exports.Session.prototype,"json",void 0),u([s.BigInt(),g("design:type",Number)],exports.Session.prototype,"expired",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Session.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Session.prototype,"updated_at",void 0),exports.Session=u([s.Database(h),s.ModelName("session")],exports.Session);class P{static write(e,r,o){return y(this,void 0,void 0,(function*(){yield P.writeRaw(t.LogColor.White,"",e,r,o)}))}static error(e,r,o){return y(this,void 0,void 0,(function*(){yield P.writeRaw(t.LogColor.Red,"error",e,r,o)}))}static info(e,r,o){return y(this,void 0,void 0,(function*(){yield P.writeRaw(t.LogColor.Cyan,"info",e,r,o)}))}static success(e,r,o){return y(this,void 0,void 0,(function*(){yield P.writeRaw(t.LogColor.Green,"success",e,r,o)}))}static warning(e,r,o){return y(this,void 0,void 0,(function*(){yield P.writeRaw(t.LogColor.Yellow,"warning",e,r,o)}))}static writeRaw(e,r,o,s,i){return y(this,void 0,void 0,(function*(){i&&t.Log.console(e,r,o),h&&(yield exports.Log.create({type:r,source:s,message:o}).catch((()=>null)))}))}}const A=e=>n.existsSync(e)?n.readFileSync(e):void 0,f={http:A(x.API_HTTP_CRT),token:A(x.API_TOKEN_CRT)},C={http:A(x.API_HTTP_KEY),token:A(x.API_TOKEN_KEY)};class S extends d.Store{constructor(){super(),this.all=e=>y(this,void 0,void 0,(function*(){e=e||r.noop;const t=yield exports.Session.findAll({attributes:["session"],where:{expired:{[a.Op.gte]:Date.now()}}}).catch((t=>(e(t),null)));t&&e(null,t.map((e=>e.session))),e()})),this.clear=e=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy().catch(r.noop),e&&e()})),this.destroy=(e,t)=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy({where:{session:e}}).catch(r.noop),t&&t()})),this.expired=()=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy({where:{expired:{[a.Op.lt]:Date.now()}}}).catch(r.noop)})),this.get=(e,t)=>y(this,void 0,void 0,(function*(){t=t||r.noop;const o=yield exports.Session.findOne({where:{session:e,expired:{[a.Op.gte]:Date.now()}}}).catch((e=>(t(e),null)));if(o){const e=JSON.parse(o.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield o.destroy().catch(r.noop),void t(null)}t(null,e)}else t(null)})),this.length=e=>y(this,void 0,void 0,(function*(){e&&e(null,(yield exports.Session.count().catch(r.noop))||0)})),this.set=(e,t,o)=>y(this,void 0,void 0,(function*(){o=o||r.noop;const s=Date.now()+x.API_SESSION_LIFETIME,i=JSON.stringify(t),[n,d]=(yield exports.Session.findOrCreate({where:{session:e},defaults:{session:e,json:i,expired:s}}).catch(r.noop))||[];n&&(d||(n.json=i,n.expired=s,yield n.save().catch(r.noop))),o()})),this.loop=r.loop(this.expired,3e4),this.loop.start()}}class O{static create(e){return y(this,void 0,void 0,(function*(){if(!C.token)return{error:"Key not found"};const{id:t}=e,o=r.uuidv4(),s=yield exports.Auth.create({secret:o,user_id:t}).catch(O.error);if(!s)return{error:"Internal Server Error"};return{auth:s,token:p.sign({id:t,secret:o},C.token,O.options())}}))}static destroy(e){return y(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){P.error(e.message,"api.token",x.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:x.API_TOKEN_LIFETIME+"ms"}}static renew(e){return y(this,void 0,void 0,(function*(){if(!C.token)return{error:"Key not found"};const{error:t,decode:o}=O.verify(e,x.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(o){const{id:e,secret:t}=o;if(e&&t){const o=yield exports.User.findOne({where:{id:e,state:!0}}).catch(O.error);if(o){const s=yield exports.Auth.findOne({where:{secret:t,user_id:o.id}}).catch(O.error);if(s&&!s.logout){s.secret=r.uuidv4(),yield s.save().catch(O.error);return{auth:s,token:p.sign({id:e,secret:s.secret},C.token,O.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e,t,r){return y(this,void 0,void 0,(function*(){if(e){t=r.hash.encrypt(e);const o=yield exports.User.findOne({where:{token:t,state:!0}}).catch(O.error);if(o){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield exports.Auth.findOrCreate({where:{secret:t,user_id:o.id},defaults:{secret:t,user_id:o.id}}).catch(O.error))||[];if(r)return{auth:r,user:o}}return{error:"Access denied"}}const{error:o,decode:s}=O.verify(t);if(o)return{error:o};if(s){const{id:e,secret:t}=s;if(e&&t){const r=yield exports.User.findOne({where:{id:e,state:!0}}).catch(O.error);if(r){const e=yield exports.Auth.findOne({where:{secret:t,user_id:r.id}}).catch(O.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!f.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:p.verify(e,f.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class I extends e.Application{constructor(e){super(e,{cert:f.http,cross:x.API_HTTP_CROSS,hybrid:x.API_HTTP_HYBRID,key:C.http,notfound:x.API_HTTP_NOTFOUND,path:x.API_DEFAULT_PATH,port:x.API_HTTP_PORT,public:x.API_HTTP_PUBLIC,redirect:x.API_HTTP_REDIRECT,session:{store:new S,name:x.API_SESSION_NAME,secret:x.API_SESSION_SECRET,cookie:{maxAge:x.API_SESSION_LIFETIME},genid:r.uuidv4}}),this.hash=new t.Hash(x.API_KEY_HASH)}error(e,t){P.error(e.message,t,x.API_CONSOLE_ERROR)}log(e,t){P.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return y(this,void 0,void 0,(function*(){yield h.sync(),yield e.listen.call(this),x.API_WEBSOCKET_START&&this.server&&(this._webSocket=new o.WebSocketServer({server:this.server,verifyClient:(e,t)=>t(x.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>y(this,void 0,void 0,(function*(){t.url||(t.url="");const o=t.url.length<=1?"":t.url.replace(/\//g,".");let s;e.on("message",(r=>y(this,void 0,void 0,(function*(){if(s)try{const i=JSON.parse(r);this.emit("ws.message"+o,{data:i,message:r,req:t,user:s,ws:e})}catch(i){this.emit("ws.message"+o,{message:r,req:t,user:s,ws:e})}else{const{user:i}=yield O.user("",r.toString(),this);i&&(s=i,this.emit("ws.connection"+o,{req:t,user:s,ws:e}))}s||e.close()})))),e.on("close",(()=>{s&&this.emit("ws.close"+o,{user:s,ws:e})})),yield r.sleep(2e3),s||e.close()})))))}))}websocket(){return this._webSocket}}class E{static all(){return y(this,void 0,void 0,(function*(){const e=yield exports.Configs.findAll().catch(E.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e,t){return y(this,void 0,void 0,(function*(){var r;const o=null!==(r=null==t?void 0:t.id)&&void 0!==r?r:null;return((yield exports.Configs.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:o})).catch(E.error))||0)>0}))}static error(e){P.error(e.message,"api.config",x.API_CONSOLE_ERROR)}static get(e){return y(this,arguments,void 0,(function*(e,t=""){const[r]=(yield exports.Configs.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(E.error))||[];return r?r.value:t}))}static set(e,t,r){return y(this,void 0,void 0,(function*(){var o;const s=null!==(o=null==r?void 0:r.id)&&void 0!==o?o:null,[i]=(yield exports.Configs.findOrCreate(Object.assign({where:{key:e}},{user_id:s})).catch(E.error))||[];i&&(i.value=t,yield i.save().catch(E.error))}))}}const w=e=>{var t,r,o,s,i,n;return{audit_user_ip:null!==(t=e.ip())&&void 0!==t?t:"0.0.0.0",audit_user_id:null!==(s=null===(o=null===(r=null==e?void 0:e.req)||void 0===r?void 0:r.user)||void 0===o?void 0:o.id)&&void 0!==s?s:null,audit_user_agent:null!==(n=null===(i=e.req)||void 0===i?void 0:i.headers["user-agent"])&&void 0!==n?n:""}},T=e.parameterFactory((({ctx:e})=>w(e))),b=e.parameterFactory((({ctx:e})=>e.req.auth)),D=e.parameterFactory((({ctx:e})=>e.req.user));class U extends r.EventEmitter{auth(e,t,r,o,s){return y(this,void 0,void 0,(function*(){const{auth:i,error:n,user:d}=yield O.user(t,r,s);return n?e.error(n):i&&d?i.user_agent&&i.user_agent!=o?e.error("Invalid token"):(e.req.auth=i,e.req.user=d,void e.next()):e.error("Internal Server Error")}))}create(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".create",r)}))}delete(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".delete",r)}))}error(e){P.error(e.message,"api.controller",x.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r){return y(this,void 0,void 0,(function*(){if(r){const o=yield this.permissions(r,{route:t});if(o&&o.length>0)return e.next()}e.unauthorized("Access denied")}))}permissions(e,t){return y(this,void 0,void 0,(function*(){return yield exports.Permission.findAll({where:Object.assign(Object.assign({},null!=t?t:{}),{state:!0}),include:[{model:exports.GroupPermission,required:!0,include:[{model:exports.Group,required:!0,where:{state:!0},include:[{model:exports.UserGroup,required:!0,where:{user_id:e.id}}]}]}]}).catch(this.error)}))}read(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".read",r)}))}session(e,t,o){return y(this,void 0,void 0,(function*(){o.auth&&o.user&&(o.user_agent?o.user_agent!=t&&o.regenerate(r.noop):(o.user_agent=t,o.save(r.noop))),e.next()}))}upload(t,r){r.path||(r.path=x.API_UPLOAD_TEMP),r.size||(r.size=x.API_UPLOAD_SIZE),r.field||(r.field=x.API_UPLOAD_FIELD),e.Upload.middleware(t,r)}update(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".update",r)}))}validation(e,t){return y(this,void 0,void 0,(function*(){const{error:o,value:s}=yield r.Validation.object(t).parse().validateAsync(e.req.body);if(o)return e.validation(o);e.req.body=s,e.next()}))}}u([c(0,e.Ctx()),c(1,e.Headers(x.API_KEY_HEADER)),c(2,e.Headers(x.API_TOKEN_HEADER)),c(3,e.Headers("user-agent")),c(4,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,String,I]),g("design:returntype",Promise)],U.prototype,"auth",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,D()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],U.prototype,"create",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,D()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],U.prototype,"delete",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,D()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],U.prototype,"permission",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,D()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],U.prototype,"read",null),u([c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Session()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object]),g("design:returntype",Promise)],U.prototype,"session",null),u([c(0,e.Ctx()),c(1,e.Argument()),g("design:type",Function),g("design:paramtypes",[e.Context,Object]),g("design:returntype",void 0)],U.prototype,"upload",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,D()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],U.prototype,"update",null),u([c(0,e.Ctx()),c(1,e.Argument()),g("design:type",Function),g("design:paramtypes",[e.Context,Object]),g("design:returntype",Promise)],U.prototype,"validation",null),exports.ModelController=class extends U{constructor(){super(...arguments),this._columns=[]}_add(t){return y(this,arguments,void 0,(function*({ctx:t,options:r,body:o}){const s=yield this.model().create(Object.assign(Object.assign({},t.req.body),o||{}),Object.assign(Object.assign({},r||{}),w(t))).catch(this.error);if(s){const r=this.key();return t.prepare(e.Status.OK,{[r]:s.getDataValue(r)}),s}t.error("Internal Server Error")}))}_all(t){return y(this,arguments,void 0,(function*({ctx:t,options:o,callback:s,scope:i}){var n,d,p,l;const u=this.scope(i),c=Object.assign({},o||{});c.where=Object.assign({},c.where||{});const g=t.req.query.limit,y=r.isString(g)?parseInt(g):x.API_MODEL_LIMIT;c.limit=y>=0?Math.min(y,x.API_MODEL_LIMIT_MAX):void 0;const h=t.req.query.offset;if(r.isString(h)){const e=h?parseInt(h):0;c.offset=e>0?e:void 0}const v=[],m=this.columns(),_=e=>m.indexOf(e)>=0,P=null===(n=t.req.query.asc)||void 0===n?void 0:n.toString();P&&P.length&&v.push(...P.split(",").filter(_).map((e=>[e,"ASC"])));const A=null===(d=t.req.query.desc)||void 0===d?void 0:d.toString();A&&A.length&&v.push(...A.split(",").filter(_).map((e=>[e,"DESC"]))),v.length&&(c.order=v);const f=[],C=null===(p=t.req.query.search)||void 0===p?void 0:p.toString();(r.isArray(c.attributes)?c.attributes:m).filter(r.isString).forEach((e=>{var r;if(C&&C.length&&f.push({[e]:{[a.Op.like]:`%${C}%`}}),"search_"+e in t.req.query){const o=null===(r=t.req.query["search_"+e])||void 0===r?void 0:r.toString();o&&o.length&&f.push({[e]:{[a.Op.like]:`%${o}%`}})}})),f.length&&(c.where=Object.assign(Object.assign({},c.where),{[a.Op.or]:[...f]}));const S=null!==(l=yield u.count(Object.assign(Object.assign({},c),{col:m[0]})).catch(this.error))&&void 0!==l?l:0,O=yield u.findAll(c).catch(this.error),I={count:S};return O?(t.prepare(e.Status.OK,Object.assign(Object.assign({},I),{records:s?yield s(O):O})),Object.assign(Object.assign({},I),{records:O})):(t.error("Internal Server Error"),Object.assign(Object.assign({},I),{records:[]}))}))}columns(){return 0==this._columns.length&&(this._columns=Object.keys(this.model().getAttributes())),this._columns}_del(e){return y(this,arguments,void 0,(function*({ctx:e,options:t}){const r=this.key(),{[r]:o}=e.req.params;if(!o)return e.error("Internal Server Error"),0;const s=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[r]:o}),individualHooks:!0}),w(e))).catch(this.error);return s?(e.success("OK"),s):(e.notFound("Record not found"),0)}))}error(e){e.sql?P.error(e.message+"\n"+e.sql,"api.controller.sql",x.API_CONSOLE_ERROR):super.error(e)}_get(t){return y(this,arguments,void 0,(function*({ctx:t,options:r,callback:o,scope:s}){const i=this.key(),{[i]:n}=t.req.params,d=yield this.scope(s).findOne(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[i]:n})})).catch(this.error);return d?(t.prepare(e.Status.OK,o?yield o(d):d.toJSON()),d):null===d?t.notFound("Record not found"):void t.error("Internal Server Error")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}_set(e){return y(this,arguments,void 0,(function*({ctx:e,options:t,body:r}){var o;const s=this.key(),{[s]:i}=e.req.params,[n]=null!==(o=yield this.model().update(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[s]:i}),individualHooks:!0}),w(e))).catch(this.error))&&void 0!==o?o:[];return n?(e.success("OK"),!0):(e.success("Record not changed"),!1)}))}},exports.ModelController=u([e.Extends(U)],exports.ModelController),exports.AuditsController=class extends exports.ModelController{model(){return exports.Audit}all(e,t,r){return y(this,void 0,void 0,(function*(){const o={};t&&(o.type=t),r&&(o.table=r),yield this._all({ctx:e,options:{attributes:{exclude:["data","previously"]},where:o,order:[["created_at","DESC"]]}})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}},u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),c(1,e.Query("type")),c(2,e.Query("table")),g("design:type",Function),g("design:paramtypes",[e.Context,String,String]),g("design:returntype",Promise)],exports.AuditsController.prototype,"all",null),u([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.AuditsController.prototype,"get",null),exports.AuditsController=u([e.Controller("/audits"),e.Extends(exports.ModelController)],exports.AuditsController),exports.AuthController=class extends U{login(e,o,s,i,n){return y(this,void 0,void 0,(function*(){var d;yield r.sleep(x.API_SLEEP_AUTH);const p=yield exports.User.scope("password").findOne({where:{[a.Op.or]:[{email:s},{username:s}]}}).catch(this.error);if(i+=null!==(d=null==p?void 0:p.salt)&&void 0!==d?d:"",!p||p.password!=t.sha256(i))return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const l=yield exports.Register.findOne({where:{state:!0,user_id:p.id}}).catch(this.error);if(l)return e.error("Activation required"),n.emit("auth.activation",{ctx:e,register:l,user:p}),void this.emit("auth.activation",{ctx:e,register:l,user:p});if(!p.state)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e,user:p}),void this.emit("auth.failure",{ctx:e,user:p});const{auth:u,error:c,token:g}=yield O.create(p);return c?(e.error(c),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):u&&g?(u.user_agent=o,yield u.save().catch(this.error),e.json({token:g}),n.emit("auth.login",{auth:u,ctx:e,user:p}),void this.emit("auth.login",{auth:u,ctx:e,user:p})):(e.error("Internal Server Error"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,r,o){return y(this,void 0,void 0,(function*(){if(yield O.destroy(t))return e.success("Disconcerted"),o.emit("auth.logout",{auth:t,ctx:e,user:r}),void this.emit("auth.logout",{auth:t,ctx:e,user:r});e.unauthorized("Access denied")}))}renew(e,t,r,o){return y(this,void 0,void 0,(function*(){const{auth:s,error:i,token:n}=yield O.renew(r);return i?e.error(i):s?(s.user_agent=t,yield s.save().catch(this.error),e.json({token:n}),o.emit("auth.renew",{auth:s,ctx:e}),void this.emit("auth.renew",{auth:s,ctx:e})):e.error("Internal Server Error")}))}user(e,t){return y(this,void 0,void 0,(function*(){const r=yield this.permissions(t);if(!r)return e.error("Internal Server Error");e.json(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.route))}))}))}},u([e.Post("/login"),e.Middleware("validation",{username:r.Validation.string().min(3).required(),password:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Body("username")),c(3,e.Body("password")),c(4,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,String,I]),g("design:returntype",Promise)],exports.AuthController.prototype,"login",null),u([e.Get("/logout"),e.Middleware("auth"),c(0,e.Ctx()),c(1,b()),c(2,D()),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.Auth,exports.User,I]),g("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),u([e.Post("/renew"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Body("token")),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,I]),g("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),u([e.Get(),e.Middleware("auth"),c(0,e.Ctx()),c(1,D()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=u([e.Controller("/auth"),e.Extends(U)],exports.AuthController),exports.FilesController=class extends U{directory(){return x.API_HTTP_PUBLIC||"./"}files(e){return y(this,void 0,void 0,(function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const o=l.join(this.directory(),t);if(!n.existsSync(o)||!n.statSync(o).isDirectory())return e.notFound("Path not Found");let s=[];return s=n.readdirSync(o),s=s.map((e=>this.info(l.join(o,e)))),s=s.filter(r.isDef),Object.assign(Object.assign({},this.info(o)),{files:s})}))}access(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,this.name()+"."+t,r)}))}info(e){if(!n.existsSync(e))return null;const t=n.statSync(e),r=e.split("/").pop();e=e.replace(this.directory(),"/").replace(/^\/\//,"/");const o=t.isDirectory();return{name:r,path:e.replace(/^\/\//,"/"),size:t.size,extension:o?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:o,symlink:t.isSymbolicLink()}}name(){return"files"}},u([e.Get("/path/?*"),e.Middleware("auth"),e.Middleware("access","list"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.FilesController.prototype,"files",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,D()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],exports.FilesController.prototype,"access",null),exports.FilesController=u([e.Controller("/files"),e.Extends(U)],exports.FilesController),exports.ForgotController=class extends U{check(e,t){return y(this,void 0,void 0,(function*(){const o=yield this.find(t);if(!o||!o.user)return e.notFound("User not found");o.token=r.uniqueID(),yield o.save(),e.json({token:o.token})}))}forgot(e,t,o){return y(this,void 0,void 0,(function*(){yield r.sleep(x.API_SLEEP_FORGOT);const s=t,i=yield exports.User.findOne({where:{[a.Op.or]:[{email:s},{username:t}]}}).catch(this.error);if(!i)return e.notFound("User not found");const n=r.uniqueID(),d=Date.now()+6e4*x.API_TOKEN_FORGOT,p=yield exports.Forgot.create({token:n,timestamp:d,state:!0,user_id:i.id});e.success("OK"),o.emit("forgot.send",{ctx:e,forgot:p,user:i}),this.emit("forgot.send",{ctx:e,forgot:p,user:i})}))}reset(e,r,o,s){return y(this,void 0,void 0,(function*(){const i=yield this.find(r);if(!i)return e.notFound("User not found");i.state=!1,yield i.save().catch(this.error),i.user.password=t.sha256(o),yield i.user.save().catch(this.error),e.success("OK"),s.emit("forgot.reset",{ctx:e,user:i.user}),this.emit("forgot.reset",{ctx:e,user:i.user})}))}find(e){return y(this,void 0,void 0,(function*(){return yield exports.Forgot.findOne({where:{token:e,state:!0},include:[{model:exports.User,required:!0}]}).catch(this.error)}))}},u([e.Get("/check"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Body("token")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),u([e.Post(),e.Middleware("validation",{username:r.Validation.string().min(4).required()}),c(0,e.Ctx()),c(1,e.Body("username")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,I]),g("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),u([e.Post("/reset"),e.Middleware("validation",{token:r.Validation.string().required(),password:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Body("token")),c(2,e.Body("password")),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,I]),g("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=u([e.Controller("/forgot"),e.Extends(U)],exports.ForgotController),exports.CrudController=class extends exports.ModelController{constructor(){super(...arguments),this._crud={}}add(e){return y(this,void 0,void 0,(function*(){yield this._add({ctx:e})}))}all(e){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}CrudCreate(){return this._crud}del(e){return y(this,void 0,void 0,(function*(){yield this._del({ctx:e})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e){return y(this,void 0,void 0,(function*(){yield this._set({ctx:e})}))}CrudUpdate(){return this._crud}validationAdd(e){return y(this,void 0,void 0,(function*(){const t=this.CrudCreate();if(t==this._crud)return e.error("Internal Server Error");yield this.validation(e,t)}))}validationSet(e){return y(this,void 0,void 0,(function*(){const t=this.CrudUpdate();if(t==this._crud)return e.error("Internal Server Error");yield this.validation(e,t)}))}},u([e.Post(),e.Middleware("auth"),e.Middleware("create"),e.Middleware("validationAdd"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"add",null),u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"all",null),u([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("delete"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"del",null),u([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"get",null),u([e.Put("/:id"),e.Middleware("auth"),e.Middleware("update"),e.Middleware("validationSet"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"set",null),u([c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"validationAdd",null),u([c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"validationSet",null),exports.CrudController=u([e.Extends(exports.ModelController)],exports.CrudController),exports.GroupsController=class extends exports.CrudController{model(){return exports.Group}CrudCreate(){return{name:r.Validation.string().required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}}CrudUpdate(){return{name:r.Validation.string().empty(),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}}},exports.GroupsController=u([e.Controller("/groups"),e.Extends(exports.CrudController)],exports.GroupsController),exports.GroupsPermissionsController=class extends exports.ModelController{model(){return exports.GroupPermission}all(e,t){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{group_id:t},include:[{model:exports.Permission,required:!0}]},callback:e=>e.map((e=>e.permission))})}))}set(e,t,o,s){return y(this,void 0,void 0,(function*(){const i=yield exports.Group.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield exports.GroupPermission.destroy(Object.assign({where:{group_id:t},individualHooks:!0},s)),o){let e=0;yield r.sleep(1e3);for(let r=0;r<o.length;r++)e=yield exports.Permission.count({where:{id:o[r]}}),e&&(yield exports.GroupPermission.create({group_id:t,permission_id:o[r]},Object.assign({},s)))}return e.success("OK")}if(r.isNull(i))return e.notFound("Record not found");e.error("Internal Server Error")}))}},u([e.Get("/:id/routes"),e.Middleware("auth"),e.Middleware("read","groups"),c(0,e.Ctx()),c(1,e.Params("id")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"all",null),u([e.Put("/:id/permissions"),e.Middleware("auth"),e.Middleware("update","groups"),e.Middleware("validation",{permissions:r.Validation.array(r.Validation.number().parse())}),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.Body("permissions")),c(3,T()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Array,Object]),g("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"set",null),exports.GroupsPermissionsController=u([e.Controller("/groups"),e.Extends(exports.ModelController)],exports.GroupsPermissionsController),exports.LogsController=class extends exports.ModelController{model(){return exports.Log}all(e,t,r){return y(this,void 0,void 0,(function*(){const o={};t&&(o.type=t),r&&(o.source=r),yield this._all({ctx:e,options:{where:o,order:[["created_at","DESC"]]}})}))}},u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),c(1,e.Query("type")),c(2,e.Query("source")),g("design:type",Function),g("design:paramtypes",[e.Context,String,String]),g("design:returntype",Promise)],exports.LogsController.prototype,"all",null),exports.LogsController=u([e.Controller("/logs"),e.Extends(exports.ModelController)],exports.LogsController),exports.PermissionsController=class extends exports.CrudController{model(){return exports.Permission}CrudCreate(){return{name:r.Validation.string().required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}}CrudUpdate(){return{name:r.Validation.string().empty(),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}}},exports.PermissionsController=u([e.Controller("/permissions"),e.Extends(exports.CrudController)],exports.PermissionsController),exports.RegisterController=class extends U{register(e,o,s){return y(this,void 0,void 0,(function*(){yield r.sleep(x.API_SLEEP_REGISTRY);const{name:i,date:n,email:d,username:p,password:l,confirm:u}=o,c=p||d,g=t.sha256(l);if(yield exports.User.count({where:{[a.Op.or]:[{email:d},{username:c}]}}).catch(this.error))return e.validation("Invalid email or username");if(g!=t.sha256(u))return e.error("Invalid password");const y=yield exports.User.create({name:i,email:d,username:c,password:g,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!y)return e.error("Internal Server Error");const h=yield exports.Register.create({token:yield this.getId(),user_id:y.id,state:!0}).catch(this.error);if(!h)return yield y.destroy().catch(this.error),e.error("Internal Server Error");e.success("OK"),s.emit("register.user",{ctx:e,register:h,user:y}),this.emit("register.user",{ctx:e,register:h,user:y})}))}confirm(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield exports.Register.findOne({where:{token:t,state:!0},include:[{model:exports.User,required:!0}]}).catch(this.error);if(!o)return e.notFound("User not found");o.state=!1,yield o.save().catch(this.error),o.user.state=!0,yield o.user.save().catch(this.error),e.success("OK"),r.emit("register.confirm",{ctx:e,register:o,user:o.user}),this.emit("register.confirm",{ctx:e,register:o,user:o.user})}))}send(e,t,r){return y(this,void 0,void 0,(function*(){const o=t,s=yield exports.Register.findOne({where:{state:!0},include:[{model:exports.User,required:!0,where:{[a.Op.or]:[{email:o},{username:t}]}}]}).catch(this.error);if(!s)return e.notFound("User not found");e.success("OK"),r.emit("register.send",{ctx:e,register:s,user:s.user}),this.emit("register.send",{ctx:e,register:s,user:s.user})}))}getId(){return y(this,void 0,void 0,(function*(){const e=r.uuidv4();return(yield exports.Register.count({where:{token:e}}))?this.getId():e}))}},u([e.Post(),e.Middleware("validation",{name:r.Validation.string().required(),date:r.Validation.date().required(),email:r.Validation.string().email().required(),username:r.Validation.string().min(4).empty(),password:r.Validation.string().min(5).required(),confirm:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Body()),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,Object,I]),g("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),u([e.Post("/confirm"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Body("token")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,I]),g("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),u([e.Post("/send"),e.Middleware("validation",{username:r.Validation.string().min(4).required()}),c(0,e.Ctx()),c(1,e.Body("username")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,I]),g("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=u([e.Controller("/register"),e.Extends(U)],exports.RegisterController),exports.SetupController=class extends U{setup(e,o){return y(this,void 0,void 0,(function*(){if(0==(yield exports.User.count())){const e=r.uniqueID(),s=yield exports.User.create({name:"Admin",email:"admin@localhost",username:"admin",password:t.sha256("admin"+e),salt:e,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0},Object.assign({},o)),i={description:"API CORE",state:!0},n=yield exports.Group.create(Object.assign({name:"admin"},i),Object.assign({},o));yield exports.UserGroup.create({user_id:s.id,group_id:n.id},Object.assign({},o));const d=["audits","users","groups","routes"],a=["create","read","update","delete"];yield r.forEachSeries(d,(e=>y(this,void 0,void 0,(function*(){yield r.forEachSeries(a,(t=>y(this,void 0,void 0,(function*(){const r=yield exports.Permission.create(Object.assign({name:`${e} ${t}`,route:`${e}.${t}`},i),Object.assign({},o));yield exports.GroupPermission.create({group_id:n.id,permission_id:r.id},Object.assign({},o))}))))}))));const p=["delete","list","read","rename","upload","write"];yield r.forEachSeries(p,(e=>y(this,void 0,void 0,(function*(){const t=yield exports.Permission.create(Object.assign({name:`files ${e}`,route:`files.${e}`},i),Object.assign({},o));yield exports.GroupPermission.create({group_id:n.id,permission_id:t.id},Object.assign({},o))}))));const l=["logs"];yield r.forEachSeries(l,(e=>y(this,void 0,void 0,(function*(){const t=yield exports.Permission.create(Object.assign({name:`${e} files`,route:`${e}.read`},i),Object.assign({},o));yield exports.GroupPermission.create({group_id:n.id,permission_id:t.id},Object.assign({},o))}))))}e.success("OK")}))}},u([e.Get(),c(0,e.Ctx()),c(1,T()),g("design:type",Function),g("design:paramtypes",[e.Context,Object]),g("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=u([e.Controller("/setup"),e.Extends(U)],exports.SetupController),exports.UsersController=class extends exports.ModelController{model(){return exports.User}constructor(){super(),this.path=x.API_HTTP_PUBLIC+"/avatar",x.API_HTTP_PUBLIC&&n.existsSync(x.API_HTTP_PUBLIC)&&!n.existsSync(this.path)&&n.mkdirSync(this.path)}avatar(e,t,r,o){return y(this,void 0,void 0,(function*(){if(t.length){const s=t[0].filename||"";if(s){const t=this.path+"/"+r.avatar;if(n.existsSync(t)&&n.lstatSync(t).isFile()&&n.rmSync(t),r.avatar=s,yield r.save(Object.assign({},o)).catch(this.error))return e.success("OK")}}e.success("Record not changed")}))}avatar_delete(e,t,r){return y(this,void 0,void 0,(function*(){const o=this.path+"/"+t.avatar;t.avatar="",(yield t.save(Object.assign({},r)).catch(this.error))&&n.existsSync(o)&&n.rmSync(o),e.success("OK")}))}password(e,o,s,i,n){return y(this,void 0,void 0,(function*(){var d;const a=yield this.scope("password").findOne({where:{id:i.id,state:!0}}).catch(this.error);return o+=null!==(d=null==a?void 0:a.salt)&&void 0!==d?d:"",a&&a.password==t.sha256(o)?(a.salt=r.uniqueID(),a.password=t.sha256(s+a.salt),(yield a.save(Object.assign({},n)).catch(this.error))?e.success("OK"):void e.success("Record not changed")):e.error("Record not changed")}))}token(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.model().findOne({attributes:["token"],where:{id:t.id}}).catch(this.error);if(o)return e.json({token:r.hash.decrypt(o.token)});e.notFound("Record not found")}))}token_get(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.scope("token").findOne({where:{id:t}}).catch(this.error);if(o)return e.json({token:r.hash.decrypt(o.token)});e.notFound("Record not found")}))}token_delete(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(o)return o.token="",yield o.save(Object.assign({},r)).catch(this.error),e.success("OK");e.notFound("Record not found")}))}token_renew(e,t,r,o){return y(this,void 0,void 0,(function*(){const s=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(s){const t=yield this.token_new();return s.token=o.hash.encrypt(t),yield s.save(Object.assign({},r)).catch(this.error),e.json({token:t})}e.notFound("Record not found")}))}token_new(){return y(this,void 0,void 0,(function*(){var e;const t=r.uuidv4();return(null!==(e=yield this.model().count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t}))}add(e,o){return y(this,void 0,void 0,(function*(){const s=r.uniqueID();yield this._add({ctx:e,body:{password:t.sha256(o+s),salt:s}})}))}all(e){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}del(e,t,r){return y(this,void 0,void 0,(function*(){if(r.id.toString()==t)return e.notFound("Record not found");yield this._del({ctx:e})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,o){return y(this,void 0,void 0,(function*(){const s=r.uniqueID();yield this._set({ctx:e,body:o?{password:t.sha256(o+s),salt:s}:{}})}))}},u([e.Post("/avatar"),e.Middleware("auth"),e.Middleware("upload",(e=>({count:1,field:"file",path:e.controller.path,types:["image/bmp","image/jpeg","image/png"],size:32}))),c(0,e.Ctx()),c(1,e.Files()),c(2,D()),c(3,T()),g("design:type",Function),g("design:paramtypes",[e.Context,Array,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),u([e.Delete("/avatar"),e.Middleware("auth"),c(0,e.Ctx()),c(1,D()),c(2,T()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"avatar_delete",null),u([e.Post("/password"),e.Middleware("auth"),e.Middleware("validation",{oldPassword:r.Validation.string().min(5).required(),newPassword:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Body("oldPassword")),c(2,e.Body("newPassword")),c(3,D()),c(4,T()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"password",null),u([e.Get("/token"),e.Middleware("auth"),c(0,e.Ctx()),c(1,D()),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User,I]),g("design:returntype",Promise)],exports.UsersController.prototype,"token",null),u([e.Get("/token/:id"),e.Middleware("auth"),e.Middleware("create"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,I]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_get",null),u([e.Delete("/token/:id"),e.Middleware("auth"),e.Middleware("delete"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,T()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_delete",null),u([e.Get("/token/renew/:id"),e.Middleware("auth"),e.Middleware("update"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,T()),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object,I]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_renew",null),u([e.Post(),e.Middleware("auth"),e.Middleware("create"),e.Middleware("validation",{name:r.Validation.string().required(),email:r.Validation.string().email().required(),username:r.Validation.string().min(4).required(),password:r.Validation.string().min(5).required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}),c(0,e.Ctx()),c(1,e.Body("password")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.UsersController.prototype,"add",null),u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.UsersController.prototype,"all",null),u([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("delete"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,D()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],exports.UsersController.prototype,"del",null),u([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.UsersController.prototype,"get",null),u([e.Put("/:id"),e.Middleware("auth"),e.Middleware("update"),e.Middleware("validation",{name:r.Validation.string().empty(),email:r.Validation.string().email().empty(),username:r.Validation.string().min(4).empty(),password:r.Validation.string().min(5).empty().filter(""),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}),c(0,e.Ctx()),c(1,e.Body("password")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=u([e.Controller("/users"),e.Extends(exports.ModelController),g("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class extends exports.ModelController{model(){return exports.UserGroup}groups(e,t){return y(this,void 0,void 0,(function*(){yield this.all(e,t.id.toString())}))}all(e,t){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{user_id:t},include:[{model:exports.Group,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,o,s){return y(this,void 0,void 0,(function*(){const i=yield exports.User.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){if(yield exports.UserGroup.destroy(Object.assign({where:{user_id:i.id},individualHooks:!0},s)),o){let e=0;yield r.sleep(1e3);for(let t=0;t<o.length;t++)e=yield exports.Group.count({where:{id:o[t]}}),e&&(yield exports.UserGroup.create({user_id:i.id,group_id:o[t]},Object.assign({},s)))}return e.success("OK")}if(r.isNull(i))return e.notFound("Record not found");e.error("Internal Server Error")}))}},u([e.Get("/groups"),e.Middleware("auth"),e.Middleware("read","users"),c(0,e.Ctx()),c(1,D()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"groups",null),u([e.Get("/:id/groups"),e.Middleware("auth"),e.Middleware("read","users"),c(0,e.Ctx()),c(1,e.Params("id")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),u([e.Put("/:id/groups"),e.Middleware("auth"),e.Middleware("update","users"),e.Middleware("validation",{groups:r.Validation.array(r.Validation.number().parse())}),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.Body("groups")),c(3,T()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Array,Object]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=u([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersGroupsController),exports.Application=I,exports.Config=E,exports.ControllerBase=U,exports.Env=x,exports.Logs=P,exports.Model=v,exports.ReqAudit=T,exports.ReqAuth=b,exports.ReqUser=D,exports.Token=O,exports.audit=w,exports.conn=h,exports.crt=f,exports.hooks=_,exports.key=C;
7
+ "use strict";var e=require("@andrewcaires/express"),t=require("@andrewcaires/node"),r=require("@andrewcaires/utils.js"),o=require("ws"),s=require("@andrewcaires/sequelize"),i=require("dotenv"),n=require("fs"),d=require("express-session"),a=require("sequelize"),p=require("jsonwebtoken"),l=require("path");function u(e,t,r,o){var s,i=arguments.length,n=i<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,o);else for(var d=e.length-1;d>=0;d--)(s=e[d])&&(n=(i<3?s(n):i>3?s(t,r,n):s(t,r))||n);return i>3&&n&&Object.defineProperty(t,r,n),n}function c(e,t){return function(r,o){t(r,o,e)}}function g(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function y(e,t,r,o){return new(r||(r=Promise))((function(s,i){function n(e){try{a(o.next(e))}catch(e){i(e)}}function d(e){try{a(o.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?s(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(n,d)}a((o=o.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,i.config();class x{static getBool(e,t){return r.toBool(x.getString(e,t.toString()))}static getInt(e,t){return parseInt(x.getString(e,t.toString()))}static getMs(e,t){return r.parseMs(x.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}x.API_CONSOLE_ERROR=x.getBool("API_CONSOLE_ERROR",!1),x.API_DB_DATABASE=x.getString("API_DB_DATABASE",""),x.API_DB_HOST=x.getString("API_DB_HOST","127.0.0.1"),x.API_DB_PASSWORD=x.getString("API_DB_PASSWORD",""),x.API_DB_PORT=x.getInt("API_DB_PORT",3306),x.API_DB_TYPE=x.getString("API_DB_TYPE",""),x.API_DB_USERNAME=x.getString("API_DB_USERNAME","root"),x.API_DB_LOG=x.getBool("API_DB_LOG",!1),x.API_DB_AUDIT=x.getBool("API_DB_AUDIT",!0),x.API_DB_PREFIX=x.getString("API_DB_PREFIX",""),x.API_DB_TIMEZONE=x.getString("API_DB_TIMEZONE","+00:00"),x.API_HTTP_CRT=x.getString("API_HTTP_CRT",""),x.API_HTTP_KEY=x.getString("API_HTTP_KEY",""),x.API_HTTP_PORT=x.getInt("API_HTTP_PORT",3e3),x.API_HTTP_PUBLIC=x.getString("API_HTTP_PUBLIC",""),x.API_HTTP_CROSS=x.getBool("API_HTTP_CROSS",!1),x.API_HTTP_HYBRID=x.getBool("API_HTTP_HYBRID",!1),x.API_HTTP_NOTFOUND=x.getString("API_HTTP_NOTFOUND",""),x.API_HTTP_PATH=x.getString("API_HTTP_PATH","/api"),x.API_HTTP_REDIRECT=x.getString("API_HTTP_REDIRECT",""),x.API_KEY_HASH=x.getString("API_KEY_HASH",""),x.API_KEY_HEADER=x.getString("API_KEY_HEADER","api_key"),x.API_MODEL_LIMIT=x.getInt("API_MODEL_LIMIT",10),x.API_MODEL_LIMIT_MAX=x.getInt("API_MODEL_LIMIT_MAX",500),x.API_SLEEP_AUTH=x.getMs("API_SLEEP_AUTH","2s"),x.API_SLEEP_FORGOT=x.getMs("API_SLEEP_FORGOT","5s"),x.API_SLEEP_REGISTRY=x.getMs("API_SLEEP_REGISTRY","5s"),x.API_SESSION_NAME=x.getString("API_SESSION_NAME","session.id"),x.API_SESSION_LIFETIME=x.getMs("API_SESSION_LIFETIME","1d"),x.API_SESSION_SECRET=x.getString("API_SESSION_SECRET","yoursecret"),x.API_TOKEN_CRT=x.getString("API_TOKEN_CRT",""),x.API_TOKEN_KEY=x.getString("API_TOKEN_KEY",""),x.API_TOKEN_FORGOT=x.getMs("API_TOKEN_LIFETIME","1d"),x.API_TOKEN_HEADER=x.getString("API_TOKEN_HEADER","authorization"),x.API_TOKEN_LIFETIME=x.getMs("API_TOKEN_LIFETIME","1d"),x.API_TOKEN_RENEW=x.getMs("API_TOKEN_RENEW","1d"),x.API_UPLOAD_COUNT=x.getInt("API_UPLOAD_COUNT",1),x.API_UPLOAD_FIELD=x.getString("API_UPLOAD_FIELD","upload"),x.API_UPLOAD_SIZE=x.getInt("API_UPLOAD_SIZE",2),x.API_UPLOAD_TEMP=x.getString("API_UPLOAD_TEMP","./temp"),x.API_USER_HISTORY=x.getBool("API_USER_HISTORY",!0),x.API_WEBSOCKET_START=x.getBool("API_WEBSOCKET_START",!1);const h=new s.Connection({type:x.API_DB_TYPE,database:x.API_DB_DATABASE,username:x.API_DB_USERNAME,password:x.API_DB_PASSWORD,hostname:x.API_DB_HOST,hostport:x.API_DB_PORT,logging:x.API_DB_LOG,prefix:x.API_DB_PREFIX});class v extends s.Model{}const m=(e,t,r)=>{var o,s,i,n,d;return{type:e,model:null!==(o=null==t?void 0:t.getTableName())&&void 0!==o?o:null,client:null!==(s=null==r?void 0:r.audit_client)&&void 0!==s?s:null,href:null!==(i=null==r?void 0:r.audit_href)&&void 0!==i?i:null,user_agent:null!==(n=null==r?void 0:r.audit_user_agent)&&void 0!==n?n:null,user_id:null!==(d=null==r?void 0:r.audit_user_id)&&void 0!==d?d:null,state:!0}},_={afterCreate:(e,t)=>y(void 0,void 0,void 0,(function*(){var o;if(!x.API_DB_AUDIT)return;const s=r.isObject(e)?e.constructor:null,i=null!==(o=null==s?void 0:s.primaryKeyAttribute)&&void 0!==o?o:null;yield exports.Audit.create(Object.assign(Object.assign({},m("CREATE",s,t)),{record:i?e.getDataValue(i):null,data:e.toJSON()})).catch(r.noop)})),afterUpdate:(e,t)=>y(void 0,void 0,void 0,(function*(){var o;if(!x.API_DB_AUDIT)return;const s=r.isObject(e)?e.constructor:null,i=null!==(o=null==s?void 0:s.primaryKeyAttribute)&&void 0!==o?o:null,n={},d=e.changed();d&&d.forEach((t=>n[t]=e.getDataValue(t))),yield exports.Audit.create(Object.assign(Object.assign({},m("UPDATE",s,t)),{record:i?e.getDataValue(i):null,data:n,previously:e.previous()})).catch(r.noop)})),afterDestroy:(e,t)=>y(void 0,void 0,void 0,(function*(){var o;if(!x.API_DB_AUDIT)return;const s=r.isObject(e)?e.constructor:null,i=null!==(o=null==s?void 0:s.primaryKeyAttribute)&&void 0!==o?o:null;yield exports.Audit.create(Object.assign(Object.assign({},m("DELETE",s,t)),{record:i?e.getDataValue(i):null,data:e.toJSON()})).catch(r.noop)}))};exports.Auth=class extends v{},u([s.Id(),g("design:type",Number)],exports.Auth.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Auth.prototype,"secret",void 0),u([s.FullDate(),g("design:type",Date)],exports.Auth.prototype,"logout",void 0),u([s.String(),g("design:type",s.String)],exports.Auth.prototype,"user_agent",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Auth.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Auth.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Auth.prototype,"deleted_at",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Auth.prototype,"user_id",void 0),exports.Auth=u([s.Database(h),s.ModelName("auth")],exports.Auth),exports.Register=class extends v{},u([s.Id(),g("design:type",Number)],exports.Register.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Register.prototype,"token",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Register.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Register.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Register.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Register.prototype,"deleted_at",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Register.prototype,"user_id",void 0),exports.Register=u([s.Database(h),s.ModelName("register")],exports.Register),exports.Group=class extends v{},u([s.Id(),g("design:type",Number)],exports.Group.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Group.prototype,"name",void 0),u([s.Text(),g("design:type",s.String)],exports.Group.prototype,"description",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Group.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Group.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Group.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Group.prototype,"deleted_at",void 0),u([s.HasMany((()=>exports.UserGroup),"group_id"),g("design:type",Array)],exports.Group.prototype,"groups_routes",void 0),u([s.HasMany((()=>exports.UserGroup),"group_id"),g("design:type",Array)],exports.Group.prototype,"users_groups",void 0),exports.Group=u([s.Database(h),s.ModelName("group"),s.Hooks(_)],exports.Group),exports.UserGroup=class extends v{},u([s.CreatedAt,g("design:type",Date)],exports.UserGroup.prototype,"created_at",void 0),u([s.BelongsTo((()=>exports.Group)),g("design:type",Number)],exports.UserGroup.prototype,"group_id",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.UserGroup.prototype,"user_id",void 0),exports.UserGroup=u([s.Database(h),s.ModelName("users_groups"),s.Hooks(_)],exports.UserGroup),exports.UserHistory=class extends v{},u([s.String(),g("design:type",s.String)],exports.UserHistory.prototype,"password",void 0),u([s.CreatedAt,g("design:type",Date)],exports.UserHistory.prototype,"created_at",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.UserHistory.prototype,"user_id",void 0),exports.UserHistory=u([s.Database(h),s.ModelName("users_histories")],exports.UserHistory),exports.User=class extends v{},u([s.Id(),g("design:type",Number)],exports.User.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"name",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"email",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"username",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"password",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"salt",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"token",void 0),u([s.String(),g("design:type",s.String)],exports.User.prototype,"avatar",void 0),u([s.DateOnly(),g("design:type",s.String)],exports.User.prototype,"date",void 0),u([s.Text(),g("design:type",s.String)],exports.User.prototype,"description",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.User.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.User.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.User.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.User.prototype,"deleted_at",void 0),u([s.HasMany((()=>exports.Audit),"user_id"),g("design:type",Array)],exports.User.prototype,"audits",void 0),u([s.HasMany((()=>exports.Auth),"user_id"),g("design:type",Array)],exports.User.prototype,"auths",void 0),u([s.HasMany((()=>exports.Register),"user_id"),g("design:type",Array)],exports.User.prototype,"registers",void 0),u([s.HasMany((()=>exports.UserGroup),"user_id"),g("design:type",Array)],exports.User.prototype,"users_groups",void 0),u([s.HasMany((()=>exports.UserHistory),"user_id"),g("design:type",Array)],exports.User.prototype,"users_histories",void 0),exports.User=u([s.Database(h),s.ModelName("user"),s.DefaultScope({attributes:{exclude:["password","salt","token"]}}),s.Scopes({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),s.Hooks(_)],exports.User),exports.Audit=class extends v{},u([s.Id(),g("design:type",Number)],exports.Audit.prototype,"id",void 0),u([s.Enum("CREATE","DELETE","UPDATE"),g("design:type",s.String)],exports.Audit.prototype,"type",void 0),u([s.String(),g("design:type",s.String)],exports.Audit.prototype,"model",void 0),u([s.String(),g("design:type",s.String)],exports.Audit.prototype,"record",void 0),u([s.Json(),g("design:type",Object)],exports.Audit.prototype,"data",void 0),u([s.Json(),g("design:type",Object)],exports.Audit.prototype,"previously",void 0),u([s.String(),g("design:type",s.String)],exports.Audit.prototype,"client",void 0),u([s.Text(),g("design:type",s.String)],exports.Audit.prototype,"href",void 0),u([s.String(),g("design:type",s.String)],exports.Audit.prototype,"user_agent",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Audit.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Audit.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Audit.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Audit.prototype,"deleted_at",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Audit.prototype,"user_id",void 0),exports.Audit=u([s.Database(h),s.ModelName("audit")],exports.Audit),exports.Configs=class extends v{},u([s.String(),g("design:type",s.String)],exports.Configs.prototype,"key",void 0),u([s.String(),g("design:type",s.String)],exports.Configs.prototype,"value",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Configs.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Configs.prototype,"updated_at",void 0),exports.Configs=u([s.Database(h),s.ModelName("configs"),s.Hooks(_)],exports.Configs),exports.Forgot=class extends v{},u([s.Id(),g("design:type",Number)],exports.Forgot.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Forgot.prototype,"token",void 0),u([s.BigInt(),g("design:type",Number)],exports.Forgot.prototype,"timestamp",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Forgot.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Forgot.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Forgot.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Forgot.prototype,"deleted_at",void 0),u([s.BelongsTo((()=>exports.User)),g("design:type",Number)],exports.Forgot.prototype,"user_id",void 0),exports.Forgot=u([s.Database(h),s.ModelName("forgot")],exports.Forgot),exports.Permission=class extends v{},u([s.Id(),g("design:type",Number)],exports.Permission.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Permission.prototype,"name",void 0),u([s.String(),s.Unique(!0),g("design:type",s.String)],exports.Permission.prototype,"route",void 0),u([s.Text(),g("design:type",s.String)],exports.Permission.prototype,"description",void 0),u([s.Boolean(),g("design:type",s.Boolean)],exports.Permission.prototype,"state",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Permission.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Permission.prototype,"updated_at",void 0),u([s.DeletedAt,g("design:type",Date)],exports.Permission.prototype,"deleted_at",void 0),u([s.HasMany((()=>exports.GroupPermission),"permission_id"),g("design:type",Array)],exports.Permission.prototype,"groups_permissions",void 0),exports.Permission=u([s.Database(h),s.ModelName("permission"),s.Hooks(_)],exports.Permission),exports.GroupPermission=class extends v{},u([s.CreatedAt,g("design:type",Date)],exports.GroupPermission.prototype,"created_at",void 0),u([s.BelongsTo((()=>exports.Group)),g("design:type",Number)],exports.GroupPermission.prototype,"group_id",void 0),u([s.BelongsTo((()=>exports.Permission)),g("design:type",Number)],exports.GroupPermission.prototype,"permission_id",void 0),exports.GroupPermission=u([s.Database(h),s.ModelName("groups_permissions"),s.Hooks(_)],exports.GroupPermission),exports.Log=class extends v{},u([s.Id(),g("design:type",Number)],exports.Log.prototype,"id",void 0),u([s.String(),g("design:type",s.String)],exports.Log.prototype,"type",void 0),u([s.String(),g("design:type",s.String)],exports.Log.prototype,"source",void 0),u([s.Text(),g("design:type",s.String)],exports.Log.prototype,"message",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Log.prototype,"created_at",void 0),exports.Log=u([s.Database(h),s.ModelName("log")],exports.Log),exports.Session=class extends v{},u([s.String(),g("design:type",s.String)],exports.Session.prototype,"session",void 0),u([s.Text(),g("design:type",s.String)],exports.Session.prototype,"json",void 0),u([s.BigInt(),g("design:type",Number)],exports.Session.prototype,"expired",void 0),u([s.CreatedAt,g("design:type",Date)],exports.Session.prototype,"created_at",void 0),u([s.UpdatedAt,g("design:type",Date)],exports.Session.prototype,"updated_at",void 0),exports.Session=u([s.Database(h),s.ModelName("session")],exports.Session);class A{static write(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.White,"",e,r,o)}))}static error(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.Red,"error",e,r,o)}))}static info(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.Cyan,"info",e,r,o)}))}static success(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.Green,"success",e,r,o)}))}static warning(e,r,o){return y(this,void 0,void 0,(function*(){yield A.writeRaw(t.LogColor.Yellow,"warning",e,r,o)}))}static writeRaw(e,r,o,s,i){return y(this,void 0,void 0,(function*(){i&&t.Log.console(e,r,o),h&&(yield exports.Log.create({type:r,source:s,message:o}).catch((()=>null)))}))}}const O=e=>n.existsSync(e)?n.readFileSync(e):void 0,P={http:O(x.API_HTTP_CRT),token:O(x.API_TOKEN_CRT)},C={http:O(x.API_HTTP_KEY),token:O(x.API_TOKEN_KEY)};class S extends d.Store{constructor(){super(),this.all=e=>y(this,void 0,void 0,(function*(){e=e||r.noop;const t=yield exports.Session.findAll({attributes:["session"],where:{expired:{[a.Op.gte]:Date.now()}}}).catch((t=>(e(t),null)));t&&e(null,t.map((e=>e.session))),e()})),this.clear=e=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy().catch(r.noop),e&&e()})),this.destroy=(e,t)=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy({where:{session:e}}).catch(r.noop),t&&t()})),this.expired=()=>y(this,void 0,void 0,(function*(){yield exports.Session.destroy({where:{expired:{[a.Op.lt]:Date.now()}}}).catch(r.noop)})),this.get=(e,t)=>y(this,void 0,void 0,(function*(){t=t||r.noop;const o=yield exports.Session.findOne({where:{session:e,expired:{[a.Op.gte]:Date.now()}}}).catch((e=>(t(e),null)));if(o){const e=JSON.parse(o.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield o.destroy().catch(r.noop),void t(null)}t(null,e)}else t(null)})),this.length=e=>y(this,void 0,void 0,(function*(){e&&e(null,(yield exports.Session.count().catch(r.noop))||0)})),this.set=(e,t,o)=>y(this,void 0,void 0,(function*(){o=o||r.noop;const s=Date.now()+x.API_SESSION_LIFETIME,i=JSON.stringify(t),[n,d]=(yield exports.Session.findOrCreate({where:{session:e},defaults:{session:e,json:i,expired:s}}).catch(r.noop))||[];n&&(d||(n.json=i,n.expired=s,yield n.save().catch(r.noop))),o()})),this.loop=r.loop(this.expired,3e4),this.loop.start()}}class E{static create(e){return y(this,void 0,void 0,(function*(){if(!C.token)return{error:"KEY NOT FOUND"};const{id:t}=e,o=r.uuidv4(),s=yield exports.Auth.create({secret:o,user_id:t}).catch(E.error);if(!s)return{error:"INTERNAL SERVER ERROR"};return{auth:s,token:p.sign({id:t,secret:o},C.token,E.options())}}))}static destroy(e){return y(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){A.error(e.message,"api.token",x.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:x.API_TOKEN_LIFETIME+"ms"}}static renew(e){return y(this,void 0,void 0,(function*(){if(!C.token)return{error:"KEY NOT FOUND"};const{error:t,decode:o}=E.verify(e,x.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(o){const{id:e,secret:t}=o;if(e&&t){const o=yield exports.User.findOne({where:{id:e,state:!0}}).catch(E.error);if(o){const s=yield exports.Auth.findOne({where:{secret:t,user_id:o.id}}).catch(E.error);if(s&&!s.logout){s.secret=r.uuidv4(),yield s.save().catch(E.error);return{auth:s,token:p.sign({id:e,secret:s.secret},C.token,E.options())}}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}}))}static user(e,t,r){return y(this,void 0,void 0,(function*(){if(e){t=r.hash.encrypt(e);const o=yield exports.User.findOne({where:{token:t,state:!0}}).catch(E.error);if(o){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield exports.Auth.findOrCreate({where:{secret:t,user_id:o.id},defaults:{secret:t,user_id:o.id}}).catch(E.error))||[];if(r)return{auth:r,user:o}}return{error:"ACCESS DENIED"}}const{error:o,decode:s}=E.verify(t);if(o)return{error:o};if(s){const{id:e,secret:t}=s;if(e&&t){const r=yield exports.User.findOne({where:{id:e,state:!0}}).catch(E.error);if(r){const e=yield exports.Auth.findOne({where:{secret:t,user_id:r.id}}).catch(E.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}}))}static verify(e,t){if(!P.token)return{error:"CERT NOT FOUND"};if(!e||e.split(".").length<3)return{error:"INVALID TOKEN"};try{return{decode:p.verify(e,P.token,{clockTolerance:t})}}catch(e){return{error:"INVALID TOKEN"}}}}class f extends e.Application{constructor(e){super(e,{cert:P.http,cross:x.API_HTTP_CROSS,hybrid:x.API_HTTP_HYBRID,key:C.http,notfound:x.API_HTTP_NOTFOUND,path:x.API_HTTP_PATH,port:x.API_HTTP_PORT,public:x.API_HTTP_PUBLIC,redirect:x.API_HTTP_REDIRECT,session:{store:new S,name:x.API_SESSION_NAME,secret:x.API_SESSION_SECRET,cookie:{maxAge:x.API_SESSION_LIFETIME},genid:r.uuidv4}}),this.hash=new t.Hash(x.API_KEY_HASH)}error(e,t){A.error(e.message,t,x.API_CONSOLE_ERROR)}log(e,t){A.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return y(this,void 0,void 0,(function*(){yield h.sync(),yield e.listen.call(this),x.API_WEBSOCKET_START&&this.server&&(this._webSocket=new o.WebSocketServer({server:this.server,verifyClient:(e,t)=>t(x.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>y(this,void 0,void 0,(function*(){t.url||(t.url="");const o=t.url.length<=1?"":t.url.replace(/\//g,".");let s;e.on("message",(r=>y(this,void 0,void 0,(function*(){if(s)try{const i=JSON.parse(r);this.emit("ws.message"+o,{data:i,message:r,req:t,user:s,ws:e})}catch(i){this.emit("ws.message"+o,{message:r,req:t,user:s,ws:e})}else{const{user:i}=yield E.user("",r.toString(),this);i&&(s=i,this.emit("ws.connection"+o,{req:t,user:s,ws:e}))}s||e.close()})))),e.on("close",(()=>{s&&this.emit("ws.close"+o,{user:s,ws:e})})),yield r.sleep(2e3),s||e.close()})))))}))}websocket(){return this._webSocket}}const I=e=>{var t,r,o,s,i,n,d,a,p;return{audit_client:null!==(t=e.ip())&&void 0!==t?t:"0.0.0.0",audit_href:(null===(r=null==e?void 0:e.req)||void 0===r?void 0:r.protocol)+"://"+(null===(o=null==e?void 0:e.req)||void 0===o?void 0:o.get("host"))+(null===(s=null==e?void 0:e.req)||void 0===s?void 0:s.originalUrl),audit_user_agent:null!==(n=null===(i=e.req)||void 0===i?void 0:i.headers["user-agent"])&&void 0!==n?n:"",audit_user_id:null!==(p=null===(a=null===(d=null==e?void 0:e.req)||void 0===d?void 0:d.user)||void 0===a?void 0:a.id)&&void 0!==p?p:null}};class R{static all(){return y(this,void 0,void 0,(function*(){const e=yield exports.Configs.findAll().catch(R.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e,t){return y(this,void 0,void 0,(function*(){var r;const o=null!==(r=null==t?void 0:t.id)&&void 0!==r?r:null;return((yield exports.Configs.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:o})).catch(R.error))||0)>0}))}static error(e){A.error(e.message,"api.config",x.API_CONSOLE_ERROR)}static get(e){return y(this,arguments,void 0,(function*(e,t=""){const[r]=(yield exports.Configs.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(R.error))||[];return r?r.value:t}))}static set(e,t,r){return y(this,void 0,void 0,(function*(){var o;const s=null!==(o=null==r?void 0:r.id)&&void 0!==o?o:null,[i]=(yield exports.Configs.findOrCreate(Object.assign({where:{key:e}},{user_id:s})).catch(R.error))||[];i&&(i.value=t,yield i.save().catch(R.error))}))}}const T=e.parameterFactory((({ctx:e})=>I(e))),D=e.parameterFactory((({ctx:e})=>e.req.auth)),w=e.parameterFactory((({ctx:e})=>e.req.user));class N extends r.EventEmitter{auth(e,t,r,o,s){return y(this,void 0,void 0,(function*(){const{auth:i,error:n,user:d}=yield E.user(t,r,s);return n?e.error(n):i&&d?i.user_agent&&i.user_agent!=o?e.error("INVALID TOKEN"):(e.req.auth=i,e.req.user=d,void e.next()):e.error("INTERNAL SERVER ERROR")}))}create(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".create",r)}))}delete(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".delete",r)}))}error(e){A.error(e.message,"api.controller",x.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r){return y(this,void 0,void 0,(function*(){if(r){const o=yield this.permissions(r,{route:t});if(o&&o.length>0)return e.next()}e.unauthorized("ACCESS DENIED")}))}permissions(e,t){return y(this,void 0,void 0,(function*(){return yield exports.Permission.findAll({where:Object.assign(Object.assign({},null!=t?t:{}),{state:!0}),include:[{model:exports.GroupPermission,required:!0,include:[{model:exports.Group,required:!0,where:{state:!0},include:[{model:exports.UserGroup,required:!0,where:{user_id:e.id}}]}]}]}).catch(this.error)}))}read(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".read",r)}))}session(e,t,o){return y(this,void 0,void 0,(function*(){o.auth&&o.user&&(o.user_agent?o.user_agent!=t&&o.regenerate(r.noop):(o.user_agent=t,o.save(r.noop))),e.next()}))}upload(t,r){r.path||(r.path=x.API_UPLOAD_TEMP),r.size||(r.size=x.API_UPLOAD_SIZE),r.field||(r.field=x.API_UPLOAD_FIELD),e.Upload.middleware(t,r)}update(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".update",r)}))}validation(e,t){return y(this,void 0,void 0,(function*(){const{error:o,value:s}=yield r.Validation.object(t).parse().validateAsync(e.req.body);if(o)return e.validation(o);e.req.body=s,e.next()}))}}u([c(0,e.Ctx()),c(1,e.Headers(x.API_KEY_HEADER)),c(2,e.Headers(x.API_TOKEN_HEADER)),c(3,e.Headers("user-agent")),c(4,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,String,f]),g("design:returntype",Promise)],N.prototype,"auth",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],N.prototype,"create",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],N.prototype,"delete",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],N.prototype,"permission",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],N.prototype,"read",null),u([c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Session()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object]),g("design:returntype",Promise)],N.prototype,"session",null),u([c(0,e.Ctx()),c(1,e.Argument()),g("design:type",Function),g("design:paramtypes",[e.Context,Object]),g("design:returntype",void 0)],N.prototype,"upload",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],N.prototype,"update",null),u([c(0,e.Ctx()),c(1,e.Argument()),g("design:type",Function),g("design:paramtypes",[e.Context,Object]),g("design:returntype",Promise)],N.prototype,"validation",null),exports.ModelController=class extends N{constructor(){super(...arguments),this._columns=[]}_add(t){return y(this,arguments,void 0,(function*({ctx:t,options:r,body:o}){const s=yield this.model().create(Object.assign(Object.assign({},t.req.body),o||{}),Object.assign(Object.assign({},r||{}),I(t))).catch(this.error);if(s){const r=this.key();return t.prepare(e.Status.OK,{[r]:s.getDataValue(r)}),s}t.error("INTERNAL SERVER ERROR")}))}_all(t){return y(this,arguments,void 0,(function*({ctx:t,options:o,callback:s,scope:i}){var n,d,p,l;const u=this.scope(i),c=Object.assign({},o||{});c.where=Object.assign({},c.where||{});const g=t.req.query.limit,y=r.isString(g)?parseInt(g):x.API_MODEL_LIMIT;c.limit=y>=0?Math.min(y,x.API_MODEL_LIMIT_MAX):void 0;const h=t.req.query.offset;if(r.isString(h)){const e=h?parseInt(h):0;c.offset=e>0?e:void 0}const v=[],m=this.columns(),_=e=>m.indexOf(e)>=0,A=null===(n=t.req.query.asc)||void 0===n?void 0:n.toString();A&&A.length&&v.push(...A.split(",").filter(_).map((e=>[e,"ASC"])));const O=null===(d=t.req.query.desc)||void 0===d?void 0:d.toString();O&&O.length&&v.push(...O.split(",").filter(_).map((e=>[e,"DESC"]))),v.length&&(c.order=v);const P=[],C=null===(p=t.req.query.search)||void 0===p?void 0:p.toString();(r.isArray(c.attributes)?c.attributes:m).filter(r.isString).forEach((e=>{var r;if(C&&C.length&&P.push({[e]:{[a.Op.like]:`%${C}%`}}),"search_"+e in t.req.query){const o=null===(r=t.req.query["search_"+e])||void 0===r?void 0:r.toString();o&&o.length&&P.push({[e]:{[a.Op.like]:`%${o}%`}})}})),P.length&&(c.where=Object.assign(Object.assign({},c.where),{[a.Op.or]:[...P]}));const S=null!==(l=yield u.count(Object.assign(Object.assign({},c),{col:m[0]})).catch(this.error))&&void 0!==l?l:0,E=yield u.findAll(c).catch(this.error),f={count:S};return E?(t.prepare(e.Status.OK,Object.assign(Object.assign({},f),{records:s?yield s(E):E})),Object.assign(Object.assign({},f),{records:E})):(t.error("INTERNAL SERVER ERROR"),Object.assign(Object.assign({},f),{records:[]}))}))}columns(){return 0==this._columns.length&&(this._columns=Object.keys(this.model().getAttributes())),this._columns}_del(e){return y(this,arguments,void 0,(function*({ctx:e,options:t}){const r=this.key(),{[r]:o}=e.req.params;if(!o)return e.error("INTERNAL SERVER ERROR"),0;const s=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[r]:o}),individualHooks:!0}),I(e))).catch(this.error);return s?(e.success("OK"),s):(e.notFound("RECORD NOT FOUND"),0)}))}error(e){e.sql?A.error(e.message+"\n"+e.sql,"api.controller.sql",x.API_CONSOLE_ERROR):super.error(e)}_get(t){return y(this,arguments,void 0,(function*({ctx:t,options:r,callback:o,scope:s}){const i=this.key(),{[i]:n}=t.req.params,d=yield this.scope(s).findOne(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[i]:n})})).catch(this.error);return d?(t.prepare(e.Status.OK,o?yield o(d):d.toJSON()),d):null===d?t.notFound("RECORD NOT FOUND"):void t.error("INTERNAL SERVER ERROR")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}_set(e){return y(this,arguments,void 0,(function*({ctx:e,options:t,body:r}){var o;const s=this.key(),{[s]:i}=e.req.params,[n]=null!==(o=yield this.model().update(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[s]:i}),individualHooks:!0}),I(e))).catch(this.error))&&void 0!==o?o:[];return n?(e.success("OK"),!0):(e.success("RECORD NOT CHANGED"),!1)}))}},exports.ModelController=u([e.Extends(N)],exports.ModelController),exports.AuditsController=class extends exports.ModelController{model(){return exports.Audit}all(e,t,r){return y(this,void 0,void 0,(function*(){const o={};t&&(o.type=t),r&&(o.table=r),yield this._all({ctx:e,options:{attributes:{exclude:["data","previously"]},where:o,order:[["created_at","DESC"]]}})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}},u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),c(1,e.Query("type")),c(2,e.Query("table")),g("design:type",Function),g("design:paramtypes",[e.Context,String,String]),g("design:returntype",Promise)],exports.AuditsController.prototype,"all",null),u([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.AuditsController.prototype,"get",null),exports.AuditsController=u([e.Controller("/audits"),e.Extends(exports.ModelController)],exports.AuditsController),exports.AuthController=class extends N{login(e,o,s,i,n){return y(this,void 0,void 0,(function*(){var d;yield r.sleep(x.API_SLEEP_AUTH);const p=yield exports.User.scope("password").findOne({where:{[a.Op.or]:[{email:s},{username:s}]}}).catch(this.error);if(i+=null!==(d=null==p?void 0:p.salt)&&void 0!==d?d:"",!p||p.password!=t.sha256(i))return e.notFound("INVALID USERNAME OR PASSWORD"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const l=yield exports.Register.findOne({where:{state:!0,user_id:p.id}}).catch(this.error);if(l)return e.error("ACTIVATION REQUIRED"),n.emit("auth.activation",{ctx:e,register:l,user:p}),void this.emit("auth.activation",{ctx:e,register:l,user:p});if(!p.state)return e.notFound("INVALID USERNAME OR PASSWORD"),n.emit("auth.failure",{ctx:e,user:p}),void this.emit("auth.failure",{ctx:e,user:p});const{auth:u,error:c,token:g}=yield E.create(p);return c?(e.error(c),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):u&&g?(u.user_agent=o,yield u.save().catch(this.error),e.json({token:g}),n.emit("auth.login",{auth:u,ctx:e,user:p}),void this.emit("auth.login",{auth:u,ctx:e,user:p})):(e.error("INTERNAL SERVER ERROR"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,r,o){return y(this,void 0,void 0,(function*(){if(yield E.destroy(t))return e.success("OK"),o.emit("auth.logout",{auth:t,ctx:e,user:r}),void this.emit("auth.logout",{auth:t,ctx:e,user:r});e.unauthorized("ACCESS DENIED")}))}renew(e,t,r,o){return y(this,void 0,void 0,(function*(){const{auth:s,error:i,token:n}=yield E.renew(r);return i?e.error(i):s?(s.user_agent=t,yield s.save().catch(this.error),e.json({token:n}),o.emit("auth.renew",{auth:s,ctx:e}),void this.emit("auth.renew",{auth:s,ctx:e})):e.error("INTERNAL SERVER ERROR")}))}user(e,t){return y(this,void 0,void 0,(function*(){const r=yield this.permissions(t);if(!r)return e.error("INTERNAL SERVER ERROR");e.json(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.route))}))}))}},u([e.Post("/login"),e.Middleware("validation",{username:r.Validation.string().min(3).required(),password:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Body("username")),c(3,e.Body("password")),c(4,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,String,f]),g("design:returntype",Promise)],exports.AuthController.prototype,"login",null),u([e.Get("/logout"),e.Middleware("auth"),c(0,e.Ctx()),c(1,D()),c(2,w()),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.Auth,exports.User,f]),g("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),u([e.Post("/renew"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Headers("user-agent")),c(2,e.Body("token")),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,f]),g("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),u([e.Get(),e.Middleware("auth"),c(0,e.Ctx()),c(1,w()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=u([e.Controller("/auth"),e.Extends(N)],exports.AuthController),exports.FilesController=class extends N{directory(){return x.API_HTTP_PUBLIC||"./"}files(e){return y(this,void 0,void 0,(function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const o=l.join(this.directory(),t);if(!n.existsSync(o)||!n.statSync(o).isDirectory())return e.notFound("RECORD NOT FOUND");let s=[];return s=n.readdirSync(o),s=s.map((e=>this.info(l.join(o,e)))),s=s.filter(r.isDef),Object.assign(Object.assign({},this.info(o)),{files:s})}))}access(e,t,r){return y(this,void 0,void 0,(function*(){yield this.permission(e,this.name()+"."+t,r)}))}info(e){if(!n.existsSync(e))return null;const t=n.statSync(e),r=e.split("/").pop();e=e.replace(this.directory(),"/").replace(/^\/\//,"/");const o=t.isDirectory();return{name:r,path:e.replace(/^\/\//,"/"),size:t.size,extension:o?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:o,symlink:t.isSymbolicLink()}}name(){return"files"}},u([e.Get("/path/?*"),e.Middleware("auth"),e.Middleware("access","list"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.FilesController.prototype,"files",null),u([c(0,e.Ctx()),c(1,e.Argument()),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],exports.FilesController.prototype,"access",null),exports.FilesController=u([e.Controller("/files"),e.Extends(N)],exports.FilesController),exports.ForgotController=class extends N{check(e,t){return y(this,void 0,void 0,(function*(){const o=yield this.find(t);if(!o||!o.user)return e.notFound("RECORD NOT FOUND");o.token=r.uniqueID(),yield o.save(),e.json({token:o.token})}))}forgot(e,t,o){return y(this,void 0,void 0,(function*(){yield r.sleep(x.API_SLEEP_FORGOT);const s=t,i=yield exports.User.findOne({where:{[a.Op.or]:[{email:s},{username:t}]}}).catch(this.error);if(!i)return e.notFound("RECORD NOT FOUND");const n=r.uniqueID(),d=Date.now()+6e4*x.API_TOKEN_FORGOT,p=yield exports.Forgot.create({token:n,timestamp:d,state:!0,user_id:i.id});e.success("OK"),o.emit("forgot.send",{ctx:e,forgot:p,user:i}),this.emit("forgot.send",{ctx:e,forgot:p,user:i})}))}reset(e,r,o,s){return y(this,void 0,void 0,(function*(){const i=yield this.find(r);if(!i)return e.notFound("RECORD NOT FOUND");i.state=!1,yield i.save().catch(this.error),i.user.password=t.sha256(o),yield i.user.save().catch(this.error),e.success("OK"),s.emit("forgot.reset",{ctx:e,user:i.user}),this.emit("forgot.reset",{ctx:e,user:i.user})}))}find(e){return y(this,void 0,void 0,(function*(){return yield exports.Forgot.findOne({where:{token:e,state:!0},include:[{model:exports.User,required:!0}]}).catch(this.error)}))}},u([e.Get("/check"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Body("token")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),u([e.Post(),e.Middleware("validation",{username:r.Validation.string().min(4).required()}),c(0,e.Ctx()),c(1,e.Body("username")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,f]),g("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),u([e.Post("/reset"),e.Middleware("validation",{token:r.Validation.string().required(),password:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Body("token")),c(2,e.Body("password")),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,f]),g("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=u([e.Controller("/forgot"),e.Extends(N)],exports.ForgotController),exports.CrudController=class extends exports.ModelController{constructor(){super(...arguments),this._crud={}}add(e){return y(this,void 0,void 0,(function*(){yield this._add({ctx:e})}))}all(e){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}CrudCreate(){return this._crud}del(e){return y(this,void 0,void 0,(function*(){yield this._del({ctx:e})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e){return y(this,void 0,void 0,(function*(){yield this._set({ctx:e})}))}CrudUpdate(){return this._crud}validationAdd(e){return y(this,void 0,void 0,(function*(){const t=this.CrudCreate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)}))}validationSet(e){return y(this,void 0,void 0,(function*(){const t=this.CrudUpdate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)}))}},u([e.Post(),e.Middleware("auth"),e.Middleware("create"),e.Middleware("validationAdd"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"add",null),u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"all",null),u([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("delete"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"del",null),u([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"get",null),u([e.Put("/:id"),e.Middleware("auth"),e.Middleware("update"),e.Middleware("validationSet"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"set",null),u([c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"validationAdd",null),u([c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.CrudController.prototype,"validationSet",null),exports.CrudController=u([e.Extends(exports.ModelController)],exports.CrudController),exports.GroupsController=class extends exports.CrudController{model(){return exports.Group}CrudCreate(){return{name:r.Validation.string().required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}}CrudUpdate(){return{name:r.Validation.string().empty(),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}}},exports.GroupsController=u([e.Controller("/groups"),e.Extends(exports.CrudController)],exports.GroupsController),exports.GroupsPermissionsController=class extends exports.ModelController{model(){return exports.GroupPermission}all(e,t){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{group_id:t},include:[{model:exports.Permission,required:!0}]},callback:e=>e.map((e=>e.permission))})}))}set(e,t,o,s){return y(this,void 0,void 0,(function*(){const i=yield exports.Group.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){const t=i.id;if(yield exports.GroupPermission.destroy(Object.assign({where:{group_id:t},individualHooks:!0},s)),o){let e=0;yield r.sleep(1e3);for(let r=0;r<o.length;r++)e=yield exports.Permission.count({where:{id:o[r]}}),e&&(yield exports.GroupPermission.create({group_id:t,permission_id:o[r]},Object.assign({},s)))}return e.success("OK")}if(r.isNull(i))return e.notFound("RECORD NOT FOUND");e.error("INTERNAL SERVER ERROR")}))}},u([e.Get("/:id/routes"),e.Middleware("auth"),e.Middleware("read","groups"),c(0,e.Ctx()),c(1,e.Params("id")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"all",null),u([e.Put("/:id/permissions"),e.Middleware("auth"),e.Middleware("update","groups"),e.Middleware("validation",{permissions:r.Validation.array(r.Validation.number().parse())}),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.Body("permissions")),c(3,T()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Array,Object]),g("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"set",null),exports.GroupsPermissionsController=u([e.Controller("/groups"),e.Extends(exports.ModelController)],exports.GroupsPermissionsController),exports.LogsController=class extends exports.ModelController{model(){return exports.Log}all(e,t,r){return y(this,void 0,void 0,(function*(){const o={};t&&(o.type=t),r&&(o.source=r),yield this._all({ctx:e,options:{where:o,order:[["created_at","DESC"]]}})}))}},u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),c(1,e.Query("type")),c(2,e.Query("source")),g("design:type",Function),g("design:paramtypes",[e.Context,String,String]),g("design:returntype",Promise)],exports.LogsController.prototype,"all",null),exports.LogsController=u([e.Controller("/logs"),e.Extends(exports.ModelController)],exports.LogsController),exports.PermissionsController=class extends exports.CrudController{model(){return exports.Permission}CrudCreate(){return{name:r.Validation.string().required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}}CrudUpdate(){return{name:r.Validation.string().empty(),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}}},exports.PermissionsController=u([e.Controller("/permissions"),e.Extends(exports.CrudController)],exports.PermissionsController),exports.RegisterController=class extends N{register(e,o,s){return y(this,void 0,void 0,(function*(){yield r.sleep(x.API_SLEEP_REGISTRY);const{name:i,date:n,email:d,username:p,password:l,confirm:u}=o,c=p||d,g=t.sha256(l);if(yield exports.User.count({where:{[a.Op.or]:[{email:d},{username:c}]}}).catch(this.error))return e.validation("INVALID EMAIL OR USERNAME");if(g!=t.sha256(u))return e.error("INVALID PASSWORD");const y=yield exports.User.create({name:i,email:d,username:c,password:g,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!y)return e.error("INTERNAL SERVER ERROR");const h=yield exports.Register.create({token:yield this.getId(),user_id:y.id,state:!0}).catch(this.error);if(!h)return yield y.destroy().catch(this.error),e.error("INTERNAL SERVER ERROR");e.success("OK"),s.emit("register.user",{ctx:e,register:h,user:y}),this.emit("register.user",{ctx:e,register:h,user:y})}))}confirm(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield exports.Register.findOne({where:{token:t,state:!0},include:[{model:exports.User,required:!0}]}).catch(this.error);if(!o)return e.notFound("RECORD NOT FOUND");o.state=!1,yield o.save().catch(this.error),o.user.state=!0,yield o.user.save().catch(this.error),e.success("OK"),r.emit("register.confirm",{ctx:e,register:o,user:o.user}),this.emit("register.confirm",{ctx:e,register:o,user:o.user})}))}send(e,t,r){return y(this,void 0,void 0,(function*(){const o=t,s=yield exports.Register.findOne({where:{state:!0},include:[{model:exports.User,required:!0,where:{[a.Op.or]:[{email:o},{username:t}]}}]}).catch(this.error);if(!s)return e.notFound("RECORD NOT FOUND");e.success("OK"),r.emit("register.send",{ctx:e,register:s,user:s.user}),this.emit("register.send",{ctx:e,register:s,user:s.user})}))}getId(){return y(this,void 0,void 0,(function*(){const e=r.uuidv4();return(yield exports.Register.count({where:{token:e}}))?this.getId():e}))}},u([e.Post(),e.Middleware("validation",{name:r.Validation.string().required(),date:r.Validation.date().required(),email:r.Validation.string().email().required(),username:r.Validation.string().min(4).empty(),password:r.Validation.string().min(5).required(),confirm:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Body()),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,Object,f]),g("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),u([e.Post("/confirm"),e.Middleware("validation",{token:r.Validation.string().required()}),c(0,e.Ctx()),c(1,e.Body("token")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,f]),g("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),u([e.Post("/send"),e.Middleware("validation",{username:r.Validation.string().min(4).required()}),c(0,e.Ctx()),c(1,e.Body("username")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,f]),g("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=u([e.Controller("/register"),e.Extends(N)],exports.RegisterController),exports.SetupController=class extends N{setup(e,o){return y(this,void 0,void 0,(function*(){if(0==(yield exports.User.count())){const e=r.uniqueID(),s=yield exports.User.create({name:"Admin",email:"admin@localhost",username:"admin",password:t.sha256("admin"+e),salt:e,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0},Object.assign({},o)),i={description:"API CORE",state:!0},n=yield exports.Group.create(Object.assign({name:"admin"},i),Object.assign({},o));yield exports.UserGroup.create({user_id:s.id,group_id:n.id},Object.assign({},o));const d=["audits","users","groups","routes"],a=["create","read","update","delete"];yield r.forEachSeries(d,(e=>y(this,void 0,void 0,(function*(){yield r.forEachSeries(a,(t=>y(this,void 0,void 0,(function*(){const r=yield exports.Permission.create(Object.assign({name:`${e} ${t}`,route:`${e}.${t}`},i),Object.assign({},o));yield exports.GroupPermission.create({group_id:n.id,permission_id:r.id},Object.assign({},o))}))))}))));const p=["delete","list","read","rename","upload","write"];yield r.forEachSeries(p,(e=>y(this,void 0,void 0,(function*(){const t=yield exports.Permission.create(Object.assign({name:`files ${e}`,route:`files.${e}`},i),Object.assign({},o));yield exports.GroupPermission.create({group_id:n.id,permission_id:t.id},Object.assign({},o))}))));const l=["logs"];yield r.forEachSeries(l,(e=>y(this,void 0,void 0,(function*(){const t=yield exports.Permission.create(Object.assign({name:`${e} files`,route:`${e}.read`},i),Object.assign({},o));yield exports.GroupPermission.create({group_id:n.id,permission_id:t.id},Object.assign({},o))}))))}e.success("OK")}))}},u([e.Get(),c(0,e.Ctx()),c(1,T()),g("design:type",Function),g("design:paramtypes",[e.Context,Object]),g("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=u([e.Controller("/setup"),e.Extends(N)],exports.SetupController),exports.UsersController=class extends exports.ModelController{model(){return exports.User}constructor(){super(),this.path=x.API_HTTP_PUBLIC+"/avatar",x.API_HTTP_PUBLIC&&n.existsSync(x.API_HTTP_PUBLIC)&&!n.existsSync(this.path)&&n.mkdirSync(this.path)}avatar(e,t,r,o){return y(this,void 0,void 0,(function*(){if(t.length){const s=t[0].filename||"";if(s){const t=this.path+"/"+r.avatar;if(n.existsSync(t)&&n.lstatSync(t).isFile()&&n.rmSync(t),r.avatar=s,yield r.save(Object.assign({},o)).catch(this.error))return e.success("OK")}}e.success("RECORD NOT CHANGED")}))}avatar_delete(e,t,r){return y(this,void 0,void 0,(function*(){const o=this.path+"/"+t.avatar;t.avatar="",(yield t.save(Object.assign({},r)).catch(this.error))&&n.existsSync(o)&&n.rmSync(o),e.success("OK")}))}password(e,o,s,i,n){return y(this,void 0,void 0,(function*(){var d;if(x.API_USER_HISTORY){if(yield exports.UserHistory.count({where:{password:t.sha256(s+i.id)}}).catch(this.error))return e.error("PASSWORD PREVIOUSLY REGISTERED")}const a=yield this.scope("password").findOne({where:{id:i.id,state:!0}}).catch(this.error);return o+=null!==(d=null==a?void 0:a.salt)&&void 0!==d?d:"",a&&a.password==t.sha256(o)?(a.salt=r.uniqueID(),a.password=t.sha256(s+a.salt),(yield a.save(Object.assign({},n)).catch(this.error))?e.success("OK"):void e.success("RECORD NOT CHANGED")):e.error("INVALID PASSWORD")}))}token(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.model().findOne({attributes:["token"],where:{id:t.id}}).catch(this.error);if(o)return e.json({token:r.hash.decrypt(o.token)});e.notFound("RECORD NOT FOUND")}))}token_get(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.scope("token").findOne({where:{id:t}}).catch(this.error);if(o)return e.json({token:r.hash.decrypt(o.token)});e.notFound("RECORD NOT FOUND")}))}token_delete(e,t,r){return y(this,void 0,void 0,(function*(){const o=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(o)return o.token="",yield o.save(Object.assign({},r)).catch(this.error),e.success("OK");e.notFound("RECORD NOT FOUND")}))}token_renew(e,t,r,o){return y(this,void 0,void 0,(function*(){const s=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(s){const t=yield this.token_new();return s.token=o.hash.encrypt(t),yield s.save(Object.assign({},r)).catch(this.error),e.json({token:t})}e.notFound("RECORD NOT FOUND")}))}token_new(){return y(this,void 0,void 0,(function*(){var e;const t=r.uuidv4();return(null!==(e=yield this.model().count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t}))}add(e,o){return y(this,void 0,void 0,(function*(){const s=r.uniqueID(),i=yield this._add({ctx:e,body:{password:t.sha256(o+s),salt:s}});x.API_USER_HISTORY&&i&&(yield exports.UserHistory.create({password:t.sha256(o+i.id),user_id:i.id}))}))}all(e){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}del(e,t,r){return y(this,void 0,void 0,(function*(){if(r.id.toString()==t)return e.notFound("RECORD NOT FOUND");yield this._del({ctx:e})}))}get(e){return y(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,o,s){return y(this,void 0,void 0,(function*(){if(x.API_USER_HISTORY&&s){const r=t.sha256(s+o);if(yield exports.UserHistory.count({where:{password:r}}).catch(this.error))return e.error("PASSWORD PREVIOUSLY REGISTERED");yield exports.UserHistory.create({password:r,user_id:o}).catch(this.error)}const i=s?r.uniqueID():"";yield this._set({ctx:e,body:s?{password:t.sha256(s+i),salt:i}:{}})}))}},u([e.Post("/avatar"),e.Middleware("auth"),e.Middleware("upload",(e=>({count:1,field:"file",path:e.controller.path,types:["image/bmp","image/jpeg","image/png"],size:32}))),c(0,e.Ctx()),c(1,e.Files()),c(2,w()),c(3,T()),g("design:type",Function),g("design:paramtypes",[e.Context,Array,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),u([e.Delete("/avatar"),e.Middleware("auth"),c(0,e.Ctx()),c(1,w()),c(2,T()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"avatar_delete",null),u([e.Post("/password"),e.Middleware("auth"),e.Middleware("validation",{oldPassword:r.Validation.string().min(5).required(),newPassword:r.Validation.string().min(5).required()}),c(0,e.Ctx()),c(1,e.Body("oldPassword")),c(2,e.Body("newPassword")),c(3,w()),c(4,T()),g("design:type",Function),g("design:paramtypes",[e.Context,String,String,exports.User,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"password",null),u([e.Get("/token"),e.Middleware("auth"),c(0,e.Ctx()),c(1,w()),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User,f]),g("design:returntype",Promise)],exports.UsersController.prototype,"token",null),u([e.Get("/token/:id"),e.Middleware("auth"),e.Middleware("create"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,f]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_get",null),u([e.Delete("/token/:id"),e.Middleware("auth"),e.Middleware("delete"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,T()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_delete",null),u([e.Get("/token/renew/:id"),e.Middleware("auth"),e.Middleware("update"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,T()),c(3,e.App()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Object,f]),g("design:returntype",Promise)],exports.UsersController.prototype,"token_renew",null),u([e.Post(),e.Middleware("auth"),e.Middleware("create"),e.Middleware("validation",{name:r.Validation.string().required(),email:r.Validation.string().email().required(),username:r.Validation.string().min(4).required(),password:r.Validation.string().min(5).required(),description:r.Validation.string().empty(""),state:r.Validation.boolean().parse().required()}),c(0,e.Ctx()),c(1,e.Body("password")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.UsersController.prototype,"add",null),u([e.Get(),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.UsersController.prototype,"all",null),u([e.Delete("/:id"),e.Middleware("auth"),e.Middleware("delete"),c(0,e.Ctx()),c(1,e.Params("id")),c(2,w()),g("design:type",Function),g("design:paramtypes",[e.Context,String,exports.User]),g("design:returntype",Promise)],exports.UsersController.prototype,"del",null),u([e.Get("/:id"),e.Middleware("auth"),e.Middleware("read"),c(0,e.Ctx()),g("design:type",Function),g("design:paramtypes",[e.Context]),g("design:returntype",Promise)],exports.UsersController.prototype,"get",null),u([e.Put("/:id"),e.Middleware("auth"),e.Middleware("update"),e.Middleware("validation",{name:r.Validation.string().empty(),email:r.Validation.string().email().empty(),username:r.Validation.string().min(4).empty(),password:r.Validation.string().min(5).empty().filter(""),description:r.Validation.string().empty(),state:r.Validation.boolean().parse().empty()}),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.Body("password")),g("design:type",Function),g("design:paramtypes",[e.Context,String,String]),g("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=u([e.Controller("/users"),e.Extends(exports.ModelController),g("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class extends exports.ModelController{model(){return exports.UserGroup}groups(e,t){return y(this,void 0,void 0,(function*(){yield this.all(e,t.id.toString())}))}all(e,t){return y(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{user_id:t},include:[{model:exports.Group,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,o,s){return y(this,void 0,void 0,(function*(){const i=yield exports.User.findByPk(t,{attributes:["id"]}).catch(this.error);if(i){if(yield exports.UserGroup.destroy(Object.assign({where:{user_id:i.id},individualHooks:!0},s)),o){let e=0;yield r.sleep(1e3);for(let t=0;t<o.length;t++)e=yield exports.Group.count({where:{id:o[t]}}),e&&(yield exports.UserGroup.create({user_id:i.id,group_id:o[t]},Object.assign({},s)))}return e.success("OK")}if(r.isNull(i))return e.notFound("RECORD NOT FOUND");e.error("INTERNAL SERVER ERROR")}))}},u([e.Get("/groups"),e.Middleware("auth"),e.Middleware("read","users"),c(0,e.Ctx()),c(1,w()),g("design:type",Function),g("design:paramtypes",[e.Context,exports.User]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"groups",null),u([e.Get("/:id/groups"),e.Middleware("auth"),e.Middleware("read","users"),c(0,e.Ctx()),c(1,e.Params("id")),g("design:type",Function),g("design:paramtypes",[e.Context,String]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),u([e.Put("/:id/groups"),e.Middleware("auth"),e.Middleware("update","users"),e.Middleware("validation",{groups:r.Validation.array(r.Validation.number().parse())}),c(0,e.Ctx()),c(1,e.Params("id")),c(2,e.Body("groups")),c(3,T()),g("design:type",Function),g("design:paramtypes",[e.Context,String,Array,Object]),g("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=u([e.Controller("/users"),e.Extends(exports.ModelController)],exports.UsersGroupsController),exports.Application=f,exports.Config=R,exports.ControllerBase=N,exports.Env=x,exports.Logs=A,exports.Model=v,exports.ReqAudit=T,exports.ReqAuth=D,exports.ReqUser=w,exports.Token=E,exports.audit=I,exports.crt=P,exports.database=h,exports.hooks=_,exports.key=C;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @andrewcaires/api v4.0.4
2
+ * @andrewcaires/api v4.1.1
3
3
  * Simple api for small applications using express, jsonwebtoken, sequelize and websocket
4
4
  * (c) 2024 Andrew Caires
5
5
  * @license: MIT
@@ -77,6 +77,13 @@ declare class UserGroup extends Model {
77
77
  user: User;
78
78
  }
79
79
 
80
+ declare class UserHistory extends Model {
81
+ password: string;
82
+ created_at: Date;
83
+ user_id: number;
84
+ user: User;
85
+ }
86
+
80
87
  declare class User extends Model {
81
88
  id: number;
82
89
  name: string;
@@ -96,6 +103,7 @@ declare class User extends Model {
96
103
  auths: Array<Auth>;
97
104
  registers: Array<Register>;
98
105
  users_groups: Array<UserGroup>;
106
+ users_histories: Array<UserHistory>;
99
107
  }
100
108
 
101
109
  declare class Audit extends Model {
@@ -103,10 +111,11 @@ declare class Audit extends Model {
103
111
  type: string;
104
112
  model: string;
105
113
  record: string;
106
- user_ip: string;
107
- user_agent: string;
108
114
  data: TypeObjectAny;
109
115
  previously: TypeObjectAny;
116
+ client: string;
117
+ href: string;
118
+ user_agent: string;
110
119
  state: boolean;
111
120
  created_at: Date;
112
121
  updated_at: Date;
@@ -175,6 +184,8 @@ declare class Application extends Application$1 {
175
184
  websocket(): WebSocketServer | undefined;
176
185
  }
177
186
 
187
+ declare const audit: (ctx: Context) => TypeObjectAny;
188
+
178
189
  declare class Config {
179
190
  static all(): Promise<TypeObjectString>;
180
191
  static del(key: string, user?: User): Promise<boolean>;
@@ -183,8 +194,6 @@ declare class Config {
183
194
  static set(key: string, value: string, user?: User): Promise<void>;
184
195
  }
185
196
 
186
- declare const conn: Connection;
187
-
188
197
  interface ArgumentsModelAdd<M extends Model$2<M>> {
189
198
  ctx: Context;
190
199
  options?: CreateOptions<Attributes<M>>;
@@ -348,7 +357,7 @@ declare class UsersController extends ModelController<User> {
348
357
  protected all(ctx: Context): Promise<void>;
349
358
  protected del(ctx: Context, id: string, user: User): Promise<void>;
350
359
  protected get(ctx: Context): Promise<void>;
351
- protected set(ctx: Context, password: string): Promise<void>;
360
+ protected set(ctx: Context, id: string, password: string): Promise<void>;
352
361
  }
353
362
 
354
363
  declare class UsersGroupsController extends ModelController<UserGroup> {
@@ -358,9 +367,10 @@ declare class UsersGroupsController extends ModelController<UserGroup> {
358
367
  protected set(ctx: Context, id: string, groups: Array<number>, audit: TypeObjectAny): Promise<void>;
359
368
  }
360
369
 
370
+ declare const database: Connection;
371
+
361
372
  declare class Env {
362
373
  static readonly API_CONSOLE_ERROR: boolean;
363
- static readonly API_DEFAULT_PATH: string;
364
374
  static readonly API_DB_DATABASE: string;
365
375
  static readonly API_DB_HOST: string;
366
376
  static readonly API_DB_PASSWORD: string;
@@ -378,6 +388,7 @@ declare class Env {
378
388
  static readonly API_HTTP_CROSS: boolean;
379
389
  static readonly API_HTTP_HYBRID: boolean;
380
390
  static readonly API_HTTP_NOTFOUND: string;
391
+ static readonly API_HTTP_PATH: string;
381
392
  static readonly API_HTTP_REDIRECT: string;
382
393
  static readonly API_KEY_HASH: string;
383
394
  static readonly API_KEY_HEADER: string;
@@ -399,6 +410,7 @@ declare class Env {
399
410
  static readonly API_UPLOAD_FIELD: string;
400
411
  static readonly API_UPLOAD_SIZE: number;
401
412
  static readonly API_UPLOAD_TEMP: string;
413
+ static readonly API_USER_HISTORY: boolean;
402
414
  static readonly API_WEBSOCKET_START: boolean;
403
415
  protected static getBool(key: string, value: boolean): boolean;
404
416
  protected static getInt(key: string, value: number): number;
@@ -406,11 +418,6 @@ declare class Env {
406
418
  protected static getString(key: string, value: string): string;
407
419
  }
408
420
 
409
- declare const audit: (ctx: Context) => {
410
- audit_user_ip: string;
411
- audit_user_id: number | null;
412
- audit_user_agent: string;
413
- };
414
421
  declare const ReqAudit: (key?: string) => ParameterDecorator;
415
422
 
416
423
  declare const ReqAuth: (key?: string) => ParameterDecorator;
@@ -460,4 +467,4 @@ declare class Token {
460
467
  private static verify;
461
468
  }
462
469
 
463
- export { Application, type ArgumentsModelAdd, type ArgumentsModelAll, type ArgumentsModelDel, type ArgumentsModelGet, type ArgumentsModelSet, Audit, AuditsController, Auth, AuthController, type CallbackModelAll, type CallbackModelGet, Config, Configs, ControllerBase, CrudController, Env, FilesController, Forgot, ForgotController, Group, GroupPermission, GroupsController, GroupsPermissionsController, type IDatabaseOptions, type ITokenParameters, Log, Logs, LogsController, Model, ModelController, Permission, PermissionsController, Register, RegisterController, ReqAudit, ReqAuth, ReqUser, type ResultModelAll, Session, SetupController, Token, User, UserGroup, UsersController, UsersGroupsController, audit, conn, crt, hooks, key };
470
+ export { Application, type ArgumentsModelAdd, type ArgumentsModelAll, type ArgumentsModelDel, type ArgumentsModelGet, type ArgumentsModelSet, Audit, AuditsController, Auth, AuthController, type CallbackModelAll, type CallbackModelGet, Config, Configs, ControllerBase, CrudController, Env, FilesController, Forgot, ForgotController, Group, GroupPermission, GroupsController, GroupsPermissionsController, type IDatabaseOptions, type ITokenParameters, Log, Logs, LogsController, Model, ModelController, Permission, PermissionsController, Register, RegisterController, ReqAudit, ReqAuth, ReqUser, type ResultModelAll, Session, SetupController, Token, User, UserGroup, UserHistory, UsersController, UsersGroupsController, audit, crt, database, hooks, key };
package/dist/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/api v4.0.4
2
+ * @andrewcaires/api v4.1.1
3
3
  * Simple api for small applications using express, jsonwebtoken, sequelize and websocket
4
4
  * (c) 2024 Andrew Caires
5
5
  * @license: MIT
6
6
  */
7
- import{Application as e,parameterFactory as t,Ctx as r,Headers as i,App as n,Argument as s,Session as o,Upload as d,Context as a,Extends as u,Status as p,Get as c,Middleware as l,Query as y,Controller as g,Post as h,Body as v,Delete as _,Put as m,Params as f,Files as P}from"@andrewcaires/express";import{LogColor as O,Log as I,Hash as A,sha256 as E}from"@andrewcaires/node";import{toBool as S,parseMs as T,isObject as b,noop as w,loop as D,uuidv4 as k,sleep as R,EventEmitter as x,Validation as j,isString as F,isArray as N,isDef as q,uniqueID as L,isNull as C,forEachSeries as B}from"@andrewcaires/utils.js";import{WebSocketServer as H}from"ws";import{Connection as K,Model as U,Id as M,String as Y,FullDate as G,CreatedAt as W,UpdatedAt as z,DeletedAt as $,BelongsTo as J,Database as X,ModelName as V,Boolean as Z,Text as Q,HasMany as ee,Hooks as te,DateOnly as re,DefaultScope as ie,Scopes as ne,Enum as se,Json as oe,BigInt as de,Unique as ae}from"@andrewcaires/sequelize";import{config as ue}from"dotenv";import{existsSync as pe,readFileSync as ce,statSync as le,readdirSync as ye,mkdirSync as ge,lstatSync as he,rmSync as ve}from"fs";import{Store as _e}from"express-session";import{Op as me}from"sequelize";import fe from"jsonwebtoken";import{join as Pe}from"path";function Oe(e,t,r,i){var n,s=arguments.length,o=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,i);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(o=(s<3?n(o):s>3?n(t,r,o):n(t,r))||o);return s>3&&o&&Object.defineProperty(t,r,o),o}function Ie(e,t){return function(r,i){t(r,i,e)}}function Ae(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,ue();class Se{static getBool(e,t){return S(Se.getString(e,t.toString()))}static getInt(e,t){return parseInt(Se.getString(e,t.toString()))}static getMs(e,t){return T(Se.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}Se.API_CONSOLE_ERROR=Se.getBool("API_CONSOLE_ERROR",!1),Se.API_DEFAULT_PATH=Se.getString("API_DEFAULT_PATH","/api"),Se.API_DB_DATABASE=Se.getString("API_DB_DATABASE",""),Se.API_DB_HOST=Se.getString("API_DB_HOST","127.0.0.1"),Se.API_DB_PASSWORD=Se.getString("API_DB_PASSWORD",""),Se.API_DB_PORT=Se.getInt("API_DB_PORT",3306),Se.API_DB_TYPE=Se.getString("API_DB_TYPE",""),Se.API_DB_USERNAME=Se.getString("API_DB_USERNAME","root"),Se.API_DB_LOG=Se.getBool("API_DB_LOG",!1),Se.API_DB_AUDIT=Se.getBool("API_DB_AUDIT",!0),Se.API_DB_PREFIX=Se.getString("API_DB_PREFIX",""),Se.API_DB_TIMEZONE=Se.getString("API_DB_TIMEZONE","+00:00"),Se.API_HTTP_CRT=Se.getString("API_HTTP_CRT",""),Se.API_HTTP_KEY=Se.getString("API_HTTP_KEY",""),Se.API_HTTP_PORT=Se.getInt("API_HTTP_PORT",3e3),Se.API_HTTP_PUBLIC=Se.getString("API_HTTP_PUBLIC",""),Se.API_HTTP_CROSS=Se.getBool("API_HTTP_CROSS",!1),Se.API_HTTP_HYBRID=Se.getBool("API_HTTP_HYBRID",!1),Se.API_HTTP_NOTFOUND=Se.getString("API_HTTP_NOTFOUND",""),Se.API_HTTP_REDIRECT=Se.getString("API_HTTP_REDIRECT",""),Se.API_KEY_HASH=Se.getString("API_KEY_HASH",""),Se.API_KEY_HEADER=Se.getString("API_KEY_HEADER","api_key"),Se.API_MODEL_LIMIT=Se.getInt("API_MODEL_LIMIT",10),Se.API_MODEL_LIMIT_MAX=Se.getInt("API_MODEL_LIMIT_MAX",500),Se.API_SLEEP_AUTH=Se.getMs("API_SLEEP_AUTH","2s"),Se.API_SLEEP_FORGOT=Se.getMs("API_SLEEP_FORGOT","5s"),Se.API_SLEEP_REGISTRY=Se.getMs("API_SLEEP_REGISTRY","5s"),Se.API_SESSION_NAME=Se.getString("API_SESSION_NAME","session.id"),Se.API_SESSION_LIFETIME=Se.getMs("API_SESSION_LIFETIME","1d"),Se.API_SESSION_SECRET=Se.getString("API_SESSION_SECRET","yoursecret"),Se.API_TOKEN_CRT=Se.getString("API_TOKEN_CRT",""),Se.API_TOKEN_KEY=Se.getString("API_TOKEN_KEY",""),Se.API_TOKEN_FORGOT=Se.getMs("API_TOKEN_LIFETIME","1d"),Se.API_TOKEN_HEADER=Se.getString("API_TOKEN_HEADER","authorization"),Se.API_TOKEN_LIFETIME=Se.getMs("API_TOKEN_LIFETIME","1d"),Se.API_TOKEN_RENEW=Se.getMs("API_TOKEN_RENEW","1d"),Se.API_UPLOAD_COUNT=Se.getInt("API_UPLOAD_COUNT",1),Se.API_UPLOAD_FIELD=Se.getString("API_UPLOAD_FIELD","upload"),Se.API_UPLOAD_SIZE=Se.getInt("API_UPLOAD_SIZE",2),Se.API_UPLOAD_TEMP=Se.getString("API_UPLOAD_TEMP","./temp"),Se.API_WEBSOCKET_START=Se.getBool("API_WEBSOCKET_START",!1);const Te=new K({type:Se.API_DB_TYPE,database:Se.API_DB_DATABASE,username:Se.API_DB_USERNAME,password:Se.API_DB_PASSWORD,hostname:Se.API_DB_HOST,hostport:Se.API_DB_PORT,logging:Se.API_DB_LOG,prefix:Se.API_DB_PREFIX});class be extends U{}const we=(e,t,r)=>{var i,n,s,o;return{type:e,model:null!==(i=null==t?void 0:t.getTableName())&&void 0!==i?i:null,user_ip:null!==(n=null==r?void 0:r.audit_user_ip)&&void 0!==n?n:null,user_agent:null!==(s=null==r?void 0:r.audit_user_agent)&&void 0!==s?s:null,user_id:null!==(o=null==r?void 0:r.audit_user_id)&&void 0!==o?o:null,state:!0}},De={afterCreate:(e,t)=>Ee(void 0,void 0,void 0,(function*(){var r;if(!Se.API_DB_AUDIT)return;const i=b(e)?e.constructor:null,n=null!==(r=null==i?void 0:i.primaryKeyAttribute)&&void 0!==r?r:null;yield Ne.create(Object.assign(Object.assign({},we("CREATE",i,t)),{record:n?e.getDataValue(n):null,data:e.toJSON()})).catch(w)})),afterUpdate:(e,t)=>Ee(void 0,void 0,void 0,(function*(){var r;if(!Se.API_DB_AUDIT)return;const i=b(e)?e.constructor:null,n=null!==(r=null==i?void 0:i.primaryKeyAttribute)&&void 0!==r?r:null,s=e.changed();s&&s.forEach((t=>e.getDataValue(t))),yield Ne.create(Object.assign(Object.assign({},we("UPDATE",i,t)),{record:n?e.getDataValue(n):null,data:e.toJSON(),previously:e.previous()})).catch(w)})),afterDestroy:(e,t)=>Ee(void 0,void 0,void 0,(function*(){var r;if(!Se.API_DB_AUDIT)return;const i=b(e)?e.constructor:null,n=null!==(r=null==i?void 0:i.primaryKeyAttribute)&&void 0!==r?r:null;yield Ne.create(Object.assign(Object.assign({},we("DELETE",i,t)),{record:n?e.getDataValue(n):null,data:JSON.stringify(e.toJSON())})).catch(w)}))};let ke=class extends be{};Oe([M(),Ae("design:type",Number)],ke.prototype,"id",void 0),Oe([Y(),Ae("design:type",Y)],ke.prototype,"secret",void 0),Oe([G(),Ae("design:type",Date)],ke.prototype,"logout",void 0),Oe([Y(),Ae("design:type",Y)],ke.prototype,"user_agent",void 0),Oe([W,Ae("design:type",Date)],ke.prototype,"created_at",void 0),Oe([z,Ae("design:type",Date)],ke.prototype,"updated_at",void 0),Oe([$,Ae("design:type",Date)],ke.prototype,"deleted_at",void 0),Oe([J((()=>Fe)),Ae("design:type",Number)],ke.prototype,"user_id",void 0),ke=Oe([X(Te),V("auth")],ke);let Re=class extends be{};Oe([M(),Ae("design:type",Number)],Re.prototype,"id",void 0),Oe([Y(),Ae("design:type",Y)],Re.prototype,"token",void 0),Oe([Z(),Ae("design:type",Z)],Re.prototype,"state",void 0),Oe([W,Ae("design:type",Date)],Re.prototype,"created_at",void 0),Oe([z,Ae("design:type",Date)],Re.prototype,"updated_at",void 0),Oe([$,Ae("design:type",Date)],Re.prototype,"deleted_at",void 0),Oe([J((()=>Fe)),Ae("design:type",Number)],Re.prototype,"user_id",void 0),Re=Oe([X(Te),V("register")],Re);let xe=class extends be{};Oe([M(),Ae("design:type",Number)],xe.prototype,"id",void 0),Oe([Y(),Ae("design:type",Y)],xe.prototype,"name",void 0),Oe([Q(),Ae("design:type",Y)],xe.prototype,"description",void 0),Oe([Z(),Ae("design:type",Z)],xe.prototype,"state",void 0),Oe([W,Ae("design:type",Date)],xe.prototype,"created_at",void 0),Oe([z,Ae("design:type",Date)],xe.prototype,"updated_at",void 0),Oe([$,Ae("design:type",Date)],xe.prototype,"deleted_at",void 0),Oe([ee((()=>je),"group_id"),Ae("design:type",Array)],xe.prototype,"groups_routes",void 0),Oe([ee((()=>je),"group_id"),Ae("design:type",Array)],xe.prototype,"users_groups",void 0),xe=Oe([X(Te),V("group"),te(De)],xe);let je=class extends be{};Oe([W,Ae("design:type",Date)],je.prototype,"created_at",void 0),Oe([J((()=>xe)),Ae("design:type",Number)],je.prototype,"group_id",void 0),Oe([J((()=>Fe)),Ae("design:type",Number)],je.prototype,"user_id",void 0),je=Oe([X(Te),V("users_groups"),te(De)],je);let Fe=class extends be{};Oe([M(),Ae("design:type",Number)],Fe.prototype,"id",void 0),Oe([Y(),Ae("design:type",Y)],Fe.prototype,"name",void 0),Oe([Y(),Ae("design:type",Y)],Fe.prototype,"email",void 0),Oe([Y(),Ae("design:type",Y)],Fe.prototype,"username",void 0),Oe([Y(),Ae("design:type",Y)],Fe.prototype,"password",void 0),Oe([Y(),Ae("design:type",Y)],Fe.prototype,"salt",void 0),Oe([Y(),Ae("design:type",Y)],Fe.prototype,"token",void 0),Oe([Y(),Ae("design:type",Y)],Fe.prototype,"avatar",void 0),Oe([re(),Ae("design:type",Y)],Fe.prototype,"date",void 0),Oe([Q(),Ae("design:type",Y)],Fe.prototype,"description",void 0),Oe([Z(),Ae("design:type",Z)],Fe.prototype,"state",void 0),Oe([W,Ae("design:type",Date)],Fe.prototype,"created_at",void 0),Oe([z,Ae("design:type",Date)],Fe.prototype,"updated_at",void 0),Oe([$,Ae("design:type",Date)],Fe.prototype,"deleted_at",void 0),Oe([ee((()=>Ne),"user_id"),Ae("design:type",Array)],Fe.prototype,"audits",void 0),Oe([ee((()=>ke),"user_id"),Ae("design:type",Array)],Fe.prototype,"auths",void 0),Oe([ee((()=>Re),"user_id"),Ae("design:type",Array)],Fe.prototype,"registers",void 0),Oe([ee((()=>je),"user_id"),Ae("design:type",Array)],Fe.prototype,"users_groups",void 0),Fe=Oe([X(Te),V("user"),ie({attributes:{exclude:["password","salt","token"]}}),ne({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),te(De)],Fe);let Ne=class extends be{};Oe([M(),Ae("design:type",Number)],Ne.prototype,"id",void 0),Oe([se("CREATE","DELETE","UPDATE"),Ae("design:type",Y)],Ne.prototype,"type",void 0),Oe([Y(),Ae("design:type",Y)],Ne.prototype,"model",void 0),Oe([Y(),Ae("design:type",Y)],Ne.prototype,"record",void 0),Oe([Y(),Ae("design:type",Y)],Ne.prototype,"user_ip",void 0),Oe([Y(),Ae("design:type",Y)],Ne.prototype,"user_agent",void 0),Oe([oe(),Ae("design:type",Object)],Ne.prototype,"data",void 0),Oe([oe(),Ae("design:type",Object)],Ne.prototype,"previously",void 0),Oe([Z(),Ae("design:type",Z)],Ne.prototype,"state",void 0),Oe([W,Ae("design:type",Date)],Ne.prototype,"created_at",void 0),Oe([z,Ae("design:type",Date)],Ne.prototype,"updated_at",void 0),Oe([$,Ae("design:type",Date)],Ne.prototype,"deleted_at",void 0),Oe([J((()=>Fe)),Ae("design:type",Number)],Ne.prototype,"user_id",void 0),Ne=Oe([X(Te),V("audit")],Ne);let qe=class extends be{};Oe([Y(),Ae("design:type",Y)],qe.prototype,"key",void 0),Oe([Y(),Ae("design:type",Y)],qe.prototype,"value",void 0),Oe([W,Ae("design:type",Date)],qe.prototype,"created_at",void 0),Oe([z,Ae("design:type",Date)],qe.prototype,"updated_at",void 0),qe=Oe([X(Te),V("configs"),te(De)],qe);let Le=class extends be{};Oe([M(),Ae("design:type",Number)],Le.prototype,"id",void 0),Oe([Y(),Ae("design:type",Y)],Le.prototype,"token",void 0),Oe([de(),Ae("design:type",Number)],Le.prototype,"timestamp",void 0),Oe([Z(),Ae("design:type",Z)],Le.prototype,"state",void 0),Oe([W,Ae("design:type",Date)],Le.prototype,"created_at",void 0),Oe([z,Ae("design:type",Date)],Le.prototype,"updated_at",void 0),Oe([$,Ae("design:type",Date)],Le.prototype,"deleted_at",void 0),Oe([J((()=>Fe)),Ae("design:type",Number)],Le.prototype,"user_id",void 0),Le=Oe([X(Te),V("forgot")],Le);let Ce=class extends be{};Oe([M(),Ae("design:type",Number)],Ce.prototype,"id",void 0),Oe([Y(),Ae("design:type",Y)],Ce.prototype,"name",void 0),Oe([Y(),ae(!0),Ae("design:type",Y)],Ce.prototype,"route",void 0),Oe([Q(),Ae("design:type",Y)],Ce.prototype,"description",void 0),Oe([Z(),Ae("design:type",Z)],Ce.prototype,"state",void 0),Oe([W,Ae("design:type",Date)],Ce.prototype,"created_at",void 0),Oe([z,Ae("design:type",Date)],Ce.prototype,"updated_at",void 0),Oe([$,Ae("design:type",Date)],Ce.prototype,"deleted_at",void 0),Oe([ee((()=>Be),"permission_id"),Ae("design:type",Array)],Ce.prototype,"groups_permissions",void 0),Ce=Oe([X(Te),V("permission"),te(De)],Ce);let Be=class extends be{};Oe([W,Ae("design:type",Date)],Be.prototype,"created_at",void 0),Oe([J((()=>xe)),Ae("design:type",Number)],Be.prototype,"group_id",void 0),Oe([J((()=>Ce)),Ae("design:type",Number)],Be.prototype,"permission_id",void 0),Be=Oe([X(Te),V("groups_permissions"),te(De)],Be);let He=class extends be{};Oe([M(),Ae("design:type",Number)],He.prototype,"id",void 0),Oe([Y(),Ae("design:type",Y)],He.prototype,"type",void 0),Oe([Y(),Ae("design:type",Y)],He.prototype,"source",void 0),Oe([Q(),Ae("design:type",Y)],He.prototype,"message",void 0),Oe([W,Ae("design:type",Date)],He.prototype,"created_at",void 0),He=Oe([X(Te),V("log")],He);let Ke=class extends be{};Oe([Y(),Ae("design:type",Y)],Ke.prototype,"session",void 0),Oe([Q(),Ae("design:type",Y)],Ke.prototype,"json",void 0),Oe([de(),Ae("design:type",Number)],Ke.prototype,"expired",void 0),Oe([W,Ae("design:type",Date)],Ke.prototype,"created_at",void 0),Oe([z,Ae("design:type",Date)],Ke.prototype,"updated_at",void 0),Ke=Oe([X(Te),V("session")],Ke);class Ue{static write(e,t,r){return Ee(this,void 0,void 0,(function*(){yield Ue.writeRaw(O.White,"",e,t,r)}))}static error(e,t,r){return Ee(this,void 0,void 0,(function*(){yield Ue.writeRaw(O.Red,"error",e,t,r)}))}static info(e,t,r){return Ee(this,void 0,void 0,(function*(){yield Ue.writeRaw(O.Cyan,"info",e,t,r)}))}static success(e,t,r){return Ee(this,void 0,void 0,(function*(){yield Ue.writeRaw(O.Green,"success",e,t,r)}))}static warning(e,t,r){return Ee(this,void 0,void 0,(function*(){yield Ue.writeRaw(O.Yellow,"warning",e,t,r)}))}static writeRaw(e,t,r,i,n){return Ee(this,void 0,void 0,(function*(){n&&I.console(e,t,r),Te&&(yield He.create({type:t,source:i,message:r}).catch((()=>null)))}))}}const Me=e=>pe(e)?ce(e):void 0,Ye={http:Me(Se.API_HTTP_CRT),token:Me(Se.API_TOKEN_CRT)},Ge={http:Me(Se.API_HTTP_KEY),token:Me(Se.API_TOKEN_KEY)};class We extends _e{constructor(){super(),this.all=e=>Ee(this,void 0,void 0,(function*(){e=e||w;const t=yield Ke.findAll({attributes:["session"],where:{expired:{[me.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 Ke.destroy().catch(w),e&&e()})),this.destroy=(e,t)=>Ee(this,void 0,void 0,(function*(){yield Ke.destroy({where:{session:e}}).catch(w),t&&t()})),this.expired=()=>Ee(this,void 0,void 0,(function*(){yield Ke.destroy({where:{expired:{[me.lt]:Date.now()}}}).catch(w)})),this.get=(e,t)=>Ee(this,void 0,void 0,(function*(){t=t||w;const r=yield Ke.findOne({where:{session:e,expired:{[me.gte]:Date.now()}}}).catch((e=>(t(e),null)));if(r){const e=JSON.parse(r.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield r.destroy().catch(w),void t(null)}t(null,e)}else t(null)})),this.length=e=>Ee(this,void 0,void 0,(function*(){e&&e(null,(yield Ke.count().catch(w))||0)})),this.set=(e,t,r)=>Ee(this,void 0,void 0,(function*(){r=r||w;const i=Date.now()+Se.API_SESSION_LIFETIME,n=JSON.stringify(t),[s,o]=(yield Ke.findOrCreate({where:{session:e},defaults:{session:e,json:n,expired:i}}).catch(w))||[];s&&(o||(s.json=n,s.expired=i,yield s.save().catch(w))),r()})),this.loop=D(this.expired,3e4),this.loop.start()}}class ze{static create(e){return Ee(this,void 0,void 0,(function*(){if(!Ge.token)return{error:"Key not found"};const{id:t}=e,r=k(),i=yield ke.create({secret:r,user_id:t}).catch(ze.error);if(!i)return{error:"Internal Server Error"};return{auth:i,token:fe.sign({id:t,secret:r},Ge.token,ze.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){Ue.error(e.message,"api.token",Se.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:Se.API_TOKEN_LIFETIME+"ms"}}static renew(e){return Ee(this,void 0,void 0,(function*(){if(!Ge.token)return{error:"Key not found"};const{error:t,decode:r}=ze.verify(e,Se.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield Fe.findOne({where:{id:e,state:!0}}).catch(ze.error);if(r){const i=yield ke.findOne({where:{secret:t,user_id:r.id}}).catch(ze.error);if(i&&!i.logout){i.secret=k(),yield i.save().catch(ze.error);return{auth:i,token:fe.sign({id:e,secret:i.secret},Ge.token,ze.options())}}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static user(e,t,r){return Ee(this,void 0,void 0,(function*(){if(e){t=r.hash.encrypt(e);const i=yield Fe.findOne({where:{token:t,state:!0}}).catch(ze.error);if(i){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield ke.findOrCreate({where:{secret:t,user_id:i.id},defaults:{secret:t,user_id:i.id}}).catch(ze.error))||[];if(r)return{auth:r,user:i}}return{error:"Access denied"}}const{error:i,decode:n}=ze.verify(t);if(i)return{error:i};if(n){const{id:e,secret:t}=n;if(e&&t){const r=yield Fe.findOne({where:{id:e,state:!0}}).catch(ze.error);if(r){const e=yield ke.findOne({where:{secret:t,user_id:r.id}}).catch(ze.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"Access denied"}}}return{error:"Invalid token"}}))}static verify(e,t){if(!Ye.token)return{error:"Cert not found"};if(!e||e.split(".").length<3)return{error:"Invalid Token"};try{return{decode:fe.verify(e,Ye.token,{clockTolerance:t})}}catch(e){return{error:"Invalid Token"}}}}class $e extends e{constructor(e){super(e,{cert:Ye.http,cross:Se.API_HTTP_CROSS,hybrid:Se.API_HTTP_HYBRID,key:Ge.http,notfound:Se.API_HTTP_NOTFOUND,path:Se.API_DEFAULT_PATH,port:Se.API_HTTP_PORT,public:Se.API_HTTP_PUBLIC,redirect:Se.API_HTTP_REDIRECT,session:{store:new We,name:Se.API_SESSION_NAME,secret:Se.API_SESSION_SECRET,cookie:{maxAge:Se.API_SESSION_LIFETIME},genid:k}}),this.hash=new A(Se.API_KEY_HASH)}error(e,t){Ue.error(e.message,t,Se.API_CONSOLE_ERROR)}log(e,t){Ue.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return Ee(this,void 0,void 0,(function*(){yield Te.sync(),yield e.listen.call(this),Se.API_WEBSOCKET_START&&this.server&&(this._webSocket=new H({server:this.server,verifyClient:(e,t)=>t(Se.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 ze.user("",n.toString(),this);s&&(i=s,this.emit("ws.connection"+r,{req:t,user:i,ws:e}))}i||e.close()})))),e.on("close",(()=>{i&&this.emit("ws.close"+r,{user:i,ws:e})})),yield R(2e3),i||e.close()})))))}))}websocket(){return this._webSocket}}class Je{static all(){return Ee(this,void 0,void 0,(function*(){const e=yield qe.findAll().catch(Je.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e,t){return Ee(this,void 0,void 0,(function*(){var r;const i=null!==(r=null==t?void 0:t.id)&&void 0!==r?r:null;return((yield qe.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:i})).catch(Je.error))||0)>0}))}static error(e){Ue.error(e.message,"api.config",Se.API_CONSOLE_ERROR)}static get(e){return Ee(this,arguments,void 0,(function*(e,t=""){const[r]=(yield qe.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(Je.error))||[];return r?r.value:t}))}static set(e,t,r){return Ee(this,void 0,void 0,(function*(){var i;const n=null!==(i=null==r?void 0:r.id)&&void 0!==i?i:null,[s]=(yield qe.findOrCreate(Object.assign({where:{key:e}},{user_id:n})).catch(Je.error))||[];s&&(s.value=t,yield s.save().catch(Je.error))}))}}const Xe=e=>{var t,r,i,n,s,o;return{audit_user_ip:null!==(t=e.ip())&&void 0!==t?t:"0.0.0.0",audit_user_id:null!==(n=null===(i=null===(r=null==e?void 0:e.req)||void 0===r?void 0:r.user)||void 0===i?void 0:i.id)&&void 0!==n?n:null,audit_user_agent:null!==(o=null===(s=e.req)||void 0===s?void 0:s.headers["user-agent"])&&void 0!==o?o:""}},Ve=t((({ctx:e})=>Xe(e))),Ze=t((({ctx:e})=>e.req.auth)),Qe=t((({ctx:e})=>e.req.user));class et extends x{auth(e,t,r,i,n){return Ee(this,void 0,void 0,(function*(){const{auth:s,error:o,user:d}=yield ze.user(t,r,n);return o?e.error(o):s&&d?s.user_agent&&s.user_agent!=i?e.error("Invalid token"):(e.req.auth=s,e.req.user=d,void e.next()):e.error("Internal Server Error")}))}create(e,t,r){return Ee(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".create",r)}))}delete(e,t,r){return Ee(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".delete",r)}))}error(e){Ue.error(e.message,"api.controller",Se.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,r){return Ee(this,void 0,void 0,(function*(){if(r){const i=yield this.permissions(r,{route:t});if(i&&i.length>0)return e.next()}e.unauthorized("Access denied")}))}permissions(e,t){return Ee(this,void 0,void 0,(function*(){return yield Ce.findAll({where:Object.assign(Object.assign({},null!=t?t:{}),{state:!0}),include:[{model:Be,required:!0,include:[{model:xe,required:!0,where:{state:!0},include:[{model:je,required:!0,where:{user_id:e.id}}]}]}]}).catch(this.error)}))}read(e,t,r){return Ee(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".read",r)}))}session(e,t,r){return Ee(this,void 0,void 0,(function*(){r.auth&&r.user&&(r.user_agent?r.user_agent!=t&&r.regenerate(w):(r.user_agent=t,r.save(w))),e.next()}))}upload(e,t){t.path||(t.path=Se.API_UPLOAD_TEMP),t.size||(t.size=Se.API_UPLOAD_SIZE),t.field||(t.field=Se.API_UPLOAD_FIELD),d.middleware(e,t)}update(e,t,r){return Ee(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".update",r)}))}validation(e,t){return Ee(this,void 0,void 0,(function*(){const{error:r,value:i}=yield j.object(t).parse().validateAsync(e.req.body);if(r)return e.validation(r);e.req.body=i,e.next()}))}}Oe([Ie(0,r()),Ie(1,i(Se.API_KEY_HEADER)),Ie(2,i(Se.API_TOKEN_HEADER)),Ie(3,i("user-agent")),Ie(4,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,String,String,$e]),Ae("design:returntype",Promise)],et.prototype,"auth",null),Oe([Ie(0,r()),Ie(1,s()),Ie(2,Qe()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Fe]),Ae("design:returntype",Promise)],et.prototype,"create",null),Oe([Ie(0,r()),Ie(1,s()),Ie(2,Qe()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Fe]),Ae("design:returntype",Promise)],et.prototype,"delete",null),Oe([Ie(0,r()),Ie(1,s()),Ie(2,Qe()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Fe]),Ae("design:returntype",Promise)],et.prototype,"permission",null),Oe([Ie(0,r()),Ie(1,s()),Ie(2,Qe()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Fe]),Ae("design:returntype",Promise)],et.prototype,"read",null),Oe([Ie(0,r()),Ie(1,i("user-agent")),Ie(2,o()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Object]),Ae("design:returntype",Promise)],et.prototype,"session",null),Oe([Ie(0,r()),Ie(1,s()),Ae("design:type",Function),Ae("design:paramtypes",[a,Object]),Ae("design:returntype",void 0)],et.prototype,"upload",null),Oe([Ie(0,r()),Ie(1,s()),Ie(2,Qe()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Fe]),Ae("design:returntype",Promise)],et.prototype,"update",null),Oe([Ie(0,r()),Ie(1,s()),Ae("design:type",Function),Ae("design:paramtypes",[a,Object]),Ae("design:returntype",Promise)],et.prototype,"validation",null);let tt=class extends et{constructor(){super(...arguments),this._columns=[]}_add(e){return Ee(this,arguments,void 0,(function*({ctx:e,options:t,body:r}){const i=yield this.model().create(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign({},t||{}),Xe(e))).catch(this.error);if(i){const t=this.key();return e.prepare(p.OK,{[t]:i.getDataValue(t)}),i}e.error("Internal Server Error")}))}_all(e){return Ee(this,arguments,void 0,(function*({ctx:e,options:t,callback:r,scope:i}){var n,s,o,d;const a=this.scope(i),u=Object.assign({},t||{});u.where=Object.assign({},u.where||{});const c=e.req.query.limit,l=F(c)?parseInt(c):Se.API_MODEL_LIMIT;u.limit=l>=0?Math.min(l,Se.API_MODEL_LIMIT_MAX):void 0;const y=e.req.query.offset;if(F(y)){const e=y?parseInt(y):0;u.offset=e>0?e:void 0}const g=[],h=this.columns(),v=e=>h.indexOf(e)>=0,_=null===(n=e.req.query.asc)||void 0===n?void 0:n.toString();_&&_.length&&g.push(..._.split(",").filter(v).map((e=>[e,"ASC"])));const m=null===(s=e.req.query.desc)||void 0===s?void 0:s.toString();m&&m.length&&g.push(...m.split(",").filter(v).map((e=>[e,"DESC"]))),g.length&&(u.order=g);const f=[],P=null===(o=e.req.query.search)||void 0===o?void 0:o.toString();(N(u.attributes)?u.attributes:h).filter(F).forEach((t=>{var r;if(P&&P.length&&f.push({[t]:{[me.like]:`%${P}%`}}),"search_"+t in e.req.query){const i=null===(r=e.req.query["search_"+t])||void 0===r?void 0:r.toString();i&&i.length&&f.push({[t]:{[me.like]:`%${i}%`}})}})),f.length&&(u.where=Object.assign(Object.assign({},u.where),{[me.or]:[...f]}));const O=null!==(d=yield a.count(Object.assign(Object.assign({},u),{col:h[0]})).catch(this.error))&&void 0!==d?d:0,I=yield a.findAll(u).catch(this.error),A={count:O};return I?(e.prepare(p.OK,Object.assign(Object.assign({},A),{records:r?yield r(I):I})),Object.assign(Object.assign({},A),{records:I})):(e.error("Internal Server Error"),Object.assign(Object.assign({},A),{records:[]}))}))}columns(){return 0==this._columns.length&&(this._columns=Object.keys(this.model().getAttributes())),this._columns}_del(e){return Ee(this,arguments,void 0,(function*({ctx:e,options:t}){const r=this.key(),{[r]:i}=e.req.params;if(!i)return e.error("Internal Server Error"),0;const n=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[r]:i}),individualHooks:!0}),Xe(e))).catch(this.error);return n?(e.success("OK"),n):(e.notFound("Record not found"),0)}))}error(e){e.sql?Ue.error(e.message+"\n"+e.sql,"api.controller.sql",Se.API_CONSOLE_ERROR):super.error(e)}_get(e){return Ee(this,arguments,void 0,(function*({ctx:e,options:t,callback:r,scope:i}){const n=this.key(),{[n]:s}=e.req.params,o=yield this.scope(i).findOne(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[n]:s})})).catch(this.error);return o?(e.prepare(p.OK,r?yield r(o):o.toJSON()),o):null===o?e.notFound("Record not found"):void e.error("Internal Server Error")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}_set(e){return Ee(this,arguments,void 0,(function*({ctx:e,options:t,body:r}){var i;const n=this.key(),{[n]:s}=e.req.params,[o]=null!==(i=yield this.model().update(Object.assign(Object.assign({},e.req.body),r||{}),Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[n]:s}),individualHooks:!0}),Xe(e))).catch(this.error))&&void 0!==i?i:[];return o?(e.success("OK"),!0):(e.success("Record not changed"),!1)}))}};tt=Oe([u(et)],tt);let rt=class extends tt{model(){return Ne}all(e,t,r){return Ee(this,void 0,void 0,(function*(){const i={};t&&(i.type=t),r&&(i.table=r),yield this._all({ctx:e,options:{attributes:{exclude:["data","previously"]},where:i,order:[["created_at","DESC"]]}})}))}get(e){return Ee(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}};Oe([c(),l("auth"),l("read"),Ie(0,r()),Ie(1,y("type")),Ie(2,y("table")),Ae("design:type",Function),Ae("design:paramtypes",[a,String,String]),Ae("design:returntype",Promise)],rt.prototype,"all",null),Oe([c("/:id"),l("auth"),l("read"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],rt.prototype,"get",null),rt=Oe([g("/audits"),u(tt)],rt);let it=class extends et{login(e,t,r,i,n){return Ee(this,void 0,void 0,(function*(){var s;yield R(Se.API_SLEEP_AUTH);const o=yield Fe.scope("password").findOne({where:{[me.or]:[{email:r},{username:r}]}}).catch(this.error);if(i+=null!==(s=null==o?void 0:o.salt)&&void 0!==s?s:"",!o||o.password!=E(i))return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const d=yield Re.findOne({where:{state:!0,user_id:o.id}}).catch(this.error);if(d)return e.error("Activation required"),n.emit("auth.activation",{ctx:e,register:d,user:o}),void this.emit("auth.activation",{ctx:e,register:d,user:o});if(!o.state)return e.notFound("Invalid username or password"),n.emit("auth.failure",{ctx:e,user:o}),void this.emit("auth.failure",{ctx:e,user:o});const{auth:a,error:u,token:p}=yield ze.create(o);return u?(e.error(u),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):a&&p?(a.user_agent=t,yield a.save().catch(this.error),e.json({token:p}),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 Ee(this,void 0,void 0,(function*(){if(yield ze.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 Ee(this,void 0,void 0,(function*(){const{auth:n,error:s,token:o}=yield ze.renew(r);return s?e.error(s):n?(n.user_agent=t,yield n.save().catch(this.error),e.json({token:o}),i.emit("auth.renew",{auth:n,ctx:e}),void this.emit("auth.renew",{auth:n,ctx:e})):e.error("Internal Server Error")}))}user(e,t){return Ee(this,void 0,void 0,(function*(){const r=yield this.permissions(t);if(!r)return e.error("Internal Server Error");e.json(Object.assign(Object.assign({},t.toJSON()),{permissions:r.map((e=>e.route))}))}))}};Oe([h("/login"),l("validation",{username:j.string().min(3).required(),password:j.string().min(5).required()}),Ie(0,r()),Ie(1,i("user-agent")),Ie(2,v("username")),Ie(3,v("password")),Ie(4,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,String,String,$e]),Ae("design:returntype",Promise)],it.prototype,"login",null),Oe([c("/logout"),l("auth"),Ie(0,r()),Ie(1,Ze()),Ie(2,Qe()),Ie(3,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,ke,Fe,$e]),Ae("design:returntype",Promise)],it.prototype,"logout",null),Oe([h("/renew"),l("validation",{token:j.string().required()}),Ie(0,r()),Ie(1,i("user-agent")),Ie(2,v("token")),Ie(3,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,String,$e]),Ae("design:returntype",Promise)],it.prototype,"renew",null),Oe([c(),l("auth"),Ie(0,r()),Ie(1,Qe()),Ae("design:type",Function),Ae("design:paramtypes",[a,Fe]),Ae("design:returntype",Promise)],it.prototype,"user",null),it=Oe([g("/auth"),u(et)],it);let nt=class extends et{directory(){return Se.API_HTTP_PUBLIC||"./"}files(e){return Ee(this,void 0,void 0,(function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const r=Pe(this.directory(),t);if(!pe(r)||!le(r).isDirectory())return e.notFound("Path not Found");let i=[];return i=ye(r),i=i.map((e=>this.info(Pe(r,e)))),i=i.filter(q),Object.assign(Object.assign({},this.info(r)),{files:i})}))}access(e,t,r){return Ee(this,void 0,void 0,(function*(){yield this.permission(e,this.name()+"."+t,r)}))}info(e){if(!pe(e))return null;const t=le(e),r=e.split("/").pop();e=e.replace(this.directory(),"/").replace(/^\/\//,"/");const i=t.isDirectory();return{name:r,path:e.replace(/^\/\//,"/"),size:t.size,extension:i?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:i,symlink:t.isSymbolicLink()}}name(){return"files"}};Oe([c("/path/?*"),l("auth"),l("access","list"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],nt.prototype,"files",null),Oe([Ie(0,r()),Ie(1,s()),Ie(2,Qe()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Fe]),Ae("design:returntype",Promise)],nt.prototype,"access",null),nt=Oe([g("/files"),u(et)],nt);let st=class extends et{check(e,t){return Ee(this,void 0,void 0,(function*(){const r=yield this.find(t);if(!r||!r.user)return e.notFound("User not found");r.token=L(),yield r.save(),e.json({token:r.token})}))}forgot(e,t,r){return Ee(this,void 0,void 0,(function*(){yield R(Se.API_SLEEP_FORGOT);const i=t,n=yield Fe.findOne({where:{[me.or]:[{email:i},{username:t}]}}).catch(this.error);if(!n)return e.notFound("User not found");const s=L(),o=Date.now()+6e4*Se.API_TOKEN_FORGOT,d=yield Le.create({token:s,timestamp:o,state:!0,user_id:n.id});e.success("OK"),r.emit("forgot.send",{ctx:e,forgot:d,user:n}),this.emit("forgot.send",{ctx:e,forgot:d,user:n})}))}reset(e,t,r,i){return Ee(this,void 0,void 0,(function*(){const n=yield this.find(t);if(!n)return e.notFound("User not found");n.state=!1,yield n.save().catch(this.error),n.user.password=E(r),yield n.user.save().catch(this.error),e.success("OK"),i.emit("forgot.reset",{ctx:e,user:n.user}),this.emit("forgot.reset",{ctx:e,user:n.user})}))}find(e){return Ee(this,void 0,void 0,(function*(){return yield Le.findOne({where:{token:e,state:!0},include:[{model:Fe,required:!0}]}).catch(this.error)}))}};Oe([c("/check"),l("validation",{token:j.string().required()}),Ie(0,r()),Ie(1,v("token")),Ae("design:type",Function),Ae("design:paramtypes",[a,String]),Ae("design:returntype",Promise)],st.prototype,"check",null),Oe([h(),l("validation",{username:j.string().min(4).required()}),Ie(0,r()),Ie(1,v("username")),Ie(2,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,$e]),Ae("design:returntype",Promise)],st.prototype,"forgot",null),Oe([h("/reset"),l("validation",{token:j.string().required(),password:j.string().min(5).required()}),Ie(0,r()),Ie(1,v("token")),Ie(2,v("password")),Ie(3,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,String,$e]),Ae("design:returntype",Promise)],st.prototype,"reset",null),st=Oe([g("/forgot"),u(et)],st);let ot=class extends tt{constructor(){super(...arguments),this._crud={}}add(e){return Ee(this,void 0,void 0,(function*(){yield this._add({ctx:e})}))}all(e){return Ee(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}CrudCreate(){return this._crud}del(e){return Ee(this,void 0,void 0,(function*(){yield this._del({ctx:e})}))}get(e){return Ee(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e){return Ee(this,void 0,void 0,(function*(){yield this._set({ctx:e})}))}CrudUpdate(){return this._crud}validationAdd(e){return Ee(this,void 0,void 0,(function*(){const t=this.CrudCreate();if(t==this._crud)return e.error("Internal Server Error");yield this.validation(e,t)}))}validationSet(e){return Ee(this,void 0,void 0,(function*(){const t=this.CrudUpdate();if(t==this._crud)return e.error("Internal Server Error");yield this.validation(e,t)}))}};Oe([h(),l("auth"),l("create"),l("validationAdd"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],ot.prototype,"add",null),Oe([c(),l("auth"),l("read"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],ot.prototype,"all",null),Oe([_("/:id"),l("auth"),l("delete"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],ot.prototype,"del",null),Oe([c("/:id"),l("auth"),l("read"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],ot.prototype,"get",null),Oe([m("/:id"),l("auth"),l("update"),l("validationSet"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],ot.prototype,"set",null),Oe([Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],ot.prototype,"validationAdd",null),Oe([Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],ot.prototype,"validationSet",null),ot=Oe([u(tt)],ot);let dt=class extends ot{model(){return xe}CrudCreate(){return{name:j.string().required(),description:j.string().empty(""),state:j.boolean().parse().required()}}CrudUpdate(){return{name:j.string().empty(),description:j.string().empty(),state:j.boolean().parse().empty()}}};dt=Oe([g("/groups"),u(ot)],dt);let at=class extends tt{model(){return Be}all(e,t){return Ee(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{group_id:t},include:[{model:Ce,required:!0}]},callback:e=>e.map((e=>e.permission))})}))}set(e,t,r,i){return Ee(this,void 0,void 0,(function*(){const n=yield xe.findByPk(t,{attributes:["id"]}).catch(this.error);if(n){const t=n.id;if(yield Be.destroy(Object.assign({where:{group_id:t},individualHooks:!0},i)),r){let e=0;yield R(1e3);for(let n=0;n<r.length;n++)e=yield Ce.count({where:{id:r[n]}}),e&&(yield Be.create({group_id:t,permission_id:r[n]},Object.assign({},i)))}return e.success("OK")}if(C(n))return e.notFound("Record not found");e.error("Internal Server Error")}))}};Oe([c("/:id/routes"),l("auth"),l("read","groups"),Ie(0,r()),Ie(1,f("id")),Ae("design:type",Function),Ae("design:paramtypes",[a,String]),Ae("design:returntype",Promise)],at.prototype,"all",null),Oe([m("/:id/permissions"),l("auth"),l("update","groups"),l("validation",{permissions:j.array(j.number().parse())}),Ie(0,r()),Ie(1,f("id")),Ie(2,v("permissions")),Ie(3,Ve()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Array,Object]),Ae("design:returntype",Promise)],at.prototype,"set",null),at=Oe([g("/groups"),u(tt)],at);let ut=class extends tt{model(){return He}all(e,t,r){return Ee(this,void 0,void 0,(function*(){const i={};t&&(i.type=t),r&&(i.source=r),yield this._all({ctx:e,options:{where:i,order:[["created_at","DESC"]]}})}))}};Oe([c(),l("auth"),l("read"),Ie(0,r()),Ie(1,y("type")),Ie(2,y("source")),Ae("design:type",Function),Ae("design:paramtypes",[a,String,String]),Ae("design:returntype",Promise)],ut.prototype,"all",null),ut=Oe([g("/logs"),u(tt)],ut);let pt=class extends ot{model(){return Ce}CrudCreate(){return{name:j.string().required(),description:j.string().empty(""),state:j.boolean().parse().required()}}CrudUpdate(){return{name:j.string().empty(),description:j.string().empty(),state:j.boolean().parse().empty()}}};pt=Oe([g("/permissions"),u(ot)],pt);let ct=class extends et{register(e,t,r){return Ee(this,void 0,void 0,(function*(){yield R(Se.API_SLEEP_REGISTRY);const{name:i,date:n,email:s,username:o,password:d,confirm:a}=t,u=o||s,p=E(d);if(yield Fe.count({where:{[me.or]:[{email:s},{username:u}]}}).catch(this.error))return e.validation("Invalid email or username");if(p!=E(a))return e.error("Invalid password");const c=yield Fe.create({name:i,email:s,username:u,password:p,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!c)return e.error("Internal Server Error");const l=yield Re.create({token:yield this.getId(),user_id:c.id,state:!0}).catch(this.error);if(!l)return yield c.destroy().catch(this.error),e.error("Internal Server Error");e.success("OK"),r.emit("register.user",{ctx:e,register:l,user:c}),this.emit("register.user",{ctx:e,register:l,user:c})}))}confirm(e,t,r){return Ee(this,void 0,void 0,(function*(){const i=yield Re.findOne({where:{token:t,state:!0},include:[{model:Fe,required:!0}]}).catch(this.error);if(!i)return e.notFound("User not found");i.state=!1,yield i.save().catch(this.error),i.user.state=!0,yield i.user.save().catch(this.error),e.success("OK"),r.emit("register.confirm",{ctx:e,register:i,user:i.user}),this.emit("register.confirm",{ctx:e,register:i,user:i.user})}))}send(e,t,r){return Ee(this,void 0,void 0,(function*(){const i=t,n=yield Re.findOne({where:{state:!0},include:[{model:Fe,required:!0,where:{[me.or]:[{email:i},{username:t}]}}]}).catch(this.error);if(!n)return e.notFound("User not found");e.success("OK"),r.emit("register.send",{ctx:e,register:n,user:n.user}),this.emit("register.send",{ctx:e,register:n,user:n.user})}))}getId(){return Ee(this,void 0,void 0,(function*(){const e=k();return(yield Re.count({where:{token:e}}))?this.getId():e}))}};Oe([h(),l("validation",{name:j.string().required(),date:j.date().required(),email:j.string().email().required(),username:j.string().min(4).empty(),password:j.string().min(5).required(),confirm:j.string().min(5).required()}),Ie(0,r()),Ie(1,v()),Ie(2,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,Object,$e]),Ae("design:returntype",Promise)],ct.prototype,"register",null),Oe([h("/confirm"),l("validation",{token:j.string().required()}),Ie(0,r()),Ie(1,v("token")),Ie(2,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,$e]),Ae("design:returntype",Promise)],ct.prototype,"confirm",null),Oe([h("/send"),l("validation",{username:j.string().min(4).required()}),Ie(0,r()),Ie(1,v("username")),Ie(2,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,$e]),Ae("design:returntype",Promise)],ct.prototype,"send",null),ct=Oe([g("/register"),u(et)],ct);let lt=class extends et{setup(e,t){return Ee(this,void 0,void 0,(function*(){if(0==(yield Fe.count())){const e=L(),r=yield Fe.create({name:"Admin",email:"admin@localhost",username:"admin",password:E("admin"+e),salt:e,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0},Object.assign({},t)),i={description:"API CORE",state:!0},n=yield xe.create(Object.assign({name:"admin"},i),Object.assign({},t));yield je.create({user_id:r.id,group_id:n.id},Object.assign({},t));const s=["audits","users","groups","routes"],o=["create","read","update","delete"];yield B(s,(e=>Ee(this,void 0,void 0,(function*(){yield B(o,(r=>Ee(this,void 0,void 0,(function*(){const s=yield Ce.create(Object.assign({name:`${e} ${r}`,route:`${e}.${r}`},i),Object.assign({},t));yield Be.create({group_id:n.id,permission_id:s.id},Object.assign({},t))}))))}))));const d=["delete","list","read","rename","upload","write"];yield B(d,(e=>Ee(this,void 0,void 0,(function*(){const r=yield Ce.create(Object.assign({name:`files ${e}`,route:`files.${e}`},i),Object.assign({},t));yield Be.create({group_id:n.id,permission_id:r.id},Object.assign({},t))}))));const a=["logs"];yield B(a,(e=>Ee(this,void 0,void 0,(function*(){const r=yield Ce.create(Object.assign({name:`${e} files`,route:`${e}.read`},i),Object.assign({},t));yield Be.create({group_id:n.id,permission_id:r.id},Object.assign({},t))}))))}e.success("OK")}))}};Oe([c(),Ie(0,r()),Ie(1,Ve()),Ae("design:type",Function),Ae("design:paramtypes",[a,Object]),Ae("design:returntype",Promise)],lt.prototype,"setup",null),lt=Oe([g("/setup"),u(et)],lt);let yt=class extends tt{model(){return Fe}constructor(){super(),this.path=Se.API_HTTP_PUBLIC+"/avatar",Se.API_HTTP_PUBLIC&&pe(Se.API_HTTP_PUBLIC)&&!pe(this.path)&&ge(this.path)}avatar(e,t,r,i){return Ee(this,void 0,void 0,(function*(){if(t.length){const n=t[0].filename||"";if(n){const t=this.path+"/"+r.avatar;if(pe(t)&&he(t).isFile()&&ve(t),r.avatar=n,yield r.save(Object.assign({},i)).catch(this.error))return e.success("OK")}}e.success("Record not changed")}))}avatar_delete(e,t,r){return Ee(this,void 0,void 0,(function*(){const i=this.path+"/"+t.avatar;t.avatar="",(yield t.save(Object.assign({},r)).catch(this.error))&&pe(i)&&ve(i),e.success("OK")}))}password(e,t,r,i,n){return Ee(this,void 0,void 0,(function*(){var s;const o=yield this.scope("password").findOne({where:{id:i.id,state:!0}}).catch(this.error);return t+=null!==(s=null==o?void 0:o.salt)&&void 0!==s?s:"",o&&o.password==E(t)?(o.salt=L(),o.password=E(r+o.salt),(yield o.save(Object.assign({},n)).catch(this.error))?e.success("OK"):void e.success("Record not changed")):e.error("Record not changed")}))}token(e,t,r){return Ee(this,void 0,void 0,(function*(){const i=yield this.model().findOne({attributes:["token"],where:{id:t.id}}).catch(this.error);if(i)return e.json({token:r.hash.decrypt(i.token)});e.notFound("Record not found")}))}token_get(e,t,r){return Ee(this,void 0,void 0,(function*(){const i=yield this.scope("token").findOne({where:{id:t}}).catch(this.error);if(i)return e.json({token:r.hash.decrypt(i.token)});e.notFound("Record not found")}))}token_delete(e,t,r){return Ee(this,void 0,void 0,(function*(){const i=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(i)return i.token="",yield i.save(Object.assign({},r)).catch(this.error),e.success("OK");e.notFound("Record not found")}))}token_renew(e,t,r,i){return Ee(this,void 0,void 0,(function*(){const n=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(n){const t=yield this.token_new();return n.token=i.hash.encrypt(t),yield n.save(Object.assign({},r)).catch(this.error),e.json({token:t})}e.notFound("Record not found")}))}token_new(){return Ee(this,void 0,void 0,(function*(){var e;const t=k();return(null!==(e=yield this.model().count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t}))}add(e,t){return Ee(this,void 0,void 0,(function*(){const r=L();yield this._add({ctx:e,body:{password:E(t+r),salt:r}})}))}all(e){return Ee(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}del(e,t,r){return Ee(this,void 0,void 0,(function*(){if(r.id.toString()==t)return e.notFound("Record not found");yield this._del({ctx:e})}))}get(e){return Ee(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,t){return Ee(this,void 0,void 0,(function*(){const r=L();yield this._set({ctx:e,body:t?{password:E(t+r),salt:r}:{}})}))}};Oe([h("/avatar"),l("auth"),l("upload",(e=>({count:1,field:"file",path:e.controller.path,types:["image/bmp","image/jpeg","image/png"],size:32}))),Ie(0,r()),Ie(1,P()),Ie(2,Qe()),Ie(3,Ve()),Ae("design:type",Function),Ae("design:paramtypes",[a,Array,Fe,Object]),Ae("design:returntype",Promise)],yt.prototype,"avatar",null),Oe([_("/avatar"),l("auth"),Ie(0,r()),Ie(1,Qe()),Ie(2,Ve()),Ae("design:type",Function),Ae("design:paramtypes",[a,Fe,Object]),Ae("design:returntype",Promise)],yt.prototype,"avatar_delete",null),Oe([h("/password"),l("auth"),l("validation",{oldPassword:j.string().min(5).required(),newPassword:j.string().min(5).required()}),Ie(0,r()),Ie(1,v("oldPassword")),Ie(2,v("newPassword")),Ie(3,Qe()),Ie(4,Ve()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,String,Fe,Object]),Ae("design:returntype",Promise)],yt.prototype,"password",null),Oe([c("/token"),l("auth"),Ie(0,r()),Ie(1,Qe()),Ie(2,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,Fe,$e]),Ae("design:returntype",Promise)],yt.prototype,"token",null),Oe([c("/token/:id"),l("auth"),l("create"),Ie(0,r()),Ie(1,f("id")),Ie(2,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,$e]),Ae("design:returntype",Promise)],yt.prototype,"token_get",null),Oe([_("/token/:id"),l("auth"),l("delete"),Ie(0,r()),Ie(1,f("id")),Ie(2,Ve()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Object]),Ae("design:returntype",Promise)],yt.prototype,"token_delete",null),Oe([c("/token/renew/:id"),l("auth"),l("update"),Ie(0,r()),Ie(1,f("id")),Ie(2,Ve()),Ie(3,n()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Object,$e]),Ae("design:returntype",Promise)],yt.prototype,"token_renew",null),Oe([h(),l("auth"),l("create"),l("validation",{name:j.string().required(),email:j.string().email().required(),username:j.string().min(4).required(),password:j.string().min(5).required(),description:j.string().empty(""),state:j.boolean().parse().required()}),Ie(0,r()),Ie(1,v("password")),Ae("design:type",Function),Ae("design:paramtypes",[a,String]),Ae("design:returntype",Promise)],yt.prototype,"add",null),Oe([c(),l("auth"),l("read"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],yt.prototype,"all",null),Oe([_("/:id"),l("auth"),l("delete"),Ie(0,r()),Ie(1,f("id")),Ie(2,Qe()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Fe]),Ae("design:returntype",Promise)],yt.prototype,"del",null),Oe([c("/:id"),l("auth"),l("read"),Ie(0,r()),Ae("design:type",Function),Ae("design:paramtypes",[a]),Ae("design:returntype",Promise)],yt.prototype,"get",null),Oe([m("/:id"),l("auth"),l("update"),l("validation",{name:j.string().empty(),email:j.string().email().empty(),username:j.string().min(4).empty(),password:j.string().min(5).empty().filter(""),description:j.string().empty(),state:j.boolean().parse().empty()}),Ie(0,r()),Ie(1,v("password")),Ae("design:type",Function),Ae("design:paramtypes",[a,String]),Ae("design:returntype",Promise)],yt.prototype,"set",null),yt=Oe([g("/users"),u(tt),Ae("design:paramtypes",[])],yt);let gt=class extends tt{model(){return je}groups(e,t){return Ee(this,void 0,void 0,(function*(){yield this.all(e,t.id.toString())}))}all(e,t){return Ee(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{user_id:t},include:[{model:xe,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,r,i){return Ee(this,void 0,void 0,(function*(){const n=yield Fe.findByPk(t,{attributes:["id"]}).catch(this.error);if(n){if(yield je.destroy(Object.assign({where:{user_id:n.id},individualHooks:!0},i)),r){let e=0;yield R(1e3);for(let t=0;t<r.length;t++)e=yield xe.count({where:{id:r[t]}}),e&&(yield je.create({user_id:n.id,group_id:r[t]},Object.assign({},i)))}return e.success("OK")}if(C(n))return e.notFound("Record not found");e.error("Internal Server Error")}))}};Oe([c("/groups"),l("auth"),l("read","users"),Ie(0,r()),Ie(1,Qe()),Ae("design:type",Function),Ae("design:paramtypes",[a,Fe]),Ae("design:returntype",Promise)],gt.prototype,"groups",null),Oe([c("/:id/groups"),l("auth"),l("read","users"),Ie(0,r()),Ie(1,f("id")),Ae("design:type",Function),Ae("design:paramtypes",[a,String]),Ae("design:returntype",Promise)],gt.prototype,"all",null),Oe([m("/:id/groups"),l("auth"),l("update","users"),l("validation",{groups:j.array(j.number().parse())}),Ie(0,r()),Ie(1,f("id")),Ie(2,v("groups")),Ie(3,Ve()),Ae("design:type",Function),Ae("design:paramtypes",[a,String,Array,Object]),Ae("design:returntype",Promise)],gt.prototype,"set",null),gt=Oe([g("/users"),u(tt)],gt);export{$e as Application,Ne as Audit,rt as AuditsController,ke as Auth,it as AuthController,Je as Config,qe as Configs,et as ControllerBase,ot as CrudController,Se as Env,nt as FilesController,Le as Forgot,st as ForgotController,xe as Group,Be as GroupPermission,dt as GroupsController,at as GroupsPermissionsController,He as Log,Ue as Logs,ut as LogsController,be as Model,tt as ModelController,Ce as Permission,pt as PermissionsController,Re as Register,ct as RegisterController,Ve as ReqAudit,Ze as ReqAuth,Qe as ReqUser,Ke as Session,lt as SetupController,ze as Token,Fe as User,je as UserGroup,yt as UsersController,gt as UsersGroupsController,Xe as audit,Te as conn,Ye as crt,De as hooks,Ge as key};
7
+ import{Application as e,parameterFactory as t,Ctx as i,Headers as r,App as s,Argument as n,Session as o,Upload as d,Context as a,Extends as u,Status as p,Get as c,Middleware as l,Query as y,Controller as g,Post as h,Body as v,Delete as _,Put as m,Params as O,Files as E}from"@andrewcaires/express";import{LogColor as f,Log as P,Hash as I,sha256 as A}from"@andrewcaires/node";import{toBool as R,parseMs as S,isObject as T,noop as D,loop as N,uuidv4 as b,sleep as w,EventEmitter as F,Validation as k,isString as x,isArray as j,isDef as C,uniqueID as L,isNull as q,forEachSeries as U}from"@andrewcaires/utils.js";import{WebSocketServer as H}from"ws";import{Connection as K,Model as B,Id as M,String as V,FullDate as Y,CreatedAt as G,UpdatedAt as W,DeletedAt as z,BelongsTo as $,Database as J,ModelName as X,Boolean as Z,Text as Q,HasMany as ee,Hooks as te,DateOnly as ie,DefaultScope as re,Scopes as se,Enum as ne,Json as oe,BigInt as de,Unique as ae}from"@andrewcaires/sequelize";import{config as ue}from"dotenv";import{existsSync as pe,readFileSync as ce,statSync as le,readdirSync as ye,mkdirSync as ge,lstatSync as he,rmSync as ve}from"fs";import{Store as _e}from"express-session";import{Op as me}from"sequelize";import Oe from"jsonwebtoken";import{join as Ee}from"path";function fe(e,t,i,r){var s,n=arguments.length,o=n<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,r);else for(var d=e.length-1;d>=0;d--)(s=e[d])&&(o=(n<3?s(o):n>3?s(t,i,o):s(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o}function Pe(e,t){return function(i,r){t(i,r,e)}}function Ie(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function Ae(e,t,i,r){return new(i||(i=Promise))((function(s,n){function o(e){try{a(r.next(e))}catch(e){n(e)}}function d(e){try{a(r.throw(e))}catch(e){n(e)}}function a(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,d)}a((r=r.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError,ue();class Re{static getBool(e,t){return R(Re.getString(e,t.toString()))}static getInt(e,t){return parseInt(Re.getString(e,t.toString()))}static getMs(e,t){return S(Re.getString(e,t))}static getString(e,t){return e in process.env?process.env[e]||"":t}}Re.API_CONSOLE_ERROR=Re.getBool("API_CONSOLE_ERROR",!1),Re.API_DB_DATABASE=Re.getString("API_DB_DATABASE",""),Re.API_DB_HOST=Re.getString("API_DB_HOST","127.0.0.1"),Re.API_DB_PASSWORD=Re.getString("API_DB_PASSWORD",""),Re.API_DB_PORT=Re.getInt("API_DB_PORT",3306),Re.API_DB_TYPE=Re.getString("API_DB_TYPE",""),Re.API_DB_USERNAME=Re.getString("API_DB_USERNAME","root"),Re.API_DB_LOG=Re.getBool("API_DB_LOG",!1),Re.API_DB_AUDIT=Re.getBool("API_DB_AUDIT",!0),Re.API_DB_PREFIX=Re.getString("API_DB_PREFIX",""),Re.API_DB_TIMEZONE=Re.getString("API_DB_TIMEZONE","+00:00"),Re.API_HTTP_CRT=Re.getString("API_HTTP_CRT",""),Re.API_HTTP_KEY=Re.getString("API_HTTP_KEY",""),Re.API_HTTP_PORT=Re.getInt("API_HTTP_PORT",3e3),Re.API_HTTP_PUBLIC=Re.getString("API_HTTP_PUBLIC",""),Re.API_HTTP_CROSS=Re.getBool("API_HTTP_CROSS",!1),Re.API_HTTP_HYBRID=Re.getBool("API_HTTP_HYBRID",!1),Re.API_HTTP_NOTFOUND=Re.getString("API_HTTP_NOTFOUND",""),Re.API_HTTP_PATH=Re.getString("API_HTTP_PATH","/api"),Re.API_HTTP_REDIRECT=Re.getString("API_HTTP_REDIRECT",""),Re.API_KEY_HASH=Re.getString("API_KEY_HASH",""),Re.API_KEY_HEADER=Re.getString("API_KEY_HEADER","api_key"),Re.API_MODEL_LIMIT=Re.getInt("API_MODEL_LIMIT",10),Re.API_MODEL_LIMIT_MAX=Re.getInt("API_MODEL_LIMIT_MAX",500),Re.API_SLEEP_AUTH=Re.getMs("API_SLEEP_AUTH","2s"),Re.API_SLEEP_FORGOT=Re.getMs("API_SLEEP_FORGOT","5s"),Re.API_SLEEP_REGISTRY=Re.getMs("API_SLEEP_REGISTRY","5s"),Re.API_SESSION_NAME=Re.getString("API_SESSION_NAME","session.id"),Re.API_SESSION_LIFETIME=Re.getMs("API_SESSION_LIFETIME","1d"),Re.API_SESSION_SECRET=Re.getString("API_SESSION_SECRET","yoursecret"),Re.API_TOKEN_CRT=Re.getString("API_TOKEN_CRT",""),Re.API_TOKEN_KEY=Re.getString("API_TOKEN_KEY",""),Re.API_TOKEN_FORGOT=Re.getMs("API_TOKEN_LIFETIME","1d"),Re.API_TOKEN_HEADER=Re.getString("API_TOKEN_HEADER","authorization"),Re.API_TOKEN_LIFETIME=Re.getMs("API_TOKEN_LIFETIME","1d"),Re.API_TOKEN_RENEW=Re.getMs("API_TOKEN_RENEW","1d"),Re.API_UPLOAD_COUNT=Re.getInt("API_UPLOAD_COUNT",1),Re.API_UPLOAD_FIELD=Re.getString("API_UPLOAD_FIELD","upload"),Re.API_UPLOAD_SIZE=Re.getInt("API_UPLOAD_SIZE",2),Re.API_UPLOAD_TEMP=Re.getString("API_UPLOAD_TEMP","./temp"),Re.API_USER_HISTORY=Re.getBool("API_USER_HISTORY",!0),Re.API_WEBSOCKET_START=Re.getBool("API_WEBSOCKET_START",!1);const Se=new K({type:Re.API_DB_TYPE,database:Re.API_DB_DATABASE,username:Re.API_DB_USERNAME,password:Re.API_DB_PASSWORD,hostname:Re.API_DB_HOST,hostport:Re.API_DB_PORT,logging:Re.API_DB_LOG,prefix:Re.API_DB_PREFIX});class Te extends B{}const De=(e,t,i)=>{var r,s,n,o,d;return{type:e,model:null!==(r=null==t?void 0:t.getTableName())&&void 0!==r?r:null,client:null!==(s=null==i?void 0:i.audit_client)&&void 0!==s?s:null,href:null!==(n=null==i?void 0:i.audit_href)&&void 0!==n?n:null,user_agent:null!==(o=null==i?void 0:i.audit_user_agent)&&void 0!==o?o:null,user_id:null!==(d=null==i?void 0:i.audit_user_id)&&void 0!==d?d:null,state:!0}},Ne={afterCreate:(e,t)=>Ae(void 0,void 0,void 0,(function*(){var i;if(!Re.API_DB_AUDIT)return;const r=T(e)?e.constructor:null,s=null!==(i=null==r?void 0:r.primaryKeyAttribute)&&void 0!==i?i:null;yield Ce.create(Object.assign(Object.assign({},De("CREATE",r,t)),{record:s?e.getDataValue(s):null,data:e.toJSON()})).catch(D)})),afterUpdate:(e,t)=>Ae(void 0,void 0,void 0,(function*(){var i;if(!Re.API_DB_AUDIT)return;const r=T(e)?e.constructor:null,s=null!==(i=null==r?void 0:r.primaryKeyAttribute)&&void 0!==i?i:null,n={},o=e.changed();o&&o.forEach((t=>n[t]=e.getDataValue(t))),yield Ce.create(Object.assign(Object.assign({},De("UPDATE",r,t)),{record:s?e.getDataValue(s):null,data:n,previously:e.previous()})).catch(D)})),afterDestroy:(e,t)=>Ae(void 0,void 0,void 0,(function*(){var i;if(!Re.API_DB_AUDIT)return;const r=T(e)?e.constructor:null,s=null!==(i=null==r?void 0:r.primaryKeyAttribute)&&void 0!==i?i:null;yield Ce.create(Object.assign(Object.assign({},De("DELETE",r,t)),{record:s?e.getDataValue(s):null,data:e.toJSON()})).catch(D)}))};let be=class extends Te{};fe([M(),Ie("design:type",Number)],be.prototype,"id",void 0),fe([V(),Ie("design:type",V)],be.prototype,"secret",void 0),fe([Y(),Ie("design:type",Date)],be.prototype,"logout",void 0),fe([V(),Ie("design:type",V)],be.prototype,"user_agent",void 0),fe([G,Ie("design:type",Date)],be.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],be.prototype,"updated_at",void 0),fe([z,Ie("design:type",Date)],be.prototype,"deleted_at",void 0),fe([$((()=>je)),Ie("design:type",Number)],be.prototype,"user_id",void 0),be=fe([J(Se),X("auth")],be);let we=class extends Te{};fe([M(),Ie("design:type",Number)],we.prototype,"id",void 0),fe([V(),Ie("design:type",V)],we.prototype,"token",void 0),fe([Z(),Ie("design:type",Z)],we.prototype,"state",void 0),fe([G,Ie("design:type",Date)],we.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],we.prototype,"updated_at",void 0),fe([z,Ie("design:type",Date)],we.prototype,"deleted_at",void 0),fe([$((()=>je)),Ie("design:type",Number)],we.prototype,"user_id",void 0),we=fe([J(Se),X("register")],we);let Fe=class extends Te{};fe([M(),Ie("design:type",Number)],Fe.prototype,"id",void 0),fe([V(),Ie("design:type",V)],Fe.prototype,"name",void 0),fe([Q(),Ie("design:type",V)],Fe.prototype,"description",void 0),fe([Z(),Ie("design:type",Z)],Fe.prototype,"state",void 0),fe([G,Ie("design:type",Date)],Fe.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],Fe.prototype,"updated_at",void 0),fe([z,Ie("design:type",Date)],Fe.prototype,"deleted_at",void 0),fe([ee((()=>ke),"group_id"),Ie("design:type",Array)],Fe.prototype,"groups_routes",void 0),fe([ee((()=>ke),"group_id"),Ie("design:type",Array)],Fe.prototype,"users_groups",void 0),Fe=fe([J(Se),X("group"),te(Ne)],Fe);let ke=class extends Te{};fe([G,Ie("design:type",Date)],ke.prototype,"created_at",void 0),fe([$((()=>Fe)),Ie("design:type",Number)],ke.prototype,"group_id",void 0),fe([$((()=>je)),Ie("design:type",Number)],ke.prototype,"user_id",void 0),ke=fe([J(Se),X("users_groups"),te(Ne)],ke);let xe=class extends Te{};fe([V(),Ie("design:type",V)],xe.prototype,"password",void 0),fe([G,Ie("design:type",Date)],xe.prototype,"created_at",void 0),fe([$((()=>je)),Ie("design:type",Number)],xe.prototype,"user_id",void 0),xe=fe([J(Se),X("users_histories")],xe);let je=class extends Te{};fe([M(),Ie("design:type",Number)],je.prototype,"id",void 0),fe([V(),Ie("design:type",V)],je.prototype,"name",void 0),fe([V(),Ie("design:type",V)],je.prototype,"email",void 0),fe([V(),Ie("design:type",V)],je.prototype,"username",void 0),fe([V(),Ie("design:type",V)],je.prototype,"password",void 0),fe([V(),Ie("design:type",V)],je.prototype,"salt",void 0),fe([V(),Ie("design:type",V)],je.prototype,"token",void 0),fe([V(),Ie("design:type",V)],je.prototype,"avatar",void 0),fe([ie(),Ie("design:type",V)],je.prototype,"date",void 0),fe([Q(),Ie("design:type",V)],je.prototype,"description",void 0),fe([Z(),Ie("design:type",Z)],je.prototype,"state",void 0),fe([G,Ie("design:type",Date)],je.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],je.prototype,"updated_at",void 0),fe([z,Ie("design:type",Date)],je.prototype,"deleted_at",void 0),fe([ee((()=>Ce),"user_id"),Ie("design:type",Array)],je.prototype,"audits",void 0),fe([ee((()=>be),"user_id"),Ie("design:type",Array)],je.prototype,"auths",void 0),fe([ee((()=>we),"user_id"),Ie("design:type",Array)],je.prototype,"registers",void 0),fe([ee((()=>ke),"user_id"),Ie("design:type",Array)],je.prototype,"users_groups",void 0),fe([ee((()=>xe),"user_id"),Ie("design:type",Array)],je.prototype,"users_histories",void 0),je=fe([J(Se),X("user"),re({attributes:{exclude:["password","salt","token"]}}),se({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),te(Ne)],je);let Ce=class extends Te{};fe([M(),Ie("design:type",Number)],Ce.prototype,"id",void 0),fe([ne("CREATE","DELETE","UPDATE"),Ie("design:type",V)],Ce.prototype,"type",void 0),fe([V(),Ie("design:type",V)],Ce.prototype,"model",void 0),fe([V(),Ie("design:type",V)],Ce.prototype,"record",void 0),fe([oe(),Ie("design:type",Object)],Ce.prototype,"data",void 0),fe([oe(),Ie("design:type",Object)],Ce.prototype,"previously",void 0),fe([V(),Ie("design:type",V)],Ce.prototype,"client",void 0),fe([Q(),Ie("design:type",V)],Ce.prototype,"href",void 0),fe([V(),Ie("design:type",V)],Ce.prototype,"user_agent",void 0),fe([Z(),Ie("design:type",Z)],Ce.prototype,"state",void 0),fe([G,Ie("design:type",Date)],Ce.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],Ce.prototype,"updated_at",void 0),fe([z,Ie("design:type",Date)],Ce.prototype,"deleted_at",void 0),fe([$((()=>je)),Ie("design:type",Number)],Ce.prototype,"user_id",void 0),Ce=fe([J(Se),X("audit")],Ce);let Le=class extends Te{};fe([V(),Ie("design:type",V)],Le.prototype,"key",void 0),fe([V(),Ie("design:type",V)],Le.prototype,"value",void 0),fe([G,Ie("design:type",Date)],Le.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],Le.prototype,"updated_at",void 0),Le=fe([J(Se),X("configs"),te(Ne)],Le);let qe=class extends Te{};fe([M(),Ie("design:type",Number)],qe.prototype,"id",void 0),fe([V(),Ie("design:type",V)],qe.prototype,"token",void 0),fe([de(),Ie("design:type",Number)],qe.prototype,"timestamp",void 0),fe([Z(),Ie("design:type",Z)],qe.prototype,"state",void 0),fe([G,Ie("design:type",Date)],qe.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],qe.prototype,"updated_at",void 0),fe([z,Ie("design:type",Date)],qe.prototype,"deleted_at",void 0),fe([$((()=>je)),Ie("design:type",Number)],qe.prototype,"user_id",void 0),qe=fe([J(Se),X("forgot")],qe);let Ue=class extends Te{};fe([M(),Ie("design:type",Number)],Ue.prototype,"id",void 0),fe([V(),Ie("design:type",V)],Ue.prototype,"name",void 0),fe([V(),ae(!0),Ie("design:type",V)],Ue.prototype,"route",void 0),fe([Q(),Ie("design:type",V)],Ue.prototype,"description",void 0),fe([Z(),Ie("design:type",Z)],Ue.prototype,"state",void 0),fe([G,Ie("design:type",Date)],Ue.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],Ue.prototype,"updated_at",void 0),fe([z,Ie("design:type",Date)],Ue.prototype,"deleted_at",void 0),fe([ee((()=>He),"permission_id"),Ie("design:type",Array)],Ue.prototype,"groups_permissions",void 0),Ue=fe([J(Se),X("permission"),te(Ne)],Ue);let He=class extends Te{};fe([G,Ie("design:type",Date)],He.prototype,"created_at",void 0),fe([$((()=>Fe)),Ie("design:type",Number)],He.prototype,"group_id",void 0),fe([$((()=>Ue)),Ie("design:type",Number)],He.prototype,"permission_id",void 0),He=fe([J(Se),X("groups_permissions"),te(Ne)],He);let Ke=class extends Te{};fe([M(),Ie("design:type",Number)],Ke.prototype,"id",void 0),fe([V(),Ie("design:type",V)],Ke.prototype,"type",void 0),fe([V(),Ie("design:type",V)],Ke.prototype,"source",void 0),fe([Q(),Ie("design:type",V)],Ke.prototype,"message",void 0),fe([G,Ie("design:type",Date)],Ke.prototype,"created_at",void 0),Ke=fe([J(Se),X("log")],Ke);let Be=class extends Te{};fe([V(),Ie("design:type",V)],Be.prototype,"session",void 0),fe([Q(),Ie("design:type",V)],Be.prototype,"json",void 0),fe([de(),Ie("design:type",Number)],Be.prototype,"expired",void 0),fe([G,Ie("design:type",Date)],Be.prototype,"created_at",void 0),fe([W,Ie("design:type",Date)],Be.prototype,"updated_at",void 0),Be=fe([J(Se),X("session")],Be);class Me{static write(e,t,i){return Ae(this,void 0,void 0,(function*(){yield Me.writeRaw(f.White,"",e,t,i)}))}static error(e,t,i){return Ae(this,void 0,void 0,(function*(){yield Me.writeRaw(f.Red,"error",e,t,i)}))}static info(e,t,i){return Ae(this,void 0,void 0,(function*(){yield Me.writeRaw(f.Cyan,"info",e,t,i)}))}static success(e,t,i){return Ae(this,void 0,void 0,(function*(){yield Me.writeRaw(f.Green,"success",e,t,i)}))}static warning(e,t,i){return Ae(this,void 0,void 0,(function*(){yield Me.writeRaw(f.Yellow,"warning",e,t,i)}))}static writeRaw(e,t,i,r,s){return Ae(this,void 0,void 0,(function*(){s&&P.console(e,t,i),Se&&(yield Ke.create({type:t,source:r,message:i}).catch((()=>null)))}))}}const Ve=e=>pe(e)?ce(e):void 0,Ye={http:Ve(Re.API_HTTP_CRT),token:Ve(Re.API_TOKEN_CRT)},Ge={http:Ve(Re.API_HTTP_KEY),token:Ve(Re.API_TOKEN_KEY)};class We extends _e{constructor(){super(),this.all=e=>Ae(this,void 0,void 0,(function*(){e=e||D;const t=yield Be.findAll({attributes:["session"],where:{expired:{[me.gte]:Date.now()}}}).catch((t=>(e(t),null)));t&&e(null,t.map((e=>e.session))),e()})),this.clear=e=>Ae(this,void 0,void 0,(function*(){yield Be.destroy().catch(D),e&&e()})),this.destroy=(e,t)=>Ae(this,void 0,void 0,(function*(){yield Be.destroy({where:{session:e}}).catch(D),t&&t()})),this.expired=()=>Ae(this,void 0,void 0,(function*(){yield Be.destroy({where:{expired:{[me.lt]:Date.now()}}}).catch(D)})),this.get=(e,t)=>Ae(this,void 0,void 0,(function*(){t=t||D;const i=yield Be.findOne({where:{session:e,expired:{[me.gte]:Date.now()}}}).catch((e=>(t(e),null)));if(i){const e=JSON.parse(i.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield i.destroy().catch(D),void t(null)}t(null,e)}else t(null)})),this.length=e=>Ae(this,void 0,void 0,(function*(){e&&e(null,(yield Be.count().catch(D))||0)})),this.set=(e,t,i)=>Ae(this,void 0,void 0,(function*(){i=i||D;const r=Date.now()+Re.API_SESSION_LIFETIME,s=JSON.stringify(t),[n,o]=(yield Be.findOrCreate({where:{session:e},defaults:{session:e,json:s,expired:r}}).catch(D))||[];n&&(o||(n.json=s,n.expired=r,yield n.save().catch(D))),i()})),this.loop=N(this.expired,3e4),this.loop.start()}}class ze{static create(e){return Ae(this,void 0,void 0,(function*(){if(!Ge.token)return{error:"KEY NOT FOUND"};const{id:t}=e,i=b(),r=yield be.create({secret:i,user_id:t}).catch(ze.error);if(!r)return{error:"INTERNAL SERVER ERROR"};return{auth:r,token:Oe.sign({id:t,secret:i},Ge.token,ze.options())}}))}static destroy(e){return Ae(this,void 0,void 0,(function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)}))}static error(e){Me.error(e.message,"api.token",Re.API_CONSOLE_ERROR)}static options(){return{algorithm:"RS256",expiresIn:Re.API_TOKEN_LIFETIME+"ms"}}static renew(e){return Ae(this,void 0,void 0,(function*(){if(!Ge.token)return{error:"KEY NOT FOUND"};const{error:t,decode:i}=ze.verify(e,Re.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(i){const{id:e,secret:t}=i;if(e&&t){const i=yield je.findOne({where:{id:e,state:!0}}).catch(ze.error);if(i){const r=yield be.findOne({where:{secret:t,user_id:i.id}}).catch(ze.error);if(r&&!r.logout){r.secret=b(),yield r.save().catch(ze.error);return{auth:r,token:Oe.sign({id:e,secret:r.secret},Ge.token,ze.options())}}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}}))}static user(e,t,i){return Ae(this,void 0,void 0,(function*(){if(e){t=i.hash.encrypt(e);const r=yield je.findOne({where:{token:t,state:!0}}).catch(ze.error);if(r){const t=e.replace(/(-[\w]{4})/g,"-****"),[i]=(yield be.findOrCreate({where:{secret:t,user_id:r.id},defaults:{secret:t,user_id:r.id}}).catch(ze.error))||[];if(i)return{auth:i,user:r}}return{error:"ACCESS DENIED"}}const{error:r,decode:s}=ze.verify(t);if(r)return{error:r};if(s){const{id:e,secret:t}=s;if(e&&t){const i=yield je.findOne({where:{id:e,state:!0}}).catch(ze.error);if(i){const e=yield be.findOne({where:{secret:t,user_id:i.id}}).catch(ze.error);if(e&&!e.logout)return{auth:e,user:i}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}}))}static verify(e,t){if(!Ye.token)return{error:"CERT NOT FOUND"};if(!e||e.split(".").length<3)return{error:"INVALID TOKEN"};try{return{decode:Oe.verify(e,Ye.token,{clockTolerance:t})}}catch(e){return{error:"INVALID TOKEN"}}}}class $e extends e{constructor(e){super(e,{cert:Ye.http,cross:Re.API_HTTP_CROSS,hybrid:Re.API_HTTP_HYBRID,key:Ge.http,notfound:Re.API_HTTP_NOTFOUND,path:Re.API_HTTP_PATH,port:Re.API_HTTP_PORT,public:Re.API_HTTP_PUBLIC,redirect:Re.API_HTTP_REDIRECT,session:{store:new We,name:Re.API_SESSION_NAME,secret:Re.API_SESSION_SECRET,cookie:{maxAge:Re.API_SESSION_LIFETIME},genid:b}}),this.hash=new I(Re.API_KEY_HASH)}error(e,t){Me.error(e.message,t,Re.API_CONSOLE_ERROR)}log(e,t){Me.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return Ae(this,void 0,void 0,(function*(){yield Se.sync(),yield e.listen.call(this),Re.API_WEBSOCKET_START&&this.server&&(this._webSocket=new H({server:this.server,verifyClient:(e,t)=>t(Re.API_WEBSOCKET_START)}),this._webSocket.on("connection",((e,t)=>Ae(this,void 0,void 0,(function*(){t.url||(t.url="");const i=t.url.length<=1?"":t.url.replace(/\//g,".");let r;e.on("message",(s=>Ae(this,void 0,void 0,(function*(){if(r)try{const n=JSON.parse(s);this.emit("ws.message"+i,{data:n,message:s,req:t,user:r,ws:e})}catch(n){this.emit("ws.message"+i,{message:s,req:t,user:r,ws:e})}else{const{user:n}=yield ze.user("",s.toString(),this);n&&(r=n,this.emit("ws.connection"+i,{req:t,user:r,ws:e}))}r||e.close()})))),e.on("close",(()=>{r&&this.emit("ws.close"+i,{user:r,ws:e})})),yield w(2e3),r||e.close()})))))}))}websocket(){return this._webSocket}}const Je=e=>{var t,i,r,s,n,o,d,a,u;return{audit_client:null!==(t=e.ip())&&void 0!==t?t:"0.0.0.0",audit_href:(null===(i=null==e?void 0:e.req)||void 0===i?void 0:i.protocol)+"://"+(null===(r=null==e?void 0:e.req)||void 0===r?void 0:r.get("host"))+(null===(s=null==e?void 0:e.req)||void 0===s?void 0:s.originalUrl),audit_user_agent:null!==(o=null===(n=e.req)||void 0===n?void 0:n.headers["user-agent"])&&void 0!==o?o:"",audit_user_id:null!==(u=null===(a=null===(d=null==e?void 0:e.req)||void 0===d?void 0:d.user)||void 0===a?void 0:a.id)&&void 0!==u?u:null}};class Xe{static all(){return Ae(this,void 0,void 0,(function*(){const e=yield Le.findAll().catch(Xe.error),t={};return e&&e.forEach((e=>t[e.key]=e.value)),t}))}static del(e,t){return Ae(this,void 0,void 0,(function*(){var i;const r=null!==(i=null==t?void 0:t.id)&&void 0!==i?i:null;return((yield Le.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:r})).catch(Xe.error))||0)>0}))}static error(e){Me.error(e.message,"api.config",Re.API_CONSOLE_ERROR)}static get(e){return Ae(this,arguments,void 0,(function*(e,t=""){const[i]=(yield Le.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(Xe.error))||[];return i?i.value:t}))}static set(e,t,i){return Ae(this,void 0,void 0,(function*(){var r;const s=null!==(r=null==i?void 0:i.id)&&void 0!==r?r:null,[n]=(yield Le.findOrCreate(Object.assign({where:{key:e}},{user_id:s})).catch(Xe.error))||[];n&&(n.value=t,yield n.save().catch(Xe.error))}))}}const Ze=t((({ctx:e})=>Je(e))),Qe=t((({ctx:e})=>e.req.auth)),et=t((({ctx:e})=>e.req.user));class tt extends F{auth(e,t,i,r,s){return Ae(this,void 0,void 0,(function*(){const{auth:n,error:o,user:d}=yield ze.user(t,i,s);return o?e.error(o):n&&d?n.user_agent&&n.user_agent!=r?e.error("INVALID TOKEN"):(e.req.auth=n,e.req.user=d,void e.next()):e.error("INTERNAL SERVER ERROR")}))}create(e,t,i){return Ae(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".create",i)}))}delete(e,t,i){return Ae(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".delete",i)}))}error(e){Me.error(e.message,"api.controller",Re.API_CONSOLE_ERROR)}name(){return"api"}permission(e,t,i){return Ae(this,void 0,void 0,(function*(){if(i){const r=yield this.permissions(i,{route:t});if(r&&r.length>0)return e.next()}e.unauthorized("ACCESS DENIED")}))}permissions(e,t){return Ae(this,void 0,void 0,(function*(){return yield Ue.findAll({where:Object.assign(Object.assign({},null!=t?t:{}),{state:!0}),include:[{model:He,required:!0,include:[{model:Fe,required:!0,where:{state:!0},include:[{model:ke,required:!0,where:{user_id:e.id}}]}]}]}).catch(this.error)}))}read(e,t,i){return Ae(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".read",i)}))}session(e,t,i){return Ae(this,void 0,void 0,(function*(){i.auth&&i.user&&(i.user_agent?i.user_agent!=t&&i.regenerate(D):(i.user_agent=t,i.save(D))),e.next()}))}upload(e,t){t.path||(t.path=Re.API_UPLOAD_TEMP),t.size||(t.size=Re.API_UPLOAD_SIZE),t.field||(t.field=Re.API_UPLOAD_FIELD),d.middleware(e,t)}update(e,t,i){return Ae(this,void 0,void 0,(function*(){yield this.permission(e,(t||this.name())+".update",i)}))}validation(e,t){return Ae(this,void 0,void 0,(function*(){const{error:i,value:r}=yield k.object(t).parse().validateAsync(e.req.body);if(i)return e.validation(i);e.req.body=r,e.next()}))}}fe([Pe(0,i()),Pe(1,r(Re.API_KEY_HEADER)),Pe(2,r(Re.API_TOKEN_HEADER)),Pe(3,r("user-agent")),Pe(4,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String,String,$e]),Ie("design:returntype",Promise)],tt.prototype,"auth",null),fe([Pe(0,i()),Pe(1,n()),Pe(2,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,je]),Ie("design:returntype",Promise)],tt.prototype,"create",null),fe([Pe(0,i()),Pe(1,n()),Pe(2,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,je]),Ie("design:returntype",Promise)],tt.prototype,"delete",null),fe([Pe(0,i()),Pe(1,n()),Pe(2,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,je]),Ie("design:returntype",Promise)],tt.prototype,"permission",null),fe([Pe(0,i()),Pe(1,n()),Pe(2,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,je]),Ie("design:returntype",Promise)],tt.prototype,"read",null),fe([Pe(0,i()),Pe(1,r("user-agent")),Pe(2,o()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,Object]),Ie("design:returntype",Promise)],tt.prototype,"session",null),fe([Pe(0,i()),Pe(1,n()),Ie("design:type",Function),Ie("design:paramtypes",[a,Object]),Ie("design:returntype",void 0)],tt.prototype,"upload",null),fe([Pe(0,i()),Pe(1,n()),Pe(2,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,je]),Ie("design:returntype",Promise)],tt.prototype,"update",null),fe([Pe(0,i()),Pe(1,n()),Ie("design:type",Function),Ie("design:paramtypes",[a,Object]),Ie("design:returntype",Promise)],tt.prototype,"validation",null);let it=class extends tt{constructor(){super(...arguments),this._columns=[]}_add(e){return Ae(this,arguments,void 0,(function*({ctx:e,options:t,body:i}){const r=yield this.model().create(Object.assign(Object.assign({},e.req.body),i||{}),Object.assign(Object.assign({},t||{}),Je(e))).catch(this.error);if(r){const t=this.key();return e.prepare(p.OK,{[t]:r.getDataValue(t)}),r}e.error("INTERNAL SERVER ERROR")}))}_all(e){return Ae(this,arguments,void 0,(function*({ctx:e,options:t,callback:i,scope:r}){var s,n,o,d;const a=this.scope(r),u=Object.assign({},t||{});u.where=Object.assign({},u.where||{});const c=e.req.query.limit,l=x(c)?parseInt(c):Re.API_MODEL_LIMIT;u.limit=l>=0?Math.min(l,Re.API_MODEL_LIMIT_MAX):void 0;const y=e.req.query.offset;if(x(y)){const e=y?parseInt(y):0;u.offset=e>0?e:void 0}const g=[],h=this.columns(),v=e=>h.indexOf(e)>=0,_=null===(s=e.req.query.asc)||void 0===s?void 0:s.toString();_&&_.length&&g.push(..._.split(",").filter(v).map((e=>[e,"ASC"])));const m=null===(n=e.req.query.desc)||void 0===n?void 0:n.toString();m&&m.length&&g.push(...m.split(",").filter(v).map((e=>[e,"DESC"]))),g.length&&(u.order=g);const O=[],E=null===(o=e.req.query.search)||void 0===o?void 0:o.toString();(j(u.attributes)?u.attributes:h).filter(x).forEach((t=>{var i;if(E&&E.length&&O.push({[t]:{[me.like]:`%${E}%`}}),"search_"+t in e.req.query){const r=null===(i=e.req.query["search_"+t])||void 0===i?void 0:i.toString();r&&r.length&&O.push({[t]:{[me.like]:`%${r}%`}})}})),O.length&&(u.where=Object.assign(Object.assign({},u.where),{[me.or]:[...O]}));const f=null!==(d=yield a.count(Object.assign(Object.assign({},u),{col:h[0]})).catch(this.error))&&void 0!==d?d:0,P=yield a.findAll(u).catch(this.error),I={count:f};return P?(e.prepare(p.OK,Object.assign(Object.assign({},I),{records:i?yield i(P):P})),Object.assign(Object.assign({},I),{records:P})):(e.error("INTERNAL SERVER ERROR"),Object.assign(Object.assign({},I),{records:[]}))}))}columns(){return 0==this._columns.length&&(this._columns=Object.keys(this.model().getAttributes())),this._columns}_del(e){return Ae(this,arguments,void 0,(function*({ctx:e,options:t}){const i=this.key(),{[i]:r}=e.req.params;if(!r)return e.error("INTERNAL SERVER ERROR"),0;const s=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[i]:r}),individualHooks:!0}),Je(e))).catch(this.error);return s?(e.success("OK"),s):(e.notFound("RECORD NOT FOUND"),0)}))}error(e){e.sql?Me.error(e.message+"\n"+e.sql,"api.controller.sql",Re.API_CONSOLE_ERROR):super.error(e)}_get(e){return Ae(this,arguments,void 0,(function*({ctx:e,options:t,callback:i,scope:r}){const s=this.key(),{[s]:n}=e.req.params,o=yield this.scope(r).findOne(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[s]:n})})).catch(this.error);return o?(e.prepare(p.OK,i?yield i(o):o.toJSON()),o):null===o?e.notFound("RECORD NOT FOUND"):void e.error("INTERNAL SERVER ERROR")}))}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}_set(e){return Ae(this,arguments,void 0,(function*({ctx:e,options:t,body:i}){var r;const s=this.key(),{[s]:n}=e.req.params,[o]=null!==(r=yield this.model().update(Object.assign(Object.assign({},e.req.body),i||{}),Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[s]:n}),individualHooks:!0}),Je(e))).catch(this.error))&&void 0!==r?r:[];return o?(e.success("OK"),!0):(e.success("RECORD NOT CHANGED"),!1)}))}};it=fe([u(tt)],it);let rt=class extends it{model(){return Ce}all(e,t,i){return Ae(this,void 0,void 0,(function*(){const r={};t&&(r.type=t),i&&(r.table=i),yield this._all({ctx:e,options:{attributes:{exclude:["data","previously"]},where:r,order:[["created_at","DESC"]]}})}))}get(e){return Ae(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}};fe([c(),l("auth"),l("read"),Pe(0,i()),Pe(1,y("type")),Pe(2,y("table")),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String]),Ie("design:returntype",Promise)],rt.prototype,"all",null),fe([c("/:id"),l("auth"),l("read"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],rt.prototype,"get",null),rt=fe([g("/audits"),u(it)],rt);let st=class extends tt{login(e,t,i,r,s){return Ae(this,void 0,void 0,(function*(){var n;yield w(Re.API_SLEEP_AUTH);const o=yield je.scope("password").findOne({where:{[me.or]:[{email:i},{username:i}]}}).catch(this.error);if(r+=null!==(n=null==o?void 0:o.salt)&&void 0!==n?n:"",!o||o.password!=A(r))return e.notFound("INVALID USERNAME OR PASSWORD"),s.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const d=yield we.findOne({where:{state:!0,user_id:o.id}}).catch(this.error);if(d)return e.error("ACTIVATION REQUIRED"),s.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"),s.emit("auth.failure",{ctx:e,user:o}),void this.emit("auth.failure",{ctx:e,user:o});const{auth:a,error:u,token:p}=yield ze.create(o);return u?(e.error(u),s.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):a&&p?(a.user_agent=t,yield a.save().catch(this.error),e.json({token:p}),s.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"),s.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))}))}logout(e,t,i,r){return Ae(this,void 0,void 0,(function*(){if(yield ze.destroy(t))return e.success("OK"),r.emit("auth.logout",{auth:t,ctx:e,user:i}),void this.emit("auth.logout",{auth:t,ctx:e,user:i});e.unauthorized("ACCESS DENIED")}))}renew(e,t,i,r){return Ae(this,void 0,void 0,(function*(){const{auth:s,error:n,token:o}=yield ze.renew(i);return n?e.error(n):s?(s.user_agent=t,yield s.save().catch(this.error),e.json({token:o}),r.emit("auth.renew",{auth:s,ctx:e}),void this.emit("auth.renew",{auth:s,ctx:e})):e.error("INTERNAL SERVER ERROR")}))}user(e,t){return Ae(this,void 0,void 0,(function*(){const i=yield this.permissions(t);if(!i)return e.error("INTERNAL SERVER ERROR");e.json(Object.assign(Object.assign({},t.toJSON()),{permissions:i.map((e=>e.route))}))}))}};fe([h("/login"),l("validation",{username:k.string().min(3).required(),password:k.string().min(5).required()}),Pe(0,i()),Pe(1,r("user-agent")),Pe(2,v("username")),Pe(3,v("password")),Pe(4,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String,String,$e]),Ie("design:returntype",Promise)],st.prototype,"login",null),fe([c("/logout"),l("auth"),Pe(0,i()),Pe(1,Qe()),Pe(2,et()),Pe(3,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,be,je,$e]),Ie("design:returntype",Promise)],st.prototype,"logout",null),fe([h("/renew"),l("validation",{token:k.string().required()}),Pe(0,i()),Pe(1,r("user-agent")),Pe(2,v("token")),Pe(3,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String,$e]),Ie("design:returntype",Promise)],st.prototype,"renew",null),fe([c(),l("auth"),Pe(0,i()),Pe(1,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,je]),Ie("design:returntype",Promise)],st.prototype,"user",null),st=fe([g("/auth"),u(tt)],st);let nt=class extends tt{directory(){return Re.API_HTTP_PUBLIC||"./"}files(e){return Ae(this,void 0,void 0,(function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const i=Ee(this.directory(),t);if(!pe(i)||!le(i).isDirectory())return e.notFound("RECORD NOT FOUND");let r=[];return r=ye(i),r=r.map((e=>this.info(Ee(i,e)))),r=r.filter(C),Object.assign(Object.assign({},this.info(i)),{files:r})}))}access(e,t,i){return Ae(this,void 0,void 0,(function*(){yield this.permission(e,this.name()+"."+t,i)}))}info(e){if(!pe(e))return null;const t=le(e),i=e.split("/").pop();e=e.replace(this.directory(),"/").replace(/^\/\//,"/");const r=t.isDirectory();return{name:i,path:e.replace(/^\/\//,"/"),size:t.size,extension:r?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:r,symlink:t.isSymbolicLink()}}name(){return"files"}};fe([c("/path/?*"),l("auth"),l("access","list"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],nt.prototype,"files",null),fe([Pe(0,i()),Pe(1,n()),Pe(2,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,je]),Ie("design:returntype",Promise)],nt.prototype,"access",null),nt=fe([g("/files"),u(tt)],nt);let ot=class extends tt{check(e,t){return Ae(this,void 0,void 0,(function*(){const i=yield this.find(t);if(!i||!i.user)return e.notFound("RECORD NOT FOUND");i.token=L(),yield i.save(),e.json({token:i.token})}))}forgot(e,t,i){return Ae(this,void 0,void 0,(function*(){yield w(Re.API_SLEEP_FORGOT);const r=t,s=yield je.findOne({where:{[me.or]:[{email:r},{username:t}]}}).catch(this.error);if(!s)return e.notFound("RECORD NOT FOUND");const n=L(),o=Date.now()+6e4*Re.API_TOKEN_FORGOT,d=yield qe.create({token:n,timestamp:o,state:!0,user_id:s.id});e.success("OK"),i.emit("forgot.send",{ctx:e,forgot:d,user:s}),this.emit("forgot.send",{ctx:e,forgot:d,user:s})}))}reset(e,t,i,r){return Ae(this,void 0,void 0,(function*(){const s=yield this.find(t);if(!s)return e.notFound("RECORD NOT FOUND");s.state=!1,yield s.save().catch(this.error),s.user.password=A(i),yield s.user.save().catch(this.error),e.success("OK"),r.emit("forgot.reset",{ctx:e,user:s.user}),this.emit("forgot.reset",{ctx:e,user:s.user})}))}find(e){return Ae(this,void 0,void 0,(function*(){return yield qe.findOne({where:{token:e,state:!0},include:[{model:je,required:!0}]}).catch(this.error)}))}};fe([c("/check"),l("validation",{token:k.string().required()}),Pe(0,i()),Pe(1,v("token")),Ie("design:type",Function),Ie("design:paramtypes",[a,String]),Ie("design:returntype",Promise)],ot.prototype,"check",null),fe([h(),l("validation",{username:k.string().min(4).required()}),Pe(0,i()),Pe(1,v("username")),Pe(2,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,$e]),Ie("design:returntype",Promise)],ot.prototype,"forgot",null),fe([h("/reset"),l("validation",{token:k.string().required(),password:k.string().min(5).required()}),Pe(0,i()),Pe(1,v("token")),Pe(2,v("password")),Pe(3,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String,$e]),Ie("design:returntype",Promise)],ot.prototype,"reset",null),ot=fe([g("/forgot"),u(tt)],ot);let dt=class extends it{constructor(){super(...arguments),this._crud={}}add(e){return Ae(this,void 0,void 0,(function*(){yield this._add({ctx:e})}))}all(e){return Ae(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}CrudCreate(){return this._crud}del(e){return Ae(this,void 0,void 0,(function*(){yield this._del({ctx:e})}))}get(e){return Ae(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e){return Ae(this,void 0,void 0,(function*(){yield this._set({ctx:e})}))}CrudUpdate(){return this._crud}validationAdd(e){return Ae(this,void 0,void 0,(function*(){const t=this.CrudCreate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)}))}validationSet(e){return Ae(this,void 0,void 0,(function*(){const t=this.CrudUpdate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)}))}};fe([h(),l("auth"),l("create"),l("validationAdd"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],dt.prototype,"add",null),fe([c(),l("auth"),l("read"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],dt.prototype,"all",null),fe([_("/:id"),l("auth"),l("delete"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],dt.prototype,"del",null),fe([c("/:id"),l("auth"),l("read"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],dt.prototype,"get",null),fe([m("/:id"),l("auth"),l("update"),l("validationSet"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],dt.prototype,"set",null),fe([Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],dt.prototype,"validationAdd",null),fe([Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],dt.prototype,"validationSet",null),dt=fe([u(it)],dt);let at=class extends dt{model(){return Fe}CrudCreate(){return{name:k.string().required(),description:k.string().empty(""),state:k.boolean().parse().required()}}CrudUpdate(){return{name:k.string().empty(),description:k.string().empty(),state:k.boolean().parse().empty()}}};at=fe([g("/groups"),u(dt)],at);let ut=class extends it{model(){return He}all(e,t){return Ae(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{group_id:t},include:[{model:Ue,required:!0}]},callback:e=>e.map((e=>e.permission))})}))}set(e,t,i,r){return Ae(this,void 0,void 0,(function*(){const s=yield Fe.findByPk(t,{attributes:["id"]}).catch(this.error);if(s){const t=s.id;if(yield He.destroy(Object.assign({where:{group_id:t},individualHooks:!0},r)),i){let e=0;yield w(1e3);for(let s=0;s<i.length;s++)e=yield Ue.count({where:{id:i[s]}}),e&&(yield He.create({group_id:t,permission_id:i[s]},Object.assign({},r)))}return e.success("OK")}if(q(s))return e.notFound("RECORD NOT FOUND");e.error("INTERNAL SERVER ERROR")}))}};fe([c("/:id/routes"),l("auth"),l("read","groups"),Pe(0,i()),Pe(1,O("id")),Ie("design:type",Function),Ie("design:paramtypes",[a,String]),Ie("design:returntype",Promise)],ut.prototype,"all",null),fe([m("/:id/permissions"),l("auth"),l("update","groups"),l("validation",{permissions:k.array(k.number().parse())}),Pe(0,i()),Pe(1,O("id")),Pe(2,v("permissions")),Pe(3,Ze()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,Array,Object]),Ie("design:returntype",Promise)],ut.prototype,"set",null),ut=fe([g("/groups"),u(it)],ut);let pt=class extends it{model(){return Ke}all(e,t,i){return Ae(this,void 0,void 0,(function*(){const r={};t&&(r.type=t),i&&(r.source=i),yield this._all({ctx:e,options:{where:r,order:[["created_at","DESC"]]}})}))}};fe([c(),l("auth"),l("read"),Pe(0,i()),Pe(1,y("type")),Pe(2,y("source")),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String]),Ie("design:returntype",Promise)],pt.prototype,"all",null),pt=fe([g("/logs"),u(it)],pt);let ct=class extends dt{model(){return Ue}CrudCreate(){return{name:k.string().required(),description:k.string().empty(""),state:k.boolean().parse().required()}}CrudUpdate(){return{name:k.string().empty(),description:k.string().empty(),state:k.boolean().parse().empty()}}};ct=fe([g("/permissions"),u(dt)],ct);let lt=class extends tt{register(e,t,i){return Ae(this,void 0,void 0,(function*(){yield w(Re.API_SLEEP_REGISTRY);const{name:r,date:s,email:n,username:o,password:d,confirm:a}=t,u=o||n,p=A(d);if(yield je.count({where:{[me.or]:[{email:n},{username:u}]}}).catch(this.error))return e.validation("INVALID EMAIL OR USERNAME");if(p!=A(a))return e.error("INVALID PASSWORD");const c=yield je.create({name:r,email:n,username:u,password:p,avatar:"",date:s,description:"",state:!1}).catch(this.error);if(!c)return e.error("INTERNAL SERVER ERROR");const l=yield we.create({token:yield this.getId(),user_id:c.id,state:!0}).catch(this.error);if(!l)return yield c.destroy().catch(this.error),e.error("INTERNAL SERVER ERROR");e.success("OK"),i.emit("register.user",{ctx:e,register:l,user:c}),this.emit("register.user",{ctx:e,register:l,user:c})}))}confirm(e,t,i){return Ae(this,void 0,void 0,(function*(){const r=yield we.findOne({where:{token:t,state:!0},include:[{model:je,required:!0}]}).catch(this.error);if(!r)return e.notFound("RECORD NOT FOUND");r.state=!1,yield r.save().catch(this.error),r.user.state=!0,yield r.user.save().catch(this.error),e.success("OK"),i.emit("register.confirm",{ctx:e,register:r,user:r.user}),this.emit("register.confirm",{ctx:e,register:r,user:r.user})}))}send(e,t,i){return Ae(this,void 0,void 0,(function*(){const r=t,s=yield we.findOne({where:{state:!0},include:[{model:je,required:!0,where:{[me.or]:[{email:r},{username:t}]}}]}).catch(this.error);if(!s)return e.notFound("RECORD NOT FOUND");e.success("OK"),i.emit("register.send",{ctx:e,register:s,user:s.user}),this.emit("register.send",{ctx:e,register:s,user:s.user})}))}getId(){return Ae(this,void 0,void 0,(function*(){const e=b();return(yield we.count({where:{token:e}}))?this.getId():e}))}};fe([h(),l("validation",{name:k.string().required(),date:k.date().required(),email:k.string().email().required(),username:k.string().min(4).empty(),password:k.string().min(5).required(),confirm:k.string().min(5).required()}),Pe(0,i()),Pe(1,v()),Pe(2,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,Object,$e]),Ie("design:returntype",Promise)],lt.prototype,"register",null),fe([h("/confirm"),l("validation",{token:k.string().required()}),Pe(0,i()),Pe(1,v("token")),Pe(2,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,$e]),Ie("design:returntype",Promise)],lt.prototype,"confirm",null),fe([h("/send"),l("validation",{username:k.string().min(4).required()}),Pe(0,i()),Pe(1,v("username")),Pe(2,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,$e]),Ie("design:returntype",Promise)],lt.prototype,"send",null),lt=fe([g("/register"),u(tt)],lt);let yt=class extends tt{setup(e,t){return Ae(this,void 0,void 0,(function*(){if(0==(yield je.count())){const e=L(),i=yield je.create({name:"Admin",email:"admin@localhost",username:"admin",password:A("admin"+e),salt:e,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0},Object.assign({},t)),r={description:"API CORE",state:!0},s=yield Fe.create(Object.assign({name:"admin"},r),Object.assign({},t));yield ke.create({user_id:i.id,group_id:s.id},Object.assign({},t));const n=["audits","users","groups","routes"],o=["create","read","update","delete"];yield U(n,(e=>Ae(this,void 0,void 0,(function*(){yield U(o,(i=>Ae(this,void 0,void 0,(function*(){const n=yield Ue.create(Object.assign({name:`${e} ${i}`,route:`${e}.${i}`},r),Object.assign({},t));yield He.create({group_id:s.id,permission_id:n.id},Object.assign({},t))}))))}))));const d=["delete","list","read","rename","upload","write"];yield U(d,(e=>Ae(this,void 0,void 0,(function*(){const i=yield Ue.create(Object.assign({name:`files ${e}`,route:`files.${e}`},r),Object.assign({},t));yield He.create({group_id:s.id,permission_id:i.id},Object.assign({},t))}))));const a=["logs"];yield U(a,(e=>Ae(this,void 0,void 0,(function*(){const i=yield Ue.create(Object.assign({name:`${e} files`,route:`${e}.read`},r),Object.assign({},t));yield He.create({group_id:s.id,permission_id:i.id},Object.assign({},t))}))))}e.success("OK")}))}};fe([c(),Pe(0,i()),Pe(1,Ze()),Ie("design:type",Function),Ie("design:paramtypes",[a,Object]),Ie("design:returntype",Promise)],yt.prototype,"setup",null),yt=fe([g("/setup"),u(tt)],yt);let gt=class extends it{model(){return je}constructor(){super(),this.path=Re.API_HTTP_PUBLIC+"/avatar",Re.API_HTTP_PUBLIC&&pe(Re.API_HTTP_PUBLIC)&&!pe(this.path)&&ge(this.path)}avatar(e,t,i,r){return Ae(this,void 0,void 0,(function*(){if(t.length){const s=t[0].filename||"";if(s){const t=this.path+"/"+i.avatar;if(pe(t)&&he(t).isFile()&&ve(t),i.avatar=s,yield i.save(Object.assign({},r)).catch(this.error))return e.success("OK")}}e.success("RECORD NOT CHANGED")}))}avatar_delete(e,t,i){return Ae(this,void 0,void 0,(function*(){const r=this.path+"/"+t.avatar;t.avatar="",(yield t.save(Object.assign({},i)).catch(this.error))&&pe(r)&&ve(r),e.success("OK")}))}password(e,t,i,r,s){return Ae(this,void 0,void 0,(function*(){var n;if(Re.API_USER_HISTORY){if(yield xe.count({where:{password:A(i+r.id)}}).catch(this.error))return e.error("PASSWORD PREVIOUSLY REGISTERED")}const o=yield this.scope("password").findOne({where:{id:r.id,state:!0}}).catch(this.error);return t+=null!==(n=null==o?void 0:o.salt)&&void 0!==n?n:"",o&&o.password==A(t)?(o.salt=L(),o.password=A(i+o.salt),(yield o.save(Object.assign({},s)).catch(this.error))?e.success("OK"):void e.success("RECORD NOT CHANGED")):e.error("INVALID PASSWORD")}))}token(e,t,i){return Ae(this,void 0,void 0,(function*(){const r=yield this.model().findOne({attributes:["token"],where:{id:t.id}}).catch(this.error);if(r)return e.json({token:i.hash.decrypt(r.token)});e.notFound("RECORD NOT FOUND")}))}token_get(e,t,i){return Ae(this,void 0,void 0,(function*(){const r=yield this.scope("token").findOne({where:{id:t}}).catch(this.error);if(r)return e.json({token:i.hash.decrypt(r.token)});e.notFound("RECORD NOT FOUND")}))}token_delete(e,t,i){return Ae(this,void 0,void 0,(function*(){const r=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(r)return r.token="",yield r.save(Object.assign({},i)).catch(this.error),e.success("OK");e.notFound("RECORD NOT FOUND")}))}token_renew(e,t,i,r){return Ae(this,void 0,void 0,(function*(){const s=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(s){const t=yield this.token_new();return s.token=r.hash.encrypt(t),yield s.save(Object.assign({},i)).catch(this.error),e.json({token:t})}e.notFound("RECORD NOT FOUND")}))}token_new(){return Ae(this,void 0,void 0,(function*(){var e;const t=b();return(null!==(e=yield this.model().count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t}))}add(e,t){return Ae(this,void 0,void 0,(function*(){const i=L(),r=yield this._add({ctx:e,body:{password:A(t+i),salt:i}});Re.API_USER_HISTORY&&r&&(yield xe.create({password:A(t+r.id),user_id:r.id}))}))}all(e){return Ae(this,void 0,void 0,(function*(){yield this._all({ctx:e})}))}del(e,t,i){return Ae(this,void 0,void 0,(function*(){if(i.id.toString()==t)return e.notFound("RECORD NOT FOUND");yield this._del({ctx:e})}))}get(e){return Ae(this,void 0,void 0,(function*(){yield this._get({ctx:e})}))}set(e,t,i){return Ae(this,void 0,void 0,(function*(){if(Re.API_USER_HISTORY&&i){const r=A(i+t);if(yield xe.count({where:{password:r}}).catch(this.error))return e.error("PASSWORD PREVIOUSLY REGISTERED");yield xe.create({password:r,user_id:t}).catch(this.error)}const r=i?L():"";yield this._set({ctx:e,body:i?{password:A(i+r),salt:r}:{}})}))}};fe([h("/avatar"),l("auth"),l("upload",(e=>({count:1,field:"file",path:e.controller.path,types:["image/bmp","image/jpeg","image/png"],size:32}))),Pe(0,i()),Pe(1,E()),Pe(2,et()),Pe(3,Ze()),Ie("design:type",Function),Ie("design:paramtypes",[a,Array,je,Object]),Ie("design:returntype",Promise)],gt.prototype,"avatar",null),fe([_("/avatar"),l("auth"),Pe(0,i()),Pe(1,et()),Pe(2,Ze()),Ie("design:type",Function),Ie("design:paramtypes",[a,je,Object]),Ie("design:returntype",Promise)],gt.prototype,"avatar_delete",null),fe([h("/password"),l("auth"),l("validation",{oldPassword:k.string().min(5).required(),newPassword:k.string().min(5).required()}),Pe(0,i()),Pe(1,v("oldPassword")),Pe(2,v("newPassword")),Pe(3,et()),Pe(4,Ze()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String,je,Object]),Ie("design:returntype",Promise)],gt.prototype,"password",null),fe([c("/token"),l("auth"),Pe(0,i()),Pe(1,et()),Pe(2,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,je,$e]),Ie("design:returntype",Promise)],gt.prototype,"token",null),fe([c("/token/:id"),l("auth"),l("create"),Pe(0,i()),Pe(1,O("id")),Pe(2,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,$e]),Ie("design:returntype",Promise)],gt.prototype,"token_get",null),fe([_("/token/:id"),l("auth"),l("delete"),Pe(0,i()),Pe(1,O("id")),Pe(2,Ze()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,Object]),Ie("design:returntype",Promise)],gt.prototype,"token_delete",null),fe([c("/token/renew/:id"),l("auth"),l("update"),Pe(0,i()),Pe(1,O("id")),Pe(2,Ze()),Pe(3,s()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,Object,$e]),Ie("design:returntype",Promise)],gt.prototype,"token_renew",null),fe([h(),l("auth"),l("create"),l("validation",{name:k.string().required(),email:k.string().email().required(),username:k.string().min(4).required(),password:k.string().min(5).required(),description:k.string().empty(""),state:k.boolean().parse().required()}),Pe(0,i()),Pe(1,v("password")),Ie("design:type",Function),Ie("design:paramtypes",[a,String]),Ie("design:returntype",Promise)],gt.prototype,"add",null),fe([c(),l("auth"),l("read"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],gt.prototype,"all",null),fe([_("/:id"),l("auth"),l("delete"),Pe(0,i()),Pe(1,O("id")),Pe(2,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,je]),Ie("design:returntype",Promise)],gt.prototype,"del",null),fe([c("/:id"),l("auth"),l("read"),Pe(0,i()),Ie("design:type",Function),Ie("design:paramtypes",[a]),Ie("design:returntype",Promise)],gt.prototype,"get",null),fe([m("/:id"),l("auth"),l("update"),l("validation",{name:k.string().empty(),email:k.string().email().empty(),username:k.string().min(4).empty(),password:k.string().min(5).empty().filter(""),description:k.string().empty(),state:k.boolean().parse().empty()}),Pe(0,i()),Pe(1,O("id")),Pe(2,v("password")),Ie("design:type",Function),Ie("design:paramtypes",[a,String,String]),Ie("design:returntype",Promise)],gt.prototype,"set",null),gt=fe([g("/users"),u(it),Ie("design:paramtypes",[])],gt);let ht=class extends it{model(){return ke}groups(e,t){return Ae(this,void 0,void 0,(function*(){yield this.all(e,t.id.toString())}))}all(e,t){return Ae(this,void 0,void 0,(function*(){yield this._all({ctx:e,options:{where:{user_id:t},include:[{model:Fe,required:!0}]},callback:e=>e.map((e=>e.group))})}))}set(e,t,i,r){return Ae(this,void 0,void 0,(function*(){const s=yield je.findByPk(t,{attributes:["id"]}).catch(this.error);if(s){if(yield ke.destroy(Object.assign({where:{user_id:s.id},individualHooks:!0},r)),i){let e=0;yield w(1e3);for(let t=0;t<i.length;t++)e=yield Fe.count({where:{id:i[t]}}),e&&(yield ke.create({user_id:s.id,group_id:i[t]},Object.assign({},r)))}return e.success("OK")}if(q(s))return e.notFound("RECORD NOT FOUND");e.error("INTERNAL SERVER ERROR")}))}};fe([c("/groups"),l("auth"),l("read","users"),Pe(0,i()),Pe(1,et()),Ie("design:type",Function),Ie("design:paramtypes",[a,je]),Ie("design:returntype",Promise)],ht.prototype,"groups",null),fe([c("/:id/groups"),l("auth"),l("read","users"),Pe(0,i()),Pe(1,O("id")),Ie("design:type",Function),Ie("design:paramtypes",[a,String]),Ie("design:returntype",Promise)],ht.prototype,"all",null),fe([m("/:id/groups"),l("auth"),l("update","users"),l("validation",{groups:k.array(k.number().parse())}),Pe(0,i()),Pe(1,O("id")),Pe(2,v("groups")),Pe(3,Ze()),Ie("design:type",Function),Ie("design:paramtypes",[a,String,Array,Object]),Ie("design:returntype",Promise)],ht.prototype,"set",null),ht=fe([g("/users"),u(it)],ht);export{$e as Application,Ce as Audit,rt as AuditsController,be as Auth,st as AuthController,Xe as Config,Le as Configs,tt as ControllerBase,dt as CrudController,Re as Env,nt as FilesController,qe as Forgot,ot as ForgotController,Fe as Group,He as GroupPermission,at as GroupsController,ut as GroupsPermissionsController,Ke as Log,Me as Logs,pt as LogsController,Te as Model,it as ModelController,Ue as Permission,ct as PermissionsController,we as Register,lt as RegisterController,Ze as ReqAudit,Qe as ReqAuth,et as ReqUser,Be as Session,yt as SetupController,ze as Token,je as User,ke as UserGroup,xe as UserHistory,gt as UsersController,ht as UsersGroupsController,Je as audit,Ye as crt,Se as database,Ne as hooks,Ge as key};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrewcaires/api",
3
- "version": "4.0.4",
3
+ "version": "4.1.1",
4
4
  "description": "Simple api for small applications using express, jsonwebtoken, sequelize and websocket",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs.js",
@@ -46,7 +46,7 @@
46
46
  },
47
47
  "homepage": "https://github.com/andrewcaires/npm/tree/main/api#readme",
48
48
  "dependencies": {
49
- "@andrewcaires/express": "^1.2.0",
49
+ "@andrewcaires/express": "^1.2.2",
50
50
  "@andrewcaires/node": "^1.2.0",
51
51
  "@andrewcaires/sequelize": "^1.1.2",
52
52
  "@andrewcaires/utils.js": "^0.4.0",