@andrewcaires/api 4.5.1 → 4.5.2
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 +2 -2
- package/dist/index.d.ts +5 -3
- package/dist/index.esm.js +2 -2
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/api v4.5.
|
|
2
|
+
* @andrewcaires/api v4.5.2
|
|
3
3
|
* Simple api for small applications using express, jsonwebtoken, sequelize and websocket
|
|
4
4
|
* (c) 2026 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
6
6
|
*/
|
|
7
|
-
"use strict";var e=require("@andrewcaires/utils.js"),t=require("@andrewcaires/express"),r=require("@andrewcaires/node"),o=require("dotenv"),i=require("@andrewcaires/sequelize"),s=require("jsonwebtoken"),n=require("fs"),d=require("ws"),a=require("express-session"),l=require("path");class Controller extends e.EventEmitter{}function p(e,t,r,o){var i,s=arguments.length,n=s<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--)(i=e[d])&&(n=(s<3?i(n):s>3?i(t,r,n):i(t,r))||n);return s>3&&n&&Object.defineProperty(t,r,n),n}function u(e,t){return function(r,o){t(r,o,e)}}function c(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function g(e,t,r,o){return new(r||(r=Promise))(function(i,s){function n(e){try{a(o.next(e))}catch(e){s(e)}}function d(e){try{a(o.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(n,d)}a((o=o.apply(e,t||[])).next())})}Controller.ATTRIBUTES=Symbol("ATTRIBUTES"),Controller.PERMISSIONS=Symbol("PERMISSIONS"),"function"==typeof SuppressedError&&SuppressedError,o.config({quiet:!0});class Env extends r.Env{}Env.API_BASE_NAME=Env.getString("API_BASE_NAME",""),Env.API_BODYPARSER_STRICT=Env.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=Env.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=Env.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=Env.getString("API_BODYPARSER_TYPE","json"),Env.API_CONSOLE_ERROR=Env.getBool("API_CONSOLE_ERROR",!1),Env.API_DATABASE_URL=Env.getString("API_DATABASE_URL",""),Env.API_DATABASE_LOG=Env.getBool("API_DATABASE_LOG",!1),Env.API_DATABASE_AUDIT=Env.getBool("API_DATABASE_AUDIT",!0),Env.API_DATABASE_PREFIX=Env.getString("API_DATABASE_PREFIX",""),Env.API_DATABASE_TIMEZONE=Env.getString("API_DATABASE_TIMEZONE","+00:00"),Env.API_HTTP_CRT=Env.getString("API_HTTP_CRT",""),Env.API_HTTP_KEY=Env.getString("API_HTTP_KEY",""),Env.API_HTTP_PORT=Env.getInt("API_HTTP_PORT",3e3),Env.API_HTTP_PUBLIC=Env.getString("API_HTTP_PUBLIC",""),Env.API_HTTP_CROSS=Env.getBool("API_HTTP_CROSS",!1),Env.API_HTTP_HYBRID=Env.getBool("API_HTTP_HYBRID",!1),Env.API_HTTP_NOTFOUND=Env.getString("API_HTTP_NOTFOUND",""),Env.API_HTTP_PATH=Env.getString("API_HTTP_PATH","/api"),Env.API_HTTP_REDIRECT=Env.getString("API_HTTP_REDIRECT",""),Env.API_KEY_HASH=Env.getString("API_KEY_HASH",""),Env.API_KEY_HEADER=Env.getString("API_KEY_HEADER","x-api-key"),Env.API_MODEL_LIMIT=Env.getInt("API_MODEL_LIMIT",10),Env.API_MODEL_LIMIT_MAX=Env.getInt("API_MODEL_LIMIT_MAX",500),Env.API_SLEEP_AUTH=Env.getMs("API_SLEEP_AUTH","2s"),Env.API_SLEEP_FORGOT=Env.getMs("API_SLEEP_FORGOT","5s"),Env.API_SLEEP_REGISTRY=Env.getMs("API_SLEEP_REGISTRY","5s"),Env.API_SESSION_NAME=Env.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=Env.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=Env.getString("API_SESSION_SECRET","yoursecret"),Env.API_TOKEN_CRT=Env.getString("API_TOKEN_CRT",""),Env.API_TOKEN_KEY=Env.getString("API_TOKEN_KEY",""),Env.API_TOKEN_FORGOT=Env.getMs("API_TOKEN_LIFETIME","1d"),Env.API_TOKEN_HEADER=Env.getString("API_TOKEN_HEADER","authorization"),Env.API_TOKEN_HEADER_KEY=Env.getString("API_TOKEN_HEADER","bearer"),Env.API_TOKEN_LIFETIME=Env.getMs("API_TOKEN_LIFETIME","1d"),Env.API_TOKEN_RENEW=Env.getMs("API_TOKEN_RENEW","1d"),Env.API_UPLOAD_COUNT=Env.getInt("API_UPLOAD_COUNT",1),Env.API_UPLOAD_FIELD=Env.getString("API_UPLOAD_FIELD","upload"),Env.API_UPLOAD_SIZE=Env.getInt("API_UPLOAD_SIZE",2),Env.API_UPLOAD_TEMP=Env.getString("API_UPLOAD_TEMP","./temp"),Env.API_USER_HISTORY=Env.getBool("API_USER_HISTORY",!0),Env.API_WEBSOCKET_START=Env.getBool("API_WEBSOCKET_START",!1);const y=e=>{var t,r,o,i,s,n,d,a,l;return{audit_client:null!==(t=e.getIp())&&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===(i=null==e?void 0:e.req)||void 0===i?void 0:i.originalUrl),audit_user_agent:null!==(n=null===(s=e.req)||void 0===s?void 0:s.headers["user-agent"])&&void 0!==n?n:"",audit_user_id:null!==(l=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!==l?l:null}},h=t.parameterFactory(({ctx:e})=>y(e)),v=t.parameterFactory(({ctx:e})=>e.req.auth),x=t.parameterFactory(({ctx:e})=>e.req.user),m=new i.Sequelize(Env.API_DATABASE_URL,{logging:Env.API_DATABASE_LOG,prefix:Env.API_DATABASE_PREFIX,timezone:Env.API_DATABASE_TIMEZONE}),E=(e,t,r)=>{var o,i,s,n,d;return{type:e,model:null!==(o=null==t?void 0:t.getTableName())&&void 0!==o?o:null,client:null!==(i=null==r?void 0:r.audit_client)&&void 0!==i?i:null,href:null!==(s=null==r?void 0:r.audit_href)&&void 0!==s?s: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}},A={afterCreate:(t,r)=>g(void 0,void 0,void 0,function*(){var o;if(!Env.API_DATABASE_AUDIT)return;const i=e.isObject(t)?t.constructor:null,s=null!==(o=null==i?void 0:i.primaryKeyAttribute)&&void 0!==o?o:null;yield exports.Audit.create(Object.assign(Object.assign({},E("CREATE",i,r)),{record:s?t.getDataValue(s):null,data:t.toJSON()})).catch(e.noop)}),afterUpdate:(t,r)=>g(void 0,void 0,void 0,function*(){var o;if(!Env.API_DATABASE_AUDIT)return;const i=e.isObject(t)?t.constructor:null,s=null!==(o=null==i?void 0:i.primaryKeyAttribute)&&void 0!==o?o:null,n={},d=t.changed();d&&d.forEach(e=>n[e]=t.getDataValue(e)),yield exports.Audit.create(Object.assign(Object.assign({},E("UPDATE",i,r)),{record:s?t.getDataValue(s):null,data:n,previously:t.previous()})).catch(e.noop)}),afterDestroy:(t,r)=>g(void 0,void 0,void 0,function*(){var o;if(!Env.API_DATABASE_AUDIT)return;const i=e.isObject(t)?t.constructor:null,s=null!==(o=null==i?void 0:i.primaryKeyAttribute)&&void 0!==o?o:null;yield exports.Audit.create(Object.assign(Object.assign({},E("DELETE",i,r)),{record:s?t.getDataValue(s):null,data:t.toJSON()})).catch(e.noop)})};exports.Auth=class Auth extends i.Model{},p([i.Column.Id(),c("design:type",Number)],exports.Auth.prototype,"id",void 0),p([i.Column.String(),c("design:type",String)],exports.Auth.prototype,"secret",void 0),p([i.Column.FullDate(),c("design:type",Object)],exports.Auth.prototype,"logout",void 0),p([i.Column.String(),c("design:type",String)],exports.Auth.prototype,"user_agent",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Auth.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Auth.prototype,"updated_at",void 0),p([i.Column.DeletedAt,c("design:type",Object)],exports.Auth.prototype,"deleted_at",void 0),p([i.BelongsTo(()=>exports.User),c("design:type",Number)],exports.Auth.prototype,"user_id",void 0),exports.Auth=p([i.Database(m),i.ModelName("auth"),i.Version("4.2.0")],exports.Auth),exports.Register=class Register extends i.Model{},p([i.Column.Id(),c("design:type",Number)],exports.Register.prototype,"id",void 0),p([i.Column.String(),c("design:type",String)],exports.Register.prototype,"token",void 0),p([i.Column.Boolean(),c("design:type",Boolean)],exports.Register.prototype,"state",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Register.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Register.prototype,"updated_at",void 0),p([i.Column.DeletedAt,c("design:type",Object)],exports.Register.prototype,"deleted_at",void 0),p([i.BelongsTo(()=>exports.User),c("design:type",Number)],exports.Register.prototype,"user_id",void 0),exports.Register=p([i.Database(m),i.ModelName("register"),i.Version("4.2.0")],exports.Register),exports.Group=class Group extends i.Model{},p([i.Column.Id(),c("design:type",Number)],exports.Group.prototype,"id",void 0),p([i.Column.String(),c("design:type",String)],exports.Group.prototype,"name",void 0),p([i.Column.Text(),c("design:type",String)],exports.Group.prototype,"description",void 0),p([i.Column.Boolean(),c("design:type",Boolean)],exports.Group.prototype,"state",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Group.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Group.prototype,"updated_at",void 0),p([i.Column.DeletedAt,c("design:type",Object)],exports.Group.prototype,"deleted_at",void 0),p([i.HasMany(()=>exports.UserGroup,"group_id"),c("design:type",Array)],exports.Group.prototype,"groups_routes",void 0),p([i.HasMany(()=>exports.UserGroup,"group_id"),c("design:type",Array)],exports.Group.prototype,"users_groups",void 0),exports.Group=p([i.Database(m),i.ModelName("group"),i.Hooks(A),i.Version("4.2.0")],exports.Group),exports.UserGroup=class UserGroup extends i.Model{},p([i.Column.CreatedAt,c("design:type",Date)],exports.UserGroup.prototype,"created_at",void 0),p([i.BelongsTo(()=>exports.Group),c("design:type",Number)],exports.UserGroup.prototype,"group_id",void 0),p([i.BelongsTo(()=>exports.User),c("design:type",Number)],exports.UserGroup.prototype,"user_id",void 0),exports.UserGroup=p([i.Database(m),i.ModelName("users_groups"),i.Hooks(A),i.Version("4.2.0")],exports.UserGroup),exports.UserHistory=class UserHistory extends i.Model{},p([i.Column.String(),c("design:type",String)],exports.UserHistory.prototype,"password",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.UserHistory.prototype,"created_at",void 0),p([i.BelongsTo(()=>exports.User),c("design:type",Number)],exports.UserHistory.prototype,"user_id",void 0),exports.UserHistory=p([i.Database(m),i.ModelName("users_histories"),i.Version("4.2.0")],exports.UserHistory),exports.User=class User extends i.Model{},p([i.Column.Id(),c("design:type",Number)],exports.User.prototype,"id",void 0),p([i.Column.String(),c("design:type",String)],exports.User.prototype,"name",void 0),p([i.Column.String(),c("design:type",String)],exports.User.prototype,"email",void 0),p([i.Column.String(),c("design:type",String)],exports.User.prototype,"username",void 0),p([i.Column.String(),c("design:type",String)],exports.User.prototype,"password",void 0),p([i.Column.String(),c("design:type",String)],exports.User.prototype,"salt",void 0),p([i.Column.String(),c("design:type",String)],exports.User.prototype,"token",void 0),p([i.Column.String(),c("design:type",String)],exports.User.prototype,"avatar",void 0),p([i.Column.DateOnly(),c("design:type",String)],exports.User.prototype,"date",void 0),p([i.Column.Text(),c("design:type",String)],exports.User.prototype,"description",void 0),p([i.Column.Boolean(),c("design:type",Boolean)],exports.User.prototype,"state",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.User.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.User.prototype,"updated_at",void 0),p([i.Column.DeletedAt,c("design:type",Object)],exports.User.prototype,"deleted_at",void 0),p([i.HasMany(()=>exports.Audit,"user_id"),c("design:type",Array)],exports.User.prototype,"audits",void 0),p([i.HasMany(()=>exports.Auth,"user_id"),c("design:type",Array)],exports.User.prototype,"auths",void 0),p([i.HasMany(()=>exports.Register,"user_id"),c("design:type",Array)],exports.User.prototype,"registers",void 0),p([i.HasMany(()=>exports.UserGroup,"user_id"),c("design:type",Array)],exports.User.prototype,"users_groups",void 0),p([i.HasMany(()=>exports.UserHistory,"user_id"),c("design:type",Array)],exports.User.prototype,"users_histories",void 0),exports.User=p([i.Database(m),i.ModelName("user"),i.DefaultScope({attributes:{exclude:["password","salt","token"]}}),i.Scopes({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),i.Hooks(A),i.Version("4.2.0")],exports.User),exports.Audit=class Audit extends i.Model{},p([i.Column.Id(),c("design:type",Number)],exports.Audit.prototype,"id",void 0),p([i.Column.Enum("CREATE","DELETE","UPDATE"),c("design:type",String)],exports.Audit.prototype,"type",void 0),p([i.Column.String(),c("design:type",String)],exports.Audit.prototype,"model",void 0),p([i.Column.String(),c("design:type",String)],exports.Audit.prototype,"record",void 0),p([i.Column.Json(),c("design:type",Object)],exports.Audit.prototype,"data",void 0),p([i.Column.Json(),c("design:type",Object)],exports.Audit.prototype,"previously",void 0),p([i.Column.String(),c("design:type",String)],exports.Audit.prototype,"client",void 0),p([i.Column.Text(),c("design:type",String)],exports.Audit.prototype,"href",void 0),p([i.Column.String(),c("design:type",String)],exports.Audit.prototype,"user_agent",void 0),p([i.Column.Boolean(),c("design:type",Boolean)],exports.Audit.prototype,"state",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Audit.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Audit.prototype,"updated_at",void 0),p([i.Column.DeletedAt,c("design:type",Object)],exports.Audit.prototype,"deleted_at",void 0),p([i.BelongsTo(()=>exports.User),c("design:type",Number)],exports.Audit.prototype,"user_id",void 0),exports.Audit=p([i.Database(m),i.ModelName("audit"),i.Version("4.2.0")],exports.Audit),exports.Config=class Config extends i.Model{static all(){return g(this,void 0,void 0,function*(){const e=yield this.findAll().catch(this.error),t={};return e&&e.forEach(e=>t[e.key]=e.value),t})}static del(e,t){return g(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 this.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:o})).catch(this.error))||0)>0})}static get(e){return g(this,arguments,void 0,function*(e,t=""){const[r]=(yield this.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return r?r.value:t})}static set(e,t,r){return g(this,void 0,void 0,function*(){var o;const i=null!==(o=null==r?void 0:r.id)&&void 0!==o?o:null,[s]=(yield this.findOrCreate(Object.assign({where:{key:e}},{user_id:i})).catch(this.error))||[];s&&(s.value=t,yield s.save().catch(this.error))})}},p([i.Column.String(),c("design:type",String)],exports.Config.prototype,"key",void 0),p([i.Column.String(),c("design:type",String)],exports.Config.prototype,"value",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Config.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Config.prototype,"updated_at",void 0),exports.Config=p([i.Database(m),i.ModelName("configs"),i.Version("4.2.0")],exports.Config),exports.Forgot=class Forgot extends i.Model{},p([i.Column.Id(),c("design:type",Number)],exports.Forgot.prototype,"id",void 0),p([i.Column.String(),c("design:type",String)],exports.Forgot.prototype,"token",void 0),p([i.Column.BigInt(),c("design:type",Number)],exports.Forgot.prototype,"timestamp",void 0),p([i.Column.Boolean(),c("design:type",Boolean)],exports.Forgot.prototype,"state",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Forgot.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Forgot.prototype,"updated_at",void 0),p([i.Column.DeletedAt,c("design:type",Object)],exports.Forgot.prototype,"deleted_at",void 0),p([i.BelongsTo(()=>exports.User),c("design:type",Number)],exports.Forgot.prototype,"user_id",void 0),exports.Forgot=p([i.Database(m),i.ModelName("forgot"),i.Version("4.2.0")],exports.Forgot),exports.Permission=class Permission extends i.Model{},p([i.Column.Id(),c("design:type",Number)],exports.Permission.prototype,"id",void 0),p([i.Column.String(),c("design:type",String)],exports.Permission.prototype,"name",void 0),p([i.Column.String(),i.Unique(!0),c("design:type",String)],exports.Permission.prototype,"route",void 0),p([i.Column.String(),c("design:type",String)],exports.Permission.prototype,"tag",void 0),p([i.Column.Text(),c("design:type",String)],exports.Permission.prototype,"description",void 0),p([i.Column.Boolean(),c("design:type",Boolean)],exports.Permission.prototype,"state",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Permission.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Permission.prototype,"updated_at",void 0),p([i.Column.DeletedAt,c("design:type",Object)],exports.Permission.prototype,"deleted_at",void 0),p([i.HasMany(()=>exports.GroupPermission,"permission_id"),c("design:type",Array)],exports.Permission.prototype,"groups_permissions",void 0),exports.Permission=p([i.Database(m),i.ModelName("permission"),i.Hooks(A),i.Version("4.3.1")],exports.Permission),exports.GroupPermission=class GroupPermission extends i.Model{},p([i.Column.CreatedAt,c("design:type",Date)],exports.GroupPermission.prototype,"created_at",void 0),p([i.BelongsTo(()=>exports.Group),c("design:type",Number)],exports.GroupPermission.prototype,"group_id",void 0),p([i.BelongsTo(()=>exports.Permission),c("design:type",Number)],exports.GroupPermission.prototype,"permission_id",void 0),exports.GroupPermission=p([i.Database(m),i.ModelName("groups_permissions"),i.Hooks(A),i.Version("4.2.0")],exports.GroupPermission),exports.Log=class Log extends i.Model{static write(e,t,o){return g(this,void 0,void 0,function*(){yield this.writeRaw(r.LogColor.White,"",e,t,o)})}static error(e,t,o){return g(this,void 0,void 0,function*(){yield this.writeRaw(r.LogColor.Red,"error",e,t,o)})}static info(e,t,o){return g(this,void 0,void 0,function*(){yield this.writeRaw(r.LogColor.Cyan,"info",e,t,o)})}static success(e,t,o){return g(this,void 0,void 0,function*(){yield this.writeRaw(r.LogColor.Green,"success",e,t,o)})}static warning(e,t,o){return g(this,void 0,void 0,function*(){yield this.writeRaw(r.LogColor.Yellow,"warning",e,t,o)})}static writeRaw(e,t,o,i,s){return g(this,void 0,void 0,function*(){s&&r.Log.console(e,t,o),m&&(yield this.create({type:t,source:i,message:o}).catch(this.error))})}},p([i.Column.Id(),c("design:type",Number)],exports.Log.prototype,"id",void 0),p([i.Column.String(),c("design:type",String)],exports.Log.prototype,"type",void 0),p([i.Column.String(),c("design:type",String)],exports.Log.prototype,"source",void 0),p([i.Column.Text(),c("design:type",String)],exports.Log.prototype,"message",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Log.prototype,"created_at",void 0),exports.Log=p([i.Database(m),i.ModelName("log"),i.Version("4.2.0")],exports.Log),exports.Migration=class Migration extends i.Model{},p([i.Column.String(),c("design:type",String)],exports.Migration.prototype,"model",void 0),p([i.Column.String(),c("design:type",String)],exports.Migration.prototype,"version",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Migration.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Migration.prototype,"updated_at",void 0),exports.Migration=p([i.Database(m),i.ModelName("migration"),i.Version("4.2.0")],exports.Migration),exports.Session=class Session extends i.Model{},p([i.Column.String(),c("design:type",String)],exports.Session.prototype,"session",void 0),p([i.Column.Text(),c("design:type",String)],exports.Session.prototype,"json",void 0),p([i.Column.BigInt(),c("design:type",Number)],exports.Session.prototype,"expired",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Session.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Session.prototype,"updated_at",void 0),exports.Session=p([i.Database(m),i.ModelName("session"),i.Version("4.2.0")],exports.Session);class AuthBase{static error(e){let t="token";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),exports.Log.error(e.message,t,Env.API_CONSOLE_ERROR)}}class AuthKey extends AuthBase{static user(e,t){return g(this,void 0,void 0,function*(){if(!e)return{error:"INVALID TOKEN"};const r=t.hash.encrypt(e),o=yield exports.User.findOne({where:{token:r,state:!0}}).catch(this.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(this.error))||[];if(r)return r.logout&&(r.logout=null,yield r.save().catch(this.error)),{auth:r,user:o}}return{error:"ACCESS DENIED"}})}}const C=e=>n.existsSync(e)?n.readFileSync(e):void 0,_={http:C(Env.API_HTTP_CRT),token:C(Env.API_TOKEN_CRT)},S={http:C(Env.API_HTTP_KEY),token:C(Env.API_TOKEN_KEY)};class AuthToken extends AuthBase{static options(){return{algorithm:"RS256",expiresIn:`${Env.API_TOKEN_LIFETIME}ms`}}static create(t){return g(this,void 0,void 0,function*(){if(!S.token)return{error:"KEY NOT FOUND"};const{id:r}=t,o=e.uuidv7(),i=yield exports.Auth.create({secret:o,user_id:r}).catch(this.error);if(!i)return{error:"INTERNAL SERVER ERROR"};return{auth:i,token:s.sign({id:r,secret:o},S.token,this.options())}})}static destroy(e){return g(this,void 0,void 0,function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)})}static renew(t){return g(this,void 0,void 0,function*(){if(!S.token)return{error:"KEY NOT FOUND"};const{error:r,decode:o}=this.verify(t,Env.API_TOKEN_RENEW/1e3);if(r)return{error:r};if(o){const{id:t,secret:r}=o;if(t&&r){const o=yield exports.User.findOne({where:{id:t,state:!0}}).catch(this.error);if(o){const i=yield exports.Auth.findOne({where:{secret:r,user_id:o.id}}).catch(this.error);if(i&&!i.logout){i.secret=e.uuidv7(),yield i.save().catch(this.error);return{auth:i,token:s.sign({id:t,secret:i.secret},S.token,this.options())}}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}})}static user(e){return g(this,void 0,void 0,function*(){const{error:t,decode:r}=this.verify(e);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield exports.User.findOne({where:{id:e,state:!0}}).catch(this.error);if(r){const e=yield exports.Auth.findOne({where:{secret:t,user_id:r.id}}).catch(this.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}})}static verify(e,t){if(!_.token)return{error:"CERT NOT FOUND"};if(!e||e.split(".").length<3)return{error:"INVALID TOKEN"};try{return{decode:s.verify(e,_.token,{clockTolerance:t})}}catch(e){return{error:"INVALID TOKEN"}}}}class Store extends a.Store{constructor(){super(),this.all=t=>g(this,void 0,void 0,function*(){t=t||e.noop;const r=yield exports.Session.findAll({attributes:["session"],where:{expired:{[i.Op.gte]:Date.now()}}}).catch(e=>(t(e),null));r&&t(null,r.map(e=>e.session)),t()}),this.clear=t=>g(this,void 0,void 0,function*(){yield exports.Session.destroy().catch(e.noop),t&&t()}),this.destroy=(t,r)=>g(this,void 0,void 0,function*(){yield exports.Session.destroy({where:{session:t}}).catch(e.noop),r&&r()}),this.expired=()=>g(this,void 0,void 0,function*(){yield exports.Session.destroy({where:{expired:{[i.Op.lt]:Date.now()}}}).catch(e.noop)}),this.get=(t,r)=>g(this,void 0,void 0,function*(){r=r||e.noop;const o=yield exports.Session.findOne({where:{session:t,expired:{[i.Op.gte]:Date.now()}}}).catch(e=>(r(e),null));if(o){const t=JSON.parse(o.json);if(t.cookie){if(new Date(t.cookie.expires).getTime()<=Date.now())return yield o.destroy().catch(e.noop),void r(null)}return void r(null,t)}r(null)}),this.length=t=>g(this,void 0,void 0,function*(){t&&t(null,(yield exports.Session.count().catch(e.noop))||0)}),this.set=(t,r,o)=>g(this,void 0,void 0,function*(){o=o||e.noop;const i=Date.now()+Env.API_SESSION_LIFETIME,s=JSON.stringify(r),[n,d]=(yield exports.Session.findOrCreate({where:{session:t},defaults:{session:t,json:s,expired:i}}).catch(e.noop))||[];n&&(d||(n.json=s,n.expired=i,yield n.save().catch(e.noop))),o()}),this.loop=e.loop(this.expired,3e4),this.loop.start()}}class Application extends t.Application{constructor(t){super(t,{cert:_.http,cross:Env.API_HTTP_CROSS,hybrid:Env.API_HTTP_HYBRID,json:{strict:Env.API_BODYPARSER_STRICT,inflate:Env.API_BODYPARSER_INFLATE,limit:Env.API_BODYPARSER_LIMIT,type:Env.API_BODYPARSER_TYPE},key:S.http,notfound:Env.API_HTTP_NOTFOUND,path:Env.API_HTTP_PATH,port:Env.API_HTTP_PORT,public:Env.API_HTTP_PUBLIC,redirect:Env.API_HTTP_REDIRECT,session:{store:new Store,name:Env.API_SESSION_NAME,secret:Env.API_SESSION_SECRET,cookie:{maxAge:Env.API_SESSION_LIFETIME},genid:e.uuidv7}}),this.hash=new r.Hash(Env.API_KEY_HASH)}error(e,t){Env.API_BASE_NAME&&(t=t?`${Env.API_BASE_NAME}.${t}`:Env.API_BASE_NAME),exports.Log.error(e.message,t,Env.API_CONSOLE_ERROR)}log(e,t){Env.API_BASE_NAME&&(t=t?`${Env.API_BASE_NAME}.${t}`:Env.API_BASE_NAME),exports.Log.info(e,t,!0)}listen(){const t=Object.create(null,{listen:{get:()=>super.listen}});return g(this,void 0,void 0,function*(){yield m.sync(),yield this.migrations(m),yield e.forEachSeries(this.controllers,t=>g(this,void 0,void 0,function*(){e.isFunction(t.sync)&&(yield t.sync(this))})),yield t.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new d.WebSocketServer({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(t,r)=>g(this,void 0,void 0,function*(){r.url||(r.url="");const o=r.url.length<=1?"":r.url.replace(/\//g,".");let i;t.on("message",e=>g(this,void 0,void 0,function*(){if(i)try{const s=JSON.parse(e);this.emit("ws.message"+o,{data:s,message:e,req:r,user:i,ws:t})}catch(s){this.emit("ws.message"+o,{erro:s,message:e,req:r,user:i,ws:t})}else{const{user:s}=yield AuthToken.user(e.toString());s&&(i=s,this.emit("ws.connection"+o,{req:r,user:i,ws:t}))}i||t.close()})),t.on("close",()=>{i&&this.emit("ws.close"+o,{user:i,ws:t})}),yield e.sleep(2e3),i||t.close()})))})}migrations(t){return g(this,void 0,void 0,function*(){const r=[];yield e.forEachSeries(Object.keys(t.models),e=>g(this,void 0,void 0,function*(){var o;const i=t.models[e],s=i.version();if(!s)return;const[n,d]=null!==(o=yield exports.Migration.findOrCreate({where:{model:i.tableName},defaults:{model:i.tableName,version:""}}).catch(this.error))&&void 0!==o?o:[];n&&(d||n.version!=s)&&(n.version=s,yield n.save().catch(this.error),r.push(i))})),yield e.forEachSeries(r,e=>g(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}var P,O,f,I,R;class ControllerBase extends Controller{constructor(){super(...arguments),this[P]=[]}auth(e,t,r,o,i,s){return g(this,void 0,void 0,function*(){var n;t=null!=t?t:o;const[d,a]=null!==(n=null==r?void 0:r.split(" "))&&void 0!==n?n:["",""];if(!(t||a&&d.toLowerCase()==Env.API_TOKEN_HEADER_KEY))return e.error("INVALID TOKEN");const{auth:l,error:p,user:u}=yield t?AuthKey.user(t,s):AuthToken.user(a);return p?e.error(p):l&&u?!t&&l.user_agent&&l.user_agent!=i?e.error("INVALID TOKEN"):(e.req.auth=l,e.req.user=u,void e.next()):e.error("INTERNAL SERVER ERROR")})}canCreate(e,t,r){return g(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".create",r)})}canDelete(e,t,r){return g(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".delete",r)})}canRead(e,t,r){return g(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".read",r)})}canUpdate(e,t,r){return g(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".update",r)})}error(e){let t="controller_base";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),exports.Log.error(e.message,t,Env.API_CONSOLE_ERROR)}name(){var e,t;return(null!==(t=null===(e=this.constructor)||void 0===e?void 0:e.name)&&void 0!==t?t:"api").replace(/(([a-z])([A-Z]))/g,"$2_$3")}permission(e,t,r){return g(this,void 0,void 0,function*(){if(r){if((yield this.permissions(r,{route:t})).length>0)return e.next()}e.unauthorized("ACCESS DENIED")})}permissions(e,t){return g(this,void 0,void 0,function*(){var r;return null!==(r=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))&&void 0!==r?r:[]})}session(t,r,o){return g(this,void 0,void 0,function*(){o.auth&&o.user&&(o.user_agent?o.user_agent!=r&&o.regenerate(e.noop):(o.user_agent=r,o.save(e.noop))),t.next()})}sync(){return g(this,void 0,void 0,function*(){const t=this.name().toLowerCase(),r={description:"",state:!0};yield e.forEachSeries(this[Controller.PERMISSIONS],o=>g(this,void 0,void 0,function*(){const i=`${t}.${o}`,s=e.upperCamelCase(t.replace(/_/g," ")," ");yield exports.Permission.findOrCreate({where:{route:i},defaults:Object.assign({name:`${s} ${e.upperCamelCase(o," ")}`,route:i,tag:s},r)})}))})}upload(e,r){r.path||(r.path=Env.API_UPLOAD_TEMP),r.size||(r.size=Env.API_UPLOAD_SIZE),r.field||(r.field=Env.API_UPLOAD_FIELD),t.Upload.middleware(e,r)}validation(t,r){return g(this,void 0,void 0,function*(){const{error:o,value:i}=yield e.Validation.object(r).parse().validateAsync(t.req.body);if(o)return t.validation(o);t.req.body=i,t.next()})}}P=Controller.PERMISSIONS,p([u(0,t.Ctx()),u(1,t.Headers(Env.API_KEY_HEADER)),u(2,t.Headers(Env.API_TOKEN_HEADER)),u(3,t.Query(Env.API_KEY_HEADER)),u(4,t.Headers("user-agent")),u(5,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,String,String,String,Application]),c("design:returntype",Promise)],ControllerBase.prototype,"auth",null),p([u(0,t.Ctx()),u(1,t.Argument()),u(2,x()),c("design:type",Function),c("design:paramtypes",[t.Context,String,exports.User]),c("design:returntype",Promise)],ControllerBase.prototype,"canCreate",null),p([u(0,t.Ctx()),u(1,t.Argument()),u(2,x()),c("design:type",Function),c("design:paramtypes",[t.Context,String,exports.User]),c("design:returntype",Promise)],ControllerBase.prototype,"canDelete",null),p([u(0,t.Ctx()),u(1,t.Argument()),u(2,x()),c("design:type",Function),c("design:paramtypes",[t.Context,String,exports.User]),c("design:returntype",Promise)],ControllerBase.prototype,"canRead",null),p([u(0,t.Ctx()),u(1,t.Argument()),u(2,x()),c("design:type",Function),c("design:paramtypes",[t.Context,String,exports.User]),c("design:returntype",Promise)],ControllerBase.prototype,"canUpdate",null),p([u(0,t.Ctx()),u(1,t.Argument()),u(2,x()),c("design:type",Function),c("design:paramtypes",[t.Context,String,exports.User]),c("design:returntype",Promise)],ControllerBase.prototype,"permission",null),p([u(0,t.Ctx()),u(1,t.Headers("user-agent")),u(2,t.Session()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Object]),c("design:returntype",Promise)],ControllerBase.prototype,"session",null),p([u(0,t.Ctx()),u(1,t.Argument()),c("design:type",Function),c("design:paramtypes",[t.Context,Object]),c("design:returntype",void 0)],ControllerBase.prototype,"upload",null),p([u(0,t.Ctx()),u(1,t.Argument()),c("design:type",Function),c("design:paramtypes",[t.Context,Object]),c("design:returntype",Promise)],ControllerBase.prototype,"validation",null),exports.ControllerModel=class ControllerModel extends ControllerBase{constructor(){super(...arguments),this[O]=[],this[f]=["create","read","update","delete"]}attributes(t){if(0==this[ControllerBase.ATTRIBUTES].length&&(this[ControllerBase.ATTRIBUTES]=Object.keys(this.model().getAttributes())),e.isArray(t))return t.length?t.map(t=>e.isString(t)&&-1!=this[ControllerBase.ATTRIBUTES].indexOf(t)?t:void 0).filter(e.isString):this[ControllerBase.ATTRIBUTES];const{exclude:r,include:o}=t,i=e.isUndefined(o)?this[ControllerBase.ATTRIBUTES]:o.map(t=>e.isString(t)&&-1!=this[ControllerBase.ATTRIBUTES].indexOf(t)?t:void 0).filter(e.isString),s=null!=r?r:[];return s.length?i.filter(e=>-1==s.indexOf(e)?e:void 0).filter(e.isString):i}create(e){return g(this,arguments,void 0,function*({ctx:e,options:r,body:o}){const i=yield this.model().create(Object.assign(Object.assign({},e.req.body),o||{}),Object.assign(Object.assign({},r||{}),y(e))).catch(this.error);if(i){const r=this.key();return e.prepare(t.Status.OK,{[r]:i.getDataValue(r)}),i}e.error("INTERNAL SERVER ERROR")})}delete(e){return g(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 i=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[r]:o}),individualHooks:!0}),y(e))).catch(this.error);return i?(e.success("OK"),i):(e.notFound("RECORD NOT FOUND"),0)})}error(e){let t="controller_model";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),(null==e?void 0:e.sql)?exports.Log.error((null==e?void 0:e.message)+"\n"+(null==e?void 0:e.sql),t,Env.API_CONSOLE_ERROR):super.error(e)}findAll(r){return g(this,arguments,void 0,function*({ctx:r,options:o,callback:s,scope:n,advanced:d,attributes:a,limited:l}){var p,u,c;const g=this.scope(n),y=Object.assign({},o||{}),{fields:h,limit:v,offset:x,asc:m,desc:E,search:A,where:C}=r.req.query;if(e.isUndefined(y.limit)){let t=Env.API_MODEL_LIMIT;e.isString(v)&&(t=parseInt(v)||0),t=e.clamp(t,-1,Env.API_MODEL_LIMIT_MAX),y.limit=t>0?t:l?Env.API_MODEL_LIMIT:void 0}if(e.isNumber(y.limit)&&(y.limit=y.limit>0?y.limit:void 0),e.isString(x)){const e=parseInt(x)||0;y.offset=e>0?e:void 0}a=null!=a?a:this.attributes(null!==(p=null==y?void 0:y.attributes)&&void 0!==p?p:[]);const _=e=>a.indexOf(e)>=0,S=[];e.isString(h)&&S.push(...h.split(";").filter(_)),S.length&&(y.attributes=S);const P=[];if(e.isString(m)&&m.length&&P.push(...m.split(";").filter(_).map(e=>[e,"ASC"])),e.isString(E)&&E.length&&P.push(...E.split(";").filter(_).map(e=>[e,"DESC"])),P.length&&(y.order=P),y.where=Object.assign({},y.where||{}),e.isString(C)&&(null==d||d)){const t=i.Where.parse(a,C);if(!e.isUndefined(t.error))return r.validation(t.error.join(", ")),{count:0,records:[]};y.where=Object.assign(Object.assign({},y.where),null!==(u=t.value)&&void 0!==u?u:{})}else{const t=[];a.forEach(r=>{e.isString(A)&&A.length&&t.push({[r]:{[i.Op.like]:`%${A}%`}})}),t.length&&(y.where=Object.assign(Object.assign({},y.where),{[i.Op.or]:[...t]}))}const O=g.count(Object.assign(Object.assign({},y),{distinct:!!y.include,col:this[ControllerBase.ATTRIBUTES].length?this[ControllerBase.ATTRIBUTES][0]:void 0})).catch(this.error),f=g.findAll(y).catch(this.error);yield Promise.allSettled([O,f]);const I=null!==(c=yield O)&&void 0!==c?c:0;let R=yield f;const T={count:I};return R?(R=s?yield s(R):R,(e.isNumber(null==o?void 0:o.limit)||0==I)&&(T.count=R.length),r.prepare(t.Status.OK,Object.assign(Object.assign({},T),{records:R})),Object.assign(Object.assign({},T),{records:R})):(r.error("INTERNAL SERVER ERROR"),Object.assign(Object.assign({},T),{records:[]}))})}findOne(e){return g(this,arguments,void 0,function*({ctx:e,options:r,callback:o,scope:i}){const s=this.key(),{[s]:n}=e.req.params,d=yield this.scope(i).findOne(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[s]:n})})).catch(this.error);return d?(e.prepare(t.Status.OK,o?yield o(d):d.toJSON()),d):null===d?e.notFound("RECORD NOT FOUND"):void e.error("INTERNAL SERVER ERROR")})}sync(){return g(this,void 0,void 0,function*(){const t=this.name().toLowerCase(),r={description:"",state:!0};yield e.forEachSeries(this[ControllerBase.PERMISSIONS],o=>g(this,void 0,void 0,function*(){const i=`${t}.${o}`,s=e.upperCamelCase(t.replace(/_/g," ")," ");yield exports.Permission.findOrCreate({where:{route:i},defaults:Object.assign({name:`${s} ${e.upperCamelCase(o," ")}`,route:i,tag:s},r)})}))})}update(e){return g(this,arguments,void 0,function*({ctx:e,options:t,body:r}){var o;const i=this.key(),{[i]:s}=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),{[i]:s}),individualHooks:!0}),y(e))).catch(this.error))&&void 0!==o?o:[];return n?(e.success("OK"),!0):(e.success("RECORD NOT CHANGED"),!1)})}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}},O=ControllerBase.ATTRIBUTES,f=ControllerBase.PERMISSIONS,exports.ControllerModel=p([t.Extends(ControllerBase)],exports.ControllerModel),exports.ControllerCrud=class ControllerCrud extends exports.ControllerModel{constructor(){super(...arguments),this._crud={}}CrudArgumentsCreate(e){return{ctx:e}}CrudArgumentsFindAll(e){return{ctx:e}}CrudArgumentsFindOne(e){return{ctx:e}}CrudArgumentsDelete(e){return{ctx:e}}CrudArgumentsUpdate(e){return{ctx:e}}CrudValidationCreate(){return this._crud}CrudValidationUpdate(){return this._crud}add(e){return g(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return g(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}del(e){return g(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return g(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return g(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validationCreate(e){return g(this,void 0,void 0,function*(){const t=this.CrudValidationCreate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)})}validationUpdate(e){return g(this,void 0,void 0,function*(){const t=this.CrudValidationUpdate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)})}},p([t.Post(),t.Middleware("auth"),t.Middleware("canCreate"),t.Middleware("validationCreate"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.ControllerCrud.prototype,"add",null),p([t.Get(),t.Middleware("auth"),t.Middleware("canRead"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.ControllerCrud.prototype,"all",null),p([t.Delete("/:id"),t.Middleware("auth"),t.Middleware("canDelete"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.ControllerCrud.prototype,"del",null),p([t.Get("/:id"),t.Middleware("auth"),t.Middleware("canRead"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.ControllerCrud.prototype,"get",null),p([t.Put("/:id"),t.Middleware("auth"),t.Middleware("canUpdate"),t.Middleware("validationUpdate"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.ControllerCrud.prototype,"set",null),p([u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.ControllerCrud.prototype,"validationCreate",null),p([u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.ControllerCrud.prototype,"validationUpdate",null),exports.ControllerCrud=p([t.Extends(exports.ControllerModel)],exports.ControllerCrud),exports.AuditsController=class AuditsController extends exports.ControllerModel{model(){return exports.Audit}all(e,t,r){return g(this,void 0,void 0,function*(){const o={};t&&(o.type=t),r&&(o.table=r),yield this.findAll({ctx:e,options:{attributes:{exclude:["data","previously"]},where:o,order:[["created_at","DESC"]]},limited:!0})})}get(e){return g(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}},p([t.Get(),t.Middleware("auth"),t.Middleware("canRead"),u(0,t.Ctx()),u(1,t.Query("type")),u(2,t.Query("table")),c("design:type",Function),c("design:paramtypes",[t.Context,String,String]),c("design:returntype",Promise)],exports.AuditsController.prototype,"all",null),p([t.Get("/:id"),t.Middleware("auth"),t.Middleware("canRead"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.AuditsController.prototype,"get",null),exports.AuditsController=p([t.Controller("/audits"),t.Extends(exports.ControllerModel)],exports.AuditsController),exports.AuthController=class AuthController extends ControllerBase{login(t,o,s,n,d){return g(this,void 0,void 0,function*(){var a;yield e.sleep(Env.API_SLEEP_AUTH);const l=yield exports.User.scope("password").findOne({where:{[i.Op.or]:[{email:s},{username:s}]}}).catch(this.error);if(n+=null!==(a=null==l?void 0:l.salt)&&void 0!==a?a:"",!l||l.password!=r.sha256(n))return t.notFound("INVALID USERNAME OR PASSWORD"),d.emit("auth.failure",{ctx:t}),void this.emit("auth.failure",{ctx:t});const p=yield exports.Register.findOne({where:{state:!0,user_id:l.id}}).catch(this.error);if(p)return t.error("ACTIVATION REQUIRED"),d.emit("auth.activation",{ctx:t,register:p,user:l}),void this.emit("auth.activation",{ctx:t,register:p,user:l});if(!l.state)return t.notFound("INVALID USERNAME OR PASSWORD"),d.emit("auth.failure",{ctx:t,user:l}),void this.emit("auth.failure",{ctx:t,user:l});const{auth:u,error:c,token:g}=yield AuthToken.create(l);return c?(t.error(c),d.emit("auth.failure",{ctx:t}),void this.emit("auth.failure",{ctx:t})):u&&g?(u.user_agent=o,yield u.save().catch(this.error),t.json({token:g}),d.emit("auth.login",{auth:u,ctx:t,user:l}),void this.emit("auth.login",{auth:u,ctx:t,user:l})):(t.error("INTERNAL SERVER ERROR"),d.emit("auth.failure",{ctx:t}),void this.emit("auth.failure",{ctx:t}))})}logout(e,t,r,o){return g(this,void 0,void 0,function*(){if(yield AuthToken.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 g(this,void 0,void 0,function*(){const{auth:i,error:s,token:n}=yield AuthToken.renew(r);return s?e.error(s):i?(i.user_agent=t,yield i.save().catch(this.error),e.json({token:n}),o.emit("auth.renew",{auth:i,ctx:e}),void this.emit("auth.renew",{auth:i,ctx:e})):e.error("INTERNAL SERVER ERROR")})}user(t,r){return g(this,void 0,void 0,function*(){const o=yield this.permissions(r);if(!o)return t.error("INTERNAL SERVER ERROR");t.json(Object.assign(Object.assign({},e.denied(["username","date","description","state","created_at","updated_at","deleted_at"],r.toJSON())),{permissions:o.map(e=>e.route)}))})}},p([t.Post("/login"),t.Middleware("validation",{username:e.Validation.string().min(3).required(),password:e.Validation.string().min(5).required()}),u(0,t.Ctx()),u(1,t.Headers("user-agent")),u(2,t.Body("username")),u(3,t.Body("password")),u(4,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,String,String,Application]),c("design:returntype",Promise)],exports.AuthController.prototype,"login",null),p([t.Get("/logout"),t.Middleware("auth"),u(0,t.Ctx()),u(1,v()),u(2,x()),u(3,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,exports.Auth,exports.User,Application]),c("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),p([t.Post("/renew"),t.Middleware("validation",{token:e.Validation.string().required()}),u(0,t.Ctx()),u(1,t.Headers("user-agent")),u(2,t.Body("token")),u(3,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,String,Application]),c("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),p([t.Get(),t.Middleware("auth"),u(0,t.Ctx()),u(1,x()),c("design:type",Function),c("design:paramtypes",[t.Context,exports.User]),c("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=p([t.Controller("/auth"),t.Extends(ControllerBase)],exports.AuthController),exports.FilesController=class FilesController extends ControllerBase{constructor(){super(...arguments),this[I]=["delete","download","edit","list","read","rename","upload","write"]}directory(){return Env.API_HTTP_PUBLIC||"./"}files(t){return g(this,void 0,void 0,function*(){let{path:r}=t.req;r=r.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const o=l.join(this.directory(),r);if(!n.existsSync(o)||!n.statSync(o).isDirectory())return t.notFound("RECORD NOT FOUND");let i=[];return i=n.readdirSync(o),i=i.map(e=>this.info(l.join(o,e))),i=i.filter(e.isDef),Object.assign(Object.assign({},this.info(o)),{files:i})})}access(e,t,r){return g(this,void 0,void 0,function*(){yield this.permission(e,this.name()+"."+t,r)})}info(e){if(!n.existsSync(e))return null;const t=n.statSync(e),r=e.split("/").pop();e=e.replace(this.directory(),"/").replace(/^\/\//,"/");const 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"}sync(){return g(this,void 0,void 0,function*(){const t=this.name().toLowerCase(),r=e.upperCamelCase(t.replace(/_/g," ")," "),o={description:"",state:!0};yield e.forEachSeries(this[ControllerBase.PERMISSIONS],i=>g(this,void 0,void 0,function*(){const s=`${t}.${i}`;yield exports.Permission.findOrCreate({where:{route:s},defaults:Object.assign({name:`${r} ${e.upperCamelCase(i," ")}`,route:s,tag:r},o)})}))})}},I=ControllerBase.PERMISSIONS,p([t.Get("/path"),t.Get("/path/*path"),t.Middleware("auth"),t.Middleware("access","list"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.FilesController.prototype,"files",null),p([u(0,t.Ctx()),u(1,t.Argument()),u(2,x()),c("design:type",Function),c("design:paramtypes",[t.Context,String,exports.User]),c("design:returntype",Promise)],exports.FilesController.prototype,"access",null),exports.FilesController=p([t.Controller("/files"),t.Extends(ControllerBase)],exports.FilesController),exports.ForgotController=class ForgotController extends ControllerBase{check(t,r){return g(this,void 0,void 0,function*(){const o=yield this.find(r);if(!o||!o.user)return t.notFound("RECORD NOT FOUND");o.token=e.uniqueID(),yield o.save(),t.json({token:o.token})})}forgot(t,r,o){return g(this,void 0,void 0,function*(){yield e.sleep(Env.API_SLEEP_FORGOT);const s=r,n=yield exports.User.findOne({where:{[i.Op.or]:[{email:s},{username:r}]}}).catch(this.error);if(!n)return t.notFound("RECORD NOT FOUND");const d=e.uniqueID(),a=Date.now()+6e4*Env.API_TOKEN_FORGOT,l=yield exports.Forgot.create({token:d,timestamp:a,state:!0,user_id:n.id});t.success("OK"),o.emit("forgot.send",{ctx:t,forgot:l,user:n}),this.emit("forgot.send",{ctx:t,forgot:l,user:n})})}reset(e,t,o,i){return g(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=r.sha256(o),yield s.user.save().catch(this.error),e.success("OK"),i.emit("forgot.reset",{ctx:e,user:s.user}),this.emit("forgot.reset",{ctx:e,user:s.user})})}find(e){return g(this,void 0,void 0,function*(){return yield exports.Forgot.findOne({where:{token:e,state:!0},include:[{model:exports.User,required:!0}]}).catch(this.error)})}},p([t.Get("/check"),t.Middleware("validation",{token:e.Validation.string().required()}),u(0,t.Ctx()),u(1,t.Body("token")),c("design:type",Function),c("design:paramtypes",[t.Context,String]),c("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),p([t.Post(),t.Middleware("validation",{username:e.Validation.string().min(4).required()}),u(0,t.Ctx()),u(1,t.Body("username")),u(2,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Application]),c("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),p([t.Post("/reset"),t.Middleware("validation",{token:e.Validation.string().required(),password:e.Validation.string().min(5).required()}),u(0,t.Ctx()),u(1,t.Body("token")),u(2,t.Body("password")),u(3,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,String,Application]),c("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=p([t.Controller("/forgot"),t.Extends(ControllerBase)],exports.ForgotController),exports.GroupsController=class GroupsController extends exports.ControllerCrud{constructor(){super(...arguments),this.schemaCreate={name:e.Validation.string().required(),description:e.Validation.string().empty(""),state:e.Validation.boolean().parse().required()},this.schemaUpdate={name:e.Validation.string().empty(),description:e.Validation.string().empty(),state:e.Validation.boolean().parse().empty()}}model(){return exports.Group}CrudArgumentsFindAll(e){return{ctx:e}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}},exports.GroupsController=p([t.Controller("/groups"),t.Extends(exports.ControllerCrud)],exports.GroupsController),exports.GroupsPermissionsController=class GroupsPermissionsController extends exports.ControllerModel{model(){return exports.GroupPermission}all(e,t){return g(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{group_id:t},include:[{model:exports.Permission,required:!0}]},callback:e=>e.map(e=>e.permission)})})}me(e,t){return g(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(t,r,o,i){return g(this,void 0,void 0,function*(){const s=yield exports.Group.findByPk(r,{attributes:["id"]}).catch(this.error);if(!s)return t.notFound("RECORD NOT FOUND");const n=s.id;if(yield exports.GroupPermission.destroy(Object.assign({where:{group_id:n},individualHooks:!0},i)),o){let t=0;yield e.sleep(1e3);for(let e=0;e<o.length;e++)t=yield exports.Permission.count({where:{id:o[e]}}),t&&(yield exports.GroupPermission.create({group_id:n,permission_id:o[e]},Object.assign({},i)))}t.success("OK")})}},p([t.Get("/:id/permissions"),t.Middleware("auth"),t.Middleware("canRead","groups"),u(0,t.Ctx()),u(1,t.Params("id")),c("design:type",Function),c("design:paramtypes",[t.Context,String]),c("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"all",null),p([t.Get("/permissions"),t.Middleware("auth"),t.Middleware("canRead","users"),u(0,t.Ctx()),u(1,x()),c("design:type",Function),c("design:paramtypes",[t.Context,exports.User]),c("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"me",null),p([t.Put("/:id/permissions"),t.Middleware("auth"),t.Middleware("canUpdate","groups"),t.Middleware("validation",{permissions:e.Validation.array(e.Validation.number().parse())}),u(0,t.Ctx()),u(1,t.Params("id")),u(2,t.Body("permissions")),u(3,h()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Array,Object]),c("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"set",null),exports.GroupsPermissionsController=p([t.Controller("/groups"),t.Extends(exports.ControllerModel)],exports.GroupsPermissionsController),exports.LogsController=class LogsController extends exports.ControllerModel{constructor(){super(...arguments),this[R]=["read"]}model(){return exports.Log}all(e,t,r){return g(this,void 0,void 0,function*(){const o={};t&&(o.type=t),r&&(o.source=r),yield this.findAll({ctx:e,options:{where:o,order:[["created_at","DESC"]]},limited:!0})})}},R=exports.ControllerModel.PERMISSIONS,p([t.Get(),t.Middleware("auth"),t.Middleware("canRead"),u(0,t.Ctx()),u(1,t.Query("type")),u(2,t.Query("source")),c("design:type",Function),c("design:paramtypes",[t.Context,String,String]),c("design:returntype",Promise)],exports.LogsController.prototype,"all",null),exports.LogsController=p([t.Controller("/logs"),t.Extends(exports.ControllerModel)],exports.LogsController),exports.PermissionsController=class PermissionsController extends exports.ControllerCrud{constructor(){super(...arguments),this.schemaCreate={name:e.Validation.string().required(),route:e.Validation.string().required(),tag:e.Validation.string().required(),description:e.Validation.string().empty(""),state:e.Validation.boolean().parse().required()},this.schemaUpdate={name:e.Validation.string().empty(),route:e.Validation.string().empty(),tag:e.Validation.string().empty(),description:e.Validation.string().empty(),state:e.Validation.boolean().parse().empty()}}model(){return exports.Permission}CrudArgumentsFindAll(e){return{ctx:e}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}},exports.PermissionsController=p([t.Controller("/permissions"),t.Extends(exports.ControllerCrud)],exports.PermissionsController),exports.RegisterController=class RegisterController extends ControllerBase{register(t,o,s){return g(this,void 0,void 0,function*(){yield e.sleep(Env.API_SLEEP_REGISTRY);const{name:n,date:d,email:a,username:l,password:p,confirm:u}=o,c=l||a,g=r.sha256(p);if(yield exports.User.count({where:{[i.Op.or]:[{email:a},{username:c}]}}).catch(this.error))return t.validation("INVALID EMAIL OR USERNAME");if(g!=r.sha256(u))return t.error("INVALID PASSWORD");const y=yield exports.User.create({name:n,email:a,username:c,password:g,avatar:"",date:d,description:"",state:!1}).catch(this.error);if(!y)return t.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),t.error("INTERNAL SERVER ERROR");t.success("OK"),s.emit("register.user",{ctx:t,register:h,user:y}),this.emit("register.user",{ctx:t,register:h,user:y})})}confirm(e,t,r){return g(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 g(this,void 0,void 0,function*(){const o=t,s=yield exports.Register.findOne({where:{state:!0},include:[{model:exports.User,required:!0,where:{[i.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 g(this,void 0,void 0,function*(){const t=e.uuidv7();return(yield exports.Register.count({where:{token:t}}))?this.getId():t})}},p([t.Post(),t.Middleware("validation",{name:e.Validation.string().required(),date:e.Validation.date().required(),email:e.Validation.string().email().required(),username:e.Validation.string().min(4).empty(),password:e.Validation.string().min(5).required(),confirm:e.Validation.string().min(5).required()}),u(0,t.Ctx()),u(1,t.Body()),u(2,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,Object,Application]),c("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),p([t.Post("/confirm"),t.Middleware("validation",{token:e.Validation.string().required()}),u(0,t.Ctx()),u(1,t.Body("token")),u(2,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Application]),c("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),p([t.Post("/send"),t.Middleware("validation",{username:e.Validation.string().min(4).required()}),u(0,t.Ctx()),u(1,t.Body("username")),u(2,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Application]),c("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=p([t.Controller("/register"),t.Extends(ControllerBase)],exports.RegisterController),exports.SetupController=class SetupController extends ControllerBase{setup(t,o){return g(this,void 0,void 0,function*(){var i;if(yield exports.User.count())return t.success("OK");const s=e.uniqueID(),n=yield exports.User.create({name:"Admin",email:"admin@localhost",username:"admin",password:r.sha256("admin"+s),salt:s,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0},Object.assign({},o)),d=yield exports.Group.create(Object.assign({name:"Admin"},{description:"API CORE",state:!0}),Object.assign({},o));yield exports.UserGroup.create({user_id:n.id,group_id:d.id},Object.assign({},o));const a=null!==(i=yield exports.Permission.findAll({where:{state:!0}}).catch(this.error))&&void 0!==i?i:[];yield e.forEachSeries(a,e=>g(this,void 0,void 0,function*(){yield exports.GroupPermission.create({group_id:d.id,permission_id:e.id},Object.assign({},o))})),t.success("OK")})}},p([t.Get(),u(0,t.Ctx()),u(1,h()),c("design:type",Function),c("design:paramtypes",[t.Context,Object]),c("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=p([t.Controller("/setup"),t.Extends(ControllerBase)],exports.SetupController),exports.UsersController=class UsersController extends exports.ControllerModel{model(){return exports.User}constructor(){super(),this.path=Env.API_HTTP_PUBLIC+"/avatar",Env.API_HTTP_PUBLIC&&n.existsSync(Env.API_HTTP_PUBLIC)&&!n.existsSync(this.path)&&n.mkdirSync(this.path)}avatar(e,t,r,o){return g(this,void 0,void 0,function*(){if(t.length){const i=t[0].filename||"";if(i){const t=this.path+"/"+r.avatar;if(n.existsSync(t)&&n.lstatSync(t).isFile()&&n.rmSync(t),r.avatar=i,yield r.save(Object.assign({},o)).catch(this.error))return e.success("OK")}}e.success("RECORD NOT CHANGED")})}avatar_del(e,t,r){return g(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(t,o,i,s,n){return g(this,void 0,void 0,function*(){var d;if(Env.API_USER_HISTORY){if(yield exports.UserHistory.count({where:{password:r.sha256(i+s.id)}}).catch(this.error))return t.error("PASSWORD PREVIOUSLY REGISTERED")}const a=yield this.scope("password").findOne({where:{id:s.id,state:!0}}).catch(this.error);return o+=null!==(d=null==a?void 0:a.salt)&&void 0!==d?d:"",a&&a.password==r.sha256(o)?(a.salt=e.uniqueID(),a.password=r.sha256(i+a.salt),(yield a.save(Object.assign({},n)).catch(this.error))?t.success("OK"):void t.success("RECORD NOT CHANGED")):t.error("INVALID PASSWORD")})}token(e,t,r){return g(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_del(e,t,r){return g(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_get(e,t,r){return g(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_renew(e,t,r,o){return g(this,void 0,void 0,function*(){const i=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(i){const t=yield this.token_new();return i.token=o.hash.encrypt(t),yield i.save(Object.assign({},r)).catch(this.error),e.json({token:t})}e.notFound("RECORD NOT FOUND")})}token_new(){return g(this,void 0,void 0,function*(){var t;const r=e.uuidv7();return(null!==(t=yield this.model().count({where:{token:r}}).catch(this.error))&&void 0!==t?t:0)?this.token_new():r})}add(t,o){return g(this,void 0,void 0,function*(){const i=e.uniqueID(),s=yield this.create({ctx:t,body:{password:r.sha256(o+i),salt:i}});Env.API_USER_HISTORY&&s&&(yield exports.UserHistory.create({password:r.sha256(o+s.id),user_id:s.id}))})}all(e){return g(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["password","salt","token"]}}})})}del(e,t,r){return g(this,void 0,void 0,function*(){if(r.id.toString()==t)return e.notFound("RECORD NOT FOUND");yield this.delete({ctx:e})})}get(e){return g(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(t,o,i){return g(this,void 0,void 0,function*(){if(Env.API_USER_HISTORY&&i){const e=r.sha256(i+o);if(yield exports.UserHistory.count({where:{password:e}}).catch(this.error))return t.error("PASSWORD PREVIOUSLY REGISTERED");yield exports.UserHistory.create({password:e,user_id:o}).catch(this.error)}const s=i?e.uniqueID():"";yield this.update({ctx:t,body:i?{password:r.sha256(i+s),salt:s}:{}})})}},p([t.Post("/avatar"),t.Middleware("auth"),t.Middleware("upload",e=>({count:1,field:"file",path:e.controller.path,types:["image/bmp","image/jpeg","image/png"],size:32})),u(0,t.Ctx()),u(1,t.Files()),u(2,x()),u(3,h()),c("design:type",Function),c("design:paramtypes",[t.Context,Array,exports.User,Object]),c("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),p([t.Delete("/avatar"),t.Middleware("auth"),u(0,t.Ctx()),u(1,x()),u(2,h()),c("design:type",Function),c("design:paramtypes",[t.Context,exports.User,Object]),c("design:returntype",Promise)],exports.UsersController.prototype,"avatar_del",null),p([t.Post("/password"),t.Middleware("auth"),t.Middleware("validation",{oldPassword:e.Validation.string().min(5).required(),newPassword:e.Validation.string().min(5).required(),confirmPassword:e.Validation.string().equal(e.Validation.ref("newPassword"))}),u(0,t.Ctx()),u(1,t.Body("oldPassword")),u(2,t.Body("newPassword")),u(3,x()),u(4,h()),c("design:type",Function),c("design:paramtypes",[t.Context,String,String,exports.User,Object]),c("design:returntype",Promise)],exports.UsersController.prototype,"password",null),p([t.Get("/token"),t.Middleware("auth"),u(0,t.Ctx()),u(1,x()),u(2,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,exports.User,Application]),c("design:returntype",Promise)],exports.UsersController.prototype,"token",null),p([t.Delete("/token/:id"),t.Middleware("auth"),t.Middleware("canDelete"),u(0,t.Ctx()),u(1,t.Params("id")),u(2,h()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Object]),c("design:returntype",Promise)],exports.UsersController.prototype,"token_del",null),p([t.Get("/token/:id"),t.Middleware("auth"),t.Middleware("canCreate"),u(0,t.Ctx()),u(1,t.Params("id")),u(2,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Application]),c("design:returntype",Promise)],exports.UsersController.prototype,"token_get",null),p([t.Get("/token/renew/:id"),t.Middleware("auth"),t.Middleware("canUpdate"),u(0,t.Ctx()),u(1,t.Params("id")),u(2,h()),u(3,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Object,Application]),c("design:returntype",Promise)],exports.UsersController.prototype,"token_renew",null),p([t.Post(),t.Middleware("auth"),t.Middleware("canCreate"),t.Middleware("validation",{name:e.Validation.string().required(),email:e.Validation.string().email().required(),username:e.Validation.string().min(4).required(),password:e.Validation.string().min(5).required(),description:e.Validation.string().empty(""),state:e.Validation.boolean().parse().required()}),u(0,t.Ctx()),u(1,t.Body("password")),c("design:type",Function),c("design:paramtypes",[t.Context,String]),c("design:returntype",Promise)],exports.UsersController.prototype,"add",null),p([t.Get(),t.Middleware("auth"),t.Middleware("canRead"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.UsersController.prototype,"all",null),p([t.Delete("/:id"),t.Middleware("auth"),t.Middleware("canDelete"),u(0,t.Ctx()),u(1,t.Params("id")),u(2,x()),c("design:type",Function),c("design:paramtypes",[t.Context,String,exports.User]),c("design:returntype",Promise)],exports.UsersController.prototype,"del",null),p([t.Get("/:id"),t.Middleware("auth"),t.Middleware("canRead"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.UsersController.prototype,"get",null),p([t.Put("/:id"),t.Middleware("auth"),t.Middleware("canUpdate"),t.Middleware("validation",{name:e.Validation.string().empty(),email:e.Validation.string().email().empty(),username:e.Validation.string().min(4).empty(),password:e.Validation.string().min(5).empty().filter(""),description:e.Validation.string().empty(),state:e.Validation.boolean().parse().empty()}),u(0,t.Ctx()),u(1,t.Params("id")),u(2,t.Body("password")),c("design:type",Function),c("design:paramtypes",[t.Context,String,String]),c("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=p([t.Controller("/users"),t.Extends(exports.ControllerModel),c("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class UsersGroupsController extends exports.ControllerModel{model(){return exports.UserGroup}all(e,t){return g(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{user_id:t},include:[{model:exports.Group,required:!0}]},callback:e=>e.map(e=>e.group)})})}me(e,t){return g(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(t,r,o,i){return g(this,void 0,void 0,function*(){const s=yield exports.User.findByPk(r,{attributes:["id"]}).catch(this.error);if(!s)return t.notFound("RECORD NOT FOUND");if(yield exports.UserGroup.destroy(Object.assign({where:{user_id:s.id},individualHooks:!0},i)),o){let t=0;yield e.sleep(1e3);for(let e=0;e<o.length;e++)t=yield exports.Group.count({where:{id:o[e]}}),t&&(yield exports.UserGroup.create({user_id:s.id,group_id:o[e]},Object.assign({},i)))}t.success("OK")})}},p([t.Get("/:id/groups"),t.Middleware("auth"),t.Middleware("canRead","users"),u(0,t.Ctx()),u(1,t.Params("id")),c("design:type",Function),c("design:paramtypes",[t.Context,String]),c("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),p([t.Get("/groups"),t.Middleware("auth"),t.Middleware("canRead","users"),u(0,t.Ctx()),u(1,x()),c("design:type",Function),c("design:paramtypes",[t.Context,exports.User]),c("design:returntype",Promise)],exports.UsersGroupsController.prototype,"me",null),p([t.Put("/:id/groups"),t.Middleware("auth"),t.Middleware("canUpdate","users"),t.Middleware("validation",{groups:e.Validation.array(e.Validation.number().parse())}),u(0,t.Ctx()),u(1,t.Params("id")),u(2,t.Body("groups")),u(3,h()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Array,Object]),c("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=p([t.Controller("/users"),t.Extends(exports.ControllerModel)],exports.UsersGroupsController),exports.Application=Application,exports.AuthBase=AuthBase,exports.AuthKey=AuthKey,exports.AuthToken=AuthToken,exports.Controller=Controller,exports.ControllerBase=ControllerBase,exports.Env=Env,exports.ReqAudit=h,exports.ReqAuth=v,exports.ReqUser=x,exports.Store=Store,exports.audit=y,exports.crt=_,exports.database=m,exports.hooks=A,exports.key=S;
|
|
7
|
+
"use strict";var e=require("@andrewcaires/utils.js"),t=require("@andrewcaires/express"),r=require("@andrewcaires/node"),o=require("dotenv"),i=require("@andrewcaires/sequelize"),s=require("jsonwebtoken"),n=require("fs"),d=require("ws"),a=require("express-session"),l=require("path");class Controller extends e.EventEmitter{}function p(e,t,r,o){var i,s=arguments.length,n=s<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--)(i=e[d])&&(n=(s<3?i(n):s>3?i(t,r,n):i(t,r))||n);return s>3&&n&&Object.defineProperty(t,r,n),n}function u(e,t){return function(r,o){t(r,o,e)}}function c(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function g(e,t,r,o){return new(r||(r=Promise))(function(i,s){function n(e){try{a(o.next(e))}catch(e){s(e)}}function d(e){try{a(o.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(n,d)}a((o=o.apply(e,t||[])).next())})}Controller.ATTRIBUTES=Symbol("ATTRIBUTES"),Controller.PERMISSIONS=Symbol("PERMISSIONS"),"function"==typeof SuppressedError&&SuppressedError,o.config({quiet:!0});class Env extends r.Env{}Env.API_BASE_NAME=Env.getString("API_BASE_NAME",""),Env.API_BODYPARSER_STRICT=Env.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=Env.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=Env.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=Env.getString("API_BODYPARSER_TYPE","json"),Env.API_CONSOLE_ERROR=Env.getBool("API_CONSOLE_ERROR",!1),Env.API_DATABASE_URL=Env.getString("API_DATABASE_URL",""),Env.API_DATABASE_LOG=Env.getBool("API_DATABASE_LOG",!1),Env.API_DATABASE_AUDIT=Env.getBool("API_DATABASE_AUDIT",!0),Env.API_DATABASE_PREFIX=Env.getString("API_DATABASE_PREFIX",""),Env.API_DATABASE_TIMEZONE=Env.getString("API_DATABASE_TIMEZONE","+00:00"),Env.API_HTTP_CRT=Env.getString("API_HTTP_CRT",""),Env.API_HTTP_KEY=Env.getString("API_HTTP_KEY",""),Env.API_HTTP_PORT=Env.getInt("API_HTTP_PORT",3e3),Env.API_HTTP_PUBLIC=Env.getString("API_HTTP_PUBLIC",""),Env.API_HTTP_CROSS=Env.getBool("API_HTTP_CROSS",!1),Env.API_HTTP_HYBRID=Env.getBool("API_HTTP_HYBRID",!1),Env.API_HTTP_NOTFOUND=Env.getString("API_HTTP_NOTFOUND",""),Env.API_HTTP_PATH=Env.getString("API_HTTP_PATH","/api"),Env.API_HTTP_REDIRECT=Env.getString("API_HTTP_REDIRECT",""),Env.API_KEY_HASH=Env.getString("API_KEY_HASH",""),Env.API_KEY_HEADER=Env.getString("API_KEY_HEADER","x-api-key"),Env.API_MODEL_LIMIT=Env.getInt("API_MODEL_LIMIT",10),Env.API_MODEL_LIMIT_MAX=Env.getInt("API_MODEL_LIMIT_MAX",500),Env.API_SLEEP_AUTH=Env.getMs("API_SLEEP_AUTH","2s"),Env.API_SLEEP_FORGOT=Env.getMs("API_SLEEP_FORGOT","5s"),Env.API_SLEEP_REGISTRY=Env.getMs("API_SLEEP_REGISTRY","5s"),Env.API_SESSION_NAME=Env.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=Env.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=Env.getString("API_SESSION_SECRET","yoursecret"),Env.API_TOKEN_COOKIE=Env.getString("API_TOKEN_COOKIE","authorization"),Env.API_TOKEN_COOKIE_SET=Env.getBool("API_TOKEN_COOKIE_SET",!0),Env.API_TOKEN_CRT=Env.getString("API_TOKEN_CRT",""),Env.API_TOKEN_KEY=Env.getString("API_TOKEN_KEY",""),Env.API_TOKEN_FORGOT=Env.getMs("API_TOKEN_FORGOT","1d"),Env.API_TOKEN_HEADER=Env.getString("API_TOKEN_HEADER","authorization"),Env.API_TOKEN_HEADER_KEY=Env.getString("API_TOKEN_HEADER","bearer"),Env.API_TOKEN_LIFETIME=Env.getMs("API_TOKEN_LIFETIME","1d"),Env.API_TOKEN_RENEW=Env.getMs("API_TOKEN_RENEW","1d"),Env.API_UPLOAD_COUNT=Env.getInt("API_UPLOAD_COUNT",1),Env.API_UPLOAD_FIELD=Env.getString("API_UPLOAD_FIELD","upload"),Env.API_UPLOAD_SIZE=Env.getInt("API_UPLOAD_SIZE",2),Env.API_UPLOAD_TEMP=Env.getString("API_UPLOAD_TEMP","./temp"),Env.API_USER_HISTORY=Env.getBool("API_USER_HISTORY",!0),Env.API_WEBSOCKET_START=Env.getBool("API_WEBSOCKET_START",!1);const y=e=>{var t,r,o,i,s,n,d,a,l;return{audit_client:null!==(t=e.getIp())&&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===(i=null==e?void 0:e.req)||void 0===i?void 0:i.originalUrl),audit_user_agent:null!==(n=null===(s=e.req)||void 0===s?void 0:s.headers["user-agent"])&&void 0!==n?n:"",audit_user_id:null!==(l=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!==l?l:null}},v=t.parameterFactory(({ctx:e})=>y(e)),h=t.parameterFactory(({ctx:e})=>e.req.auth),x=t.parameterFactory(({ctx:e})=>e.req.user),E=new i.Sequelize(Env.API_DATABASE_URL,{logging:Env.API_DATABASE_LOG,prefix:Env.API_DATABASE_PREFIX,timezone:Env.API_DATABASE_TIMEZONE}),m=(e,t,r)=>{var o,i,s,n,d;return{type:e,model:null!==(o=null==t?void 0:t.getTableName())&&void 0!==o?o:null,client:null!==(i=null==r?void 0:r.audit_client)&&void 0!==i?i:null,href:null!==(s=null==r?void 0:r.audit_href)&&void 0!==s?s: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}},A={afterCreate:(t,r)=>g(void 0,void 0,void 0,function*(){var o;if(!Env.API_DATABASE_AUDIT)return;const i=e.isObject(t)?t.constructor:null,s=null!==(o=null==i?void 0:i.primaryKeyAttribute)&&void 0!==o?o:null;yield exports.Audit.create(Object.assign(Object.assign({},m("CREATE",i,r)),{record:s?t.getDataValue(s):null,data:t.toJSON()})).catch(e.noop)}),afterUpdate:(t,r)=>g(void 0,void 0,void 0,function*(){var o;if(!Env.API_DATABASE_AUDIT)return;const i=e.isObject(t)?t.constructor:null,s=null!==(o=null==i?void 0:i.primaryKeyAttribute)&&void 0!==o?o:null,n={},d=t.changed();d&&d.forEach(e=>n[e]=t.getDataValue(e)),yield exports.Audit.create(Object.assign(Object.assign({},m("UPDATE",i,r)),{record:s?t.getDataValue(s):null,data:n,previously:t.previous()})).catch(e.noop)}),afterDestroy:(t,r)=>g(void 0,void 0,void 0,function*(){var o;if(!Env.API_DATABASE_AUDIT)return;const i=e.isObject(t)?t.constructor:null,s=null!==(o=null==i?void 0:i.primaryKeyAttribute)&&void 0!==o?o:null;yield exports.Audit.create(Object.assign(Object.assign({},m("DELETE",i,r)),{record:s?t.getDataValue(s):null,data:t.toJSON()})).catch(e.noop)})};exports.Auth=class Auth extends i.Model{},p([i.Column.Id(),c("design:type",Number)],exports.Auth.prototype,"id",void 0),p([i.Column.String(),c("design:type",String)],exports.Auth.prototype,"secret",void 0),p([i.Column.FullDate(),c("design:type",Object)],exports.Auth.prototype,"logout",void 0),p([i.Column.String(),c("design:type",String)],exports.Auth.prototype,"user_agent",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Auth.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Auth.prototype,"updated_at",void 0),p([i.Column.DeletedAt,c("design:type",Object)],exports.Auth.prototype,"deleted_at",void 0),p([i.BelongsTo(()=>exports.User),c("design:type",Number)],exports.Auth.prototype,"user_id",void 0),exports.Auth=p([i.Database(E),i.ModelName("auth"),i.Version("4.2.0")],exports.Auth),exports.Register=class Register extends i.Model{},p([i.Column.Id(),c("design:type",Number)],exports.Register.prototype,"id",void 0),p([i.Column.String(),c("design:type",String)],exports.Register.prototype,"token",void 0),p([i.Column.Boolean(),c("design:type",Boolean)],exports.Register.prototype,"state",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Register.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Register.prototype,"updated_at",void 0),p([i.Column.DeletedAt,c("design:type",Object)],exports.Register.prototype,"deleted_at",void 0),p([i.BelongsTo(()=>exports.User),c("design:type",Number)],exports.Register.prototype,"user_id",void 0),exports.Register=p([i.Database(E),i.ModelName("register"),i.Version("4.2.0")],exports.Register),exports.Group=class Group extends i.Model{},p([i.Column.Id(),c("design:type",Number)],exports.Group.prototype,"id",void 0),p([i.Column.String(),c("design:type",String)],exports.Group.prototype,"name",void 0),p([i.Column.Text(),c("design:type",String)],exports.Group.prototype,"description",void 0),p([i.Column.Boolean(),c("design:type",Boolean)],exports.Group.prototype,"state",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Group.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Group.prototype,"updated_at",void 0),p([i.Column.DeletedAt,c("design:type",Object)],exports.Group.prototype,"deleted_at",void 0),p([i.HasMany(()=>exports.UserGroup,"group_id"),c("design:type",Array)],exports.Group.prototype,"groups_routes",void 0),p([i.HasMany(()=>exports.UserGroup,"group_id"),c("design:type",Array)],exports.Group.prototype,"users_groups",void 0),exports.Group=p([i.Database(E),i.ModelName("group"),i.Hooks(A),i.Version("4.2.0")],exports.Group),exports.UserGroup=class UserGroup extends i.Model{},p([i.Column.CreatedAt,c("design:type",Date)],exports.UserGroup.prototype,"created_at",void 0),p([i.BelongsTo(()=>exports.Group),c("design:type",Number)],exports.UserGroup.prototype,"group_id",void 0),p([i.BelongsTo(()=>exports.User),c("design:type",Number)],exports.UserGroup.prototype,"user_id",void 0),exports.UserGroup=p([i.Database(E),i.ModelName("users_groups"),i.Hooks(A),i.Version("4.2.0")],exports.UserGroup),exports.UserHistory=class UserHistory extends i.Model{},p([i.Column.String(),c("design:type",String)],exports.UserHistory.prototype,"password",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.UserHistory.prototype,"created_at",void 0),p([i.BelongsTo(()=>exports.User),c("design:type",Number)],exports.UserHistory.prototype,"user_id",void 0),exports.UserHistory=p([i.Database(E),i.ModelName("users_histories"),i.Version("4.2.0")],exports.UserHistory),exports.User=class User extends i.Model{},p([i.Column.Id(),c("design:type",Number)],exports.User.prototype,"id",void 0),p([i.Column.String(),c("design:type",String)],exports.User.prototype,"name",void 0),p([i.Column.String(),c("design:type",String)],exports.User.prototype,"email",void 0),p([i.Column.String(),c("design:type",String)],exports.User.prototype,"username",void 0),p([i.Column.String(),c("design:type",String)],exports.User.prototype,"password",void 0),p([i.Column.String(),c("design:type",String)],exports.User.prototype,"salt",void 0),p([i.Column.String(),c("design:type",String)],exports.User.prototype,"token",void 0),p([i.Column.String(),c("design:type",String)],exports.User.prototype,"avatar",void 0),p([i.Column.DateOnly(),c("design:type",String)],exports.User.prototype,"date",void 0),p([i.Column.Text(),c("design:type",String)],exports.User.prototype,"description",void 0),p([i.Column.Boolean(),c("design:type",Boolean)],exports.User.prototype,"state",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.User.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.User.prototype,"updated_at",void 0),p([i.Column.DeletedAt,c("design:type",Object)],exports.User.prototype,"deleted_at",void 0),p([i.HasMany(()=>exports.Audit,"user_id"),c("design:type",Array)],exports.User.prototype,"audits",void 0),p([i.HasMany(()=>exports.Auth,"user_id"),c("design:type",Array)],exports.User.prototype,"auths",void 0),p([i.HasMany(()=>exports.Register,"user_id"),c("design:type",Array)],exports.User.prototype,"registers",void 0),p([i.HasMany(()=>exports.UserGroup,"user_id"),c("design:type",Array)],exports.User.prototype,"users_groups",void 0),p([i.HasMany(()=>exports.UserHistory,"user_id"),c("design:type",Array)],exports.User.prototype,"users_histories",void 0),exports.User=p([i.Database(E),i.ModelName("user"),i.DefaultScope({attributes:{exclude:["password","salt","token"]}}),i.Scopes({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),i.Hooks(A),i.Version("4.2.0")],exports.User),exports.Audit=class Audit extends i.Model{},p([i.Column.Id(),c("design:type",Number)],exports.Audit.prototype,"id",void 0),p([i.Column.Enum("CREATE","DELETE","UPDATE"),c("design:type",String)],exports.Audit.prototype,"type",void 0),p([i.Column.String(),c("design:type",String)],exports.Audit.prototype,"model",void 0),p([i.Column.String(),c("design:type",String)],exports.Audit.prototype,"record",void 0),p([i.Column.Json(),c("design:type",Object)],exports.Audit.prototype,"data",void 0),p([i.Column.Json(),c("design:type",Object)],exports.Audit.prototype,"previously",void 0),p([i.Column.String(),c("design:type",String)],exports.Audit.prototype,"client",void 0),p([i.Column.Text(),c("design:type",String)],exports.Audit.prototype,"href",void 0),p([i.Column.String(),c("design:type",String)],exports.Audit.prototype,"user_agent",void 0),p([i.Column.Boolean(),c("design:type",Boolean)],exports.Audit.prototype,"state",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Audit.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Audit.prototype,"updated_at",void 0),p([i.Column.DeletedAt,c("design:type",Object)],exports.Audit.prototype,"deleted_at",void 0),p([i.BelongsTo(()=>exports.User),c("design:type",Number)],exports.Audit.prototype,"user_id",void 0),exports.Audit=p([i.Database(E),i.ModelName("audit"),i.Version("4.2.0")],exports.Audit),exports.Config=class Config extends i.Model{static all(){return g(this,void 0,void 0,function*(){const e=yield this.findAll().catch(this.error),t={};return e&&e.forEach(e=>t[e.key]=e.value),t})}static del(e,t){return g(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 this.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:o})).catch(this.error))||0)>0})}static get(e){return g(this,arguments,void 0,function*(e,t=""){const[r]=(yield this.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return r?r.value:t})}static set(e,t,r){return g(this,void 0,void 0,function*(){var o;const i=null!==(o=null==r?void 0:r.id)&&void 0!==o?o:null,[s]=(yield this.findOrCreate(Object.assign({where:{key:e}},{user_id:i})).catch(this.error))||[];s&&(s.value=t,yield s.save().catch(this.error))})}},p([i.Column.String(),c("design:type",String)],exports.Config.prototype,"key",void 0),p([i.Column.String(),c("design:type",String)],exports.Config.prototype,"value",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Config.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Config.prototype,"updated_at",void 0),exports.Config=p([i.Database(E),i.ModelName("configs"),i.Version("4.2.0")],exports.Config),exports.Forgot=class Forgot extends i.Model{},p([i.Column.Id(),c("design:type",Number)],exports.Forgot.prototype,"id",void 0),p([i.Column.String(),c("design:type",String)],exports.Forgot.prototype,"token",void 0),p([i.Column.BigInt(),c("design:type",Number)],exports.Forgot.prototype,"timestamp",void 0),p([i.Column.Boolean(),c("design:type",Boolean)],exports.Forgot.prototype,"state",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Forgot.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Forgot.prototype,"updated_at",void 0),p([i.Column.DeletedAt,c("design:type",Object)],exports.Forgot.prototype,"deleted_at",void 0),p([i.BelongsTo(()=>exports.User),c("design:type",Number)],exports.Forgot.prototype,"user_id",void 0),exports.Forgot=p([i.Database(E),i.ModelName("forgot"),i.Version("4.2.0")],exports.Forgot),exports.Permission=class Permission extends i.Model{},p([i.Column.Id(),c("design:type",Number)],exports.Permission.prototype,"id",void 0),p([i.Column.String(),c("design:type",String)],exports.Permission.prototype,"name",void 0),p([i.Column.String(),i.Unique(!0),c("design:type",String)],exports.Permission.prototype,"route",void 0),p([i.Column.String(),c("design:type",String)],exports.Permission.prototype,"tag",void 0),p([i.Column.Text(),c("design:type",String)],exports.Permission.prototype,"description",void 0),p([i.Column.Boolean(),c("design:type",Boolean)],exports.Permission.prototype,"state",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Permission.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Permission.prototype,"updated_at",void 0),p([i.Column.DeletedAt,c("design:type",Object)],exports.Permission.prototype,"deleted_at",void 0),p([i.HasMany(()=>exports.GroupPermission,"permission_id"),c("design:type",Array)],exports.Permission.prototype,"groups_permissions",void 0),exports.Permission=p([i.Database(E),i.ModelName("permission"),i.Hooks(A),i.Version("4.3.1")],exports.Permission),exports.GroupPermission=class GroupPermission extends i.Model{},p([i.Column.CreatedAt,c("design:type",Date)],exports.GroupPermission.prototype,"created_at",void 0),p([i.BelongsTo(()=>exports.Group),c("design:type",Number)],exports.GroupPermission.prototype,"group_id",void 0),p([i.BelongsTo(()=>exports.Permission),c("design:type",Number)],exports.GroupPermission.prototype,"permission_id",void 0),exports.GroupPermission=p([i.Database(E),i.ModelName("groups_permissions"),i.Hooks(A),i.Version("4.2.0")],exports.GroupPermission),exports.Log=class Log extends i.Model{static write(e,t,o){return g(this,void 0,void 0,function*(){yield this.writeRaw(r.LogColor.White,"",e,t,o)})}static error(e,t,o){return g(this,void 0,void 0,function*(){yield this.writeRaw(r.LogColor.Red,"error",e,t,o)})}static info(e,t,o){return g(this,void 0,void 0,function*(){yield this.writeRaw(r.LogColor.Cyan,"info",e,t,o)})}static success(e,t,o){return g(this,void 0,void 0,function*(){yield this.writeRaw(r.LogColor.Green,"success",e,t,o)})}static warning(e,t,o){return g(this,void 0,void 0,function*(){yield this.writeRaw(r.LogColor.Yellow,"warning",e,t,o)})}static writeRaw(e,t,o,i,s){return g(this,void 0,void 0,function*(){s&&r.Log.console(e,t,o),E&&(yield this.create({type:t,source:i,message:o}).catch(this.error))})}},p([i.Column.Id(),c("design:type",Number)],exports.Log.prototype,"id",void 0),p([i.Column.String(),c("design:type",String)],exports.Log.prototype,"type",void 0),p([i.Column.String(),c("design:type",String)],exports.Log.prototype,"source",void 0),p([i.Column.Text(),c("design:type",String)],exports.Log.prototype,"message",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Log.prototype,"created_at",void 0),exports.Log=p([i.Database(E),i.ModelName("log"),i.Version("4.2.0")],exports.Log),exports.Migration=class Migration extends i.Model{},p([i.Column.String(),c("design:type",String)],exports.Migration.prototype,"model",void 0),p([i.Column.String(),c("design:type",String)],exports.Migration.prototype,"version",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Migration.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Migration.prototype,"updated_at",void 0),exports.Migration=p([i.Database(E),i.ModelName("migration"),i.Version("4.2.0")],exports.Migration),exports.Session=class Session extends i.Model{},p([i.Column.String(),c("design:type",String)],exports.Session.prototype,"session",void 0),p([i.Column.Text(),c("design:type",String)],exports.Session.prototype,"json",void 0),p([i.Column.BigInt(),c("design:type",Number)],exports.Session.prototype,"expired",void 0),p([i.Column.CreatedAt,c("design:type",Date)],exports.Session.prototype,"created_at",void 0),p([i.Column.UpdatedAt,c("design:type",Date)],exports.Session.prototype,"updated_at",void 0),exports.Session=p([i.Database(E),i.ModelName("session"),i.Version("4.2.0")],exports.Session);class AuthBase{static error(e){let t="token";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),exports.Log.error(e.message,t,Env.API_CONSOLE_ERROR)}}class AuthKey extends AuthBase{static user(e,t){return g(this,void 0,void 0,function*(){if(!e)return{error:"INVALID TOKEN"};const r=t.hash.encrypt(e),o=yield exports.User.findOne({where:{token:r,state:!0}}).catch(this.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(this.error))||[];if(r)return r.logout&&(r.logout=null,yield r.save().catch(this.error)),{auth:r,user:o}}return{error:"ACCESS DENIED"}})}}const C=e=>n.existsSync(e)?n.readFileSync(e):void 0,_={http:C(Env.API_HTTP_CRT),token:C(Env.API_TOKEN_CRT)},S={http:C(Env.API_HTTP_KEY),token:C(Env.API_TOKEN_KEY)};class AuthToken extends AuthBase{static options(){return{algorithm:"RS256",expiresIn:`${Env.API_TOKEN_LIFETIME}ms`}}static create(t){return g(this,void 0,void 0,function*(){if(!S.token)return{error:"KEY NOT FOUND"};const{id:r}=t,o=e.uuidv7(),i=yield exports.Auth.create({secret:o,user_id:r}).catch(this.error);if(!i)return{error:"INTERNAL SERVER ERROR"};return{auth:i,token:s.sign({id:r,secret:o},S.token,this.options())}})}static destroy(e){return g(this,void 0,void 0,function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)})}static renew(t){return g(this,void 0,void 0,function*(){if(!S.token)return{error:"KEY NOT FOUND"};const{error:r,decode:o}=this.verify(t,Env.API_TOKEN_RENEW/1e3);if(r)return{error:r};if(o){const{id:t,secret:r}=o;if(t&&r){const o=yield exports.User.findOne({where:{id:t,state:!0}}).catch(this.error);if(o){const i=yield exports.Auth.findOne({where:{secret:r,user_id:o.id}}).catch(this.error);if(i&&!i.logout){i.secret=e.uuidv7(),yield i.save().catch(this.error);return{auth:i,token:s.sign({id:t,secret:i.secret},S.token,this.options())}}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}})}static user(e){return g(this,void 0,void 0,function*(){const{error:t,decode:r}=this.verify(e);if(t)return{error:t};if(r){const{id:e,secret:t}=r;if(e&&t){const r=yield exports.User.findOne({where:{id:e,state:!0}}).catch(this.error);if(r){const e=yield exports.Auth.findOne({where:{secret:t,user_id:r.id}}).catch(this.error);if(e&&!e.logout)return{auth:e,user:r}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}})}static verify(e,t){if(!_.token)return{error:"CERT NOT FOUND"};if(!e||e.split(".").length<3)return{error:"INVALID TOKEN"};try{return{decode:s.verify(e,_.token,{clockTolerance:t})}}catch(e){return{error:"INVALID TOKEN"}}}}class Store extends a.Store{constructor(){super(),this.all=t=>g(this,void 0,void 0,function*(){t=t||e.noop;const r=yield exports.Session.findAll({attributes:["session"],where:{expired:{[i.Op.gte]:Date.now()}}}).catch(e=>(t(e),null));r&&t(null,r.map(e=>e.session)),t()}),this.clear=t=>g(this,void 0,void 0,function*(){yield exports.Session.destroy().catch(e.noop),t&&t()}),this.destroy=(t,r)=>g(this,void 0,void 0,function*(){yield exports.Session.destroy({where:{session:t}}).catch(e.noop),r&&r()}),this.expired=()=>g(this,void 0,void 0,function*(){yield exports.Session.destroy({where:{expired:{[i.Op.lt]:Date.now()}}}).catch(e.noop)}),this.get=(t,r)=>g(this,void 0,void 0,function*(){r=r||e.noop;const o=yield exports.Session.findOne({where:{session:t,expired:{[i.Op.gte]:Date.now()}}}).catch(e=>(r(e),null));if(o){const t=JSON.parse(o.json);if(t.cookie){if(new Date(t.cookie.expires).getTime()<=Date.now())return yield o.destroy().catch(e.noop),void r(null)}return void r(null,t)}r(null)}),this.length=t=>g(this,void 0,void 0,function*(){t&&t(null,(yield exports.Session.count().catch(e.noop))||0)}),this.set=(t,r,o)=>g(this,void 0,void 0,function*(){o=o||e.noop;const i=Date.now()+Env.API_SESSION_LIFETIME,s=JSON.stringify(r),[n,d]=(yield exports.Session.findOrCreate({where:{session:t},defaults:{session:t,json:s,expired:i}}).catch(e.noop))||[];n&&(d||(n.json=s,n.expired=i,yield n.save().catch(e.noop))),o()}),this.loop=e.loop(this.expired,3e4),this.loop.start()}}class Application extends t.Application{constructor(t){super(t,{cert:_.http,cross:Env.API_HTTP_CROSS,hybrid:Env.API_HTTP_HYBRID,json:{strict:Env.API_BODYPARSER_STRICT,inflate:Env.API_BODYPARSER_INFLATE,limit:Env.API_BODYPARSER_LIMIT,type:Env.API_BODYPARSER_TYPE},key:S.http,notfound:Env.API_HTTP_NOTFOUND,path:Env.API_HTTP_PATH,port:Env.API_HTTP_PORT,public:Env.API_HTTP_PUBLIC,redirect:Env.API_HTTP_REDIRECT,session:{store:new Store,name:Env.API_SESSION_NAME,secret:Env.API_SESSION_SECRET,cookie:{maxAge:Env.API_SESSION_LIFETIME},genid:e.uuidv7}}),this.hash=new r.Hash(Env.API_KEY_HASH)}error(e,t){Env.API_BASE_NAME&&(t=t?`${Env.API_BASE_NAME}.${t}`:Env.API_BASE_NAME),exports.Log.error(e.message,t,Env.API_CONSOLE_ERROR)}log(e,t){Env.API_BASE_NAME&&(t=t?`${Env.API_BASE_NAME}.${t}`:Env.API_BASE_NAME),exports.Log.info(e,t,!0)}listen(){const t=Object.create(null,{listen:{get:()=>super.listen}});return g(this,void 0,void 0,function*(){yield E.sync(),yield this.migrations(E),yield e.forEachSeries(this.controllers,t=>g(this,void 0,void 0,function*(){e.isFunction(t.sync)&&(yield t.sync(this))})),yield t.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new d.WebSocketServer({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(t,r)=>g(this,void 0,void 0,function*(){r.url||(r.url="");const o=r.url.length<=1?"":r.url.replace(/\//g,".");let i;t.on("message",e=>g(this,void 0,void 0,function*(){if(i)try{const s=JSON.parse(e);this.emit("ws.message"+o,{data:s,message:e,req:r,user:i,ws:t})}catch(s){this.emit("ws.message"+o,{erro:s,message:e,req:r,user:i,ws:t})}else{const{user:s}=yield AuthToken.user(e.toString());s&&(i=s,this.emit("ws.connection"+o,{req:r,user:i,ws:t}))}i||t.close()})),t.on("close",()=>{i&&this.emit("ws.close"+o,{user:i,ws:t})}),yield e.sleep(2e3),i||t.close()})))})}migrations(t){return g(this,void 0,void 0,function*(){const r=[];yield e.forEachSeries(Object.keys(t.models),e=>g(this,void 0,void 0,function*(){var o;const i=t.models[e],s=i.version();if(!s)return;const[n,d]=null!==(o=yield exports.Migration.findOrCreate({where:{model:i.tableName},defaults:{model:i.tableName,version:""}}).catch(this.error))&&void 0!==o?o:[];n&&(d||n.version!=s)&&(n.version=s,yield n.save().catch(this.error),r.push(i))})),yield e.forEachSeries(r,e=>g(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}var O,P,I,f,R;class ControllerBase extends Controller{constructor(){super(...arguments),this[O]=[]}auth(e,t,r,o,i,s,n){return g(this,void 0,void 0,function*(){var d,a;t=null!=t?t:i,o=`${Env.API_TOKEN_HEADER_KEY} ${o}`;const[l,p]=null!==(a=null===(d=null!=r?r:o)||void 0===d?void 0:d.split(" "))&&void 0!==a?a:["",""];if(!(t||p&&l.toLowerCase()==Env.API_TOKEN_HEADER_KEY))return e.error("INVALID TOKEN");const{auth:u,error:c,user:g}=yield t?AuthKey.user(t,n):AuthToken.user(p);return c?e.error(c):u&&g?!t&&u.user_agent&&u.user_agent!=s?e.error("INVALID TOKEN"):(e.req.auth=u,e.req.user=g,void e.next()):e.error("INTERNAL SERVER ERROR")})}canCreate(e,t,r){return g(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".create",r)})}canDelete(e,t,r){return g(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".delete",r)})}canRead(e,t,r){return g(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".read",r)})}canUpdate(e,t,r){return g(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".update",r)})}error(e){let t="controller_base";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),exports.Log.error(e.message,t,Env.API_CONSOLE_ERROR)}name(){var e,t;return(null!==(t=null===(e=this.constructor)||void 0===e?void 0:e.name)&&void 0!==t?t:"api").replace(/(([a-z])([A-Z]))/g,"$2_$3")}permission(e,t,r){return g(this,void 0,void 0,function*(){if(r){if((yield this.permissions(r,{route:t})).length>0)return e.next()}e.unauthorized("ACCESS DENIED")})}permissions(e,t){return g(this,void 0,void 0,function*(){var r;return null!==(r=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))&&void 0!==r?r:[]})}session(t,r,o){return g(this,void 0,void 0,function*(){o.auth&&o.user&&(o.user_agent?o.user_agent!=r&&o.regenerate(e.noop):(o.user_agent=r,o.save(e.noop))),t.next()})}sync(){return g(this,void 0,void 0,function*(){const t=this.name().toLowerCase(),r={description:"",state:!0};yield e.forEachSeries(this[Controller.PERMISSIONS],o=>g(this,void 0,void 0,function*(){const i=`${t}.${o}`,s=e.upperCamelCase(t.replace(/_/g," ")," ");yield exports.Permission.findOrCreate({where:{route:i},defaults:Object.assign({name:`${s} ${e.upperCamelCase(o," ")}`,route:i,tag:s},r)})}))})}upload(e,r){r.path||(r.path=Env.API_UPLOAD_TEMP),r.size||(r.size=Env.API_UPLOAD_SIZE),r.field||(r.field=Env.API_UPLOAD_FIELD),t.Upload.middleware(e,r)}validation(t,r){return g(this,void 0,void 0,function*(){const{error:o,value:i}=yield e.Validation.object(r).parse().validateAsync(t.req.body);if(o)return t.validation(o);t.req.body=i,t.next()})}}O=Controller.PERMISSIONS,p([u(0,t.Ctx()),u(1,t.Headers(Env.API_KEY_HEADER)),u(2,t.Headers(Env.API_TOKEN_HEADER)),u(3,t.Cookies(Env.API_TOKEN_COOKIE)),u(4,t.Query(Env.API_KEY_HEADER)),u(5,t.Headers("user-agent")),u(6,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,String,String,String,String,Application]),c("design:returntype",Promise)],ControllerBase.prototype,"auth",null),p([u(0,t.Ctx()),u(1,t.Argument()),u(2,x()),c("design:type",Function),c("design:paramtypes",[t.Context,String,exports.User]),c("design:returntype",Promise)],ControllerBase.prototype,"canCreate",null),p([u(0,t.Ctx()),u(1,t.Argument()),u(2,x()),c("design:type",Function),c("design:paramtypes",[t.Context,String,exports.User]),c("design:returntype",Promise)],ControllerBase.prototype,"canDelete",null),p([u(0,t.Ctx()),u(1,t.Argument()),u(2,x()),c("design:type",Function),c("design:paramtypes",[t.Context,String,exports.User]),c("design:returntype",Promise)],ControllerBase.prototype,"canRead",null),p([u(0,t.Ctx()),u(1,t.Argument()),u(2,x()),c("design:type",Function),c("design:paramtypes",[t.Context,String,exports.User]),c("design:returntype",Promise)],ControllerBase.prototype,"canUpdate",null),p([u(0,t.Ctx()),u(1,t.Argument()),u(2,x()),c("design:type",Function),c("design:paramtypes",[t.Context,String,exports.User]),c("design:returntype",Promise)],ControllerBase.prototype,"permission",null),p([u(0,t.Ctx()),u(1,t.Headers("user-agent")),u(2,t.Session()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Object]),c("design:returntype",Promise)],ControllerBase.prototype,"session",null),p([u(0,t.Ctx()),u(1,t.Argument()),c("design:type",Function),c("design:paramtypes",[t.Context,Object]),c("design:returntype",void 0)],ControllerBase.prototype,"upload",null),p([u(0,t.Ctx()),u(1,t.Argument()),c("design:type",Function),c("design:paramtypes",[t.Context,Object]),c("design:returntype",Promise)],ControllerBase.prototype,"validation",null),exports.ControllerModel=class ControllerModel extends ControllerBase{constructor(){super(...arguments),this[P]=[],this[I]=["create","read","update","delete"]}attributes(t){if(0==this[ControllerBase.ATTRIBUTES].length&&(this[ControllerBase.ATTRIBUTES]=Object.keys(this.model().getAttributes())),e.isArray(t))return t.length?t.map(t=>e.isString(t)&&-1!=this[ControllerBase.ATTRIBUTES].indexOf(t)?t:void 0).filter(e.isString):this[ControllerBase.ATTRIBUTES];const{exclude:r,include:o}=t,i=e.isUndefined(o)?this[ControllerBase.ATTRIBUTES]:o.map(t=>e.isString(t)&&-1!=this[ControllerBase.ATTRIBUTES].indexOf(t)?t:void 0).filter(e.isString),s=null!=r?r:[];return s.length?i.filter(e=>-1==s.indexOf(e)?e:void 0).filter(e.isString):i}create(e){return g(this,arguments,void 0,function*({ctx:e,options:r,body:o}){const i=yield this.model().create(Object.assign(Object.assign({},e.req.body),o||{}),Object.assign(Object.assign({},r||{}),y(e))).catch(this.error);if(i){const r=this.key();return e.prepare(t.Status.OK,{[r]:i.getDataValue(r)}),i}e.error("INTERNAL SERVER ERROR")})}delete(e){return g(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 i=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[r]:o}),individualHooks:!0}),y(e))).catch(this.error);return i?(e.success("OK"),i):(e.notFound("RECORD NOT FOUND"),0)})}error(e){let t="controller_model";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),(null==e?void 0:e.sql)?exports.Log.error((null==e?void 0:e.message)+"\n"+(null==e?void 0:e.sql),t,Env.API_CONSOLE_ERROR):super.error(e)}findAll(r){return g(this,arguments,void 0,function*({ctx:r,options:o,callback:s,scope:n,advanced:d,attributes:a,limited:l}){var p,u,c;const g=this.scope(n),y=Object.assign({},o||{}),{fields:v,limit:h,offset:x,asc:E,desc:m,search:A,where:C}=r.req.query;if(e.isUndefined(y.limit)){let t=Env.API_MODEL_LIMIT;e.isString(h)&&(t=parseInt(h)||0),t=e.clamp(t,-1,Env.API_MODEL_LIMIT_MAX),y.limit=t>0?t:l?Env.API_MODEL_LIMIT:void 0}if(e.isNumber(y.limit)&&(y.limit=y.limit>0?y.limit:void 0),e.isString(x)){const e=parseInt(x)||0;y.offset=e>0?e:void 0}a=null!=a?a:this.attributes(null!==(p=null==y?void 0:y.attributes)&&void 0!==p?p:[]);const _=e=>a.indexOf(e)>=0,S=[];e.isString(v)&&S.push(...v.split(";").filter(_)),S.length&&(y.attributes=S);const O=[];if(e.isString(E)&&E.length&&O.push(...E.split(";").filter(_).map(e=>[e,"ASC"])),e.isString(m)&&m.length&&O.push(...m.split(";").filter(_).map(e=>[e,"DESC"])),O.length&&(y.order=O),y.where=Object.assign({},y.where||{}),e.isString(C)&&(null==d||d)){const t=i.Where.parse(a,C);if(!e.isUndefined(t.error))return r.validation(t.error.join(", ")),{count:0,records:[]};y.where=Object.assign(Object.assign({},y.where),null!==(u=t.value)&&void 0!==u?u:{})}else{const t=[];a.forEach(r=>{e.isString(A)&&A.length&&t.push({[r]:{[i.Op.like]:`%${A}%`}})}),t.length&&(y.where=Object.assign(Object.assign({},y.where),{[i.Op.or]:[...t]}))}const P=g.count(Object.assign(Object.assign({},y),{distinct:!!y.include,col:this[ControllerBase.ATTRIBUTES].length?this[ControllerBase.ATTRIBUTES][0]:void 0})).catch(this.error),I=g.findAll(y).catch(this.error);yield Promise.allSettled([P,I]);const f=null!==(c=yield P)&&void 0!==c?c:0;let R=yield I;const T={count:f};return R?(R=s?yield s(R):R,(e.isNumber(null==o?void 0:o.limit)||0==f)&&(T.count=R.length),r.prepare(t.Status.OK,Object.assign(Object.assign({},T),{records:R})),Object.assign(Object.assign({},T),{records:R})):(r.error("INTERNAL SERVER ERROR"),Object.assign(Object.assign({},T),{records:[]}))})}findOne(e){return g(this,arguments,void 0,function*({ctx:e,options:r,callback:o,scope:i}){const s=this.key(),{[s]:n}=e.req.params,d=yield this.scope(i).findOne(Object.assign(Object.assign({},r||{}),{where:Object.assign(Object.assign({},(r||{}).where),{[s]:n})})).catch(this.error);return d?(e.prepare(t.Status.OK,o?yield o(d):d.toJSON()),d):null===d?e.notFound("RECORD NOT FOUND"):void e.error("INTERNAL SERVER ERROR")})}sync(){return g(this,void 0,void 0,function*(){const t=this.name().toLowerCase(),r={description:"",state:!0};yield e.forEachSeries(this[ControllerBase.PERMISSIONS],o=>g(this,void 0,void 0,function*(){const i=`${t}.${o}`,s=e.upperCamelCase(t.replace(/_/g," ")," ");yield exports.Permission.findOrCreate({where:{route:i},defaults:Object.assign({name:`${s} ${e.upperCamelCase(o," ")}`,route:i,tag:s},r)})}))})}update(e){return g(this,arguments,void 0,function*({ctx:e,options:t,body:r}){var o;const i=this.key(),{[i]:s}=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),{[i]:s}),individualHooks:!0}),y(e))).catch(this.error))&&void 0!==o?o:[];return n?(e.success("OK"),!0):(e.success("RECORD NOT CHANGED"),!1)})}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}},P=ControllerBase.ATTRIBUTES,I=ControllerBase.PERMISSIONS,exports.ControllerModel=p([t.Extends(ControllerBase)],exports.ControllerModel),exports.ControllerCrud=class ControllerCrud extends exports.ControllerModel{constructor(){super(...arguments),this._crud={}}CrudArgumentsCreate(e){return{ctx:e}}CrudArgumentsFindAll(e){return{ctx:e}}CrudArgumentsFindOne(e){return{ctx:e}}CrudArgumentsDelete(e){return{ctx:e}}CrudArgumentsUpdate(e){return{ctx:e}}CrudValidationCreate(){return this._crud}CrudValidationUpdate(){return this._crud}add(e){return g(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return g(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}del(e){return g(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return g(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return g(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validationCreate(e){return g(this,void 0,void 0,function*(){const t=this.CrudValidationCreate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)})}validationUpdate(e){return g(this,void 0,void 0,function*(){const t=this.CrudValidationUpdate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)})}},p([t.Post(),t.Middleware("auth"),t.Middleware("canCreate"),t.Middleware("validationCreate"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.ControllerCrud.prototype,"add",null),p([t.Get(),t.Middleware("auth"),t.Middleware("canRead"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.ControllerCrud.prototype,"all",null),p([t.Delete("/:id"),t.Middleware("auth"),t.Middleware("canDelete"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.ControllerCrud.prototype,"del",null),p([t.Get("/:id"),t.Middleware("auth"),t.Middleware("canRead"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.ControllerCrud.prototype,"get",null),p([t.Put("/:id"),t.Middleware("auth"),t.Middleware("canUpdate"),t.Middleware("validationUpdate"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.ControllerCrud.prototype,"set",null),p([u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.ControllerCrud.prototype,"validationCreate",null),p([u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.ControllerCrud.prototype,"validationUpdate",null),exports.ControllerCrud=p([t.Extends(exports.ControllerModel)],exports.ControllerCrud),exports.AuditsController=class AuditsController extends exports.ControllerModel{model(){return exports.Audit}all(e,t,r){return g(this,void 0,void 0,function*(){const o={};t&&(o.type=t),r&&(o.table=r),yield this.findAll({ctx:e,options:{attributes:{exclude:["data","previously"]},where:o,order:[["created_at","DESC"]]},limited:!0})})}get(e){return g(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}},p([t.Get(),t.Middleware("auth"),t.Middleware("canRead"),u(0,t.Ctx()),u(1,t.Query("type")),u(2,t.Query("table")),c("design:type",Function),c("design:paramtypes",[t.Context,String,String]),c("design:returntype",Promise)],exports.AuditsController.prototype,"all",null),p([t.Get("/:id"),t.Middleware("auth"),t.Middleware("canRead"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.AuditsController.prototype,"get",null),exports.AuditsController=p([t.Controller("/audits"),t.Extends(exports.ControllerModel)],exports.AuditsController),exports.AuthController=class AuthController extends ControllerBase{login(t,o,s,n,d,a){return g(this,void 0,void 0,function*(){var l;yield e.sleep(Env.API_SLEEP_AUTH);const p=yield exports.User.scope("password").findOne({where:{[i.Op.or]:[{email:s},{username:s}]}}).catch(this.error);if(n+=null!==(l=null==p?void 0:p.salt)&&void 0!==l?l:"",!p||p.password!=r.sha256(n))return t.notFound("INVALID USERNAME OR PASSWORD"),a.emit("auth.failure",{ctx:t}),void this.emit("auth.failure",{ctx:t});const u=yield exports.Register.findOne({where:{state:!0,user_id:p.id}}).catch(this.error);if(u)return t.error("ACTIVATION REQUIRED"),a.emit("auth.activation",{ctx:t,register:u,user:p}),void this.emit("auth.activation",{ctx:t,register:u,user:p});if(!p.state)return t.notFound("INVALID USERNAME OR PASSWORD"),a.emit("auth.failure",{ctx:t,user:p}),void this.emit("auth.failure",{ctx:t,user:p});const{auth:c,error:g,token:y}=yield AuthToken.create(p);return g?(t.error(g),a.emit("auth.failure",{ctx:t}),void this.emit("auth.failure",{ctx:t})):c&&y?(c.user_agent=o,yield c.save().catch(this.error),Env.API_TOKEN_COOKIE_SET&&t.res.cookie(Env.API_TOKEN_COOKIE,y,{maxAge:d?Env.API_TOKEN_LIFETIME:void 0}),t.json({token:y}),a.emit("auth.login",{auth:c,ctx:t,user:p}),void this.emit("auth.login",{auth:c,ctx:t,user:p})):(t.error("INTERNAL SERVER ERROR"),a.emit("auth.failure",{ctx:t}),void this.emit("auth.failure",{ctx:t}))})}logout(e,t,r,o){return g(this,void 0,void 0,function*(){if(yield AuthToken.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 g(this,void 0,void 0,function*(){const{auth:i,error:s,token:n}=yield AuthToken.renew(r);return s?e.error(s):i?(i.user_agent=t,yield i.save().catch(this.error),e.json({token:n}),o.emit("auth.renew",{auth:i,ctx:e}),void this.emit("auth.renew",{auth:i,ctx:e})):e.error("INTERNAL SERVER ERROR")})}user(t,r){return g(this,void 0,void 0,function*(){const o=yield this.permissions(r);if(!o)return t.error("INTERNAL SERVER ERROR");t.json(Object.assign(Object.assign({},e.denied(["username","date","description","state","created_at","updated_at","deleted_at"],r.toJSON())),{permissions:o.map(e=>e.route)}))})}},p([t.Post("/login"),t.Middleware("validation",{username:e.Validation.string().min(3).required(),password:e.Validation.string().min(5).required(),remember:e.Validation.boolean().empty(!1)}),u(0,t.Ctx()),u(1,t.Headers("user-agent")),u(2,t.Body("username")),u(3,t.Body("password")),u(4,t.Body("remember")),u(5,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,String,String,Boolean,Application]),c("design:returntype",Promise)],exports.AuthController.prototype,"login",null),p([t.Get("/logout"),t.Middleware("auth"),u(0,t.Ctx()),u(1,h()),u(2,x()),u(3,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,exports.Auth,exports.User,Application]),c("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),p([t.Post("/renew"),t.Middleware("validation",{token:e.Validation.string().required()}),u(0,t.Ctx()),u(1,t.Headers("user-agent")),u(2,t.Body("token")),u(3,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,String,Application]),c("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),p([t.Get(),t.Middleware("auth"),u(0,t.Ctx()),u(1,x()),c("design:type",Function),c("design:paramtypes",[t.Context,exports.User]),c("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=p([t.Controller("/auth"),t.Extends(ControllerBase)],exports.AuthController),exports.FilesController=class FilesController extends ControllerBase{constructor(){super(...arguments),this[f]=["delete","download","edit","list","read","rename","upload","write"]}directory(){return Env.API_HTTP_PUBLIC||"./"}files(t){return g(this,void 0,void 0,function*(){let{path:r}=t.req;r=r.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const o=l.join(this.directory(),r);if(!n.existsSync(o)||!n.statSync(o).isDirectory())return t.notFound("RECORD NOT FOUND");let i=[];return i=n.readdirSync(o),i=i.map(e=>this.info(l.join(o,e))),i=i.filter(e.isDef),Object.assign(Object.assign({},this.info(o)),{files:i})})}access(e,t,r){return g(this,void 0,void 0,function*(){yield this.permission(e,this.name()+"."+t,r)})}info(e){if(!n.existsSync(e))return null;const t=n.statSync(e),r=e.split("/").pop();e=e.replace(this.directory(),"/").replace(/^\/\//,"/");const 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"}sync(){return g(this,void 0,void 0,function*(){const t=this.name().toLowerCase(),r=e.upperCamelCase(t.replace(/_/g," ")," "),o={description:"",state:!0};yield e.forEachSeries(this[ControllerBase.PERMISSIONS],i=>g(this,void 0,void 0,function*(){const s=`${t}.${i}`;yield exports.Permission.findOrCreate({where:{route:s},defaults:Object.assign({name:`${r} ${e.upperCamelCase(i," ")}`,route:s,tag:r},o)})}))})}},f=ControllerBase.PERMISSIONS,p([t.Get("/path"),t.Get("/path/*path"),t.Middleware("auth"),t.Middleware("access","list"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.FilesController.prototype,"files",null),p([u(0,t.Ctx()),u(1,t.Argument()),u(2,x()),c("design:type",Function),c("design:paramtypes",[t.Context,String,exports.User]),c("design:returntype",Promise)],exports.FilesController.prototype,"access",null),exports.FilesController=p([t.Controller("/files"),t.Extends(ControllerBase)],exports.FilesController),exports.ForgotController=class ForgotController extends ControllerBase{check(t,r){return g(this,void 0,void 0,function*(){const o=yield this.find(r);if(!o||!o.user)return t.notFound("RECORD NOT FOUND");o.token=e.uniqueID(),yield o.save(),t.json({token:o.token})})}forgot(t,r,o){return g(this,void 0,void 0,function*(){yield e.sleep(Env.API_SLEEP_FORGOT);const s=r,n=yield exports.User.findOne({where:{[i.Op.or]:[{email:s},{username:r}]}}).catch(this.error);if(!n)return t.notFound("RECORD NOT FOUND");const d=e.uniqueID(),a=Date.now()+6e4*Env.API_TOKEN_FORGOT,l=yield exports.Forgot.create({token:d,timestamp:a,state:!0,user_id:n.id});t.success("OK"),o.emit("forgot.send",{ctx:t,forgot:l,user:n}),this.emit("forgot.send",{ctx:t,forgot:l,user:n})})}reset(e,t,o,i){return g(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=r.sha256(o),yield s.user.save().catch(this.error),e.success("OK"),i.emit("forgot.reset",{ctx:e,user:s.user}),this.emit("forgot.reset",{ctx:e,user:s.user})})}find(e){return g(this,void 0,void 0,function*(){return yield exports.Forgot.findOne({where:{token:e,state:!0},include:[{model:exports.User,required:!0}]}).catch(this.error)})}},p([t.Get("/check"),t.Middleware("validation",{token:e.Validation.string().required()}),u(0,t.Ctx()),u(1,t.Body("token")),c("design:type",Function),c("design:paramtypes",[t.Context,String]),c("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),p([t.Post(),t.Middleware("validation",{username:e.Validation.string().min(4).required()}),u(0,t.Ctx()),u(1,t.Body("username")),u(2,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Application]),c("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),p([t.Post("/reset"),t.Middleware("validation",{token:e.Validation.string().required(),password:e.Validation.string().min(5).required()}),u(0,t.Ctx()),u(1,t.Body("token")),u(2,t.Body("password")),u(3,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,String,Application]),c("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=p([t.Controller("/forgot"),t.Extends(ControllerBase)],exports.ForgotController),exports.GroupsController=class GroupsController extends exports.ControllerCrud{constructor(){super(...arguments),this.schemaCreate={name:e.Validation.string().required(),description:e.Validation.string().empty(""),state:e.Validation.boolean().parse().required()},this.schemaUpdate={name:e.Validation.string().empty(),description:e.Validation.string().empty(),state:e.Validation.boolean().parse().empty()}}model(){return exports.Group}CrudArgumentsFindAll(e){return{ctx:e}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}},exports.GroupsController=p([t.Controller("/groups"),t.Extends(exports.ControllerCrud)],exports.GroupsController),exports.GroupsPermissionsController=class GroupsPermissionsController extends exports.ControllerModel{model(){return exports.GroupPermission}all(e,t){return g(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{group_id:t},include:[{model:exports.Permission,required:!0}]},callback:e=>e.map(e=>e.permission)})})}me(e,t){return g(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(t,r,o,i){return g(this,void 0,void 0,function*(){const s=yield exports.Group.findByPk(r,{attributes:["id"]}).catch(this.error);if(!s)return t.notFound("RECORD NOT FOUND");const n=s.id;if(yield exports.GroupPermission.destroy(Object.assign({where:{group_id:n},individualHooks:!0},i)),o){let t=0;yield e.sleep(1e3);for(let e=0;e<o.length;e++)t=yield exports.Permission.count({where:{id:o[e]}}),t&&(yield exports.GroupPermission.create({group_id:n,permission_id:o[e]},Object.assign({},i)))}t.success("OK")})}},p([t.Get("/:id/permissions"),t.Middleware("auth"),t.Middleware("canRead","groups"),u(0,t.Ctx()),u(1,t.Params("id")),c("design:type",Function),c("design:paramtypes",[t.Context,String]),c("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"all",null),p([t.Get("/permissions"),t.Middleware("auth"),t.Middleware("canRead","users"),u(0,t.Ctx()),u(1,x()),c("design:type",Function),c("design:paramtypes",[t.Context,exports.User]),c("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"me",null),p([t.Put("/:id/permissions"),t.Middleware("auth"),t.Middleware("canUpdate","groups"),t.Middleware("validation",{permissions:e.Validation.array(e.Validation.number().parse())}),u(0,t.Ctx()),u(1,t.Params("id")),u(2,t.Body("permissions")),u(3,v()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Array,Object]),c("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"set",null),exports.GroupsPermissionsController=p([t.Controller("/groups"),t.Extends(exports.ControllerModel)],exports.GroupsPermissionsController),exports.LogsController=class LogsController extends exports.ControllerModel{constructor(){super(...arguments),this[R]=["read"]}model(){return exports.Log}all(e,t,r){return g(this,void 0,void 0,function*(){const o={};t&&(o.type=t),r&&(o.source=r),yield this.findAll({ctx:e,options:{where:o,order:[["created_at","DESC"]]},limited:!0})})}},R=exports.ControllerModel.PERMISSIONS,p([t.Get(),t.Middleware("auth"),t.Middleware("canRead"),u(0,t.Ctx()),u(1,t.Query("type")),u(2,t.Query("source")),c("design:type",Function),c("design:paramtypes",[t.Context,String,String]),c("design:returntype",Promise)],exports.LogsController.prototype,"all",null),exports.LogsController=p([t.Controller("/logs"),t.Extends(exports.ControllerModel)],exports.LogsController),exports.PermissionsController=class PermissionsController extends exports.ControllerCrud{constructor(){super(...arguments),this.schemaCreate={name:e.Validation.string().required(),route:e.Validation.string().required(),tag:e.Validation.string().required(),description:e.Validation.string().empty(""),state:e.Validation.boolean().parse().required()},this.schemaUpdate={name:e.Validation.string().empty(),route:e.Validation.string().empty(),tag:e.Validation.string().empty(),description:e.Validation.string().empty(),state:e.Validation.boolean().parse().empty()}}model(){return exports.Permission}CrudArgumentsFindAll(e){return{ctx:e}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}},exports.PermissionsController=p([t.Controller("/permissions"),t.Extends(exports.ControllerCrud)],exports.PermissionsController),exports.RegisterController=class RegisterController extends ControllerBase{register(t,o,s){return g(this,void 0,void 0,function*(){yield e.sleep(Env.API_SLEEP_REGISTRY);const{name:n,date:d,email:a,username:l,password:p,confirm:u}=o,c=l||a,g=r.sha256(p);if(yield exports.User.count({where:{[i.Op.or]:[{email:a},{username:c}]}}).catch(this.error))return t.validation("INVALID EMAIL OR USERNAME");if(g!=r.sha256(u))return t.error("INVALID PASSWORD");const y=yield exports.User.create({name:n,email:a,username:c,password:g,avatar:"",date:d,description:"",state:!1}).catch(this.error);if(!y)return t.error("INTERNAL SERVER ERROR");const v=yield exports.Register.create({token:yield this.getId(),user_id:y.id,state:!0}).catch(this.error);if(!v)return yield y.destroy().catch(this.error),t.error("INTERNAL SERVER ERROR");t.success("OK"),s.emit("register.user",{ctx:t,register:v,user:y}),this.emit("register.user",{ctx:t,register:v,user:y})})}confirm(e,t,r){return g(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 g(this,void 0,void 0,function*(){const o=t,s=yield exports.Register.findOne({where:{state:!0},include:[{model:exports.User,required:!0,where:{[i.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 g(this,void 0,void 0,function*(){const t=e.uuidv7();return(yield exports.Register.count({where:{token:t}}))?this.getId():t})}},p([t.Post(),t.Middleware("validation",{name:e.Validation.string().required(),date:e.Validation.date().required(),email:e.Validation.string().email().required(),username:e.Validation.string().min(4).empty(),password:e.Validation.string().min(5).required(),confirm:e.Validation.string().min(5).required()}),u(0,t.Ctx()),u(1,t.Body()),u(2,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,Object,Application]),c("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),p([t.Post("/confirm"),t.Middleware("validation",{token:e.Validation.string().required()}),u(0,t.Ctx()),u(1,t.Body("token")),u(2,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Application]),c("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),p([t.Post("/send"),t.Middleware("validation",{username:e.Validation.string().min(4).required()}),u(0,t.Ctx()),u(1,t.Body("username")),u(2,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Application]),c("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=p([t.Controller("/register"),t.Extends(ControllerBase)],exports.RegisterController),exports.SetupController=class SetupController extends ControllerBase{setup(t,o){return g(this,void 0,void 0,function*(){var i;if(yield exports.User.count())return t.success("OK");const s=e.uniqueID(),n=yield exports.User.create({name:"Admin",email:"admin@localhost",username:"admin",password:r.sha256("admin"+s),salt:s,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0},Object.assign({},o)),d=yield exports.Group.create(Object.assign({name:"Admin"},{description:"API CORE",state:!0}),Object.assign({},o));yield exports.UserGroup.create({user_id:n.id,group_id:d.id},Object.assign({},o));const a=null!==(i=yield exports.Permission.findAll({where:{state:!0}}).catch(this.error))&&void 0!==i?i:[];yield e.forEachSeries(a,e=>g(this,void 0,void 0,function*(){yield exports.GroupPermission.create({group_id:d.id,permission_id:e.id},Object.assign({},o))})),t.success("OK")})}},p([t.Get(),u(0,t.Ctx()),u(1,v()),c("design:type",Function),c("design:paramtypes",[t.Context,Object]),c("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=p([t.Controller("/setup"),t.Extends(ControllerBase)],exports.SetupController),exports.UsersController=class UsersController extends exports.ControllerModel{model(){return exports.User}constructor(){super(),this.path=Env.API_HTTP_PUBLIC+"/avatar",Env.API_HTTP_PUBLIC&&n.existsSync(Env.API_HTTP_PUBLIC)&&!n.existsSync(this.path)&&n.mkdirSync(this.path)}avatar(e,t,r,o){return g(this,void 0,void 0,function*(){if(t.length){const i=t[0].filename||"";if(i){const t=this.path+"/"+r.avatar;if(n.existsSync(t)&&n.lstatSync(t).isFile()&&n.rmSync(t),r.avatar=i,yield r.save(Object.assign({},o)).catch(this.error))return e.success("OK")}}e.success("RECORD NOT CHANGED")})}avatar_del(e,t,r){return g(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(t,o,i,s,n){return g(this,void 0,void 0,function*(){var d;if(Env.API_USER_HISTORY){if(yield exports.UserHistory.count({where:{password:r.sha256(i+s.id)}}).catch(this.error))return t.error("PASSWORD PREVIOUSLY REGISTERED")}const a=yield this.scope("password").findOne({where:{id:s.id,state:!0}}).catch(this.error);return o+=null!==(d=null==a?void 0:a.salt)&&void 0!==d?d:"",a&&a.password==r.sha256(o)?(a.salt=e.uniqueID(),a.password=r.sha256(i+a.salt),(yield a.save(Object.assign({},n)).catch(this.error))?t.success("OK"):void t.success("RECORD NOT CHANGED")):t.error("INVALID PASSWORD")})}token(e,t,r){return g(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_del(e,t,r){return g(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_get(e,t,r){return g(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_renew(e,t,r,o){return g(this,void 0,void 0,function*(){const i=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(i){const t=yield this.token_new();return i.token=o.hash.encrypt(t),yield i.save(Object.assign({},r)).catch(this.error),e.json({token:t})}e.notFound("RECORD NOT FOUND")})}token_new(){return g(this,void 0,void 0,function*(){var t;const r=e.uuidv7();return(null!==(t=yield this.model().count({where:{token:r}}).catch(this.error))&&void 0!==t?t:0)?this.token_new():r})}add(t,o){return g(this,void 0,void 0,function*(){const i=e.uniqueID(),s=yield this.create({ctx:t,body:{password:r.sha256(o+i),salt:i}});Env.API_USER_HISTORY&&s&&(yield exports.UserHistory.create({password:r.sha256(o+s.id),user_id:s.id}))})}all(e){return g(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["password","salt","token"]}}})})}del(e,t,r){return g(this,void 0,void 0,function*(){if(r.id.toString()==t)return e.notFound("RECORD NOT FOUND");yield this.delete({ctx:e})})}get(e){return g(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(t,o,i){return g(this,void 0,void 0,function*(){if(Env.API_USER_HISTORY&&i){const e=r.sha256(i+o);if(yield exports.UserHistory.count({where:{password:e}}).catch(this.error))return t.error("PASSWORD PREVIOUSLY REGISTERED");yield exports.UserHistory.create({password:e,user_id:o}).catch(this.error)}const s=i?e.uniqueID():"";yield this.update({ctx:t,body:i?{password:r.sha256(i+s),salt:s}:{}})})}},p([t.Post("/avatar"),t.Middleware("auth"),t.Middleware("upload",e=>({count:1,field:"file",path:e.controller.path,types:["image/bmp","image/jpeg","image/png"],size:32})),u(0,t.Ctx()),u(1,t.Files()),u(2,x()),u(3,v()),c("design:type",Function),c("design:paramtypes",[t.Context,Array,exports.User,Object]),c("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),p([t.Delete("/avatar"),t.Middleware("auth"),u(0,t.Ctx()),u(1,x()),u(2,v()),c("design:type",Function),c("design:paramtypes",[t.Context,exports.User,Object]),c("design:returntype",Promise)],exports.UsersController.prototype,"avatar_del",null),p([t.Post("/password"),t.Middleware("auth"),t.Middleware("validation",{oldPassword:e.Validation.string().min(5).required(),newPassword:e.Validation.string().min(5).required(),confirmPassword:e.Validation.string().equal(e.Validation.ref("newPassword"))}),u(0,t.Ctx()),u(1,t.Body("oldPassword")),u(2,t.Body("newPassword")),u(3,x()),u(4,v()),c("design:type",Function),c("design:paramtypes",[t.Context,String,String,exports.User,Object]),c("design:returntype",Promise)],exports.UsersController.prototype,"password",null),p([t.Get("/token"),t.Middleware("auth"),u(0,t.Ctx()),u(1,x()),u(2,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,exports.User,Application]),c("design:returntype",Promise)],exports.UsersController.prototype,"token",null),p([t.Delete("/token/:id"),t.Middleware("auth"),t.Middleware("canDelete"),u(0,t.Ctx()),u(1,t.Params("id")),u(2,v()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Object]),c("design:returntype",Promise)],exports.UsersController.prototype,"token_del",null),p([t.Get("/token/:id"),t.Middleware("auth"),t.Middleware("canCreate"),u(0,t.Ctx()),u(1,t.Params("id")),u(2,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Application]),c("design:returntype",Promise)],exports.UsersController.prototype,"token_get",null),p([t.Get("/token/renew/:id"),t.Middleware("auth"),t.Middleware("canUpdate"),u(0,t.Ctx()),u(1,t.Params("id")),u(2,v()),u(3,t.App()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Object,Application]),c("design:returntype",Promise)],exports.UsersController.prototype,"token_renew",null),p([t.Post(),t.Middleware("auth"),t.Middleware("canCreate"),t.Middleware("validation",{name:e.Validation.string().required(),email:e.Validation.string().email().required(),username:e.Validation.string().min(4).required(),password:e.Validation.string().min(5).required(),description:e.Validation.string().empty(""),state:e.Validation.boolean().parse().required()}),u(0,t.Ctx()),u(1,t.Body("password")),c("design:type",Function),c("design:paramtypes",[t.Context,String]),c("design:returntype",Promise)],exports.UsersController.prototype,"add",null),p([t.Get(),t.Middleware("auth"),t.Middleware("canRead"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.UsersController.prototype,"all",null),p([t.Delete("/:id"),t.Middleware("auth"),t.Middleware("canDelete"),u(0,t.Ctx()),u(1,t.Params("id")),u(2,x()),c("design:type",Function),c("design:paramtypes",[t.Context,String,exports.User]),c("design:returntype",Promise)],exports.UsersController.prototype,"del",null),p([t.Get("/:id"),t.Middleware("auth"),t.Middleware("canRead"),u(0,t.Ctx()),c("design:type",Function),c("design:paramtypes",[t.Context]),c("design:returntype",Promise)],exports.UsersController.prototype,"get",null),p([t.Put("/:id"),t.Middleware("auth"),t.Middleware("canUpdate"),t.Middleware("validation",{name:e.Validation.string().empty(),email:e.Validation.string().email().empty(),username:e.Validation.string().min(4).empty(),password:e.Validation.string().min(5).empty().filter(""),description:e.Validation.string().empty(),state:e.Validation.boolean().parse().empty()}),u(0,t.Ctx()),u(1,t.Params("id")),u(2,t.Body("password")),c("design:type",Function),c("design:paramtypes",[t.Context,String,String]),c("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=p([t.Controller("/users"),t.Extends(exports.ControllerModel),c("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class UsersGroupsController extends exports.ControllerModel{model(){return exports.UserGroup}all(e,t){return g(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{user_id:t},include:[{model:exports.Group,required:!0}]},callback:e=>e.map(e=>e.group)})})}me(e,t){return g(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(t,r,o,i){return g(this,void 0,void 0,function*(){const s=yield exports.User.findByPk(r,{attributes:["id"]}).catch(this.error);if(!s)return t.notFound("RECORD NOT FOUND");if(yield exports.UserGroup.destroy(Object.assign({where:{user_id:s.id},individualHooks:!0},i)),o){let t=0;yield e.sleep(1e3);for(let e=0;e<o.length;e++)t=yield exports.Group.count({where:{id:o[e]}}),t&&(yield exports.UserGroup.create({user_id:s.id,group_id:o[e]},Object.assign({},i)))}t.success("OK")})}},p([t.Get("/:id/groups"),t.Middleware("auth"),t.Middleware("canRead","users"),u(0,t.Ctx()),u(1,t.Params("id")),c("design:type",Function),c("design:paramtypes",[t.Context,String]),c("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),p([t.Get("/groups"),t.Middleware("auth"),t.Middleware("canRead","users"),u(0,t.Ctx()),u(1,x()),c("design:type",Function),c("design:paramtypes",[t.Context,exports.User]),c("design:returntype",Promise)],exports.UsersGroupsController.prototype,"me",null),p([t.Put("/:id/groups"),t.Middleware("auth"),t.Middleware("canUpdate","users"),t.Middleware("validation",{groups:e.Validation.array(e.Validation.number().parse())}),u(0,t.Ctx()),u(1,t.Params("id")),u(2,t.Body("groups")),u(3,v()),c("design:type",Function),c("design:paramtypes",[t.Context,String,Array,Object]),c("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=p([t.Controller("/users"),t.Extends(exports.ControllerModel)],exports.UsersGroupsController),exports.Application=Application,exports.AuthBase=AuthBase,exports.AuthKey=AuthKey,exports.AuthToken=AuthToken,exports.Controller=Controller,exports.ControllerBase=ControllerBase,exports.Env=Env,exports.ReqAudit=v,exports.ReqAuth=h,exports.ReqUser=x,exports.Store=Store,exports.audit=y,exports.crt=_,exports.database=E,exports.hooks=A,exports.key=S;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/api v4.5.
|
|
2
|
+
* @andrewcaires/api v4.5.2
|
|
3
3
|
* Simple api for small applications using express, jsonwebtoken, sequelize and websocket
|
|
4
4
|
* (c) 2026 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
@@ -193,7 +193,7 @@ declare class Application extends Application$1 {
|
|
|
193
193
|
|
|
194
194
|
declare abstract class ControllerBase extends Controller {
|
|
195
195
|
protected [Controller.PERMISSIONS]: Array<string>;
|
|
196
|
-
auth(ctx: Context, key_header: string, token_header: string, key_query: string, user_agent: string, app: Application): Promise<void>;
|
|
196
|
+
auth(ctx: Context, key_header: string, token_header: string, token_cookie: string, key_query: string, user_agent: string, app: Application): Promise<void>;
|
|
197
197
|
canCreate(ctx: Context, name: string, user: User): Promise<void>;
|
|
198
198
|
canDelete(ctx: Context, name: string, user: User): Promise<void>;
|
|
199
199
|
canRead(ctx: Context, name: string, user: User): Promise<void>;
|
|
@@ -325,6 +325,8 @@ declare class Env extends Env$1 {
|
|
|
325
325
|
static readonly API_SESSION_NAME: string;
|
|
326
326
|
static readonly API_SESSION_LIFETIME: number;
|
|
327
327
|
static readonly API_SESSION_SECRET: string;
|
|
328
|
+
static readonly API_TOKEN_COOKIE: string;
|
|
329
|
+
static readonly API_TOKEN_COOKIE_SET: boolean;
|
|
328
330
|
static readonly API_TOKEN_CRT: string;
|
|
329
331
|
static readonly API_TOKEN_KEY: string;
|
|
330
332
|
static readonly API_TOKEN_FORGOT: number;
|
|
@@ -347,7 +349,7 @@ declare class AuditsController extends ControllerModel<Audit> {
|
|
|
347
349
|
}
|
|
348
350
|
|
|
349
351
|
declare class AuthController extends ControllerBase {
|
|
350
|
-
protected login(ctx: Context, user_agent: string, username: string, password: string, app: Application): Promise<void>;
|
|
352
|
+
protected login(ctx: Context, user_agent: string, username: string, password: string, remember: boolean, app: Application): Promise<void>;
|
|
351
353
|
protected logout(ctx: Context, auth: Auth, user: User, app: Application): Promise<void>;
|
|
352
354
|
protected renew(ctx: Context, user_agent: string, old: string, app: Application): Promise<void>;
|
|
353
355
|
protected user(ctx: Context, user: User): Promise<void>;
|
package/dist/index.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/api v4.5.
|
|
2
|
+
* @andrewcaires/api v4.5.2
|
|
3
3
|
* Simple api for small applications using express, jsonwebtoken, sequelize and websocket
|
|
4
4
|
* (c) 2026 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
6
6
|
*/
|
|
7
|
-
import{EventEmitter as e,isObject as t,noop as i,uuidv7 as r,loop as n,forEachSeries as o,isFunction as s,sleep as d,upperCamelCase as a,Validation as u,isArray as l,isString as p,isUndefined as c,clamp as g,isNumber as y,denied as v,isDef as h,uniqueID as E}from"@andrewcaires/utils.js";import{parameterFactory as A,Application as _,Ctx as m,Headers as O,Query as S,App as f,Context as I,Argument as P,Session as R,Upload as T,Extends as D,Status as N,Post as C,Middleware as b,Get as w,Delete as B,Put as x,Controller as F,Body as k,Params as U,Files as j}from"@andrewcaires/express";import{Env as L,LogColor as K,Log as M,Hash as H,sha256 as q}from"@andrewcaires/node";import{config as Y}from"dotenv";import{Sequelize as V,Column as $,BelongsTo as G,Database as W,ModelName as z,Version as J,Model as Z,HasMany as X,Hooks as Q,DefaultScope as ee,Scopes as te,Unique as ie,Op as re,Where as ne}from"@andrewcaires/sequelize";import oe from"jsonwebtoken";import{readFileSync as se,existsSync as de,statSync as ae,readdirSync as ue,mkdirSync as le,lstatSync as pe,rmSync as ce}from"fs";import{WebSocketServer as ge}from"ws";import{Store as ye}from"express-session";import{join as ve}from"path";class Controller extends e{}function he(e,t,i,r){var n,o=arguments.length,s=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,r);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(s=(o<3?n(s):o>3?n(t,i,s):n(t,i))||s);return o>3&&s&&Object.defineProperty(t,i,s),s}function Ee(e,t){return function(i,r){t(i,r,e)}}function Ae(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function _e(e,t,i,r){return new(i||(i=Promise))(function(n,o){function s(e){try{a(r.next(e))}catch(e){o(e)}}function d(e){try{a(r.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(s,d)}a((r=r.apply(e,t||[])).next())})}Controller.ATTRIBUTES=Symbol("ATTRIBUTES"),Controller.PERMISSIONS=Symbol("PERMISSIONS"),"function"==typeof SuppressedError&&SuppressedError,Y({quiet:!0});class Env extends L{}Env.API_BASE_NAME=Env.getString("API_BASE_NAME",""),Env.API_BODYPARSER_STRICT=Env.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=Env.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=Env.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=Env.getString("API_BODYPARSER_TYPE","json"),Env.API_CONSOLE_ERROR=Env.getBool("API_CONSOLE_ERROR",!1),Env.API_DATABASE_URL=Env.getString("API_DATABASE_URL",""),Env.API_DATABASE_LOG=Env.getBool("API_DATABASE_LOG",!1),Env.API_DATABASE_AUDIT=Env.getBool("API_DATABASE_AUDIT",!0),Env.API_DATABASE_PREFIX=Env.getString("API_DATABASE_PREFIX",""),Env.API_DATABASE_TIMEZONE=Env.getString("API_DATABASE_TIMEZONE","+00:00"),Env.API_HTTP_CRT=Env.getString("API_HTTP_CRT",""),Env.API_HTTP_KEY=Env.getString("API_HTTP_KEY",""),Env.API_HTTP_PORT=Env.getInt("API_HTTP_PORT",3e3),Env.API_HTTP_PUBLIC=Env.getString("API_HTTP_PUBLIC",""),Env.API_HTTP_CROSS=Env.getBool("API_HTTP_CROSS",!1),Env.API_HTTP_HYBRID=Env.getBool("API_HTTP_HYBRID",!1),Env.API_HTTP_NOTFOUND=Env.getString("API_HTTP_NOTFOUND",""),Env.API_HTTP_PATH=Env.getString("API_HTTP_PATH","/api"),Env.API_HTTP_REDIRECT=Env.getString("API_HTTP_REDIRECT",""),Env.API_KEY_HASH=Env.getString("API_KEY_HASH",""),Env.API_KEY_HEADER=Env.getString("API_KEY_HEADER","x-api-key"),Env.API_MODEL_LIMIT=Env.getInt("API_MODEL_LIMIT",10),Env.API_MODEL_LIMIT_MAX=Env.getInt("API_MODEL_LIMIT_MAX",500),Env.API_SLEEP_AUTH=Env.getMs("API_SLEEP_AUTH","2s"),Env.API_SLEEP_FORGOT=Env.getMs("API_SLEEP_FORGOT","5s"),Env.API_SLEEP_REGISTRY=Env.getMs("API_SLEEP_REGISTRY","5s"),Env.API_SESSION_NAME=Env.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=Env.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=Env.getString("API_SESSION_SECRET","yoursecret"),Env.API_TOKEN_CRT=Env.getString("API_TOKEN_CRT",""),Env.API_TOKEN_KEY=Env.getString("API_TOKEN_KEY",""),Env.API_TOKEN_FORGOT=Env.getMs("API_TOKEN_LIFETIME","1d"),Env.API_TOKEN_HEADER=Env.getString("API_TOKEN_HEADER","authorization"),Env.API_TOKEN_HEADER_KEY=Env.getString("API_TOKEN_HEADER","bearer"),Env.API_TOKEN_LIFETIME=Env.getMs("API_TOKEN_LIFETIME","1d"),Env.API_TOKEN_RENEW=Env.getMs("API_TOKEN_RENEW","1d"),Env.API_UPLOAD_COUNT=Env.getInt("API_UPLOAD_COUNT",1),Env.API_UPLOAD_FIELD=Env.getString("API_UPLOAD_FIELD","upload"),Env.API_UPLOAD_SIZE=Env.getInt("API_UPLOAD_SIZE",2),Env.API_UPLOAD_TEMP=Env.getString("API_UPLOAD_TEMP","./temp"),Env.API_USER_HISTORY=Env.getBool("API_USER_HISTORY",!0),Env.API_WEBSOCKET_START=Env.getBool("API_WEBSOCKET_START",!1);const me=e=>{var t,i,r,n,o,s,d,a,u;return{audit_client:null!==(t=e.getIp())&&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===(n=null==e?void 0:e.req)||void 0===n?void 0:n.originalUrl),audit_user_agent:null!==(s=null===(o=e.req)||void 0===o?void 0:o.headers["user-agent"])&&void 0!==s?s:"",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}},Oe=A(({ctx:e})=>me(e)),Se=A(({ctx:e})=>e.req.auth),fe=A(({ctx:e})=>e.req.user),Ie=new V(Env.API_DATABASE_URL,{logging:Env.API_DATABASE_LOG,prefix:Env.API_DATABASE_PREFIX,timezone:Env.API_DATABASE_TIMEZONE}),Pe=(e,t,i)=>{var r,n,o,s,d;return{type:e,model:null!==(r=null==t?void 0:t.getTableName())&&void 0!==r?r:null,client:null!==(n=null==i?void 0:i.audit_client)&&void 0!==n?n:null,href:null!==(o=null==i?void 0:i.audit_href)&&void 0!==o?o:null,user_agent:null!==(s=null==i?void 0:i.audit_user_agent)&&void 0!==s?s:null,user_id:null!==(d=null==i?void 0:i.audit_user_id)&&void 0!==d?d:null,state:!0}},Re={afterCreate:(e,r)=>_e(void 0,void 0,void 0,function*(){var n;if(!Env.API_DATABASE_AUDIT)return;const o=t(e)?e.constructor:null,s=null!==(n=null==o?void 0:o.primaryKeyAttribute)&&void 0!==n?n:null;yield Be.create(Object.assign(Object.assign({},Pe("CREATE",o,r)),{record:s?e.getDataValue(s):null,data:e.toJSON()})).catch(i)}),afterUpdate:(e,r)=>_e(void 0,void 0,void 0,function*(){var n;if(!Env.API_DATABASE_AUDIT)return;const o=t(e)?e.constructor:null,s=null!==(n=null==o?void 0:o.primaryKeyAttribute)&&void 0!==n?n:null,d={},a=e.changed();a&&a.forEach(t=>d[t]=e.getDataValue(t)),yield Be.create(Object.assign(Object.assign({},Pe("UPDATE",o,r)),{record:s?e.getDataValue(s):null,data:d,previously:e.previous()})).catch(i)}),afterDestroy:(e,r)=>_e(void 0,void 0,void 0,function*(){var n;if(!Env.API_DATABASE_AUDIT)return;const o=t(e)?e.constructor:null,s=null!==(n=null==o?void 0:o.primaryKeyAttribute)&&void 0!==n?n:null;yield Be.create(Object.assign(Object.assign({},Pe("DELETE",o,r)),{record:s?e.getDataValue(s):null,data:e.toJSON()})).catch(i)})};let Te=class Auth extends Z{};he([$.Id(),Ae("design:type",Number)],Te.prototype,"id",void 0),he([$.String(),Ae("design:type",String)],Te.prototype,"secret",void 0),he([$.FullDate(),Ae("design:type",Object)],Te.prototype,"logout",void 0),he([$.String(),Ae("design:type",String)],Te.prototype,"user_agent",void 0),he([$.CreatedAt,Ae("design:type",Date)],Te.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],Te.prototype,"updated_at",void 0),he([$.DeletedAt,Ae("design:type",Object)],Te.prototype,"deleted_at",void 0),he([G(()=>we),Ae("design:type",Number)],Te.prototype,"user_id",void 0),Te=he([W(Ie),z("auth"),J("4.2.0")],Te);let De=class Register extends Z{};he([$.Id(),Ae("design:type",Number)],De.prototype,"id",void 0),he([$.String(),Ae("design:type",String)],De.prototype,"token",void 0),he([$.Boolean(),Ae("design:type",Boolean)],De.prototype,"state",void 0),he([$.CreatedAt,Ae("design:type",Date)],De.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],De.prototype,"updated_at",void 0),he([$.DeletedAt,Ae("design:type",Object)],De.prototype,"deleted_at",void 0),he([G(()=>we),Ae("design:type",Number)],De.prototype,"user_id",void 0),De=he([W(Ie),z("register"),J("4.2.0")],De);let Ne=class Group extends Z{};he([$.Id(),Ae("design:type",Number)],Ne.prototype,"id",void 0),he([$.String(),Ae("design:type",String)],Ne.prototype,"name",void 0),he([$.Text(),Ae("design:type",String)],Ne.prototype,"description",void 0),he([$.Boolean(),Ae("design:type",Boolean)],Ne.prototype,"state",void 0),he([$.CreatedAt,Ae("design:type",Date)],Ne.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],Ne.prototype,"updated_at",void 0),he([$.DeletedAt,Ae("design:type",Object)],Ne.prototype,"deleted_at",void 0),he([X(()=>Ce,"group_id"),Ae("design:type",Array)],Ne.prototype,"groups_routes",void 0),he([X(()=>Ce,"group_id"),Ae("design:type",Array)],Ne.prototype,"users_groups",void 0),Ne=he([W(Ie),z("group"),Q(Re),J("4.2.0")],Ne);let Ce=class UserGroup extends Z{};he([$.CreatedAt,Ae("design:type",Date)],Ce.prototype,"created_at",void 0),he([G(()=>Ne),Ae("design:type",Number)],Ce.prototype,"group_id",void 0),he([G(()=>we),Ae("design:type",Number)],Ce.prototype,"user_id",void 0),Ce=he([W(Ie),z("users_groups"),Q(Re),J("4.2.0")],Ce);let be=class UserHistory extends Z{};he([$.String(),Ae("design:type",String)],be.prototype,"password",void 0),he([$.CreatedAt,Ae("design:type",Date)],be.prototype,"created_at",void 0),he([G(()=>we),Ae("design:type",Number)],be.prototype,"user_id",void 0),be=he([W(Ie),z("users_histories"),J("4.2.0")],be);let we=class User extends Z{};he([$.Id(),Ae("design:type",Number)],we.prototype,"id",void 0),he([$.String(),Ae("design:type",String)],we.prototype,"name",void 0),he([$.String(),Ae("design:type",String)],we.prototype,"email",void 0),he([$.String(),Ae("design:type",String)],we.prototype,"username",void 0),he([$.String(),Ae("design:type",String)],we.prototype,"password",void 0),he([$.String(),Ae("design:type",String)],we.prototype,"salt",void 0),he([$.String(),Ae("design:type",String)],we.prototype,"token",void 0),he([$.String(),Ae("design:type",String)],we.prototype,"avatar",void 0),he([$.DateOnly(),Ae("design:type",String)],we.prototype,"date",void 0),he([$.Text(),Ae("design:type",String)],we.prototype,"description",void 0),he([$.Boolean(),Ae("design:type",Boolean)],we.prototype,"state",void 0),he([$.CreatedAt,Ae("design:type",Date)],we.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],we.prototype,"updated_at",void 0),he([$.DeletedAt,Ae("design:type",Object)],we.prototype,"deleted_at",void 0),he([X(()=>Be,"user_id"),Ae("design:type",Array)],we.prototype,"audits",void 0),he([X(()=>Te,"user_id"),Ae("design:type",Array)],we.prototype,"auths",void 0),he([X(()=>De,"user_id"),Ae("design:type",Array)],we.prototype,"registers",void 0),he([X(()=>Ce,"user_id"),Ae("design:type",Array)],we.prototype,"users_groups",void 0),he([X(()=>be,"user_id"),Ae("design:type",Array)],we.prototype,"users_histories",void 0),we=he([W(Ie),z("user"),ee({attributes:{exclude:["password","salt","token"]}}),te({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),Q(Re),J("4.2.0")],we);let Be=class Audit extends Z{};he([$.Id(),Ae("design:type",Number)],Be.prototype,"id",void 0),he([$.Enum("CREATE","DELETE","UPDATE"),Ae("design:type",String)],Be.prototype,"type",void 0),he([$.String(),Ae("design:type",String)],Be.prototype,"model",void 0),he([$.String(),Ae("design:type",String)],Be.prototype,"record",void 0),he([$.Json(),Ae("design:type",Object)],Be.prototype,"data",void 0),he([$.Json(),Ae("design:type",Object)],Be.prototype,"previously",void 0),he([$.String(),Ae("design:type",String)],Be.prototype,"client",void 0),he([$.Text(),Ae("design:type",String)],Be.prototype,"href",void 0),he([$.String(),Ae("design:type",String)],Be.prototype,"user_agent",void 0),he([$.Boolean(),Ae("design:type",Boolean)],Be.prototype,"state",void 0),he([$.CreatedAt,Ae("design:type",Date)],Be.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],Be.prototype,"updated_at",void 0),he([$.DeletedAt,Ae("design:type",Object)],Be.prototype,"deleted_at",void 0),he([G(()=>we),Ae("design:type",Number)],Be.prototype,"user_id",void 0),Be=he([W(Ie),z("audit"),J("4.2.0")],Be);let xe=class Config extends Z{static all(){return _e(this,void 0,void 0,function*(){const e=yield this.findAll().catch(this.error),t={};return e&&e.forEach(e=>t[e.key]=e.value),t})}static del(e,t){return _e(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 this.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:r})).catch(this.error))||0)>0})}static get(e){return _e(this,arguments,void 0,function*(e,t=""){const[i]=(yield this.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return i?i.value:t})}static set(e,t,i){return _e(this,void 0,void 0,function*(){var r;const n=null!==(r=null==i?void 0:i.id)&&void 0!==r?r:null,[o]=(yield this.findOrCreate(Object.assign({where:{key:e}},{user_id:n})).catch(this.error))||[];o&&(o.value=t,yield o.save().catch(this.error))})}};he([$.String(),Ae("design:type",String)],xe.prototype,"key",void 0),he([$.String(),Ae("design:type",String)],xe.prototype,"value",void 0),he([$.CreatedAt,Ae("design:type",Date)],xe.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],xe.prototype,"updated_at",void 0),xe=he([W(Ie),z("configs"),J("4.2.0")],xe);let Fe=class Forgot extends Z{};he([$.Id(),Ae("design:type",Number)],Fe.prototype,"id",void 0),he([$.String(),Ae("design:type",String)],Fe.prototype,"token",void 0),he([$.BigInt(),Ae("design:type",Number)],Fe.prototype,"timestamp",void 0),he([$.Boolean(),Ae("design:type",Boolean)],Fe.prototype,"state",void 0),he([$.CreatedAt,Ae("design:type",Date)],Fe.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],Fe.prototype,"updated_at",void 0),he([$.DeletedAt,Ae("design:type",Object)],Fe.prototype,"deleted_at",void 0),he([G(()=>we),Ae("design:type",Number)],Fe.prototype,"user_id",void 0),Fe=he([W(Ie),z("forgot"),J("4.2.0")],Fe);let ke=class Permission extends Z{};he([$.Id(),Ae("design:type",Number)],ke.prototype,"id",void 0),he([$.String(),Ae("design:type",String)],ke.prototype,"name",void 0),he([$.String(),ie(!0),Ae("design:type",String)],ke.prototype,"route",void 0),he([$.String(),Ae("design:type",String)],ke.prototype,"tag",void 0),he([$.Text(),Ae("design:type",String)],ke.prototype,"description",void 0),he([$.Boolean(),Ae("design:type",Boolean)],ke.prototype,"state",void 0),he([$.CreatedAt,Ae("design:type",Date)],ke.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],ke.prototype,"updated_at",void 0),he([$.DeletedAt,Ae("design:type",Object)],ke.prototype,"deleted_at",void 0),he([X(()=>Ue,"permission_id"),Ae("design:type",Array)],ke.prototype,"groups_permissions",void 0),ke=he([W(Ie),z("permission"),Q(Re),J("4.3.1")],ke);let Ue=class GroupPermission extends Z{};he([$.CreatedAt,Ae("design:type",Date)],Ue.prototype,"created_at",void 0),he([G(()=>Ne),Ae("design:type",Number)],Ue.prototype,"group_id",void 0),he([G(()=>ke),Ae("design:type",Number)],Ue.prototype,"permission_id",void 0),Ue=he([W(Ie),z("groups_permissions"),Q(Re),J("4.2.0")],Ue);let je=class Log extends Z{static write(e,t,i){return _e(this,void 0,void 0,function*(){yield this.writeRaw(K.White,"",e,t,i)})}static error(e,t,i){return _e(this,void 0,void 0,function*(){yield this.writeRaw(K.Red,"error",e,t,i)})}static info(e,t,i){return _e(this,void 0,void 0,function*(){yield this.writeRaw(K.Cyan,"info",e,t,i)})}static success(e,t,i){return _e(this,void 0,void 0,function*(){yield this.writeRaw(K.Green,"success",e,t,i)})}static warning(e,t,i){return _e(this,void 0,void 0,function*(){yield this.writeRaw(K.Yellow,"warning",e,t,i)})}static writeRaw(e,t,i,r,n){return _e(this,void 0,void 0,function*(){n&&M.console(e,t,i),Ie&&(yield this.create({type:t,source:r,message:i}).catch(this.error))})}};he([$.Id(),Ae("design:type",Number)],je.prototype,"id",void 0),he([$.String(),Ae("design:type",String)],je.prototype,"type",void 0),he([$.String(),Ae("design:type",String)],je.prototype,"source",void 0),he([$.Text(),Ae("design:type",String)],je.prototype,"message",void 0),he([$.CreatedAt,Ae("design:type",Date)],je.prototype,"created_at",void 0),je=he([W(Ie),z("log"),J("4.2.0")],je);let Le=class Migration extends Z{};he([$.String(),Ae("design:type",String)],Le.prototype,"model",void 0),he([$.String(),Ae("design:type",String)],Le.prototype,"version",void 0),he([$.CreatedAt,Ae("design:type",Date)],Le.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],Le.prototype,"updated_at",void 0),Le=he([W(Ie),z("migration"),J("4.2.0")],Le);let Ke=class Session extends Z{};he([$.String(),Ae("design:type",String)],Ke.prototype,"session",void 0),he([$.Text(),Ae("design:type",String)],Ke.prototype,"json",void 0),he([$.BigInt(),Ae("design:type",Number)],Ke.prototype,"expired",void 0),he([$.CreatedAt,Ae("design:type",Date)],Ke.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],Ke.prototype,"updated_at",void 0),Ke=he([W(Ie),z("session"),J("4.2.0")],Ke);class AuthBase{static error(e){let t="token";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),je.error(e.message,t,Env.API_CONSOLE_ERROR)}}class AuthKey extends AuthBase{static user(e,t){return _e(this,void 0,void 0,function*(){if(!e)return{error:"INVALID TOKEN"};const i=t.hash.encrypt(e),r=yield we.findOne({where:{token:i,state:!0}}).catch(this.error);if(r){const t=e.replace(/(-[\w]{4})/g,"-****"),[i]=(yield Te.findOrCreate({where:{secret:t,user_id:r.id},defaults:{secret:t,user_id:r.id}}).catch(this.error))||[];if(i)return i.logout&&(i.logout=null,yield i.save().catch(this.error)),{auth:i,user:r}}return{error:"ACCESS DENIED"}})}}const Me=e=>de(e)?se(e):void 0,He={http:Me(Env.API_HTTP_CRT),token:Me(Env.API_TOKEN_CRT)},qe={http:Me(Env.API_HTTP_KEY),token:Me(Env.API_TOKEN_KEY)};class AuthToken extends AuthBase{static options(){return{algorithm:"RS256",expiresIn:`${Env.API_TOKEN_LIFETIME}ms`}}static create(e){return _e(this,void 0,void 0,function*(){if(!qe.token)return{error:"KEY NOT FOUND"};const{id:t}=e,i=r(),n=yield Te.create({secret:i,user_id:t}).catch(this.error);if(!n)return{error:"INTERNAL SERVER ERROR"};return{auth:n,token:oe.sign({id:t,secret:i},qe.token,this.options())}})}static destroy(e){return _e(this,void 0,void 0,function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)})}static renew(e){return _e(this,void 0,void 0,function*(){if(!qe.token)return{error:"KEY NOT FOUND"};const{error:t,decode:i}=this.verify(e,Env.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(i){const{id:e,secret:t}=i;if(e&&t){const i=yield we.findOne({where:{id:e,state:!0}}).catch(this.error);if(i){const n=yield Te.findOne({where:{secret:t,user_id:i.id}}).catch(this.error);if(n&&!n.logout){n.secret=r(),yield n.save().catch(this.error);return{auth:n,token:oe.sign({id:e,secret:n.secret},qe.token,this.options())}}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}})}static user(e){return _e(this,void 0,void 0,function*(){const{error:t,decode:i}=this.verify(e);if(t)return{error:t};if(i){const{id:e,secret:t}=i;if(e&&t){const i=yield we.findOne({where:{id:e,state:!0}}).catch(this.error);if(i){const e=yield Te.findOne({where:{secret:t,user_id:i.id}}).catch(this.error);if(e&&!e.logout)return{auth:e,user:i}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}})}static verify(e,t){if(!He.token)return{error:"CERT NOT FOUND"};if(!e||e.split(".").length<3)return{error:"INVALID TOKEN"};try{return{decode:oe.verify(e,He.token,{clockTolerance:t})}}catch(e){return{error:"INVALID TOKEN"}}}}class Store extends ye{constructor(){super(),this.all=e=>_e(this,void 0,void 0,function*(){e=e||i;const t=yield Ke.findAll({attributes:["session"],where:{expired:{[re.gte]:Date.now()}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.session)),e()}),this.clear=e=>_e(this,void 0,void 0,function*(){yield Ke.destroy().catch(i),e&&e()}),this.destroy=(e,t)=>_e(this,void 0,void 0,function*(){yield Ke.destroy({where:{session:e}}).catch(i),t&&t()}),this.expired=()=>_e(this,void 0,void 0,function*(){yield Ke.destroy({where:{expired:{[re.lt]:Date.now()}}}).catch(i)}),this.get=(e,t)=>_e(this,void 0,void 0,function*(){t=t||i;const r=yield Ke.findOne({where:{session:e,expired:{[re.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(i),void t(null)}return void t(null,e)}t(null)}),this.length=e=>_e(this,void 0,void 0,function*(){e&&e(null,(yield Ke.count().catch(i))||0)}),this.set=(e,t,r)=>_e(this,void 0,void 0,function*(){r=r||i;const n=Date.now()+Env.API_SESSION_LIFETIME,o=JSON.stringify(t),[s,d]=(yield Ke.findOrCreate({where:{session:e},defaults:{session:e,json:o,expired:n}}).catch(i))||[];s&&(d||(s.json=o,s.expired=n,yield s.save().catch(i))),r()}),this.loop=n(this.expired,3e4),this.loop.start()}}class Application extends _{constructor(e){super(e,{cert:He.http,cross:Env.API_HTTP_CROSS,hybrid:Env.API_HTTP_HYBRID,json:{strict:Env.API_BODYPARSER_STRICT,inflate:Env.API_BODYPARSER_INFLATE,limit:Env.API_BODYPARSER_LIMIT,type:Env.API_BODYPARSER_TYPE},key:qe.http,notfound:Env.API_HTTP_NOTFOUND,path:Env.API_HTTP_PATH,port:Env.API_HTTP_PORT,public:Env.API_HTTP_PUBLIC,redirect:Env.API_HTTP_REDIRECT,session:{store:new Store,name:Env.API_SESSION_NAME,secret:Env.API_SESSION_SECRET,cookie:{maxAge:Env.API_SESSION_LIFETIME},genid:r}}),this.hash=new H(Env.API_KEY_HASH)}error(e,t){Env.API_BASE_NAME&&(t=t?`${Env.API_BASE_NAME}.${t}`:Env.API_BASE_NAME),je.error(e.message,t,Env.API_CONSOLE_ERROR)}log(e,t){Env.API_BASE_NAME&&(t=t?`${Env.API_BASE_NAME}.${t}`:Env.API_BASE_NAME),je.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return _e(this,void 0,void 0,function*(){yield Ie.sync(),yield this.migrations(Ie),yield o(this.controllers,e=>_e(this,void 0,void 0,function*(){s(e.sync)&&(yield e.sync(this))})),yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new ge({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>_e(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",n=>_e(this,void 0,void 0,function*(){if(r)try{const o=JSON.parse(n);this.emit("ws.message"+i,{data:o,message:n,req:t,user:r,ws:e})}catch(o){this.emit("ws.message"+i,{erro:o,message:n,req:t,user:r,ws:e})}else{const{user:o}=yield AuthToken.user(n.toString());o&&(r=o,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 d(2e3),r||e.close()})))})}migrations(e){return _e(this,void 0,void 0,function*(){const t=[];yield o(Object.keys(e.models),i=>_e(this,void 0,void 0,function*(){var r;const n=e.models[i],o=n.version();if(!o)return;const[s,d]=null!==(r=yield Le.findOrCreate({where:{model:n.tableName},defaults:{model:n.tableName,version:""}}).catch(this.error))&&void 0!==r?r:[];s&&(d||s.version!=o)&&(s.version=o,yield s.save().catch(this.error),t.push(n))})),yield o(t,e=>_e(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}var Ye,Ve,$e;class ControllerBase extends Controller{constructor(){super(...arguments),this[Ye]=[]}auth(e,t,i,r,n,o){return _e(this,void 0,void 0,function*(){var s;t=null!=t?t:r;const[d,a]=null!==(s=null==i?void 0:i.split(" "))&&void 0!==s?s:["",""];if(!(t||a&&d.toLowerCase()==Env.API_TOKEN_HEADER_KEY))return e.error("INVALID TOKEN");const{auth:u,error:l,user:p}=yield t?AuthKey.user(t,o):AuthToken.user(a);return l?e.error(l):u&&p?!t&&u.user_agent&&u.user_agent!=n?e.error("INVALID TOKEN"):(e.req.auth=u,e.req.user=p,void e.next()):e.error("INTERNAL SERVER ERROR")})}canCreate(e,t,i){return _e(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".create",i)})}canDelete(e,t,i){return _e(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".delete",i)})}canRead(e,t,i){return _e(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".read",i)})}canUpdate(e,t,i){return _e(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".update",i)})}error(e){let t="controller_base";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),je.error(e.message,t,Env.API_CONSOLE_ERROR)}name(){var e,t;return(null!==(t=null===(e=this.constructor)||void 0===e?void 0:e.name)&&void 0!==t?t:"api").replace(/(([a-z])([A-Z]))/g,"$2_$3")}permission(e,t,i){return _e(this,void 0,void 0,function*(){if(i){if((yield this.permissions(i,{route:t})).length>0)return e.next()}e.unauthorized("ACCESS DENIED")})}permissions(e,t){return _e(this,void 0,void 0,function*(){var i;return null!==(i=yield ke.findAll({where:Object.assign(Object.assign({},null!=t?t:{}),{state:!0}),include:[{model:Ue,required:!0,include:[{model:Ne,required:!0,where:{state:!0},include:[{model:Ce,required:!0,where:{user_id:e.id}}]}]}]}).catch(this.error))&&void 0!==i?i:[]})}session(e,t,r){return _e(this,void 0,void 0,function*(){r.auth&&r.user&&(r.user_agent?r.user_agent!=t&&r.regenerate(i):(r.user_agent=t,r.save(i))),e.next()})}sync(){return _e(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield o(this[Controller.PERMISSIONS],i=>_e(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=a(e.replace(/_/g," ")," ");yield ke.findOrCreate({where:{route:r},defaults:Object.assign({name:`${n} ${a(i," ")}`,route:r,tag:n},t)})}))})}upload(e,t){t.path||(t.path=Env.API_UPLOAD_TEMP),t.size||(t.size=Env.API_UPLOAD_SIZE),t.field||(t.field=Env.API_UPLOAD_FIELD),T.middleware(e,t)}validation(e,t){return _e(this,void 0,void 0,function*(){const{error:i,value:r}=yield u.object(t).parse().validateAsync(e.req.body);if(i)return e.validation(i);e.req.body=r,e.next()})}}Ye=Controller.PERMISSIONS,he([Ee(0,m()),Ee(1,O(Env.API_KEY_HEADER)),Ee(2,O(Env.API_TOKEN_HEADER)),Ee(3,S(Env.API_KEY_HEADER)),Ee(4,O("user-agent")),Ee(5,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String,String,String,Application]),Ae("design:returntype",Promise)],ControllerBase.prototype,"auth",null),he([Ee(0,m()),Ee(1,P()),Ee(2,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,we]),Ae("design:returntype",Promise)],ControllerBase.prototype,"canCreate",null),he([Ee(0,m()),Ee(1,P()),Ee(2,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,we]),Ae("design:returntype",Promise)],ControllerBase.prototype,"canDelete",null),he([Ee(0,m()),Ee(1,P()),Ee(2,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,we]),Ae("design:returntype",Promise)],ControllerBase.prototype,"canRead",null),he([Ee(0,m()),Ee(1,P()),Ee(2,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,we]),Ae("design:returntype",Promise)],ControllerBase.prototype,"canUpdate",null),he([Ee(0,m()),Ee(1,P()),Ee(2,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,we]),Ae("design:returntype",Promise)],ControllerBase.prototype,"permission",null),he([Ee(0,m()),Ee(1,O("user-agent")),Ee(2,R()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Object]),Ae("design:returntype",Promise)],ControllerBase.prototype,"session",null),he([Ee(0,m()),Ee(1,P()),Ae("design:type",Function),Ae("design:paramtypes",[I,Object]),Ae("design:returntype",void 0)],ControllerBase.prototype,"upload",null),he([Ee(0,m()),Ee(1,P()),Ae("design:type",Function),Ae("design:paramtypes",[I,Object]),Ae("design:returntype",Promise)],ControllerBase.prototype,"validation",null);let Ge=class ControllerModel extends ControllerBase{constructor(){super(...arguments),this[Ve]=[],this[$e]=["create","read","update","delete"]}attributes(e){if(0==this[ControllerBase.ATTRIBUTES].length&&(this[ControllerBase.ATTRIBUTES]=Object.keys(this.model().getAttributes())),l(e))return e.length?e.map(e=>p(e)&&-1!=this[ControllerBase.ATTRIBUTES].indexOf(e)?e:void 0).filter(p):this[ControllerBase.ATTRIBUTES];const{exclude:t,include:i}=e,r=c(i)?this[ControllerBase.ATTRIBUTES]:i.map(e=>p(e)&&-1!=this[ControllerBase.ATTRIBUTES].indexOf(e)?e:void 0).filter(p),n=null!=t?t:[];return n.length?r.filter(e=>-1==n.indexOf(e)?e:void 0).filter(p):r}create(e){return _e(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||{}),me(e))).catch(this.error);if(r){const t=this.key();return e.prepare(N.OK,{[t]:r.getDataValue(t)}),r}e.error("INTERNAL SERVER ERROR")})}delete(e){return _e(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 n=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[i]:r}),individualHooks:!0}),me(e))).catch(this.error);return n?(e.success("OK"),n):(e.notFound("RECORD NOT FOUND"),0)})}error(e){let t="controller_model";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),(null==e?void 0:e.sql)?je.error((null==e?void 0:e.message)+"\n"+(null==e?void 0:e.sql),t,Env.API_CONSOLE_ERROR):super.error(e)}findAll(e){return _e(this,arguments,void 0,function*({ctx:e,options:t,callback:i,scope:r,advanced:n,attributes:o,limited:s}){var d,a,u;const l=this.scope(r),v=Object.assign({},t||{}),{fields:h,limit:E,offset:A,asc:_,desc:m,search:O,where:S}=e.req.query;if(c(v.limit)){let e=Env.API_MODEL_LIMIT;p(E)&&(e=parseInt(E)||0),e=g(e,-1,Env.API_MODEL_LIMIT_MAX),v.limit=e>0?e:s?Env.API_MODEL_LIMIT:void 0}if(y(v.limit)&&(v.limit=v.limit>0?v.limit:void 0),p(A)){const e=parseInt(A)||0;v.offset=e>0?e:void 0}o=null!=o?o:this.attributes(null!==(d=null==v?void 0:v.attributes)&&void 0!==d?d:[]);const f=e=>o.indexOf(e)>=0,I=[];p(h)&&I.push(...h.split(";").filter(f)),I.length&&(v.attributes=I);const P=[];if(p(_)&&_.length&&P.push(..._.split(";").filter(f).map(e=>[e,"ASC"])),p(m)&&m.length&&P.push(...m.split(";").filter(f).map(e=>[e,"DESC"])),P.length&&(v.order=P),v.where=Object.assign({},v.where||{}),p(S)&&(null==n||n)){const t=ne.parse(o,S);if(!c(t.error))return e.validation(t.error.join(", ")),{count:0,records:[]};v.where=Object.assign(Object.assign({},v.where),null!==(a=t.value)&&void 0!==a?a:{})}else{const e=[];o.forEach(t=>{p(O)&&O.length&&e.push({[t]:{[re.like]:`%${O}%`}})}),e.length&&(v.where=Object.assign(Object.assign({},v.where),{[re.or]:[...e]}))}const R=l.count(Object.assign(Object.assign({},v),{distinct:!!v.include,col:this[ControllerBase.ATTRIBUTES].length?this[ControllerBase.ATTRIBUTES][0]:void 0})).catch(this.error),T=l.findAll(v).catch(this.error);yield Promise.allSettled([R,T]);const D=null!==(u=yield R)&&void 0!==u?u:0;let C=yield T;const b={count:D};return C?(C=i?yield i(C):C,(y(null==t?void 0:t.limit)||0==D)&&(b.count=C.length),e.prepare(N.OK,Object.assign(Object.assign({},b),{records:C})),Object.assign(Object.assign({},b),{records:C})):(e.error("INTERNAL SERVER ERROR"),Object.assign(Object.assign({},b),{records:[]}))})}findOne(e){return _e(this,arguments,void 0,function*({ctx:e,options:t,callback:i,scope:r}){const n=this.key(),{[n]:o}=e.req.params,s=yield this.scope(r).findOne(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[n]:o})})).catch(this.error);return s?(e.prepare(N.OK,i?yield i(s):s.toJSON()),s):null===s?e.notFound("RECORD NOT FOUND"):void e.error("INTERNAL SERVER ERROR")})}sync(){return _e(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield o(this[ControllerBase.PERMISSIONS],i=>_e(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=a(e.replace(/_/g," ")," ");yield ke.findOrCreate({where:{route:r},defaults:Object.assign({name:`${n} ${a(i," ")}`,route:r,tag:n},t)})}))})}update(e){return _e(this,arguments,void 0,function*({ctx:e,options:t,body:i}){var r;const n=this.key(),{[n]:o}=e.req.params,[s]=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),{[n]:o}),individualHooks:!0}),me(e))).catch(this.error))&&void 0!==r?r:[];return s?(e.success("OK"),!0):(e.success("RECORD NOT CHANGED"),!1)})}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}};Ve=ControllerBase.ATTRIBUTES,$e=ControllerBase.PERMISSIONS,Ge=he([D(ControllerBase)],Ge);let We=class ControllerCrud extends Ge{constructor(){super(...arguments),this._crud={}}CrudArgumentsCreate(e){return{ctx:e}}CrudArgumentsFindAll(e){return{ctx:e}}CrudArgumentsFindOne(e){return{ctx:e}}CrudArgumentsDelete(e){return{ctx:e}}CrudArgumentsUpdate(e){return{ctx:e}}CrudValidationCreate(){return this._crud}CrudValidationUpdate(){return this._crud}add(e){return _e(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return _e(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}del(e){return _e(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return _e(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return _e(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validationCreate(e){return _e(this,void 0,void 0,function*(){const t=this.CrudValidationCreate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)})}validationUpdate(e){return _e(this,void 0,void 0,function*(){const t=this.CrudValidationUpdate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)})}};he([C(),b("auth"),b("canCreate"),b("validationCreate"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],We.prototype,"add",null),he([w(),b("auth"),b("canRead"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],We.prototype,"all",null),he([B("/:id"),b("auth"),b("canDelete"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],We.prototype,"del",null),he([w("/:id"),b("auth"),b("canRead"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],We.prototype,"get",null),he([x("/:id"),b("auth"),b("canUpdate"),b("validationUpdate"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],We.prototype,"set",null),he([Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],We.prototype,"validationCreate",null),he([Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],We.prototype,"validationUpdate",null),We=he([D(Ge)],We);let ze=class AuditsController extends Ge{model(){return Be}all(e,t,i){return _e(this,void 0,void 0,function*(){const r={};t&&(r.type=t),i&&(r.table=i),yield this.findAll({ctx:e,options:{attributes:{exclude:["data","previously"]},where:r,order:[["created_at","DESC"]]},limited:!0})})}get(e){return _e(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}};he([w(),b("auth"),b("canRead"),Ee(0,m()),Ee(1,S("type")),Ee(2,S("table")),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String]),Ae("design:returntype",Promise)],ze.prototype,"all",null),he([w("/:id"),b("auth"),b("canRead"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],ze.prototype,"get",null),ze=he([F("/audits"),D(Ge)],ze);let Je=class AuthController extends ControllerBase{login(e,t,i,r,n){return _e(this,void 0,void 0,function*(){var o;yield d(Env.API_SLEEP_AUTH);const s=yield we.scope("password").findOne({where:{[re.or]:[{email:i},{username:i}]}}).catch(this.error);if(r+=null!==(o=null==s?void 0:s.salt)&&void 0!==o?o:"",!s||s.password!=q(r))return e.notFound("INVALID USERNAME OR PASSWORD"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const a=yield De.findOne({where:{state:!0,user_id:s.id}}).catch(this.error);if(a)return e.error("ACTIVATION REQUIRED"),n.emit("auth.activation",{ctx:e,register:a,user:s}),void this.emit("auth.activation",{ctx:e,register:a,user:s});if(!s.state)return e.notFound("INVALID USERNAME OR PASSWORD"),n.emit("auth.failure",{ctx:e,user:s}),void this.emit("auth.failure",{ctx:e,user:s});const{auth:u,error:l,token:p}=yield AuthToken.create(s);return l?(e.error(l),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):u&&p?(u.user_agent=t,yield u.save().catch(this.error),e.json({token:p}),n.emit("auth.login",{auth:u,ctx:e,user:s}),void this.emit("auth.login",{auth:u,ctx:e,user:s})):(e.error("INTERNAL SERVER ERROR"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))})}logout(e,t,i,r){return _e(this,void 0,void 0,function*(){if(yield AuthToken.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 _e(this,void 0,void 0,function*(){const{auth:n,error:o,token:s}=yield AuthToken.renew(i);return o?e.error(o):n?(n.user_agent=t,yield n.save().catch(this.error),e.json({token:s}),r.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 _e(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({},v(["username","date","description","state","created_at","updated_at","deleted_at"],t.toJSON())),{permissions:i.map(e=>e.route)}))})}};var Ze;he([C("/login"),b("validation",{username:u.string().min(3).required(),password:u.string().min(5).required()}),Ee(0,m()),Ee(1,O("user-agent")),Ee(2,k("username")),Ee(3,k("password")),Ee(4,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String,String,Application]),Ae("design:returntype",Promise)],Je.prototype,"login",null),he([w("/logout"),b("auth"),Ee(0,m()),Ee(1,Se()),Ee(2,fe()),Ee(3,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,Te,we,Application]),Ae("design:returntype",Promise)],Je.prototype,"logout",null),he([C("/renew"),b("validation",{token:u.string().required()}),Ee(0,m()),Ee(1,O("user-agent")),Ee(2,k("token")),Ee(3,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String,Application]),Ae("design:returntype",Promise)],Je.prototype,"renew",null),he([w(),b("auth"),Ee(0,m()),Ee(1,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,we]),Ae("design:returntype",Promise)],Je.prototype,"user",null),Je=he([F("/auth"),D(ControllerBase)],Je);let Xe=class FilesController extends ControllerBase{constructor(){super(...arguments),this[Ze]=["delete","download","edit","list","read","rename","upload","write"]}directory(){return Env.API_HTTP_PUBLIC||"./"}files(e){return _e(this,void 0,void 0,function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const i=ve(this.directory(),t);if(!de(i)||!ae(i).isDirectory())return e.notFound("RECORD NOT FOUND");let r=[];return r=ue(i),r=r.map(e=>this.info(ve(i,e))),r=r.filter(h),Object.assign(Object.assign({},this.info(i)),{files:r})})}access(e,t,i){return _e(this,void 0,void 0,function*(){yield this.permission(e,this.name()+"."+t,i)})}info(e){if(!de(e))return null;const t=ae(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"}sync(){return _e(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=a(e.replace(/_/g," ")," "),i={description:"",state:!0};yield o(this[ControllerBase.PERMISSIONS],r=>_e(this,void 0,void 0,function*(){const n=`${e}.${r}`;yield ke.findOrCreate({where:{route:n},defaults:Object.assign({name:`${t} ${a(r," ")}`,route:n,tag:t},i)})}))})}};Ze=ControllerBase.PERMISSIONS,he([w("/path"),w("/path/*path"),b("auth"),b("access","list"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],Xe.prototype,"files",null),he([Ee(0,m()),Ee(1,P()),Ee(2,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,we]),Ae("design:returntype",Promise)],Xe.prototype,"access",null),Xe=he([F("/files"),D(ControllerBase)],Xe);let Qe=class ForgotController extends ControllerBase{check(e,t){return _e(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i||!i.user)return e.notFound("RECORD NOT FOUND");i.token=E(),yield i.save(),e.json({token:i.token})})}forgot(e,t,i){return _e(this,void 0,void 0,function*(){yield d(Env.API_SLEEP_FORGOT);const r=t,n=yield we.findOne({where:{[re.or]:[{email:r},{username:t}]}}).catch(this.error);if(!n)return e.notFound("RECORD NOT FOUND");const o=E(),s=Date.now()+6e4*Env.API_TOKEN_FORGOT,a=yield Fe.create({token:o,timestamp:s,state:!0,user_id:n.id});e.success("OK"),i.emit("forgot.send",{ctx:e,forgot:a,user:n}),this.emit("forgot.send",{ctx:e,forgot:a,user:n})})}reset(e,t,i,r){return _e(this,void 0,void 0,function*(){const n=yield this.find(t);if(!n)return e.notFound("RECORD NOT FOUND");n.state=!1,yield n.save().catch(this.error),n.user.password=q(i),yield n.user.save().catch(this.error),e.success("OK"),r.emit("forgot.reset",{ctx:e,user:n.user}),this.emit("forgot.reset",{ctx:e,user:n.user})})}find(e){return _e(this,void 0,void 0,function*(){return yield Fe.findOne({where:{token:e,state:!0},include:[{model:we,required:!0}]}).catch(this.error)})}};he([w("/check"),b("validation",{token:u.string().required()}),Ee(0,m()),Ee(1,k("token")),Ae("design:type",Function),Ae("design:paramtypes",[I,String]),Ae("design:returntype",Promise)],Qe.prototype,"check",null),he([C(),b("validation",{username:u.string().min(4).required()}),Ee(0,m()),Ee(1,k("username")),Ee(2,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Application]),Ae("design:returntype",Promise)],Qe.prototype,"forgot",null),he([C("/reset"),b("validation",{token:u.string().required(),password:u.string().min(5).required()}),Ee(0,m()),Ee(1,k("token")),Ee(2,k("password")),Ee(3,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String,Application]),Ae("design:returntype",Promise)],Qe.prototype,"reset",null),Qe=he([F("/forgot"),D(ControllerBase)],Qe);let et=class GroupsController extends We{constructor(){super(...arguments),this.schemaCreate={name:u.string().required(),description:u.string().empty(""),state:u.boolean().parse().required()},this.schemaUpdate={name:u.string().empty(),description:u.string().empty(),state:u.boolean().parse().empty()}}model(){return Ne}CrudArgumentsFindAll(e){return{ctx:e}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}};et=he([F("/groups"),D(We)],et);let tt=class GroupsPermissionsController extends Ge{model(){return Ue}all(e,t){return _e(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{group_id:t},include:[{model:ke,required:!0}]},callback:e=>e.map(e=>e.permission)})})}me(e,t){return _e(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(e,t,i,r){return _e(this,void 0,void 0,function*(){const n=yield Ne.findByPk(t,{attributes:["id"]}).catch(this.error);if(!n)return e.notFound("RECORD NOT FOUND");const o=n.id;if(yield Ue.destroy(Object.assign({where:{group_id:o},individualHooks:!0},r)),i){let e=0;yield d(1e3);for(let t=0;t<i.length;t++)e=yield ke.count({where:{id:i[t]}}),e&&(yield Ue.create({group_id:o,permission_id:i[t]},Object.assign({},r)))}e.success("OK")})}};var it;he([w("/:id/permissions"),b("auth"),b("canRead","groups"),Ee(0,m()),Ee(1,U("id")),Ae("design:type",Function),Ae("design:paramtypes",[I,String]),Ae("design:returntype",Promise)],tt.prototype,"all",null),he([w("/permissions"),b("auth"),b("canRead","users"),Ee(0,m()),Ee(1,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,we]),Ae("design:returntype",Promise)],tt.prototype,"me",null),he([x("/:id/permissions"),b("auth"),b("canUpdate","groups"),b("validation",{permissions:u.array(u.number().parse())}),Ee(0,m()),Ee(1,U("id")),Ee(2,k("permissions")),Ee(3,Oe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Array,Object]),Ae("design:returntype",Promise)],tt.prototype,"set",null),tt=he([F("/groups"),D(Ge)],tt);let rt=class LogsController extends Ge{constructor(){super(...arguments),this[it]=["read"]}model(){return je}all(e,t,i){return _e(this,void 0,void 0,function*(){const r={};t&&(r.type=t),i&&(r.source=i),yield this.findAll({ctx:e,options:{where:r,order:[["created_at","DESC"]]},limited:!0})})}};it=Ge.PERMISSIONS,he([w(),b("auth"),b("canRead"),Ee(0,m()),Ee(1,S("type")),Ee(2,S("source")),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String]),Ae("design:returntype",Promise)],rt.prototype,"all",null),rt=he([F("/logs"),D(Ge)],rt);let nt=class PermissionsController extends We{constructor(){super(...arguments),this.schemaCreate={name:u.string().required(),route:u.string().required(),tag:u.string().required(),description:u.string().empty(""),state:u.boolean().parse().required()},this.schemaUpdate={name:u.string().empty(),route:u.string().empty(),tag:u.string().empty(),description:u.string().empty(),state:u.boolean().parse().empty()}}model(){return ke}CrudArgumentsFindAll(e){return{ctx:e}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}};nt=he([F("/permissions"),D(We)],nt);let ot=class RegisterController extends ControllerBase{register(e,t,i){return _e(this,void 0,void 0,function*(){yield d(Env.API_SLEEP_REGISTRY);const{name:r,date:n,email:o,username:s,password:a,confirm:u}=t,l=s||o,p=q(a);if(yield we.count({where:{[re.or]:[{email:o},{username:l}]}}).catch(this.error))return e.validation("INVALID EMAIL OR USERNAME");if(p!=q(u))return e.error("INVALID PASSWORD");const c=yield we.create({name:r,email:o,username:l,password:p,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!c)return e.error("INTERNAL SERVER ERROR");const g=yield De.create({token:yield this.getId(),user_id:c.id,state:!0}).catch(this.error);if(!g)return yield c.destroy().catch(this.error),e.error("INTERNAL SERVER ERROR");e.success("OK"),i.emit("register.user",{ctx:e,register:g,user:c}),this.emit("register.user",{ctx:e,register:g,user:c})})}confirm(e,t,i){return _e(this,void 0,void 0,function*(){const r=yield De.findOne({where:{token:t,state:!0},include:[{model:we,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 _e(this,void 0,void 0,function*(){const r=t,n=yield De.findOne({where:{state:!0},include:[{model:we,required:!0,where:{[re.or]:[{email:r},{username:t}]}}]}).catch(this.error);if(!n)return e.notFound("RECORD NOT FOUND");e.success("OK"),i.emit("register.send",{ctx:e,register:n,user:n.user}),this.emit("register.send",{ctx:e,register:n,user:n.user})})}getId(){return _e(this,void 0,void 0,function*(){const e=r();return(yield De.count({where:{token:e}}))?this.getId():e})}};he([C(),b("validation",{name:u.string().required(),date:u.date().required(),email:u.string().email().required(),username:u.string().min(4).empty(),password:u.string().min(5).required(),confirm:u.string().min(5).required()}),Ee(0,m()),Ee(1,k()),Ee(2,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,Object,Application]),Ae("design:returntype",Promise)],ot.prototype,"register",null),he([C("/confirm"),b("validation",{token:u.string().required()}),Ee(0,m()),Ee(1,k("token")),Ee(2,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Application]),Ae("design:returntype",Promise)],ot.prototype,"confirm",null),he([C("/send"),b("validation",{username:u.string().min(4).required()}),Ee(0,m()),Ee(1,k("username")),Ee(2,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Application]),Ae("design:returntype",Promise)],ot.prototype,"send",null),ot=he([F("/register"),D(ControllerBase)],ot);let st=class SetupController extends ControllerBase{setup(e,t){return _e(this,void 0,void 0,function*(){var i;if(yield we.count())return e.success("OK");const r=E(),n=yield we.create({name:"Admin",email:"admin@localhost",username:"admin",password:q("admin"+r),salt:r,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0},Object.assign({},t)),s=yield Ne.create(Object.assign({name:"Admin"},{description:"API CORE",state:!0}),Object.assign({},t));yield Ce.create({user_id:n.id,group_id:s.id},Object.assign({},t));const d=null!==(i=yield ke.findAll({where:{state:!0}}).catch(this.error))&&void 0!==i?i:[];yield o(d,e=>_e(this,void 0,void 0,function*(){yield Ue.create({group_id:s.id,permission_id:e.id},Object.assign({},t))})),e.success("OK")})}};he([w(),Ee(0,m()),Ee(1,Oe()),Ae("design:type",Function),Ae("design:paramtypes",[I,Object]),Ae("design:returntype",Promise)],st.prototype,"setup",null),st=he([F("/setup"),D(ControllerBase)],st);let dt=class UsersController extends Ge{model(){return we}constructor(){super(),this.path=Env.API_HTTP_PUBLIC+"/avatar",Env.API_HTTP_PUBLIC&&de(Env.API_HTTP_PUBLIC)&&!de(this.path)&&le(this.path)}avatar(e,t,i,r){return _e(this,void 0,void 0,function*(){if(t.length){const n=t[0].filename||"";if(n){const t=this.path+"/"+i.avatar;if(de(t)&&pe(t).isFile()&&ce(t),i.avatar=n,yield i.save(Object.assign({},r)).catch(this.error))return e.success("OK")}}e.success("RECORD NOT CHANGED")})}avatar_del(e,t,i){return _e(this,void 0,void 0,function*(){const r=this.path+"/"+t.avatar;t.avatar="",(yield t.save(Object.assign({},i)).catch(this.error))&&de(r)&&ce(r),e.success("OK")})}password(e,t,i,r,n){return _e(this,void 0,void 0,function*(){var o;if(Env.API_USER_HISTORY){if(yield be.count({where:{password:q(i+r.id)}}).catch(this.error))return e.error("PASSWORD PREVIOUSLY REGISTERED")}const s=yield this.scope("password").findOne({where:{id:r.id,state:!0}}).catch(this.error);return t+=null!==(o=null==s?void 0:s.salt)&&void 0!==o?o:"",s&&s.password==q(t)?(s.salt=E(),s.password=q(i+s.salt),(yield s.save(Object.assign({},n)).catch(this.error))?e.success("OK"):void e.success("RECORD NOT CHANGED")):e.error("INVALID PASSWORD")})}token(e,t,i){return _e(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_del(e,t,i){return _e(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_get(e,t,i){return _e(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_renew(e,t,i,r){return _e(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=r.hash.encrypt(t),yield n.save(Object.assign({},i)).catch(this.error),e.json({token:t})}e.notFound("RECORD NOT FOUND")})}token_new(){return _e(this,void 0,void 0,function*(){var e;const t=r();return(null!==(e=yield this.model().count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t})}add(e,t){return _e(this,void 0,void 0,function*(){const i=E(),r=yield this.create({ctx:e,body:{password:q(t+i),salt:i}});Env.API_USER_HISTORY&&r&&(yield be.create({password:q(t+r.id),user_id:r.id}))})}all(e){return _e(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["password","salt","token"]}}})})}del(e,t,i){return _e(this,void 0,void 0,function*(){if(i.id.toString()==t)return e.notFound("RECORD NOT FOUND");yield this.delete({ctx:e})})}get(e){return _e(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e,t,i){return _e(this,void 0,void 0,function*(){if(Env.API_USER_HISTORY&&i){const r=q(i+t);if(yield be.count({where:{password:r}}).catch(this.error))return e.error("PASSWORD PREVIOUSLY REGISTERED");yield be.create({password:r,user_id:t}).catch(this.error)}const r=i?E():"";yield this.update({ctx:e,body:i?{password:q(i+r),salt:r}:{}})})}};he([C("/avatar"),b("auth"),b("upload",e=>({count:1,field:"file",path:e.controller.path,types:["image/bmp","image/jpeg","image/png"],size:32})),Ee(0,m()),Ee(1,j()),Ee(2,fe()),Ee(3,Oe()),Ae("design:type",Function),Ae("design:paramtypes",[I,Array,we,Object]),Ae("design:returntype",Promise)],dt.prototype,"avatar",null),he([B("/avatar"),b("auth"),Ee(0,m()),Ee(1,fe()),Ee(2,Oe()),Ae("design:type",Function),Ae("design:paramtypes",[I,we,Object]),Ae("design:returntype",Promise)],dt.prototype,"avatar_del",null),he([C("/password"),b("auth"),b("validation",{oldPassword:u.string().min(5).required(),newPassword:u.string().min(5).required(),confirmPassword:u.string().equal(u.ref("newPassword"))}),Ee(0,m()),Ee(1,k("oldPassword")),Ee(2,k("newPassword")),Ee(3,fe()),Ee(4,Oe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String,we,Object]),Ae("design:returntype",Promise)],dt.prototype,"password",null),he([w("/token"),b("auth"),Ee(0,m()),Ee(1,fe()),Ee(2,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,we,Application]),Ae("design:returntype",Promise)],dt.prototype,"token",null),he([B("/token/:id"),b("auth"),b("canDelete"),Ee(0,m()),Ee(1,U("id")),Ee(2,Oe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Object]),Ae("design:returntype",Promise)],dt.prototype,"token_del",null),he([w("/token/:id"),b("auth"),b("canCreate"),Ee(0,m()),Ee(1,U("id")),Ee(2,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Application]),Ae("design:returntype",Promise)],dt.prototype,"token_get",null),he([w("/token/renew/:id"),b("auth"),b("canUpdate"),Ee(0,m()),Ee(1,U("id")),Ee(2,Oe()),Ee(3,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Object,Application]),Ae("design:returntype",Promise)],dt.prototype,"token_renew",null),he([C(),b("auth"),b("canCreate"),b("validation",{name:u.string().required(),email:u.string().email().required(),username:u.string().min(4).required(),password:u.string().min(5).required(),description:u.string().empty(""),state:u.boolean().parse().required()}),Ee(0,m()),Ee(1,k("password")),Ae("design:type",Function),Ae("design:paramtypes",[I,String]),Ae("design:returntype",Promise)],dt.prototype,"add",null),he([w(),b("auth"),b("canRead"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],dt.prototype,"all",null),he([B("/:id"),b("auth"),b("canDelete"),Ee(0,m()),Ee(1,U("id")),Ee(2,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,we]),Ae("design:returntype",Promise)],dt.prototype,"del",null),he([w("/:id"),b("auth"),b("canRead"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],dt.prototype,"get",null),he([x("/:id"),b("auth"),b("canUpdate"),b("validation",{name:u.string().empty(),email:u.string().email().empty(),username:u.string().min(4).empty(),password:u.string().min(5).empty().filter(""),description:u.string().empty(),state:u.boolean().parse().empty()}),Ee(0,m()),Ee(1,U("id")),Ee(2,k("password")),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String]),Ae("design:returntype",Promise)],dt.prototype,"set",null),dt=he([F("/users"),D(Ge),Ae("design:paramtypes",[])],dt);let at=class UsersGroupsController extends Ge{model(){return Ce}all(e,t){return _e(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{user_id:t},include:[{model:Ne,required:!0}]},callback:e=>e.map(e=>e.group)})})}me(e,t){return _e(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(e,t,i,r){return _e(this,void 0,void 0,function*(){const n=yield we.findByPk(t,{attributes:["id"]}).catch(this.error);if(!n)return e.notFound("RECORD NOT FOUND");if(yield Ce.destroy(Object.assign({where:{user_id:n.id},individualHooks:!0},r)),i){let e=0;yield d(1e3);for(let t=0;t<i.length;t++)e=yield Ne.count({where:{id:i[t]}}),e&&(yield Ce.create({user_id:n.id,group_id:i[t]},Object.assign({},r)))}e.success("OK")})}};he([w("/:id/groups"),b("auth"),b("canRead","users"),Ee(0,m()),Ee(1,U("id")),Ae("design:type",Function),Ae("design:paramtypes",[I,String]),Ae("design:returntype",Promise)],at.prototype,"all",null),he([w("/groups"),b("auth"),b("canRead","users"),Ee(0,m()),Ee(1,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,we]),Ae("design:returntype",Promise)],at.prototype,"me",null),he([x("/:id/groups"),b("auth"),b("canUpdate","users"),b("validation",{groups:u.array(u.number().parse())}),Ee(0,m()),Ee(1,U("id")),Ee(2,k("groups")),Ee(3,Oe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Array,Object]),Ae("design:returntype",Promise)],at.prototype,"set",null),at=he([F("/users"),D(Ge)],at);export{Application,Be as Audit,ze as AuditsController,Te as Auth,AuthBase,Je as AuthController,AuthKey,AuthToken,xe as Config,Controller,ControllerBase,We as ControllerCrud,Ge as ControllerModel,Env,Xe as FilesController,Fe as Forgot,Qe as ForgotController,Ne as Group,Ue as GroupPermission,et as GroupsController,tt as GroupsPermissionsController,je as Log,rt as LogsController,Le as Migration,ke as Permission,nt as PermissionsController,De as Register,ot as RegisterController,Oe as ReqAudit,Se as ReqAuth,fe as ReqUser,Ke as Session,st as SetupController,Store,we as User,Ce as UserGroup,be as UserHistory,dt as UsersController,at as UsersGroupsController,me as audit,He as crt,Ie as database,Re as hooks,qe as key};
|
|
7
|
+
import{EventEmitter as e,isObject as t,noop as i,uuidv7 as r,loop as n,forEachSeries as o,isFunction as s,sleep as d,upperCamelCase as a,Validation as u,isArray as l,isString as p,isUndefined as c,clamp as g,isNumber as y,denied as v,isDef as h,uniqueID as E}from"@andrewcaires/utils.js";import{parameterFactory as A,Application as _,Ctx as m,Headers as O,Cookies as S,Query as I,App as f,Context as P,Argument as T,Session as R,Upload as N,Extends as C,Status as D,Post as b,Middleware as w,Get as B,Delete as x,Put as F,Controller as k,Body as U,Params as j,Files as L}from"@andrewcaires/express";import{Env as K,LogColor as M,Log as H,Hash as q,sha256 as Y}from"@andrewcaires/node";import{config as V}from"dotenv";import{Sequelize as $,Column as G,BelongsTo as W,Database as z,ModelName as J,Version as Z,Model as X,HasMany as Q,Hooks as ee,DefaultScope as te,Scopes as ie,Unique as re,Op as ne,Where as oe}from"@andrewcaires/sequelize";import se from"jsonwebtoken";import{readFileSync as de,existsSync as ae,statSync as ue,readdirSync as le,mkdirSync as pe,lstatSync as ce,rmSync as ge}from"fs";import{WebSocketServer as ye}from"ws";import{Store as ve}from"express-session";import{join as he}from"path";class Controller extends e{}function Ee(e,t,i,r){var n,o=arguments.length,s=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,r);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(s=(o<3?n(s):o>3?n(t,i,s):n(t,i))||s);return o>3&&s&&Object.defineProperty(t,i,s),s}function Ae(e,t){return function(i,r){t(i,r,e)}}function _e(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function me(e,t,i,r){return new(i||(i=Promise))(function(n,o){function s(e){try{a(r.next(e))}catch(e){o(e)}}function d(e){try{a(r.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(s,d)}a((r=r.apply(e,t||[])).next())})}Controller.ATTRIBUTES=Symbol("ATTRIBUTES"),Controller.PERMISSIONS=Symbol("PERMISSIONS"),"function"==typeof SuppressedError&&SuppressedError,V({quiet:!0});class Env extends K{}Env.API_BASE_NAME=Env.getString("API_BASE_NAME",""),Env.API_BODYPARSER_STRICT=Env.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=Env.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=Env.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=Env.getString("API_BODYPARSER_TYPE","json"),Env.API_CONSOLE_ERROR=Env.getBool("API_CONSOLE_ERROR",!1),Env.API_DATABASE_URL=Env.getString("API_DATABASE_URL",""),Env.API_DATABASE_LOG=Env.getBool("API_DATABASE_LOG",!1),Env.API_DATABASE_AUDIT=Env.getBool("API_DATABASE_AUDIT",!0),Env.API_DATABASE_PREFIX=Env.getString("API_DATABASE_PREFIX",""),Env.API_DATABASE_TIMEZONE=Env.getString("API_DATABASE_TIMEZONE","+00:00"),Env.API_HTTP_CRT=Env.getString("API_HTTP_CRT",""),Env.API_HTTP_KEY=Env.getString("API_HTTP_KEY",""),Env.API_HTTP_PORT=Env.getInt("API_HTTP_PORT",3e3),Env.API_HTTP_PUBLIC=Env.getString("API_HTTP_PUBLIC",""),Env.API_HTTP_CROSS=Env.getBool("API_HTTP_CROSS",!1),Env.API_HTTP_HYBRID=Env.getBool("API_HTTP_HYBRID",!1),Env.API_HTTP_NOTFOUND=Env.getString("API_HTTP_NOTFOUND",""),Env.API_HTTP_PATH=Env.getString("API_HTTP_PATH","/api"),Env.API_HTTP_REDIRECT=Env.getString("API_HTTP_REDIRECT",""),Env.API_KEY_HASH=Env.getString("API_KEY_HASH",""),Env.API_KEY_HEADER=Env.getString("API_KEY_HEADER","x-api-key"),Env.API_MODEL_LIMIT=Env.getInt("API_MODEL_LIMIT",10),Env.API_MODEL_LIMIT_MAX=Env.getInt("API_MODEL_LIMIT_MAX",500),Env.API_SLEEP_AUTH=Env.getMs("API_SLEEP_AUTH","2s"),Env.API_SLEEP_FORGOT=Env.getMs("API_SLEEP_FORGOT","5s"),Env.API_SLEEP_REGISTRY=Env.getMs("API_SLEEP_REGISTRY","5s"),Env.API_SESSION_NAME=Env.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=Env.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=Env.getString("API_SESSION_SECRET","yoursecret"),Env.API_TOKEN_COOKIE=Env.getString("API_TOKEN_COOKIE","authorization"),Env.API_TOKEN_COOKIE_SET=Env.getBool("API_TOKEN_COOKIE_SET",!0),Env.API_TOKEN_CRT=Env.getString("API_TOKEN_CRT",""),Env.API_TOKEN_KEY=Env.getString("API_TOKEN_KEY",""),Env.API_TOKEN_FORGOT=Env.getMs("API_TOKEN_FORGOT","1d"),Env.API_TOKEN_HEADER=Env.getString("API_TOKEN_HEADER","authorization"),Env.API_TOKEN_HEADER_KEY=Env.getString("API_TOKEN_HEADER","bearer"),Env.API_TOKEN_LIFETIME=Env.getMs("API_TOKEN_LIFETIME","1d"),Env.API_TOKEN_RENEW=Env.getMs("API_TOKEN_RENEW","1d"),Env.API_UPLOAD_COUNT=Env.getInt("API_UPLOAD_COUNT",1),Env.API_UPLOAD_FIELD=Env.getString("API_UPLOAD_FIELD","upload"),Env.API_UPLOAD_SIZE=Env.getInt("API_UPLOAD_SIZE",2),Env.API_UPLOAD_TEMP=Env.getString("API_UPLOAD_TEMP","./temp"),Env.API_USER_HISTORY=Env.getBool("API_USER_HISTORY",!0),Env.API_WEBSOCKET_START=Env.getBool("API_WEBSOCKET_START",!1);const Oe=e=>{var t,i,r,n,o,s,d,a,u;return{audit_client:null!==(t=e.getIp())&&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===(n=null==e?void 0:e.req)||void 0===n?void 0:n.originalUrl),audit_user_agent:null!==(s=null===(o=e.req)||void 0===o?void 0:o.headers["user-agent"])&&void 0!==s?s:"",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}},Se=A(({ctx:e})=>Oe(e)),Ie=A(({ctx:e})=>e.req.auth),fe=A(({ctx:e})=>e.req.user),Pe=new $(Env.API_DATABASE_URL,{logging:Env.API_DATABASE_LOG,prefix:Env.API_DATABASE_PREFIX,timezone:Env.API_DATABASE_TIMEZONE}),Te=(e,t,i)=>{var r,n,o,s,d;return{type:e,model:null!==(r=null==t?void 0:t.getTableName())&&void 0!==r?r:null,client:null!==(n=null==i?void 0:i.audit_client)&&void 0!==n?n:null,href:null!==(o=null==i?void 0:i.audit_href)&&void 0!==o?o:null,user_agent:null!==(s=null==i?void 0:i.audit_user_agent)&&void 0!==s?s:null,user_id:null!==(d=null==i?void 0:i.audit_user_id)&&void 0!==d?d:null,state:!0}},Re={afterCreate:(e,r)=>me(void 0,void 0,void 0,function*(){var n;if(!Env.API_DATABASE_AUDIT)return;const o=t(e)?e.constructor:null,s=null!==(n=null==o?void 0:o.primaryKeyAttribute)&&void 0!==n?n:null;yield xe.create(Object.assign(Object.assign({},Te("CREATE",o,r)),{record:s?e.getDataValue(s):null,data:e.toJSON()})).catch(i)}),afterUpdate:(e,r)=>me(void 0,void 0,void 0,function*(){var n;if(!Env.API_DATABASE_AUDIT)return;const o=t(e)?e.constructor:null,s=null!==(n=null==o?void 0:o.primaryKeyAttribute)&&void 0!==n?n:null,d={},a=e.changed();a&&a.forEach(t=>d[t]=e.getDataValue(t)),yield xe.create(Object.assign(Object.assign({},Te("UPDATE",o,r)),{record:s?e.getDataValue(s):null,data:d,previously:e.previous()})).catch(i)}),afterDestroy:(e,r)=>me(void 0,void 0,void 0,function*(){var n;if(!Env.API_DATABASE_AUDIT)return;const o=t(e)?e.constructor:null,s=null!==(n=null==o?void 0:o.primaryKeyAttribute)&&void 0!==n?n:null;yield xe.create(Object.assign(Object.assign({},Te("DELETE",o,r)),{record:s?e.getDataValue(s):null,data:e.toJSON()})).catch(i)})};let Ne=class Auth extends X{};Ee([G.Id(),_e("design:type",Number)],Ne.prototype,"id",void 0),Ee([G.String(),_e("design:type",String)],Ne.prototype,"secret",void 0),Ee([G.FullDate(),_e("design:type",Object)],Ne.prototype,"logout",void 0),Ee([G.String(),_e("design:type",String)],Ne.prototype,"user_agent",void 0),Ee([G.CreatedAt,_e("design:type",Date)],Ne.prototype,"created_at",void 0),Ee([G.UpdatedAt,_e("design:type",Date)],Ne.prototype,"updated_at",void 0),Ee([G.DeletedAt,_e("design:type",Object)],Ne.prototype,"deleted_at",void 0),Ee([W(()=>Be),_e("design:type",Number)],Ne.prototype,"user_id",void 0),Ne=Ee([z(Pe),J("auth"),Z("4.2.0")],Ne);let Ce=class Register extends X{};Ee([G.Id(),_e("design:type",Number)],Ce.prototype,"id",void 0),Ee([G.String(),_e("design:type",String)],Ce.prototype,"token",void 0),Ee([G.Boolean(),_e("design:type",Boolean)],Ce.prototype,"state",void 0),Ee([G.CreatedAt,_e("design:type",Date)],Ce.prototype,"created_at",void 0),Ee([G.UpdatedAt,_e("design:type",Date)],Ce.prototype,"updated_at",void 0),Ee([G.DeletedAt,_e("design:type",Object)],Ce.prototype,"deleted_at",void 0),Ee([W(()=>Be),_e("design:type",Number)],Ce.prototype,"user_id",void 0),Ce=Ee([z(Pe),J("register"),Z("4.2.0")],Ce);let De=class Group extends X{};Ee([G.Id(),_e("design:type",Number)],De.prototype,"id",void 0),Ee([G.String(),_e("design:type",String)],De.prototype,"name",void 0),Ee([G.Text(),_e("design:type",String)],De.prototype,"description",void 0),Ee([G.Boolean(),_e("design:type",Boolean)],De.prototype,"state",void 0),Ee([G.CreatedAt,_e("design:type",Date)],De.prototype,"created_at",void 0),Ee([G.UpdatedAt,_e("design:type",Date)],De.prototype,"updated_at",void 0),Ee([G.DeletedAt,_e("design:type",Object)],De.prototype,"deleted_at",void 0),Ee([Q(()=>be,"group_id"),_e("design:type",Array)],De.prototype,"groups_routes",void 0),Ee([Q(()=>be,"group_id"),_e("design:type",Array)],De.prototype,"users_groups",void 0),De=Ee([z(Pe),J("group"),ee(Re),Z("4.2.0")],De);let be=class UserGroup extends X{};Ee([G.CreatedAt,_e("design:type",Date)],be.prototype,"created_at",void 0),Ee([W(()=>De),_e("design:type",Number)],be.prototype,"group_id",void 0),Ee([W(()=>Be),_e("design:type",Number)],be.prototype,"user_id",void 0),be=Ee([z(Pe),J("users_groups"),ee(Re),Z("4.2.0")],be);let we=class UserHistory extends X{};Ee([G.String(),_e("design:type",String)],we.prototype,"password",void 0),Ee([G.CreatedAt,_e("design:type",Date)],we.prototype,"created_at",void 0),Ee([W(()=>Be),_e("design:type",Number)],we.prototype,"user_id",void 0),we=Ee([z(Pe),J("users_histories"),Z("4.2.0")],we);let Be=class User extends X{};Ee([G.Id(),_e("design:type",Number)],Be.prototype,"id",void 0),Ee([G.String(),_e("design:type",String)],Be.prototype,"name",void 0),Ee([G.String(),_e("design:type",String)],Be.prototype,"email",void 0),Ee([G.String(),_e("design:type",String)],Be.prototype,"username",void 0),Ee([G.String(),_e("design:type",String)],Be.prototype,"password",void 0),Ee([G.String(),_e("design:type",String)],Be.prototype,"salt",void 0),Ee([G.String(),_e("design:type",String)],Be.prototype,"token",void 0),Ee([G.String(),_e("design:type",String)],Be.prototype,"avatar",void 0),Ee([G.DateOnly(),_e("design:type",String)],Be.prototype,"date",void 0),Ee([G.Text(),_e("design:type",String)],Be.prototype,"description",void 0),Ee([G.Boolean(),_e("design:type",Boolean)],Be.prototype,"state",void 0),Ee([G.CreatedAt,_e("design:type",Date)],Be.prototype,"created_at",void 0),Ee([G.UpdatedAt,_e("design:type",Date)],Be.prototype,"updated_at",void 0),Ee([G.DeletedAt,_e("design:type",Object)],Be.prototype,"deleted_at",void 0),Ee([Q(()=>xe,"user_id"),_e("design:type",Array)],Be.prototype,"audits",void 0),Ee([Q(()=>Ne,"user_id"),_e("design:type",Array)],Be.prototype,"auths",void 0),Ee([Q(()=>Ce,"user_id"),_e("design:type",Array)],Be.prototype,"registers",void 0),Ee([Q(()=>be,"user_id"),_e("design:type",Array)],Be.prototype,"users_groups",void 0),Ee([Q(()=>we,"user_id"),_e("design:type",Array)],Be.prototype,"users_histories",void 0),Be=Ee([z(Pe),J("user"),te({attributes:{exclude:["password","salt","token"]}}),ie({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),ee(Re),Z("4.2.0")],Be);let xe=class Audit extends X{};Ee([G.Id(),_e("design:type",Number)],xe.prototype,"id",void 0),Ee([G.Enum("CREATE","DELETE","UPDATE"),_e("design:type",String)],xe.prototype,"type",void 0),Ee([G.String(),_e("design:type",String)],xe.prototype,"model",void 0),Ee([G.String(),_e("design:type",String)],xe.prototype,"record",void 0),Ee([G.Json(),_e("design:type",Object)],xe.prototype,"data",void 0),Ee([G.Json(),_e("design:type",Object)],xe.prototype,"previously",void 0),Ee([G.String(),_e("design:type",String)],xe.prototype,"client",void 0),Ee([G.Text(),_e("design:type",String)],xe.prototype,"href",void 0),Ee([G.String(),_e("design:type",String)],xe.prototype,"user_agent",void 0),Ee([G.Boolean(),_e("design:type",Boolean)],xe.prototype,"state",void 0),Ee([G.CreatedAt,_e("design:type",Date)],xe.prototype,"created_at",void 0),Ee([G.UpdatedAt,_e("design:type",Date)],xe.prototype,"updated_at",void 0),Ee([G.DeletedAt,_e("design:type",Object)],xe.prototype,"deleted_at",void 0),Ee([W(()=>Be),_e("design:type",Number)],xe.prototype,"user_id",void 0),xe=Ee([z(Pe),J("audit"),Z("4.2.0")],xe);let Fe=class Config extends X{static all(){return me(this,void 0,void 0,function*(){const e=yield this.findAll().catch(this.error),t={};return e&&e.forEach(e=>t[e.key]=e.value),t})}static del(e,t){return me(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 this.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:r})).catch(this.error))||0)>0})}static get(e){return me(this,arguments,void 0,function*(e,t=""){const[i]=(yield this.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return i?i.value:t})}static set(e,t,i){return me(this,void 0,void 0,function*(){var r;const n=null!==(r=null==i?void 0:i.id)&&void 0!==r?r:null,[o]=(yield this.findOrCreate(Object.assign({where:{key:e}},{user_id:n})).catch(this.error))||[];o&&(o.value=t,yield o.save().catch(this.error))})}};Ee([G.String(),_e("design:type",String)],Fe.prototype,"key",void 0),Ee([G.String(),_e("design:type",String)],Fe.prototype,"value",void 0),Ee([G.CreatedAt,_e("design:type",Date)],Fe.prototype,"created_at",void 0),Ee([G.UpdatedAt,_e("design:type",Date)],Fe.prototype,"updated_at",void 0),Fe=Ee([z(Pe),J("configs"),Z("4.2.0")],Fe);let ke=class Forgot extends X{};Ee([G.Id(),_e("design:type",Number)],ke.prototype,"id",void 0),Ee([G.String(),_e("design:type",String)],ke.prototype,"token",void 0),Ee([G.BigInt(),_e("design:type",Number)],ke.prototype,"timestamp",void 0),Ee([G.Boolean(),_e("design:type",Boolean)],ke.prototype,"state",void 0),Ee([G.CreatedAt,_e("design:type",Date)],ke.prototype,"created_at",void 0),Ee([G.UpdatedAt,_e("design:type",Date)],ke.prototype,"updated_at",void 0),Ee([G.DeletedAt,_e("design:type",Object)],ke.prototype,"deleted_at",void 0),Ee([W(()=>Be),_e("design:type",Number)],ke.prototype,"user_id",void 0),ke=Ee([z(Pe),J("forgot"),Z("4.2.0")],ke);let Ue=class Permission extends X{};Ee([G.Id(),_e("design:type",Number)],Ue.prototype,"id",void 0),Ee([G.String(),_e("design:type",String)],Ue.prototype,"name",void 0),Ee([G.String(),re(!0),_e("design:type",String)],Ue.prototype,"route",void 0),Ee([G.String(),_e("design:type",String)],Ue.prototype,"tag",void 0),Ee([G.Text(),_e("design:type",String)],Ue.prototype,"description",void 0),Ee([G.Boolean(),_e("design:type",Boolean)],Ue.prototype,"state",void 0),Ee([G.CreatedAt,_e("design:type",Date)],Ue.prototype,"created_at",void 0),Ee([G.UpdatedAt,_e("design:type",Date)],Ue.prototype,"updated_at",void 0),Ee([G.DeletedAt,_e("design:type",Object)],Ue.prototype,"deleted_at",void 0),Ee([Q(()=>je,"permission_id"),_e("design:type",Array)],Ue.prototype,"groups_permissions",void 0),Ue=Ee([z(Pe),J("permission"),ee(Re),Z("4.3.1")],Ue);let je=class GroupPermission extends X{};Ee([G.CreatedAt,_e("design:type",Date)],je.prototype,"created_at",void 0),Ee([W(()=>De),_e("design:type",Number)],je.prototype,"group_id",void 0),Ee([W(()=>Ue),_e("design:type",Number)],je.prototype,"permission_id",void 0),je=Ee([z(Pe),J("groups_permissions"),ee(Re),Z("4.2.0")],je);let Le=class Log extends X{static write(e,t,i){return me(this,void 0,void 0,function*(){yield this.writeRaw(M.White,"",e,t,i)})}static error(e,t,i){return me(this,void 0,void 0,function*(){yield this.writeRaw(M.Red,"error",e,t,i)})}static info(e,t,i){return me(this,void 0,void 0,function*(){yield this.writeRaw(M.Cyan,"info",e,t,i)})}static success(e,t,i){return me(this,void 0,void 0,function*(){yield this.writeRaw(M.Green,"success",e,t,i)})}static warning(e,t,i){return me(this,void 0,void 0,function*(){yield this.writeRaw(M.Yellow,"warning",e,t,i)})}static writeRaw(e,t,i,r,n){return me(this,void 0,void 0,function*(){n&&H.console(e,t,i),Pe&&(yield this.create({type:t,source:r,message:i}).catch(this.error))})}};Ee([G.Id(),_e("design:type",Number)],Le.prototype,"id",void 0),Ee([G.String(),_e("design:type",String)],Le.prototype,"type",void 0),Ee([G.String(),_e("design:type",String)],Le.prototype,"source",void 0),Ee([G.Text(),_e("design:type",String)],Le.prototype,"message",void 0),Ee([G.CreatedAt,_e("design:type",Date)],Le.prototype,"created_at",void 0),Le=Ee([z(Pe),J("log"),Z("4.2.0")],Le);let Ke=class Migration extends X{};Ee([G.String(),_e("design:type",String)],Ke.prototype,"model",void 0),Ee([G.String(),_e("design:type",String)],Ke.prototype,"version",void 0),Ee([G.CreatedAt,_e("design:type",Date)],Ke.prototype,"created_at",void 0),Ee([G.UpdatedAt,_e("design:type",Date)],Ke.prototype,"updated_at",void 0),Ke=Ee([z(Pe),J("migration"),Z("4.2.0")],Ke);let Me=class Session extends X{};Ee([G.String(),_e("design:type",String)],Me.prototype,"session",void 0),Ee([G.Text(),_e("design:type",String)],Me.prototype,"json",void 0),Ee([G.BigInt(),_e("design:type",Number)],Me.prototype,"expired",void 0),Ee([G.CreatedAt,_e("design:type",Date)],Me.prototype,"created_at",void 0),Ee([G.UpdatedAt,_e("design:type",Date)],Me.prototype,"updated_at",void 0),Me=Ee([z(Pe),J("session"),Z("4.2.0")],Me);class AuthBase{static error(e){let t="token";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),Le.error(e.message,t,Env.API_CONSOLE_ERROR)}}class AuthKey extends AuthBase{static user(e,t){return me(this,void 0,void 0,function*(){if(!e)return{error:"INVALID TOKEN"};const i=t.hash.encrypt(e),r=yield Be.findOne({where:{token:i,state:!0}}).catch(this.error);if(r){const t=e.replace(/(-[\w]{4})/g,"-****"),[i]=(yield Ne.findOrCreate({where:{secret:t,user_id:r.id},defaults:{secret:t,user_id:r.id}}).catch(this.error))||[];if(i)return i.logout&&(i.logout=null,yield i.save().catch(this.error)),{auth:i,user:r}}return{error:"ACCESS DENIED"}})}}const He=e=>ae(e)?de(e):void 0,qe={http:He(Env.API_HTTP_CRT),token:He(Env.API_TOKEN_CRT)},Ye={http:He(Env.API_HTTP_KEY),token:He(Env.API_TOKEN_KEY)};class AuthToken extends AuthBase{static options(){return{algorithm:"RS256",expiresIn:`${Env.API_TOKEN_LIFETIME}ms`}}static create(e){return me(this,void 0,void 0,function*(){if(!Ye.token)return{error:"KEY NOT FOUND"};const{id:t}=e,i=r(),n=yield Ne.create({secret:i,user_id:t}).catch(this.error);if(!n)return{error:"INTERNAL SERVER ERROR"};return{auth:n,token:se.sign({id:t,secret:i},Ye.token,this.options())}})}static destroy(e){return me(this,void 0,void 0,function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)})}static renew(e){return me(this,void 0,void 0,function*(){if(!Ye.token)return{error:"KEY NOT FOUND"};const{error:t,decode:i}=this.verify(e,Env.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(i){const{id:e,secret:t}=i;if(e&&t){const i=yield Be.findOne({where:{id:e,state:!0}}).catch(this.error);if(i){const n=yield Ne.findOne({where:{secret:t,user_id:i.id}}).catch(this.error);if(n&&!n.logout){n.secret=r(),yield n.save().catch(this.error);return{auth:n,token:se.sign({id:e,secret:n.secret},Ye.token,this.options())}}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}})}static user(e){return me(this,void 0,void 0,function*(){const{error:t,decode:i}=this.verify(e);if(t)return{error:t};if(i){const{id:e,secret:t}=i;if(e&&t){const i=yield Be.findOne({where:{id:e,state:!0}}).catch(this.error);if(i){const e=yield Ne.findOne({where:{secret:t,user_id:i.id}}).catch(this.error);if(e&&!e.logout)return{auth:e,user:i}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}})}static verify(e,t){if(!qe.token)return{error:"CERT NOT FOUND"};if(!e||e.split(".").length<3)return{error:"INVALID TOKEN"};try{return{decode:se.verify(e,qe.token,{clockTolerance:t})}}catch(e){return{error:"INVALID TOKEN"}}}}class Store extends ve{constructor(){super(),this.all=e=>me(this,void 0,void 0,function*(){e=e||i;const t=yield Me.findAll({attributes:["session"],where:{expired:{[ne.gte]:Date.now()}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.session)),e()}),this.clear=e=>me(this,void 0,void 0,function*(){yield Me.destroy().catch(i),e&&e()}),this.destroy=(e,t)=>me(this,void 0,void 0,function*(){yield Me.destroy({where:{session:e}}).catch(i),t&&t()}),this.expired=()=>me(this,void 0,void 0,function*(){yield Me.destroy({where:{expired:{[ne.lt]:Date.now()}}}).catch(i)}),this.get=(e,t)=>me(this,void 0,void 0,function*(){t=t||i;const r=yield Me.findOne({where:{session:e,expired:{[ne.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(i),void t(null)}return void t(null,e)}t(null)}),this.length=e=>me(this,void 0,void 0,function*(){e&&e(null,(yield Me.count().catch(i))||0)}),this.set=(e,t,r)=>me(this,void 0,void 0,function*(){r=r||i;const n=Date.now()+Env.API_SESSION_LIFETIME,o=JSON.stringify(t),[s,d]=(yield Me.findOrCreate({where:{session:e},defaults:{session:e,json:o,expired:n}}).catch(i))||[];s&&(d||(s.json=o,s.expired=n,yield s.save().catch(i))),r()}),this.loop=n(this.expired,3e4),this.loop.start()}}class Application extends _{constructor(e){super(e,{cert:qe.http,cross:Env.API_HTTP_CROSS,hybrid:Env.API_HTTP_HYBRID,json:{strict:Env.API_BODYPARSER_STRICT,inflate:Env.API_BODYPARSER_INFLATE,limit:Env.API_BODYPARSER_LIMIT,type:Env.API_BODYPARSER_TYPE},key:Ye.http,notfound:Env.API_HTTP_NOTFOUND,path:Env.API_HTTP_PATH,port:Env.API_HTTP_PORT,public:Env.API_HTTP_PUBLIC,redirect:Env.API_HTTP_REDIRECT,session:{store:new Store,name:Env.API_SESSION_NAME,secret:Env.API_SESSION_SECRET,cookie:{maxAge:Env.API_SESSION_LIFETIME},genid:r}}),this.hash=new q(Env.API_KEY_HASH)}error(e,t){Env.API_BASE_NAME&&(t=t?`${Env.API_BASE_NAME}.${t}`:Env.API_BASE_NAME),Le.error(e.message,t,Env.API_CONSOLE_ERROR)}log(e,t){Env.API_BASE_NAME&&(t=t?`${Env.API_BASE_NAME}.${t}`:Env.API_BASE_NAME),Le.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return me(this,void 0,void 0,function*(){yield Pe.sync(),yield this.migrations(Pe),yield o(this.controllers,e=>me(this,void 0,void 0,function*(){s(e.sync)&&(yield e.sync(this))})),yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new ye({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>me(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",n=>me(this,void 0,void 0,function*(){if(r)try{const o=JSON.parse(n);this.emit("ws.message"+i,{data:o,message:n,req:t,user:r,ws:e})}catch(o){this.emit("ws.message"+i,{erro:o,message:n,req:t,user:r,ws:e})}else{const{user:o}=yield AuthToken.user(n.toString());o&&(r=o,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 d(2e3),r||e.close()})))})}migrations(e){return me(this,void 0,void 0,function*(){const t=[];yield o(Object.keys(e.models),i=>me(this,void 0,void 0,function*(){var r;const n=e.models[i],o=n.version();if(!o)return;const[s,d]=null!==(r=yield Ke.findOrCreate({where:{model:n.tableName},defaults:{model:n.tableName,version:""}}).catch(this.error))&&void 0!==r?r:[];s&&(d||s.version!=o)&&(s.version=o,yield s.save().catch(this.error),t.push(n))})),yield o(t,e=>me(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}var Ve,$e,Ge;class ControllerBase extends Controller{constructor(){super(...arguments),this[Ve]=[]}auth(e,t,i,r,n,o,s){return me(this,void 0,void 0,function*(){var d,a;t=null!=t?t:n,r=`${Env.API_TOKEN_HEADER_KEY} ${r}`;const[u,l]=null!==(a=null===(d=null!=i?i:r)||void 0===d?void 0:d.split(" "))&&void 0!==a?a:["",""];if(!(t||l&&u.toLowerCase()==Env.API_TOKEN_HEADER_KEY))return e.error("INVALID TOKEN");const{auth:p,error:c,user:g}=yield t?AuthKey.user(t,s):AuthToken.user(l);return c?e.error(c):p&&g?!t&&p.user_agent&&p.user_agent!=o?e.error("INVALID TOKEN"):(e.req.auth=p,e.req.user=g,void e.next()):e.error("INTERNAL SERVER ERROR")})}canCreate(e,t,i){return me(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".create",i)})}canDelete(e,t,i){return me(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".delete",i)})}canRead(e,t,i){return me(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".read",i)})}canUpdate(e,t,i){return me(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".update",i)})}error(e){let t="controller_base";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),Le.error(e.message,t,Env.API_CONSOLE_ERROR)}name(){var e,t;return(null!==(t=null===(e=this.constructor)||void 0===e?void 0:e.name)&&void 0!==t?t:"api").replace(/(([a-z])([A-Z]))/g,"$2_$3")}permission(e,t,i){return me(this,void 0,void 0,function*(){if(i){if((yield this.permissions(i,{route:t})).length>0)return e.next()}e.unauthorized("ACCESS DENIED")})}permissions(e,t){return me(this,void 0,void 0,function*(){var i;return null!==(i=yield Ue.findAll({where:Object.assign(Object.assign({},null!=t?t:{}),{state:!0}),include:[{model:je,required:!0,include:[{model:De,required:!0,where:{state:!0},include:[{model:be,required:!0,where:{user_id:e.id}}]}]}]}).catch(this.error))&&void 0!==i?i:[]})}session(e,t,r){return me(this,void 0,void 0,function*(){r.auth&&r.user&&(r.user_agent?r.user_agent!=t&&r.regenerate(i):(r.user_agent=t,r.save(i))),e.next()})}sync(){return me(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield o(this[Controller.PERMISSIONS],i=>me(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=a(e.replace(/_/g," ")," ");yield Ue.findOrCreate({where:{route:r},defaults:Object.assign({name:`${n} ${a(i," ")}`,route:r,tag:n},t)})}))})}upload(e,t){t.path||(t.path=Env.API_UPLOAD_TEMP),t.size||(t.size=Env.API_UPLOAD_SIZE),t.field||(t.field=Env.API_UPLOAD_FIELD),N.middleware(e,t)}validation(e,t){return me(this,void 0,void 0,function*(){const{error:i,value:r}=yield u.object(t).parse().validateAsync(e.req.body);if(i)return e.validation(i);e.req.body=r,e.next()})}}Ve=Controller.PERMISSIONS,Ee([Ae(0,m()),Ae(1,O(Env.API_KEY_HEADER)),Ae(2,O(Env.API_TOKEN_HEADER)),Ae(3,S(Env.API_TOKEN_COOKIE)),Ae(4,I(Env.API_KEY_HEADER)),Ae(5,O("user-agent")),Ae(6,f()),_e("design:type",Function),_e("design:paramtypes",[P,String,String,String,String,String,Application]),_e("design:returntype",Promise)],ControllerBase.prototype,"auth",null),Ee([Ae(0,m()),Ae(1,T()),Ae(2,fe()),_e("design:type",Function),_e("design:paramtypes",[P,String,Be]),_e("design:returntype",Promise)],ControllerBase.prototype,"canCreate",null),Ee([Ae(0,m()),Ae(1,T()),Ae(2,fe()),_e("design:type",Function),_e("design:paramtypes",[P,String,Be]),_e("design:returntype",Promise)],ControllerBase.prototype,"canDelete",null),Ee([Ae(0,m()),Ae(1,T()),Ae(2,fe()),_e("design:type",Function),_e("design:paramtypes",[P,String,Be]),_e("design:returntype",Promise)],ControllerBase.prototype,"canRead",null),Ee([Ae(0,m()),Ae(1,T()),Ae(2,fe()),_e("design:type",Function),_e("design:paramtypes",[P,String,Be]),_e("design:returntype",Promise)],ControllerBase.prototype,"canUpdate",null),Ee([Ae(0,m()),Ae(1,T()),Ae(2,fe()),_e("design:type",Function),_e("design:paramtypes",[P,String,Be]),_e("design:returntype",Promise)],ControllerBase.prototype,"permission",null),Ee([Ae(0,m()),Ae(1,O("user-agent")),Ae(2,R()),_e("design:type",Function),_e("design:paramtypes",[P,String,Object]),_e("design:returntype",Promise)],ControllerBase.prototype,"session",null),Ee([Ae(0,m()),Ae(1,T()),_e("design:type",Function),_e("design:paramtypes",[P,Object]),_e("design:returntype",void 0)],ControllerBase.prototype,"upload",null),Ee([Ae(0,m()),Ae(1,T()),_e("design:type",Function),_e("design:paramtypes",[P,Object]),_e("design:returntype",Promise)],ControllerBase.prototype,"validation",null);let We=class ControllerModel extends ControllerBase{constructor(){super(...arguments),this[$e]=[],this[Ge]=["create","read","update","delete"]}attributes(e){if(0==this[ControllerBase.ATTRIBUTES].length&&(this[ControllerBase.ATTRIBUTES]=Object.keys(this.model().getAttributes())),l(e))return e.length?e.map(e=>p(e)&&-1!=this[ControllerBase.ATTRIBUTES].indexOf(e)?e:void 0).filter(p):this[ControllerBase.ATTRIBUTES];const{exclude:t,include:i}=e,r=c(i)?this[ControllerBase.ATTRIBUTES]:i.map(e=>p(e)&&-1!=this[ControllerBase.ATTRIBUTES].indexOf(e)?e:void 0).filter(p),n=null!=t?t:[];return n.length?r.filter(e=>-1==n.indexOf(e)?e:void 0).filter(p):r}create(e){return me(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||{}),Oe(e))).catch(this.error);if(r){const t=this.key();return e.prepare(D.OK,{[t]:r.getDataValue(t)}),r}e.error("INTERNAL SERVER ERROR")})}delete(e){return me(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 n=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[i]:r}),individualHooks:!0}),Oe(e))).catch(this.error);return n?(e.success("OK"),n):(e.notFound("RECORD NOT FOUND"),0)})}error(e){let t="controller_model";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),(null==e?void 0:e.sql)?Le.error((null==e?void 0:e.message)+"\n"+(null==e?void 0:e.sql),t,Env.API_CONSOLE_ERROR):super.error(e)}findAll(e){return me(this,arguments,void 0,function*({ctx:e,options:t,callback:i,scope:r,advanced:n,attributes:o,limited:s}){var d,a,u;const l=this.scope(r),v=Object.assign({},t||{}),{fields:h,limit:E,offset:A,asc:_,desc:m,search:O,where:S}=e.req.query;if(c(v.limit)){let e=Env.API_MODEL_LIMIT;p(E)&&(e=parseInt(E)||0),e=g(e,-1,Env.API_MODEL_LIMIT_MAX),v.limit=e>0?e:s?Env.API_MODEL_LIMIT:void 0}if(y(v.limit)&&(v.limit=v.limit>0?v.limit:void 0),p(A)){const e=parseInt(A)||0;v.offset=e>0?e:void 0}o=null!=o?o:this.attributes(null!==(d=null==v?void 0:v.attributes)&&void 0!==d?d:[]);const I=e=>o.indexOf(e)>=0,f=[];p(h)&&f.push(...h.split(";").filter(I)),f.length&&(v.attributes=f);const P=[];if(p(_)&&_.length&&P.push(..._.split(";").filter(I).map(e=>[e,"ASC"])),p(m)&&m.length&&P.push(...m.split(";").filter(I).map(e=>[e,"DESC"])),P.length&&(v.order=P),v.where=Object.assign({},v.where||{}),p(S)&&(null==n||n)){const t=oe.parse(o,S);if(!c(t.error))return e.validation(t.error.join(", ")),{count:0,records:[]};v.where=Object.assign(Object.assign({},v.where),null!==(a=t.value)&&void 0!==a?a:{})}else{const e=[];o.forEach(t=>{p(O)&&O.length&&e.push({[t]:{[ne.like]:`%${O}%`}})}),e.length&&(v.where=Object.assign(Object.assign({},v.where),{[ne.or]:[...e]}))}const T=l.count(Object.assign(Object.assign({},v),{distinct:!!v.include,col:this[ControllerBase.ATTRIBUTES].length?this[ControllerBase.ATTRIBUTES][0]:void 0})).catch(this.error),R=l.findAll(v).catch(this.error);yield Promise.allSettled([T,R]);const N=null!==(u=yield T)&&void 0!==u?u:0;let C=yield R;const b={count:N};return C?(C=i?yield i(C):C,(y(null==t?void 0:t.limit)||0==N)&&(b.count=C.length),e.prepare(D.OK,Object.assign(Object.assign({},b),{records:C})),Object.assign(Object.assign({},b),{records:C})):(e.error("INTERNAL SERVER ERROR"),Object.assign(Object.assign({},b),{records:[]}))})}findOne(e){return me(this,arguments,void 0,function*({ctx:e,options:t,callback:i,scope:r}){const n=this.key(),{[n]:o}=e.req.params,s=yield this.scope(r).findOne(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[n]:o})})).catch(this.error);return s?(e.prepare(D.OK,i?yield i(s):s.toJSON()),s):null===s?e.notFound("RECORD NOT FOUND"):void e.error("INTERNAL SERVER ERROR")})}sync(){return me(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield o(this[ControllerBase.PERMISSIONS],i=>me(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=a(e.replace(/_/g," ")," ");yield Ue.findOrCreate({where:{route:r},defaults:Object.assign({name:`${n} ${a(i," ")}`,route:r,tag:n},t)})}))})}update(e){return me(this,arguments,void 0,function*({ctx:e,options:t,body:i}){var r;const n=this.key(),{[n]:o}=e.req.params,[s]=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),{[n]:o}),individualHooks:!0}),Oe(e))).catch(this.error))&&void 0!==r?r:[];return s?(e.success("OK"),!0):(e.success("RECORD NOT CHANGED"),!1)})}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}};$e=ControllerBase.ATTRIBUTES,Ge=ControllerBase.PERMISSIONS,We=Ee([C(ControllerBase)],We);let ze=class ControllerCrud extends We{constructor(){super(...arguments),this._crud={}}CrudArgumentsCreate(e){return{ctx:e}}CrudArgumentsFindAll(e){return{ctx:e}}CrudArgumentsFindOne(e){return{ctx:e}}CrudArgumentsDelete(e){return{ctx:e}}CrudArgumentsUpdate(e){return{ctx:e}}CrudValidationCreate(){return this._crud}CrudValidationUpdate(){return this._crud}add(e){return me(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return me(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}del(e){return me(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return me(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return me(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validationCreate(e){return me(this,void 0,void 0,function*(){const t=this.CrudValidationCreate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)})}validationUpdate(e){return me(this,void 0,void 0,function*(){const t=this.CrudValidationUpdate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)})}};Ee([b(),w("auth"),w("canCreate"),w("validationCreate"),Ae(0,m()),_e("design:type",Function),_e("design:paramtypes",[P]),_e("design:returntype",Promise)],ze.prototype,"add",null),Ee([B(),w("auth"),w("canRead"),Ae(0,m()),_e("design:type",Function),_e("design:paramtypes",[P]),_e("design:returntype",Promise)],ze.prototype,"all",null),Ee([x("/:id"),w("auth"),w("canDelete"),Ae(0,m()),_e("design:type",Function),_e("design:paramtypes",[P]),_e("design:returntype",Promise)],ze.prototype,"del",null),Ee([B("/:id"),w("auth"),w("canRead"),Ae(0,m()),_e("design:type",Function),_e("design:paramtypes",[P]),_e("design:returntype",Promise)],ze.prototype,"get",null),Ee([F("/:id"),w("auth"),w("canUpdate"),w("validationUpdate"),Ae(0,m()),_e("design:type",Function),_e("design:paramtypes",[P]),_e("design:returntype",Promise)],ze.prototype,"set",null),Ee([Ae(0,m()),_e("design:type",Function),_e("design:paramtypes",[P]),_e("design:returntype",Promise)],ze.prototype,"validationCreate",null),Ee([Ae(0,m()),_e("design:type",Function),_e("design:paramtypes",[P]),_e("design:returntype",Promise)],ze.prototype,"validationUpdate",null),ze=Ee([C(We)],ze);let Je=class AuditsController extends We{model(){return xe}all(e,t,i){return me(this,void 0,void 0,function*(){const r={};t&&(r.type=t),i&&(r.table=i),yield this.findAll({ctx:e,options:{attributes:{exclude:["data","previously"]},where:r,order:[["created_at","DESC"]]},limited:!0})})}get(e){return me(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}};Ee([B(),w("auth"),w("canRead"),Ae(0,m()),Ae(1,I("type")),Ae(2,I("table")),_e("design:type",Function),_e("design:paramtypes",[P,String,String]),_e("design:returntype",Promise)],Je.prototype,"all",null),Ee([B("/:id"),w("auth"),w("canRead"),Ae(0,m()),_e("design:type",Function),_e("design:paramtypes",[P]),_e("design:returntype",Promise)],Je.prototype,"get",null),Je=Ee([k("/audits"),C(We)],Je);let Ze=class AuthController extends ControllerBase{login(e,t,i,r,n,o){return me(this,void 0,void 0,function*(){var s;yield d(Env.API_SLEEP_AUTH);const a=yield Be.scope("password").findOne({where:{[ne.or]:[{email:i},{username:i}]}}).catch(this.error);if(r+=null!==(s=null==a?void 0:a.salt)&&void 0!==s?s:"",!a||a.password!=Y(r))return e.notFound("INVALID USERNAME OR PASSWORD"),o.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const u=yield Ce.findOne({where:{state:!0,user_id:a.id}}).catch(this.error);if(u)return e.error("ACTIVATION REQUIRED"),o.emit("auth.activation",{ctx:e,register:u,user:a}),void this.emit("auth.activation",{ctx:e,register:u,user:a});if(!a.state)return e.notFound("INVALID USERNAME OR PASSWORD"),o.emit("auth.failure",{ctx:e,user:a}),void this.emit("auth.failure",{ctx:e,user:a});const{auth:l,error:p,token:c}=yield AuthToken.create(a);return p?(e.error(p),o.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):l&&c?(l.user_agent=t,yield l.save().catch(this.error),Env.API_TOKEN_COOKIE_SET&&e.res.cookie(Env.API_TOKEN_COOKIE,c,{maxAge:n?Env.API_TOKEN_LIFETIME:void 0}),e.json({token:c}),o.emit("auth.login",{auth:l,ctx:e,user:a}),void this.emit("auth.login",{auth:l,ctx:e,user:a})):(e.error("INTERNAL SERVER ERROR"),o.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))})}logout(e,t,i,r){return me(this,void 0,void 0,function*(){if(yield AuthToken.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 me(this,void 0,void 0,function*(){const{auth:n,error:o,token:s}=yield AuthToken.renew(i);return o?e.error(o):n?(n.user_agent=t,yield n.save().catch(this.error),e.json({token:s}),r.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 me(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({},v(["username","date","description","state","created_at","updated_at","deleted_at"],t.toJSON())),{permissions:i.map(e=>e.route)}))})}};var Xe;Ee([b("/login"),w("validation",{username:u.string().min(3).required(),password:u.string().min(5).required(),remember:u.boolean().empty(!1)}),Ae(0,m()),Ae(1,O("user-agent")),Ae(2,U("username")),Ae(3,U("password")),Ae(4,U("remember")),Ae(5,f()),_e("design:type",Function),_e("design:paramtypes",[P,String,String,String,Boolean,Application]),_e("design:returntype",Promise)],Ze.prototype,"login",null),Ee([B("/logout"),w("auth"),Ae(0,m()),Ae(1,Ie()),Ae(2,fe()),Ae(3,f()),_e("design:type",Function),_e("design:paramtypes",[P,Ne,Be,Application]),_e("design:returntype",Promise)],Ze.prototype,"logout",null),Ee([b("/renew"),w("validation",{token:u.string().required()}),Ae(0,m()),Ae(1,O("user-agent")),Ae(2,U("token")),Ae(3,f()),_e("design:type",Function),_e("design:paramtypes",[P,String,String,Application]),_e("design:returntype",Promise)],Ze.prototype,"renew",null),Ee([B(),w("auth"),Ae(0,m()),Ae(1,fe()),_e("design:type",Function),_e("design:paramtypes",[P,Be]),_e("design:returntype",Promise)],Ze.prototype,"user",null),Ze=Ee([k("/auth"),C(ControllerBase)],Ze);let Qe=class FilesController extends ControllerBase{constructor(){super(...arguments),this[Xe]=["delete","download","edit","list","read","rename","upload","write"]}directory(){return Env.API_HTTP_PUBLIC||"./"}files(e){return me(this,void 0,void 0,function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const i=he(this.directory(),t);if(!ae(i)||!ue(i).isDirectory())return e.notFound("RECORD NOT FOUND");let r=[];return r=le(i),r=r.map(e=>this.info(he(i,e))),r=r.filter(h),Object.assign(Object.assign({},this.info(i)),{files:r})})}access(e,t,i){return me(this,void 0,void 0,function*(){yield this.permission(e,this.name()+"."+t,i)})}info(e){if(!ae(e))return null;const t=ue(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"}sync(){return me(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=a(e.replace(/_/g," ")," "),i={description:"",state:!0};yield o(this[ControllerBase.PERMISSIONS],r=>me(this,void 0,void 0,function*(){const n=`${e}.${r}`;yield Ue.findOrCreate({where:{route:n},defaults:Object.assign({name:`${t} ${a(r," ")}`,route:n,tag:t},i)})}))})}};Xe=ControllerBase.PERMISSIONS,Ee([B("/path"),B("/path/*path"),w("auth"),w("access","list"),Ae(0,m()),_e("design:type",Function),_e("design:paramtypes",[P]),_e("design:returntype",Promise)],Qe.prototype,"files",null),Ee([Ae(0,m()),Ae(1,T()),Ae(2,fe()),_e("design:type",Function),_e("design:paramtypes",[P,String,Be]),_e("design:returntype",Promise)],Qe.prototype,"access",null),Qe=Ee([k("/files"),C(ControllerBase)],Qe);let et=class ForgotController extends ControllerBase{check(e,t){return me(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i||!i.user)return e.notFound("RECORD NOT FOUND");i.token=E(),yield i.save(),e.json({token:i.token})})}forgot(e,t,i){return me(this,void 0,void 0,function*(){yield d(Env.API_SLEEP_FORGOT);const r=t,n=yield Be.findOne({where:{[ne.or]:[{email:r},{username:t}]}}).catch(this.error);if(!n)return e.notFound("RECORD NOT FOUND");const o=E(),s=Date.now()+6e4*Env.API_TOKEN_FORGOT,a=yield ke.create({token:o,timestamp:s,state:!0,user_id:n.id});e.success("OK"),i.emit("forgot.send",{ctx:e,forgot:a,user:n}),this.emit("forgot.send",{ctx:e,forgot:a,user:n})})}reset(e,t,i,r){return me(this,void 0,void 0,function*(){const n=yield this.find(t);if(!n)return e.notFound("RECORD NOT FOUND");n.state=!1,yield n.save().catch(this.error),n.user.password=Y(i),yield n.user.save().catch(this.error),e.success("OK"),r.emit("forgot.reset",{ctx:e,user:n.user}),this.emit("forgot.reset",{ctx:e,user:n.user})})}find(e){return me(this,void 0,void 0,function*(){return yield ke.findOne({where:{token:e,state:!0},include:[{model:Be,required:!0}]}).catch(this.error)})}};Ee([B("/check"),w("validation",{token:u.string().required()}),Ae(0,m()),Ae(1,U("token")),_e("design:type",Function),_e("design:paramtypes",[P,String]),_e("design:returntype",Promise)],et.prototype,"check",null),Ee([b(),w("validation",{username:u.string().min(4).required()}),Ae(0,m()),Ae(1,U("username")),Ae(2,f()),_e("design:type",Function),_e("design:paramtypes",[P,String,Application]),_e("design:returntype",Promise)],et.prototype,"forgot",null),Ee([b("/reset"),w("validation",{token:u.string().required(),password:u.string().min(5).required()}),Ae(0,m()),Ae(1,U("token")),Ae(2,U("password")),Ae(3,f()),_e("design:type",Function),_e("design:paramtypes",[P,String,String,Application]),_e("design:returntype",Promise)],et.prototype,"reset",null),et=Ee([k("/forgot"),C(ControllerBase)],et);let tt=class GroupsController extends ze{constructor(){super(...arguments),this.schemaCreate={name:u.string().required(),description:u.string().empty(""),state:u.boolean().parse().required()},this.schemaUpdate={name:u.string().empty(),description:u.string().empty(),state:u.boolean().parse().empty()}}model(){return De}CrudArgumentsFindAll(e){return{ctx:e}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}};tt=Ee([k("/groups"),C(ze)],tt);let it=class GroupsPermissionsController extends We{model(){return je}all(e,t){return me(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{group_id:t},include:[{model:Ue,required:!0}]},callback:e=>e.map(e=>e.permission)})})}me(e,t){return me(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(e,t,i,r){return me(this,void 0,void 0,function*(){const n=yield De.findByPk(t,{attributes:["id"]}).catch(this.error);if(!n)return e.notFound("RECORD NOT FOUND");const o=n.id;if(yield je.destroy(Object.assign({where:{group_id:o},individualHooks:!0},r)),i){let e=0;yield d(1e3);for(let t=0;t<i.length;t++)e=yield Ue.count({where:{id:i[t]}}),e&&(yield je.create({group_id:o,permission_id:i[t]},Object.assign({},r)))}e.success("OK")})}};var rt;Ee([B("/:id/permissions"),w("auth"),w("canRead","groups"),Ae(0,m()),Ae(1,j("id")),_e("design:type",Function),_e("design:paramtypes",[P,String]),_e("design:returntype",Promise)],it.prototype,"all",null),Ee([B("/permissions"),w("auth"),w("canRead","users"),Ae(0,m()),Ae(1,fe()),_e("design:type",Function),_e("design:paramtypes",[P,Be]),_e("design:returntype",Promise)],it.prototype,"me",null),Ee([F("/:id/permissions"),w("auth"),w("canUpdate","groups"),w("validation",{permissions:u.array(u.number().parse())}),Ae(0,m()),Ae(1,j("id")),Ae(2,U("permissions")),Ae(3,Se()),_e("design:type",Function),_e("design:paramtypes",[P,String,Array,Object]),_e("design:returntype",Promise)],it.prototype,"set",null),it=Ee([k("/groups"),C(We)],it);let nt=class LogsController extends We{constructor(){super(...arguments),this[rt]=["read"]}model(){return Le}all(e,t,i){return me(this,void 0,void 0,function*(){const r={};t&&(r.type=t),i&&(r.source=i),yield this.findAll({ctx:e,options:{where:r,order:[["created_at","DESC"]]},limited:!0})})}};rt=We.PERMISSIONS,Ee([B(),w("auth"),w("canRead"),Ae(0,m()),Ae(1,I("type")),Ae(2,I("source")),_e("design:type",Function),_e("design:paramtypes",[P,String,String]),_e("design:returntype",Promise)],nt.prototype,"all",null),nt=Ee([k("/logs"),C(We)],nt);let ot=class PermissionsController extends ze{constructor(){super(...arguments),this.schemaCreate={name:u.string().required(),route:u.string().required(),tag:u.string().required(),description:u.string().empty(""),state:u.boolean().parse().required()},this.schemaUpdate={name:u.string().empty(),route:u.string().empty(),tag:u.string().empty(),description:u.string().empty(),state:u.boolean().parse().empty()}}model(){return Ue}CrudArgumentsFindAll(e){return{ctx:e}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}};ot=Ee([k("/permissions"),C(ze)],ot);let st=class RegisterController extends ControllerBase{register(e,t,i){return me(this,void 0,void 0,function*(){yield d(Env.API_SLEEP_REGISTRY);const{name:r,date:n,email:o,username:s,password:a,confirm:u}=t,l=s||o,p=Y(a);if(yield Be.count({where:{[ne.or]:[{email:o},{username:l}]}}).catch(this.error))return e.validation("INVALID EMAIL OR USERNAME");if(p!=Y(u))return e.error("INVALID PASSWORD");const c=yield Be.create({name:r,email:o,username:l,password:p,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!c)return e.error("INTERNAL SERVER ERROR");const g=yield Ce.create({token:yield this.getId(),user_id:c.id,state:!0}).catch(this.error);if(!g)return yield c.destroy().catch(this.error),e.error("INTERNAL SERVER ERROR");e.success("OK"),i.emit("register.user",{ctx:e,register:g,user:c}),this.emit("register.user",{ctx:e,register:g,user:c})})}confirm(e,t,i){return me(this,void 0,void 0,function*(){const r=yield Ce.findOne({where:{token:t,state:!0},include:[{model:Be,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 me(this,void 0,void 0,function*(){const r=t,n=yield Ce.findOne({where:{state:!0},include:[{model:Be,required:!0,where:{[ne.or]:[{email:r},{username:t}]}}]}).catch(this.error);if(!n)return e.notFound("RECORD NOT FOUND");e.success("OK"),i.emit("register.send",{ctx:e,register:n,user:n.user}),this.emit("register.send",{ctx:e,register:n,user:n.user})})}getId(){return me(this,void 0,void 0,function*(){const e=r();return(yield Ce.count({where:{token:e}}))?this.getId():e})}};Ee([b(),w("validation",{name:u.string().required(),date:u.date().required(),email:u.string().email().required(),username:u.string().min(4).empty(),password:u.string().min(5).required(),confirm:u.string().min(5).required()}),Ae(0,m()),Ae(1,U()),Ae(2,f()),_e("design:type",Function),_e("design:paramtypes",[P,Object,Application]),_e("design:returntype",Promise)],st.prototype,"register",null),Ee([b("/confirm"),w("validation",{token:u.string().required()}),Ae(0,m()),Ae(1,U("token")),Ae(2,f()),_e("design:type",Function),_e("design:paramtypes",[P,String,Application]),_e("design:returntype",Promise)],st.prototype,"confirm",null),Ee([b("/send"),w("validation",{username:u.string().min(4).required()}),Ae(0,m()),Ae(1,U("username")),Ae(2,f()),_e("design:type",Function),_e("design:paramtypes",[P,String,Application]),_e("design:returntype",Promise)],st.prototype,"send",null),st=Ee([k("/register"),C(ControllerBase)],st);let dt=class SetupController extends ControllerBase{setup(e,t){return me(this,void 0,void 0,function*(){var i;if(yield Be.count())return e.success("OK");const r=E(),n=yield Be.create({name:"Admin",email:"admin@localhost",username:"admin",password:Y("admin"+r),salt:r,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0},Object.assign({},t)),s=yield De.create(Object.assign({name:"Admin"},{description:"API CORE",state:!0}),Object.assign({},t));yield be.create({user_id:n.id,group_id:s.id},Object.assign({},t));const d=null!==(i=yield Ue.findAll({where:{state:!0}}).catch(this.error))&&void 0!==i?i:[];yield o(d,e=>me(this,void 0,void 0,function*(){yield je.create({group_id:s.id,permission_id:e.id},Object.assign({},t))})),e.success("OK")})}};Ee([B(),Ae(0,m()),Ae(1,Se()),_e("design:type",Function),_e("design:paramtypes",[P,Object]),_e("design:returntype",Promise)],dt.prototype,"setup",null),dt=Ee([k("/setup"),C(ControllerBase)],dt);let at=class UsersController extends We{model(){return Be}constructor(){super(),this.path=Env.API_HTTP_PUBLIC+"/avatar",Env.API_HTTP_PUBLIC&&ae(Env.API_HTTP_PUBLIC)&&!ae(this.path)&&pe(this.path)}avatar(e,t,i,r){return me(this,void 0,void 0,function*(){if(t.length){const n=t[0].filename||"";if(n){const t=this.path+"/"+i.avatar;if(ae(t)&&ce(t).isFile()&&ge(t),i.avatar=n,yield i.save(Object.assign({},r)).catch(this.error))return e.success("OK")}}e.success("RECORD NOT CHANGED")})}avatar_del(e,t,i){return me(this,void 0,void 0,function*(){const r=this.path+"/"+t.avatar;t.avatar="",(yield t.save(Object.assign({},i)).catch(this.error))&&ae(r)&&ge(r),e.success("OK")})}password(e,t,i,r,n){return me(this,void 0,void 0,function*(){var o;if(Env.API_USER_HISTORY){if(yield we.count({where:{password:Y(i+r.id)}}).catch(this.error))return e.error("PASSWORD PREVIOUSLY REGISTERED")}const s=yield this.scope("password").findOne({where:{id:r.id,state:!0}}).catch(this.error);return t+=null!==(o=null==s?void 0:s.salt)&&void 0!==o?o:"",s&&s.password==Y(t)?(s.salt=E(),s.password=Y(i+s.salt),(yield s.save(Object.assign({},n)).catch(this.error))?e.success("OK"):void e.success("RECORD NOT CHANGED")):e.error("INVALID PASSWORD")})}token(e,t,i){return me(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_del(e,t,i){return me(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_get(e,t,i){return me(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_renew(e,t,i,r){return me(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=r.hash.encrypt(t),yield n.save(Object.assign({},i)).catch(this.error),e.json({token:t})}e.notFound("RECORD NOT FOUND")})}token_new(){return me(this,void 0,void 0,function*(){var e;const t=r();return(null!==(e=yield this.model().count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t})}add(e,t){return me(this,void 0,void 0,function*(){const i=E(),r=yield this.create({ctx:e,body:{password:Y(t+i),salt:i}});Env.API_USER_HISTORY&&r&&(yield we.create({password:Y(t+r.id),user_id:r.id}))})}all(e){return me(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["password","salt","token"]}}})})}del(e,t,i){return me(this,void 0,void 0,function*(){if(i.id.toString()==t)return e.notFound("RECORD NOT FOUND");yield this.delete({ctx:e})})}get(e){return me(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e,t,i){return me(this,void 0,void 0,function*(){if(Env.API_USER_HISTORY&&i){const r=Y(i+t);if(yield we.count({where:{password:r}}).catch(this.error))return e.error("PASSWORD PREVIOUSLY REGISTERED");yield we.create({password:r,user_id:t}).catch(this.error)}const r=i?E():"";yield this.update({ctx:e,body:i?{password:Y(i+r),salt:r}:{}})})}};Ee([b("/avatar"),w("auth"),w("upload",e=>({count:1,field:"file",path:e.controller.path,types:["image/bmp","image/jpeg","image/png"],size:32})),Ae(0,m()),Ae(1,L()),Ae(2,fe()),Ae(3,Se()),_e("design:type",Function),_e("design:paramtypes",[P,Array,Be,Object]),_e("design:returntype",Promise)],at.prototype,"avatar",null),Ee([x("/avatar"),w("auth"),Ae(0,m()),Ae(1,fe()),Ae(2,Se()),_e("design:type",Function),_e("design:paramtypes",[P,Be,Object]),_e("design:returntype",Promise)],at.prototype,"avatar_del",null),Ee([b("/password"),w("auth"),w("validation",{oldPassword:u.string().min(5).required(),newPassword:u.string().min(5).required(),confirmPassword:u.string().equal(u.ref("newPassword"))}),Ae(0,m()),Ae(1,U("oldPassword")),Ae(2,U("newPassword")),Ae(3,fe()),Ae(4,Se()),_e("design:type",Function),_e("design:paramtypes",[P,String,String,Be,Object]),_e("design:returntype",Promise)],at.prototype,"password",null),Ee([B("/token"),w("auth"),Ae(0,m()),Ae(1,fe()),Ae(2,f()),_e("design:type",Function),_e("design:paramtypes",[P,Be,Application]),_e("design:returntype",Promise)],at.prototype,"token",null),Ee([x("/token/:id"),w("auth"),w("canDelete"),Ae(0,m()),Ae(1,j("id")),Ae(2,Se()),_e("design:type",Function),_e("design:paramtypes",[P,String,Object]),_e("design:returntype",Promise)],at.prototype,"token_del",null),Ee([B("/token/:id"),w("auth"),w("canCreate"),Ae(0,m()),Ae(1,j("id")),Ae(2,f()),_e("design:type",Function),_e("design:paramtypes",[P,String,Application]),_e("design:returntype",Promise)],at.prototype,"token_get",null),Ee([B("/token/renew/:id"),w("auth"),w("canUpdate"),Ae(0,m()),Ae(1,j("id")),Ae(2,Se()),Ae(3,f()),_e("design:type",Function),_e("design:paramtypes",[P,String,Object,Application]),_e("design:returntype",Promise)],at.prototype,"token_renew",null),Ee([b(),w("auth"),w("canCreate"),w("validation",{name:u.string().required(),email:u.string().email().required(),username:u.string().min(4).required(),password:u.string().min(5).required(),description:u.string().empty(""),state:u.boolean().parse().required()}),Ae(0,m()),Ae(1,U("password")),_e("design:type",Function),_e("design:paramtypes",[P,String]),_e("design:returntype",Promise)],at.prototype,"add",null),Ee([B(),w("auth"),w("canRead"),Ae(0,m()),_e("design:type",Function),_e("design:paramtypes",[P]),_e("design:returntype",Promise)],at.prototype,"all",null),Ee([x("/:id"),w("auth"),w("canDelete"),Ae(0,m()),Ae(1,j("id")),Ae(2,fe()),_e("design:type",Function),_e("design:paramtypes",[P,String,Be]),_e("design:returntype",Promise)],at.prototype,"del",null),Ee([B("/:id"),w("auth"),w("canRead"),Ae(0,m()),_e("design:type",Function),_e("design:paramtypes",[P]),_e("design:returntype",Promise)],at.prototype,"get",null),Ee([F("/:id"),w("auth"),w("canUpdate"),w("validation",{name:u.string().empty(),email:u.string().email().empty(),username:u.string().min(4).empty(),password:u.string().min(5).empty().filter(""),description:u.string().empty(),state:u.boolean().parse().empty()}),Ae(0,m()),Ae(1,j("id")),Ae(2,U("password")),_e("design:type",Function),_e("design:paramtypes",[P,String,String]),_e("design:returntype",Promise)],at.prototype,"set",null),at=Ee([k("/users"),C(We),_e("design:paramtypes",[])],at);let ut=class UsersGroupsController extends We{model(){return be}all(e,t){return me(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{user_id:t},include:[{model:De,required:!0}]},callback:e=>e.map(e=>e.group)})})}me(e,t){return me(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(e,t,i,r){return me(this,void 0,void 0,function*(){const n=yield Be.findByPk(t,{attributes:["id"]}).catch(this.error);if(!n)return e.notFound("RECORD NOT FOUND");if(yield be.destroy(Object.assign({where:{user_id:n.id},individualHooks:!0},r)),i){let e=0;yield d(1e3);for(let t=0;t<i.length;t++)e=yield De.count({where:{id:i[t]}}),e&&(yield be.create({user_id:n.id,group_id:i[t]},Object.assign({},r)))}e.success("OK")})}};Ee([B("/:id/groups"),w("auth"),w("canRead","users"),Ae(0,m()),Ae(1,j("id")),_e("design:type",Function),_e("design:paramtypes",[P,String]),_e("design:returntype",Promise)],ut.prototype,"all",null),Ee([B("/groups"),w("auth"),w("canRead","users"),Ae(0,m()),Ae(1,fe()),_e("design:type",Function),_e("design:paramtypes",[P,Be]),_e("design:returntype",Promise)],ut.prototype,"me",null),Ee([F("/:id/groups"),w("auth"),w("canUpdate","users"),w("validation",{groups:u.array(u.number().parse())}),Ae(0,m()),Ae(1,j("id")),Ae(2,U("groups")),Ae(3,Se()),_e("design:type",Function),_e("design:paramtypes",[P,String,Array,Object]),_e("design:returntype",Promise)],ut.prototype,"set",null),ut=Ee([k("/users"),C(We)],ut);export{Application,xe as Audit,Je as AuditsController,Ne as Auth,AuthBase,Ze as AuthController,AuthKey,AuthToken,Fe as Config,Controller,ControllerBase,ze as ControllerCrud,We as ControllerModel,Env,Qe as FilesController,ke as Forgot,et as ForgotController,De as Group,je as GroupPermission,tt as GroupsController,it as GroupsPermissionsController,Le as Log,nt as LogsController,Ke as Migration,Ue as Permission,ot as PermissionsController,Ce as Register,st as RegisterController,Se as ReqAudit,Ie as ReqAuth,fe as ReqUser,Me as Session,dt as SetupController,Store,Be as User,be as UserGroup,we as UserHistory,at as UsersController,ut as UsersGroupsController,Oe as audit,qe as crt,Pe as database,Re as hooks,Ye as key};
|