@andrewcaires/api 5.0.4 → 5.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/api v5.0.4
2
+ * @andrewcaires/api v5.0.5
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,t=require("@andrewcaires/express"),r=require("@andrewcaires/node"),o=require("@andrewcaires/utils.js"),s=require("ws"),i=require("@andrewcaires/sequelize"),n=require("dotenv"),d=require("bcrypt"),l=require("express-session"),a=require("jsonwebtoken"),p=require("@andrewcaires/decorator"),u=require("fs"),c=require("path");function g(e,t,r,o){var s,i=arguments.length,n=i<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,o);else for(var d=e.length-1;d>=0;d--)(s=e[d])&&(n=(i<3?s(n):i>3?s(t,r,n):s(t,r))||n);return i>3&&n&&Object.defineProperty(t,r,n),n}function y(e,t){return function(r,o){t(r,o,e)}}function v(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function h(e,t,r,o){return new(r||(r=Promise))(function(s,i){function n(e){try{l(o.next(e))}catch(e){i(e)}}function d(e){try{l(o.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(n,d)}l((o=o.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError,n.config({quiet:!0});class Env extends r.Env{}e=Env,Env.BASE_NAME=e.getString("BASE_NAME",""),Env.CONSOLE_ERROR=e.getBool("CONSOLE_ERROR",!1),Env.DATABASE_URI=e.getString("DATABASE_URI","",!0),Env.DATABASE_LOG=e.getBool("DATABASE_LOG",!1),Env.DATABASE_AUDIT=e.getBool("DATABASE_AUDIT",!0),Env.DATABASE_PREFIX=e.getString("DATABASE_PREFIX",""),Env.DATABASE_TIMEZONE=e.getString("DATABASE_TIMEZONE","+00:00"),Env.HTTP_CRT=e.getFile("HTTP_CRT"),Env.HTTP_KEY=e.getFile("HTTP_KEY"),Env.MODEL_LIMIT=e.getInt("MODEL_LIMIT",10),Env.MODEL_LIMIT_MAX=e.getInt("MODEL_LIMIT_MAX",100),Env.SLEEP_AUTH=e.getMs("SLEEP_AUTH","2s"),Env.SLEEP_FORGOT=e.getMs("SLEEP_FORGOT","5s"),Env.SLEEP_REGISTRY=e.getMs("SLEEP_REGISTRY","5s"),Env.TOKEN_CRT=e.getFile("TOKEN_CRT"),Env.TOKEN_KEY=e.getFile("TOKEN_KEY"),Env.TOKEN_TTL=e.getMs("TOKEN_TTL","1d"),Env.API_BODYPARSER_STRICT=e.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=e.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=e.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=e.getString("API_BODYPARSER_TYPE","json"),Env.API_HTTP_PORT=e.getInt("API_HTTP_PORT",3e3),Env.API_HTTP_PUBLIC=e.getString("API_HTTP_PUBLIC",""),Env.API_HTTP_CROSS=e.getBool("API_HTTP_CROSS",!1),Env.API_HTTP_HYBRID=e.getBool("API_HTTP_HYBRID",!1),Env.API_HTTP_NOTFOUND=e.getString("API_HTTP_NOTFOUND",""),Env.API_HTTP_PATH=e.getString("API_HTTP_PATH","/api"),Env.API_HTTP_REDIRECT=e.getString("API_HTTP_REDIRECT",""),Env.API_KEY_HASH=e.getString("API_KEY_HASH",""),Env.API_KEY_HEADER=e.getString("API_KEY_HEADER","x-api-key"),Env.API_SESSION_NAME=e.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=e.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=e.getString("API_SESSION_SECRET","yoursecret"),Env.API_TOKEN_COOKIE=e.getString("API_TOKEN_COOKIE","authorization"),Env.API_TOKEN_COOKIE_SET=e.getBool("API_TOKEN_COOKIE_SET",!0),Env.API_TOKEN_FORGOT=e.getMs("API_TOKEN_FORGOT","1d"),Env.API_TOKEN_HEADER=e.getString("API_TOKEN_HEADER","authorization"),Env.API_TOKEN_HEADER_KEY=e.getString("API_TOKEN_HEADER","bearer"),Env.API_TOKEN_RENEW=e.getMs("API_TOKEN_RENEW","1d"),Env.API_USER_HISTORY=e.getBool("API_USER_HISTORY",!0),Env.API_WEBSOCKET_START=e.getBool("API_WEBSOCKET_START",!1);const x=new i.Sequelize({uri:Env.DATABASE_URI,logging:!!Env.DATABASE_LOG&&(e=>r.Log.console(r.LogColor.Magenta,"sql",e)),prefix:Env.DATABASE_PREFIX,timezone:Env.DATABASE_TIMEZONE}),m=e=>r=>(s,i,n)=>{t.Use(s=>h(void 0,void 0,void 0,function*(){var i;let n=null!=r?r:"";o.isUndefined(r)&&(n=o.isFunction(s.controller.name)?s.controller.name():null===(i=s.controller.constructor)||void 0===i?void 0:i.name);const{permissions:d}=s.req;if((null!=d?d:[]).includes(`${n}.${e}`))return s.next();s.error(new t.UnauthorizedError("Access Denied"))}))(s,i,n)},C=m("create"),E=m("delete"),f=m("read"),A=m("update"),M=()=>(e,r,o)=>{t.Use(e=>h(void 0,void 0,void 0,function*(){yield(e=>h(void 0,void 0,void 0,function*(){var r,o,s,i;if(e.req.auth&&e.req.user)return e.next();const{[Env.API_KEY_HEADER]:n,[Env.API_TOKEN_HEADER]:d,"user-agent":l}=e.getHeaders(),a=e.getQuery(Env.API_KEY_HEADER),p=(null===(r=n||a)||void 0===r?void 0:r.toString())||"";let u=e.getCookie(Env.API_TOKEN_COOKIE);u=`${Env.API_TOKEN_HEADER_KEY} ${u}`;const[c,g]=null!==(s=null===(o=d||u)||void 0===o?void 0:o.split(" "))&&void 0!==s?s:["",""];if(!(p||g&&c.toLowerCase()==Env.API_TOKEN_HEADER_KEY))return e.error(new t.UnauthorizedError("Invalid token"));const{authService:y,userService:v}=e.app,{auth:h,user:x}=null!==(i=yield(p?y.key(p.toString()):y.user(g)).catch(t=>{e.error(t)}))&&void 0!==i?i:{};if(h&&x){if(!p&&h.user_agent&&h.user_agent!=l)return e.error(new t.UnauthorizedError("Invalid token"));e.req.auth=h,e.req.user=x,e.req.groups=yield v.getGroups(x.id),e.req.permissions=yield v.getPermissions(x.id),e.req.profile=yield v.getProfile(x.id),e.next()}}))(e)}))(e,r,o)},_=t.parameterFactory(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.auth}),S=t.parameterFactory(({ctx:e,key:t})=>{var r,o;return(null!==(o=null===(r=e.req)||void 0===r?void 0:r.groups)&&void 0!==o?o:[]).includes(t)}),P=t.parameterFactory(({ctx:e})=>{var t,r;return null!==(r=null===(t=e.req)||void 0===t?void 0:t.groups)&&void 0!==r?r:[]}),O=t.parameterFactory(({ctx:e,key:t})=>{var r,o;return(null!==(o=null===(r=e.req)||void 0===r?void 0:r.permissions)&&void 0!==o?o:[]).includes(t)}),U=t.parameterFactory(({ctx:e})=>{var t,r;return null!==(r=null===(t=e.req)||void 0===t?void 0:t.permissions)&&void 0!==r?r:[]}),T=t.parameterFactory(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.user}),I=(e,r,o)=>{var s,i,n,d,l,a,p,u,c,g;const y=o.ctx instanceof t.Context?o.ctx:null,v=null!==(d=null!==(n=null===(i=null===(s=null==y?void 0:y.req)||void 0===s?void 0:s.user)||void 0===i?void 0:i.id)&&void 0!==n?n:o.user_id)&&void 0!==d?d:null,h={type:e,model:null!==(l=null==r?void 0:r.getTableName())&&void 0!==l?l:null,app_name:null!==(a=Env.BASE_NAME)&&void 0!==a?a:"",state:!0,user_id:v};return y?Object.assign(Object.assign({},h),{full_url:null!==(p=null==y?void 0:y.getUrl())&&void 0!==p?p:"",ip_address:null!==(u=null==y?void 0:y.getIp())&&void 0!==u?u:"",user_agent:null!==(g=null===(c=null==y?void 0:y.req)||void 0===c?void 0:c.headers["user-agent"])&&void 0!==g?g:""}):h},w={afterCreate:(e,t)=>h(void 0,void 0,void 0,function*(){const s=o.getConstructor(e),{primaryKeyAttribute:i}=null!=s?s:{};yield exports.AuditModel.create(Object.assign(Object.assign({},I("CREATE",s,t)),{record:i?e.getDataValue(i):null,data:e.toJSON()})).catch(r.Log.catch)}),afterUpdate:(e,t)=>h(void 0,void 0,void 0,function*(){const s=o.getConstructor(e),{primaryKeyAttribute:i}=null!=s?s:{},n={},d=e.changed();d&&d.forEach(t=>n[t]=e.getDataValue(t)),yield exports.AuditModel.create(Object.assign(Object.assign({},I("UPDATE",s,t)),{record:i?e.getDataValue(i):null,data:n,previously:e.previous()})).catch(r.Log.catch)}),afterDestroy:(e,t)=>h(void 0,void 0,void 0,function*(){const s=o.getConstructor(e),{primaryKeyAttribute:i}=null!=s?s:{};yield exports.AuditModel.create(Object.assign(Object.assign({},I("DELETE",s,t)),{record:i?e.getDataValue(i):null,data:e.toJSON()})).catch(r.Log.catch)})},b=e=>(o.isUndefined(e)&&(e=Env.DATABASE_AUDIT),i.Hooks(e?w:{}));exports.RegisterModel=class RegisterModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.RegisterModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.RegisterModel.prototype,"secret",void 0),g([i.Column.FullDate(),v("design:type",Number)],exports.RegisterModel.prototype,"expired_at",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.RegisterModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.RegisterModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.RegisterModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.RegisterModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.RegisterModel.prototype,"user_id",void 0),exports.RegisterModel=g([i.Database(x),i.ModelName("register"),i.Version("5.0.0")],exports.RegisterModel),exports.UserAuthModel=class UserAuthModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserAuthModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"secret",void 0),g([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"ip_address",void 0),g([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"user_agent",void 0),g([i.Column.FullDate(),v("design:type",Object)],exports.UserAuthModel.prototype,"revoked_at",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserAuthModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserAuthModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserAuthModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserAuthModel.prototype,"user_id",void 0),exports.UserAuthModel=g([i.Database(x),i.ModelName("users_auth"),i.Version("5.0.0")],exports.UserAuthModel),exports.PermissionModel=class PermissionModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.PermissionModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.PermissionModel.prototype,"name",void 0),g([i.Column.String(),i.Unique(!0),v("design:type",String)],exports.PermissionModel.prototype,"key",void 0),g([i.Column.String(),v("design:type",String)],exports.PermissionModel.prototype,"tags",void 0),g([i.Column.Text(),v("design:type",String)],exports.PermissionModel.prototype,"description",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.PermissionModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.PermissionModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.PermissionModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.PermissionModel.prototype,"deleted_at",void 0),g([i.HasMany(()=>exports.GroupPermissionModel,"permission_id"),v("design:type",Array)],exports.PermissionModel.prototype,"groups_permissions",void 0),exports.PermissionModel=g([i.Database(x),i.ModelName("permission"),b(),i.Version("5.0.1")],exports.PermissionModel),exports.GroupPermissionModel=class GroupPermissionModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.GroupPermissionModel.prototype,"id",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.GroupPermissionModel.prototype,"created_at",void 0),g([i.Association.BelongsTo(()=>exports.GroupModel),v("design:type",String)],exports.GroupPermissionModel.prototype,"group_id",void 0),g([i.Association.BelongsTo(()=>exports.PermissionModel),v("design:type",String)],exports.GroupPermissionModel.prototype,"permission_id",void 0),exports.GroupPermissionModel=g([i.Database(x),i.ModelName("groups_permissions"),b(),i.Version("5.0.2")],exports.GroupPermissionModel),exports.GroupModel=class GroupModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.GroupModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.GroupModel.prototype,"name",void 0),g([i.Column.String(),v("design:type",String)],exports.GroupModel.prototype,"key",void 0),g([i.Column.String(),v("design:type",String)],exports.GroupModel.prototype,"tags",void 0),g([i.Column.Text(),v("design:type",String)],exports.GroupModel.prototype,"description",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.GroupModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.GroupModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.GroupModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.GroupModel.prototype,"deleted_at",void 0),g([i.Association.HasMany(()=>exports.UserGroupModel,"group_id"),v("design:type",Array)],exports.GroupModel.prototype,"users_groups",void 0),g([i.Association.HasMany(()=>exports.GroupPermissionModel,"group_id"),v("design:type",Array)],exports.GroupModel.prototype,"groups_Permission",void 0),exports.GroupModel=g([i.Database(x),i.ModelName("group"),b(),i.Version("5.0.1")],exports.GroupModel),exports.UserGroupModel=class UserGroupModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserGroupModel.prototype,"id",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserGroupModel.prototype,"created_at",void 0),g([i.Association.BelongsTo(()=>exports.GroupModel),v("design:type",String)],exports.UserGroupModel.prototype,"group_id",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserGroupModel.prototype,"user_id",void 0),exports.UserGroupModel=g([i.Database(x),i.ModelName("users_groups"),b(),i.Version("5.0.2")],exports.UserGroupModel),exports.UserPasswordModel=class UserPasswordModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserPasswordModel.prototype,"id",void 0),g([i.Column.String(),i.Value(e=>d.hashSync(e.value,12)),v("design:type",String)],exports.UserPasswordModel.prototype,"value",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.UserPasswordModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserPasswordModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserPasswordModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserPasswordModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserPasswordModel.prototype,"user_id",void 0),exports.UserPasswordModel=g([i.Database(x),i.ModelName("users_password"),b(),i.Version("5.0.0")],exports.UserPasswordModel),exports.UserProfileModel=class UserProfileModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserProfileModel.prototype,"id",void 0),g([i.Column.Json(),i.DefaultValue({}),v("design:type",Object)],exports.UserProfileModel.prototype,"data",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserProfileModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserProfileModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserProfileModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserProfileModel.prototype,"user_id",void 0),exports.UserProfileModel=g([i.Database(x),i.ModelName("users_profile"),b(),i.Version("5.0.1")],exports.UserProfileModel),exports.UserModel=class UserModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"name",void 0),g([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"email",void 0),g([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"username",void 0),g([i.Column.Text(),v("design:type",String)],exports.UserModel.prototype,"description",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.UserModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserModel.prototype,"deleted_at",void 0),g([i.Association.HasMany(()=>exports.AuditModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"audits",void 0),g([i.Association.HasMany(()=>exports.UserAuthModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"users_auths",void 0),g([i.Association.HasMany(()=>exports.RegisterModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"registers",void 0),g([i.Association.HasMany(()=>exports.UserGroupModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"users_groups",void 0),g([i.Association.HasMany(()=>exports.UserPasswordModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"users_passwords",void 0),g([i.Association.HasMany(()=>exports.UserProfileModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"users_profiles",void 0),exports.UserModel=g([i.Database(x),i.ModelName("user"),b(),i.Version("5.0.0")],exports.UserModel),exports.AuditModel=class AuditModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.AuditModel.prototype,"id",void 0),g([i.Column.Enum("CREATE","DELETE","UPDATE"),v("design:type",String)],exports.AuditModel.prototype,"type",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"model",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"record",void 0),g([i.Column.Json(),v("design:type",Object)],exports.AuditModel.prototype,"data",void 0),g([i.Column.Json(),v("design:type",Object)],exports.AuditModel.prototype,"previously",void 0),g([i.Column.Text(),v("design:type",String)],exports.AuditModel.prototype,"full_url",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"ip_address",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"user_agent",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"app_name",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.AuditModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.AuditModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.AuditModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.AuditModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.AuditModel.prototype,"user_id",void 0),exports.AuditModel=g([i.Database(x),i.ModelName("audit"),i.Version("5.0.1")],exports.AuditModel),exports.ConfigModel=class ConfigModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.ConfigModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.ConfigModel.prototype,"key",void 0),g([i.Column.String(),v("design:type",String)],exports.ConfigModel.prototype,"value",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.ConfigModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.ConfigModel.prototype,"updated_at",void 0),exports.ConfigModel=g([i.Database(x),i.ModelName("configs"),i.Version("5.0.0")],exports.ConfigModel),exports.ForgotModel=class ForgotModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.ForgotModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.ForgotModel.prototype,"secret",void 0),g([i.Column.FullDate(),v("design:type",Number)],exports.ForgotModel.prototype,"expired_at",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.ForgotModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.ForgotModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.ForgotModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.ForgotModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.ForgotModel.prototype,"user_id",void 0),exports.ForgotModel=g([i.Database(x),i.ModelName("forgot"),i.Version("5.0.0")],exports.ForgotModel),exports.LogModel=class LogModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.LogModel.prototype,"id",void 0),g([i.Column.Enum("info","warn","error"),i.DefaultValue("info"),v("design:type",String)],exports.LogModel.prototype,"level",void 0),g([i.Column.Text(),v("design:type",String)],exports.LogModel.prototype,"message",void 0),g([i.Column.String(),v("design:type",String)],exports.LogModel.prototype,"source",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.LogModel.prototype,"created_at",void 0),exports.LogModel=g([i.Database(x),i.ModelName("log"),i.Version("5.0.0")],exports.LogModel),exports.MigrationModel=class MigrationModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.MigrationModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.MigrationModel.prototype,"model",void 0),g([i.Column.String(),v("design:type",String)],exports.MigrationModel.prototype,"version",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.MigrationModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.MigrationModel.prototype,"updated_at",void 0),exports.MigrationModel=g([i.Database(x),i.ModelName("migration"),i.Version("5.0.2")],exports.MigrationModel),exports.SessionModel=class SessionModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.SessionModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.SessionModel.prototype,"session",void 0),g([i.Column.Text(),v("design:type",String)],exports.SessionModel.prototype,"json",void 0),g([i.Column.BigInt(),v("design:type",Number)],exports.SessionModel.prototype,"expired",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.SessionModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.SessionModel.prototype,"updated_at",void 0),exports.SessionModel=g([i.Database(x),i.ModelName("session"),i.Version("5.0.2")],exports.SessionModel),exports.UserMetadataModel=class UserMetadataModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserMetadataModel.prototype,"id",void 0),g([i.Column.Json(),i.DefaultValue({}),v("design:type",Object)],exports.UserMetadataModel.prototype,"data",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserMetadataModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserMetadataModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserMetadataModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserMetadataModel.prototype,"user_id",void 0),exports.UserMetadataModel=g([i.Database(x),i.ModelName("users_metadata"),b(),i.Version("5.0.1")],exports.UserMetadataModel);class Log{static error(e,t,r){return h(this,void 0,void 0,function*(){yield this.writeRaw("error",e,t,r)})}static info(e,t,r){return h(this,void 0,void 0,function*(){yield this.writeRaw("info",e,t,r)})}static warn(e,t,r){return h(this,void 0,void 0,function*(){yield this.writeRaw("warn",e,t,r)})}static writeRaw(e,t,o,s){return h(this,void 0,void 0,function*(){var i;s&&r.Log.console(null!==(i=this.colors[e])&&void 0!==i?i:r.LogColor.White,e,t),x&&(yield exports.LogModel.create({level:e,message:t,source:null!=o?o:""}).catch(r.Log.catch))})}}Log.colors={error:r.LogColor.Red,info:r.LogColor.Cyan,warn:r.LogColor.Yellow};class Loggable{get log(){return e=>Loggable.logInfo(this,e)}static get log(){return e=>this.logInfo(this,e)}get error(){return e=>Loggable.logError(this,e)}static get error(){return e=>this.logError(this,e)}static logError(e,t){var r,o;Log.error(null!==(o=null!==(r=null==t?void 0:t.message)&&void 0!==r?r:t)&&void 0!==o?o:"",this.source(e),Env.CONSOLE_ERROR)}static logInfo(e,t){Log.info(null!=t?t:"",this.source(e),Env.CONSOLE_ERROR)}static source(e){var t,r,o;const s=null!==(o=null!==(r=null===(t=null==e?void 0:e.constructor)||void 0===t?void 0:t.name)&&void 0!==r?r:null==e?void 0:e.name)&&void 0!==o?o:"null";return Env.BASE_NAME?`${Env.BASE_NAME}.${s}`:s}}class SessionStore extends l.Store{constructor(){super(),this.all=e=>h(this,void 0,void 0,function*(){e=e||o.noop;const t=yield exports.SessionModel.findAll({attributes:["session"],where:{expired:{[i.Op.gte]:Date.now()}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.session)),e()}),this.clear=e=>h(this,void 0,void 0,function*(){yield exports.SessionModel.destroy().catch(o.noop),e&&e()}),this.destroy=(e,t)=>h(this,void 0,void 0,function*(){yield exports.SessionModel.destroy({where:{session:e}}).catch(o.noop),t&&t()}),this.expired=()=>h(this,void 0,void 0,function*(){yield exports.SessionModel.destroy({where:{expired:{[i.Op.lt]:Date.now()}}}).catch(o.noop)}),this.get=(e,t)=>h(this,void 0,void 0,function*(){t=t||o.noop;const r=yield exports.SessionModel.findOne({where:{session:e,expired:{[i.Op.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(o.noop),void t(null)}return void t(null,e)}t(null)}),this.length=e=>h(this,void 0,void 0,function*(){e&&e(null,(yield exports.SessionModel.count().catch(o.noop))||0)}),this.set=(e,t,r)=>h(this,void 0,void 0,function*(){r=r||o.noop;const s=Date.now()+Env.API_SESSION_LIFETIME,i=JSON.stringify(t),[n,d]=(yield exports.SessionModel.findOrCreate({where:{session:e},defaults:{session:e,json:i,expired:s}}).catch(o.noop))||[];n&&(d||(n.json=i,n.expired=s,yield n.save().catch(o.noop))),r()}),this.loop=o.loop(this.expired,3e4),this.loop.start()}}exports.Service=class Service{},exports.Service=g([p.Trait(Loggable)],exports.Service);class AuthService extends exports.Service{create(e){return h(this,void 0,void 0,function*(){if(!Env.TOKEN_KEY)throw new t.NotFoundError("TOKEN_KEY not found");const{id:r}=e,s=o.uuidv7(),i=yield exports.UserAuthModel.create({secret:s,user_id:r}).catch(this.error);if(!i)throw new t.InternalServerError;return{auth:i,token:a.sign({id:r,secret:s},Env.TOKEN_KEY,this.options())}})}destroy(e){return h(this,void 0,void 0,function*(){return!(!e||e.revoked_at)&&(e.revoked_at=new Date,yield e.save(),!0)})}renew(e){return h(this,void 0,void 0,function*(){if(!Env.TOKEN_KEY)throw new t.NotFoundError("TOKEN_KEY not found");const{decode:r}=yield this.verify(e,Env.API_TOKEN_RENEW/1e3);if(!r)throw new t.UnauthorizedError("Invalid token");const{id:s,secret:i}=r;if(s&&i){const e=yield exports.UserModel.findOne({where:{id:s,state:!0}}).catch(this.error);if(e){const t=yield exports.UserAuthModel.findOne({where:{secret:i,user_id:e.id}}).catch(this.error);if(t&&!t.revoked_at){t.secret=o.uuidv7(),yield t.save().catch(this.error);return{auth:t,token:a.sign({id:s,secret:t.secret},Env.TOKEN_KEY,this.options())}}}}throw new t.UnauthorizedError("Invalid token")})}user(e){return h(this,void 0,void 0,function*(){const{decode:r}=yield this.verify(e);if(!r)throw new t.UnauthorizedError("Invalid token");const{id:o,secret:s}=r;if(o&&s){const e=yield exports.UserModel.findOne({where:{id:o,state:!0}}).catch(this.error);if(e){const t=yield exports.UserAuthModel.findOne({where:{secret:s,user_id:e.id}}).catch(this.error);if(t&&!t.revoked_at)return{auth:t,user:e}}}throw new t.UnauthorizedError("Invalid token")})}options(){return{algorithm:"RS256",expiresIn:`${Env.TOKEN_TTL}ms`}}verify(e,r){return h(this,void 0,void 0,function*(){if(!Env.TOKEN_CRT)throw new t.NotFoundError("TOKEN_CRT not found");if(!e||e.split(".").length<3)throw new t.UnauthorizedError("Invalid token");try{return{decode:a.verify(e,Env.TOKEN_CRT,{clockTolerance:r})}}catch(e){throw new t.UnauthorizedError("Invalid token")}})}key(e){return h(this,void 0,void 0,function*(){if(!e)throw new t.UnauthorizedError("Invalid token");const r=yield exports.UserModel.findOne({where:{token:e,state:!0}}).catch(this.error);if(r){const t=e.replace(/(-[\w]{4})/g,"-****"),[o]=(yield exports.UserAuthModel.findOrCreate({where:{secret:t,user_id:r.id},defaults:{secret:t,user_id:r.id}}).catch(this.error))||[];if(o)return o.revoked_at&&(o.revoked_at=null,yield o.save().catch(this.error)),{auth:o,user:r}}throw new t.UnauthorizedError("Invalid token")})}}class ModelService extends exports.Service{constructor(e,t){var r;super(),this.attributes=[],this.permissions=[],this.model=e,(null==t?void 0:t.permissions)&&(this.permissions=t.permissions);const o=Object.keys(e.getAttributes());this.attributes=this.filterAttributes(o,null!==(r=null==t?void 0:t.attributes)&&void 0!==r?r:[])}applySelect(e,t,r){if(!t)return;const s=null==e?void 0:e.getQuery(r?`${r}_select`:"select"),i=t.attributes,n=e=>i.includes(e);t.attributes=[],o.isString(s)&&s.length&&t.attributes.push(...s.split(/\s*,\s*/g).filter(n)),t.attributes.length||(t.attributes=i)}applyOrders(e,t){if(!t)return;const r=null==e?void 0:e.getQuery("asc"),s=null==e?void 0:e.getQuery("desc"),i=[],n=t.attributes,d=e=>n.includes(e);o.isString(r)&&r.length&&i.push(...r.split(/\s*,\s*/g).filter(d).map(e=>[e,"ASC"])),o.isString(s)&&s.length&&i.push(...s.split(/\s*,\s*/g).filter(d).map(e=>[e,"DESC"])),i.length&&(t.order=i)}applyPagination(e,t){if(!t)return;const r=null==e?void 0:e.getQuery("limit"),s=null==e?void 0:e.getQuery("offset");o.isUndefined(t.limit)&&(t.limit=Env.MODEL_LIMIT,o.isString(r)&&(t.limit=parseInt(r)||0),t.limit=o.clamp(t.limit,-1,Env.MODEL_LIMIT_MAX)),t.limit<0&&(t.limit=void 0),o.isString(s)&&(t.offset=parseInt(s)||0,t.offset<0&&(t.offset=void 0))}applyWhere(e,r,s){var n,d;if(!r)return null;const l=null==e?void 0:e.getQuery(s?`${s}_where`:"where"),a=r.attributes;if(o.isString(l)){const e=i.Where.parse(a,l);if(!o.isUndefined(e.error))return new t.ValidationError(e.error.join(", "));r.where=Object.assign(Object.assign({},null!==(n=r.where)&&void 0!==n?n:{}),null!==(d=e.value)&&void 0!==d?d:{})}return null}countAll(e){return h(this,void 0,void 0,function*(){var r,s;const{ctx:i,options:n={}}=e,d=o.merge({},n);d.attributes=this.getAttributes(null!==(r=null==d?void 0:d.attributes)&&void 0!==r?r:[]);const l=this.applyWhere(i,d);if(l)return null==i||i.error(l),0;this.applySelect(i,d);const a=null!==(s=yield this.model.count(Object.assign(Object.assign({},d),{distinct:!!d.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error))&&void 0!==s?s:0;return null==i||i.prepare(t.StatusCodes.OK,{count:a}),a})}create(e){return h(this,void 0,void 0,function*(){var r,s;const{body:i={},ctx:n,options:d={}}=e,l=o.merge({},d),a=yield this.model.create(Object.assign({},o.merge({},null!==(s=null===(r=null==n?void 0:n.req)||void 0===r?void 0:r.body)&&void 0!==s?s:{},i)),Object.assign(Object.assign({},l),{ctx:n})).catch(this.error);if(!a)return null==n||n.error(new t.InternalServerError),null;const{primaryKeyAttribute:p}=this.model;return null==n||n.prepare(t.StatusCodes.OK,{[p]:a.getDataValue(p)}),a})}delete(e){return h(this,void 0,void 0,function*(){var r,s;const{ctx:i,id:n,options:d={}}=e,{primaryKeyAttribute:l}=this.model,a=null!==(r=null==i?void 0:i.getParam(l))&&void 0!==r?r:n;if(o.isUndefined(a))return null==i||i.error(new t.BadRequestError),0;const p=o.merge({},d),u=yield this.model.destroy(Object.assign(Object.assign(Object.assign({},p),{where:Object.assign(Object.assign({},null!==(s=p.where)&&void 0!==s?s:{}),{[l]:a}),individualHooks:!0}),{ctx:i})).catch(this.error);return u?(null==i||i.success("OK"),u):(null==i||i.error(new t.NotFoundError),0)})}filterAttributes(e,t){if(o.isArray(t))return t.length?t.filter(t=>o.isString(t)&&e.includes(t)):e;const{exclude:r,include:s}=t,i=o.isUndefined(s)?e:s.filter(t=>o.isString(t)&&e.includes(t)),n=null!=r?r:[];return n.length?i.filter(e=>!n.includes(e)):i}findAll(e){return h(this,void 0,void 0,function*(){var r,s;const{ctx:i,callback:n,limited:d,options:l={},query:a=!0}=e,p=o.merge({},l);if(p.attributes=this.getAttributes(null!==(r=null==p?void 0:p.attributes)&&void 0!==r?r:[]),a&&this.applySelect(i,p),this.applyOrders(i,p),this.applyPagination(i,p),d&&(null!==(s=null==p?void 0:p.limit)&&void 0!==s?s:0)>Env.MODEL_LIMIT_MAX&&(p.limit=Env.MODEL_LIMIT_MAX),a){const e=this.applyWhere(i,p);if(e)return null==i||i.error(e),{count:0,records:[]}}const[u,c]=yield Promise.all([this.model.count(Object.assign(Object.assign({},p),{distinct:!!p.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error).then(e=>null!=e?e:0),this.model.findAll(p).catch(this.error).then(e=>null!=e?e:[])]),g={count:u,records:n?yield n(c):c};return null==i||i.prepare(t.StatusCodes.OK,g),g})}findOne(e){return h(this,void 0,void 0,function*(){var r,s,i;const{callback:n,ctx:d,id:l,options:a={},query:p=!0}=e,{primaryKeyAttribute:u}=this.model,c=null!==(r=null==d?void 0:d.getParam(u))&&void 0!==r?r:l;if(o.isUndefined(c))return null==d||d.error(new t.BadRequestError),null;const g=o.merge({},a);g.attributes=this.getAttributes(null!==(s=null==g?void 0:g.attributes)&&void 0!==s?s:[]),p&&this.applySelect(d,g);const y=yield this.model.findOne(Object.assign(Object.assign({},g),{where:Object.assign(Object.assign({},null!==(i=null==g?void 0:g.where)&&void 0!==i?i:{}),{[u]:c})})).catch(this.error);return y?(null==d||d.prepare(t.StatusCodes.OK,n?yield n(y):y.toJSON()),y):(null==d||d.error(new t.NotFoundError),null)})}getAttributes(e){return this.filterAttributes(this.attributes,e)}include(e,t){var r;const s=o.clone(t),{ctx:i}=null!=t?t:{};s.attributes=this.filterAttributes(Object.keys(e.getAttributes()),null!==(r=s.attributes)&&void 0!==r?r:[]);const n=this.applyWhere(i,s,t.name);return n?(null==i||i.error(n),null):(this.applySelect(i,s,t.name),Object.assign({model:e},s))}name(){return this.model.tableName}sync(){return h(this,void 0,void 0,function*(){if(!this.permissions.length)return;const e=this.name().toLowerCase(),t={description:"",state:!0};yield o.forEachAsync(this.permissions,r=>h(this,void 0,void 0,function*(){const s=`${e}.${r}`,i=o.upperCamelCase(e.replace(/_/g," ")," ");yield exports.PermissionModel.findOrCreate({where:{key:s},defaults:Object.assign({name:`${i} ${o.upperCamelCase(r," ")}`,key:s,tags:i},t)})}))})}update(e){return h(this,void 0,void 0,function*(){var r,s,i,n,d;const{ctx:l,body:a,id:p,options:u={}}=e,{primaryKeyAttribute:c}=this.model,g=null!==(r=null==l?void 0:l.getParam(c))&&void 0!==r?r:p;if(o.isUndefined(g))return null==l||l.error(new t.BadRequestError),!1;const y=o.merge({},u),[v]=null!==(d=yield this.model.update(Object.assign({},o.merge({},null!==(i=null===(s=null==l?void 0:l.req)||void 0===s?void 0:s.body)&&void 0!==i?i:{},null!=a?a:{})),Object.assign(Object.assign(Object.assign({},y),{where:Object.assign(Object.assign({},null!==(n=null==y?void 0:y.where)&&void 0!==n?n:{}),{[c]:g}),individualHooks:!0}),{ctx:l})).catch(this.error))&&void 0!==d?d:[];return v?(null==l||l.success("OK"),!0):(null==l||l.success("Record not changed"),!1)})}}class UserService extends exports.Service{getMetadata(e){return h(this,void 0,void 0,function*(){var t,r;const[o]=null!==(t=yield exports.UserMetadataModel.findOrCreate({where:{user_id:e},defaults:{user_id:e}}).catch(this.error))&&void 0!==t?t:[];return null!==(r=null==o?void 0:o.data)&&void 0!==r?r:{}})}getProfile(e){return h(this,void 0,void 0,function*(){var t,r;const[o]=null!==(t=yield exports.UserProfileModel.findOrCreate({where:{user_id:e},defaults:{user_id:e}}).catch(this.error))&&void 0!==t?t:[];return null!==(r=null==o?void 0:o.data)&&void 0!==r?r:{}})}getGroups(e){return h(this,void 0,void 0,function*(){var t;return(null!==(t=yield exports.GroupModel.findAll({attributes:["key"],where:{state:!0},include:[{model:exports.UserGroupModel,required:!0,where:{user_id:e}}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}getPermissions(e){return h(this,void 0,void 0,function*(){var t;return(null!==(t=yield exports.PermissionModel.findAll({attributes:["key"],where:{state:!0},include:[{model:exports.GroupPermissionModel,required:!0,include:[{model:exports.GroupModel,required:!0,attributes:["id"],where:{state:!0},include:[{model:exports.UserGroupModel,required:!0,where:{user_id:e}}]}]}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}}class Application extends t.Application{constructor(e,t){super(e,o.merge({},{cert:Env.HTTP_CRT,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:Env.HTTP_KEY,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 SessionStore,name:Env.API_SESSION_NAME,secret:Env.API_SESSION_SECRET,cookie:{maxAge:Env.API_SESSION_LIFETIME},genid:o.uuidv7}},null!=t?t:{})),this.hash=new r.Hash(Env.API_KEY_HASH)}error(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.error(e.message,t,Env.CONSOLE_ERROR)}log(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return h(this,void 0,void 0,function*(){yield x.sync(),yield this.migrations(x),yield o.forEachSeries(this.controllers,e=>h(this,void 0,void 0,function*(){o.isFunction(e.sync)&&(yield e.sync(this))})),this.authService=new AuthService,this.userService=new UserService,yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new s.WebSocketServer({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>h(this,void 0,void 0,function*(){t.url||(t.url=""),e.on("close",()=>{}),yield o.sleep(2e3)})))})}migrations(e){return h(this,void 0,void 0,function*(){const t=[];yield o.forEachSeries(Object.keys(e.models),r=>h(this,void 0,void 0,function*(){var o;const s=e.models[r],i=s.version();if(!i)return;const[n,d]=null!==(o=yield exports.MigrationModel.findOrCreate({where:{model:s.tableName},defaults:{model:s.tableName,version:""}}).catch(this.error))&&void 0!==o?o:[];n&&(d||n.version!=i)&&(n.version=i,yield n.save().catch(this.error),t.push(s))})),yield o.forEachSeries(t,e=>h(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}exports.BaseController=class BaseController extends o.EventEmitter{constructor(){super(...arguments),this.permissions=[]}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")}session(e,t,r){return h(this,void 0,void 0,function*(){r.auth&&r.user&&(r.user_agent?r.user_agent!=t&&r.regenerate(o.noop):(r.user_agent=t,r.save(o.noop))),e.next()})}sync(){return h(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield o.forEachSeries(this.permissions,r=>h(this,void 0,void 0,function*(){const s=`${e}.${r}`,i=o.upperCamelCase(e.replace(/_/g," ")," ");yield exports.PermissionModel.findOrCreate({where:{key:s},defaults:Object.assign({name:`${i} ${o.upperCamelCase(r," ")}`,key:s,tags:i},t)})}))})}},g([y(0,t.Ctx()),y(1,t.Headers("user-agent")),y(2,t.Session()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Object]),v("design:returntype",Promise)],exports.BaseController.prototype,"session",null),exports.BaseController=g([p.Trait(Loggable)],exports.BaseController),exports.ModelController=class ModelController extends exports.BaseController{constructor(){super(...arguments),this.attributes=[],this.permissions=["create","read","update","delete"]}countAll(e){return h(this,void 0,void 0,function*(){return yield this.service.countAll(e)})}create(e){return h(this,void 0,void 0,function*(){return yield this.service.create(e)})}delete(e){return h(this,void 0,void 0,function*(){return yield this.service.delete(e)})}findAll(e){return h(this,void 0,void 0,function*(){return yield this.service.findAll(e)})}findOne(e){return h(this,void 0,void 0,function*(){return yield this.service.findOne(e)})}include(e,t){return this.service.include(e,t)}sync(){return h(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield o.forEachSeries(this.permissions,r=>h(this,void 0,void 0,function*(){const s=`${e}.${r}`,i=o.upperCamelCase(e.replace(/_/g," ")," ");yield exports.PermissionModel.findOrCreate({where:{key:s},defaults:Object.assign({name:`${i} ${o.upperCamelCase(r," ")}`,key:s,tags:i},t)})})),this.service=new ModelService(this.model)})}update(e){return h(this,void 0,void 0,function*(){return yield this.service.update(e)})}name(){return this.model.tableName}},exports.ModelController=g([t.Extends(exports.BaseController)],exports.ModelController),exports.AuditsController=class AuditsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.AuditModel,this.permissions=["read"]}all(e,t,r){return h(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 h(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}},g([t.Get(),M(),f(),y(0,t.Ctx()),y(1,t.Query("type")),y(2,t.Query("table")),v("design:type",Function),v("design:paramtypes",[t.Context,String,String]),v("design:returntype",Promise)],exports.AuditsController.prototype,"all",null),g([t.Get("/:id"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.AuditsController.prototype,"get",null),exports.AuditsController=g([t.Controller("/audits"),t.Extends(exports.ModelController)],exports.AuditsController),exports.AuthController=class AuthController extends exports.BaseController{constructor(e){super(),this.authService=e}login(e,r,s,n,l,a){return h(this,void 0,void 0,function*(){var p;yield o.sleep(Env.SLEEP_AUTH);const u=yield exports.UserModel.findOne({where:{[i.Op.or]:[{email:s},{username:s}]}}).catch(this.error);if(!u)return e.error(new t.UnauthorizedError("Invalid credentials")),a.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const c=yield exports.UserPasswordModel.findOne({where:{user_id:u.id,state:!0}}).catch(this.error);if(!c||!d.compareSync(n,c.value))return e.error(new t.UnauthorizedError("Invalid credentials")),a.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const g=yield exports.RegisterModel.findOne({where:{state:!0,user_id:u.id}}).catch(this.error);if(g)return e.error("ACTIVATION REQUIRED"),a.emit("auth.activation",{ctx:e,register:g,user:u}),void this.emit("auth.activation",{ctx:e,register:g,user:u});if(!u.state)return e.error(new t.UnauthorizedError("Invalid credentials")),a.emit("auth.failure",{ctx:e,user:u}),void this.emit("auth.failure",{ctx:e,user:u});const{auth:y,token:v}=null!==(p=yield this.authService.create(u).catch(t=>{e.error(t),a.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e})}))&&void 0!==p?p:{};y&&v&&(y.user_agent=r,y.ip_address=e.getIp(),yield y.save().catch(this.error),Env.API_TOKEN_COOKIE_SET&&e.setCookie(Env.API_TOKEN_COOKIE,v,{maxAge:l?Env.TOKEN_TTL:void 0}),e.json({token:v}),a.emit("auth.login",{ctx:e,auth:y,user:u}),this.emit("auth.login",{ctx:e,auth:y,user:u}))})}logout(e,r,o,s){return h(this,void 0,void 0,function*(){if(yield this.authService.destroy(r))return Env.API_TOKEN_COOKIE_SET&&e.clearCookie(Env.API_TOKEN_COOKIE),e.success("OK"),s.emit("auth.logout",{auth:r,ctx:e,user:o}),void this.emit("auth.logout",{auth:r,ctx:e,user:o});e.error(new t.UnauthorizedError("Access Denied"))})}renew(e,t,r,o){return h(this,void 0,void 0,function*(){var s;const{auth:i,token:n}=null!==(s=yield this.authService.renew(r).catch(t=>{e.error(t)}))&&void 0!==s?s:{};i&&n&&(i.user_agent=t,yield i.save().catch(this.error),e.json({token:n}),o.emit("auth.renew",{auth:i,ctx:e}),this.emit("auth.renew",{auth:i,ctx:e}))})}user(e,r){return h(this,void 0,void 0,function*(){const{groups:s,permissions:i,profile:n}=e.req;if(!s||!i)return e.error(new t.InternalServerError);e.json(Object.assign(Object.assign({},o.denied(r.toJSON(),["username","description"])),{groups:s,permissions:i,profile:n}))})}},g([t.Post("/login"),t.Validate(e=>({username:e.string().min(3).required(),password:e.string().min(5).required(),remember:e.boolean().parse().empty(!1)})),y(0,t.Ctx()),y(1,t.Headers("user-agent")),y(2,t.Body("username")),y(3,t.Body("password")),y(4,t.Body("remember")),y(5,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,String,Boolean,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"login",null),g([t.Get("/logout"),M(),y(0,t.Ctx()),y(1,_()),y(2,T()),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserAuthModel,exports.UserModel,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),g([t.Post("/renew"),t.Validate(e=>({token:e.string().required()})),y(0,t.Ctx()),y(1,t.Headers("user-agent")),y(2,t.Body("token")),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),g([t.Get(),t.Get("/me"),M(),y(0,t.Ctx()),y(1,T()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel]),v("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=g([t.Controller("/auth"),t.Extends(exports.BaseController),y(0,p.Inject(AuthService)),v("design:paramtypes",[AuthService])],exports.AuthController),exports.CrudController=class CrudController extends exports.ModelController{constructor(){super(...arguments),this._crud={}}CrudArgumentsCountAll(e){return{ctx:e}}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}}CrudValidateCreate(){return this._crud}CrudValidateUpdate(){return this._crud}add(e){return h(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return h(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}rows(e){return h(this,void 0,void 0,function*(){yield this.countAll(this.CrudArgumentsCountAll(e))})}del(e){return h(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return h(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return h(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validate(e,r){return h(this,void 0,void 0,function*(){var s,i;const n=o.Validation.object(r).parse(),{error:d,message:l,value:a}=yield n.validateAsync(null!==(i=null===(s=e.req)||void 0===s?void 0:s.body)&&void 0!==i?i:{});if(d)return e.error(new t.ValidationError(null!=l?l:d));e.req.body=a,e.next()})}validateCreate(e){return h(this,void 0,void 0,function*(){const r=this.CrudValidateCreate();if(r==this._crud)return e.error(new t.InternalServerError);yield this.validate(e,r)})}validateUpdate(e){return h(this,void 0,void 0,function*(){const r=this.CrudValidateUpdate();if(r==this._crud)return e.error(new t.InternalServerError);yield this.validate(e,r)})}},g([t.Post(),M(),C(),t.Middleware("validateCreate"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"add",null),g([t.Get(),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"all",null),g([t.Get("/count"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"rows",null),g([t.Delete("/:id"),M(),E(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"del",null),g([t.Get("/:id"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"get",null),g([t.Put("/:id"),M(),A(),t.Middleware("validateUpdate"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"set",null),g([y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"validateCreate",null),g([y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"validateUpdate",null),exports.CrudController=g([t.Extends(exports.ModelController)],exports.CrudController),exports.FilesController=class FilesController extends exports.BaseController{constructor(){super(...arguments),this.directory=Env.API_HTTP_PUBLIC||"./",this.permissions=["delete","download","edit","list","read","rename","upload","write"]}files(e){return h(this,void 0,void 0,function*(){let{path:r}=e.req;r=r.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const s=c.join(this.directory,r);if(!u.existsSync(s)||!u.statSync(s).isDirectory())return e.error(new t.NotFoundError);let i;return i=u.readdirSync(s),i=i.map(e=>this.info(c.join(s,e))),i=i.filter(o.isDef),Object.assign(Object.assign({},this.info(s)),{files:i})})}info(e){if(!u.existsSync(e))return null;const t=u.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 h(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=o.upperCamelCase(e.replace(/_/g," ")," "),r={description:"",state:!0};yield o.forEachSeries(this.permissions,s=>h(this,void 0,void 0,function*(){const i=`${e}.${s}`;yield exports.PermissionModel.findOrCreate({where:{key:i},defaults:Object.assign({name:`${t} ${o.upperCamelCase(s," ")}`,key:i,tags:t},r)})}))})}},g([t.Get("/path"),t.Get("/path/*path"),M(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.FilesController.prototype,"files",null),exports.FilesController=g([t.Controller("/files"),t.Extends(exports.BaseController)],exports.FilesController),exports.ForgotController=class ForgotController extends exports.BaseController{check(e,r){return h(this,void 0,void 0,function*(){const s=yield this.find(r);if(!s||!s.user)return e.error(new t.NotFoundError);s.secret=o.uniqueID(),yield s.save(),e.json({token:s.secret})})}forgot(e,r,s){return h(this,void 0,void 0,function*(){yield o.sleep(Env.SLEEP_FORGOT);const n=r,d=yield exports.UserModel.findOne({where:{[i.Op.or]:[{email:n},{username:r}]}}).catch(this.error);if(!d)return e.error(new t.NotFoundError);const l=o.uniqueID(),a=Date.now()+6e4*Env.API_TOKEN_FORGOT,p=yield exports.ForgotModel.create({token:l,timestamp:a,state:!0,user_id:d.id});e.success("OK"),s.emit("forgot.send",{ctx:e,forgot:p,user:d}),this.emit("forgot.send",{ctx:e,forgot:p,user:d})})}reset(e,r,o,s){return h(this,void 0,void 0,function*(){const o=yield this.find(r);if(!o)return e.error(new t.NotFoundError);o.state=!1,yield o.save().catch(this.error),yield o.user.save().catch(this.error),e.success("OK"),s.emit("forgot.reset",{ctx:e,user:o.user}),this.emit("forgot.reset",{ctx:e,user:o.user})})}find(e){return h(this,void 0,void 0,function*(){return yield exports.ForgotModel.findOne({where:{token:e,state:!0},include:[{model:exports.UserModel,required:!0}]}).catch(this.error)})}},g([t.Get("/check"),t.Validate(e=>({token:e.string().required()})),y(0,t.Ctx()),y(1,t.Body("token")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),g([t.Post(),t.Validate(e=>({username:e.string().min(4).required()})),y(0,t.Ctx()),y(1,t.Body("username")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),g([t.Post("/reset"),t.Validate(e=>({token:e.string().required(),password:e.string().min(5).required()})),y(0,t.Ctx()),y(1,t.Body("token")),y(2,t.Body("password")),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,Application]),v("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=g([t.Controller("/forgot"),t.Extends(exports.BaseController)],exports.ForgotController),exports.GroupsController=class GroupsController extends exports.CrudController{constructor(){super(...arguments),this.model=exports.GroupModel,this.schemaCreate={name:o.Validation.string().required(),key:o.Validation.string().required(),tags:o.Validation.string().empty(""),description:o.Validation.string().empty(""),state:o.Validation.boolean().parse().required()},this.schemaUpdate={name:o.Validation.string().empty(),tags:o.Validation.string().empty(),description:o.Validation.string().empty(),state:o.Validation.boolean().parse().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudalidateUpdate(){return this.schemaUpdate}},exports.GroupsController=g([t.Controller("/groups"),t.Extends(exports.CrudController)],exports.GroupsController),exports.GroupsPermissionsController=class GroupsPermissionsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.GroupPermissionModel,this.permissions=[]}all(e,t){return h(this,void 0,void 0,function*(){const r=this.include(exports.PermissionModel,{ctx:e,required:!0});r&&(yield this.findAll({ctx:e,options:{where:{group_id:t},include:[r]},callback:e=>e.map(e=>e.permission),query:!1}))})}set(e,r,s){return h(this,void 0,void 0,function*(){const n=yield exports.GroupModel.findByPk(r,{attributes:["id"]}).catch(this.error);if(!n)return e.error(new t.NotFoundError);const d=n.id,l=[];yield o.forEachSeries(o.uniqueArray(s),t=>h(this,void 0,void 0,function*(){var r;if(!(yield exports.PermissionModel.count({where:{id:t}})))return;const[o]=null!==(r=yield exports.GroupPermissionModel.findOrCreate(Object.assign({where:{group_id:d,permission_id:t},defaults:{group_id:d,permission_id:t}},{ctx:e})).catch(this.error))&&void 0!==r?r:[];o&&l.push(t)})),yield exports.GroupPermissionModel.destroy(Object.assign({where:{group_id:d,permission_id:{[i.Op.notIn]:l}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}},g([t.Get("/:id/permissions"),M(),f("groups"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"all",null),g([t.Put("/:id/permissions"),M(),A("groups"),t.Validate(e=>({permissions:e.array(e.string())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("permissions")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"set",null),exports.GroupsPermissionsController=g([t.Controller("/groups"),t.Extends(exports.ModelController)],exports.GroupsPermissionsController),exports.LogsController=class LogsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.LogModel,this.permissions=["read"]}all(e){return h(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{order:[["created_at","DESC"]]},limited:!0})})}},g([t.Get(),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.LogsController.prototype,"all",null),exports.LogsController=g([t.Controller("/logs"),t.Extends(exports.ModelController)],exports.LogsController),exports.PermissionsController=class PermissionsController extends exports.CrudController{constructor(){super(...arguments),this.model=exports.PermissionModel,this.schemaCreate={name:o.Validation.string().required(),key:o.Validation.string().required(),tags:o.Validation.string().empty(""),description:o.Validation.string().empty(""),state:o.Validation.boolean().parse().required()},this.schemaUpdate={name:o.Validation.string().empty(),tags:o.Validation.string().empty(),description:o.Validation.string().empty(),state:o.Validation.boolean().parse().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}},exports.PermissionsController=g([t.Controller("/permissions"),t.Extends(exports.CrudController)],exports.PermissionsController),exports.RegisterController=class RegisterController extends exports.BaseController{register(e,s,n){return h(this,void 0,void 0,function*(){yield o.sleep(Env.SLEEP_REGISTRY);const{name:d,date:l,email:a,username:p,password:u,confirm:c}=s,g=p||a,y=r.sha256(u);if(yield exports.UserModel.count({where:{[i.Op.or]:[{email:a},{username:g}]}}).catch(this.error))return e.error("INVALID EMAIL OR USERNAME");if(y!=r.sha256(c))return e.error("INVALID PASSWORD");const v=yield exports.UserModel.create({name:d,email:a,username:g,password:y,avatar:"",date:l,description:"",state:!1}).catch(this.error);if(!v)return e.error(new t.InternalServerError);const h=yield exports.RegisterModel.create({token:yield this.getId(),user_id:v.id,state:!0}).catch(this.error);if(!h)return yield v.destroy().catch(this.error),e.error(new t.InternalServerError);e.success("OK"),n.emit("register.user",{ctx:e,register:h,user:v}),this.emit("register.user",{ctx:e,register:h,user:v})})}confirm(e,r,o){return h(this,void 0,void 0,function*(){const s=yield exports.RegisterModel.findOne({where:{token:r,state:!0},include:[{model:exports.UserModel,required:!0}]}).catch(this.error);if(!s)return e.error(new t.NotFoundError);s.state=!1,yield s.save().catch(this.error),s.user.state=!0,yield s.user.save().catch(this.error),e.success("OK"),o.emit("register.confirm",{ctx:e,register:s,user:s.user}),this.emit("register.confirm",{ctx:e,register:s,user:s.user})})}send(e,r,o){return h(this,void 0,void 0,function*(){const s=r,n=yield exports.RegisterModel.findOne({where:{state:!0},include:[{model:exports.UserModel,required:!0,where:{[i.Op.or]:[{email:s},{username:r}]}}]}).catch(this.error);if(!n)return e.error(new t.NotFoundError);e.success("OK"),o.emit("register.send",{ctx:e,register:n,user:n.user}),this.emit("register.send",{ctx:e,register:n,user:n.user})})}getId(){return h(this,void 0,void 0,function*(){const e=o.uuidv7();return(yield exports.RegisterModel.count({where:{token:e}}))?this.getId():e})}},g([t.Post(),t.Validate(e=>({name:e.string().required(),date:e.date().required(),email:e.string().email().required(),username:e.string().min(4).empty(),password:e.string().min(5).required(),confirm:e.string().min(5).required()})),y(0,t.Ctx()),y(1,t.Body()),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,Object,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),g([t.Post("/confirm"),t.Validate(e=>({token:e.string().required()})),y(0,t.Ctx()),y(1,t.Body("token")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),g([t.Post("/send"),t.Validate(e=>({username:e.string().min(4).required()})),y(0,t.Ctx()),y(1,t.Body("username")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=g([t.Controller("/register"),t.Extends(exports.BaseController)],exports.RegisterController),exports.SetupController=class SetupController extends exports.BaseController{setup(e){return h(this,void 0,void 0,function*(){var t;if(yield exports.UserModel.count())return e.success("OK");const r=yield exports.UserModel.create({name:"Admin",email:"admin@localhost.com",username:"admin",description:"DEFAULT",state:!0},Object.assign({},{ctx:e}));yield exports.UserPasswordModel.create({value:"admin",state:!0,user_id:r.id});const s={description:"API CORE",state:!0},i=yield exports.GroupModel.create(Object.assign({name:"Admin",key:"admin",tags:"Admin"},s),Object.assign({},{ctx:e}));yield exports.UserGroupModel.create({user_id:r.id,group_id:i.id},Object.assign({},{ctx:e})),yield exports.GroupModel.create(Object.assign({name:"User",key:"user",tags:"user"},s),Object.assign({},{ctx:e}));const n=null!==(t=yield exports.PermissionModel.findAll({where:{state:!0}}).catch(this.error))&&void 0!==t?t:[];yield o.forEachSeries(n,t=>h(this,void 0,void 0,function*(){yield exports.GroupPermissionModel.create({group_id:i.id,permission_id:t.id},Object.assign({},{ctx:e}))})),e.success("OK")})}},g([t.Get(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=g([t.Controller("/setup"),t.Extends(exports.BaseController)],exports.SetupController),exports.UsersController=class UsersController extends exports.ModelController{constructor(){super(),this.model=exports.UserModel,this.path=Env.API_HTTP_PUBLIC+"/avatar",Env.API_HTTP_PUBLIC&&u.existsSync(Env.API_HTTP_PUBLIC)&&!u.existsSync(this.path)&&u.mkdirSync(this.path)}avatar(e,r){return h(this,void 0,void 0,function*(){var o,s;const i=e.getFiles();if(i.file&&i.file.length){const{filename:n,path:d}=null!==(o=i.file[0])&&void 0!==o?o:{};if(n){const[o]=null!==(s=yield exports.UserProfileModel.findOrCreate(Object.assign({where:{user_id:r.id},defaults:{user_id:r.id}},{ctx:e})).catch(this.error))&&void 0!==s?s:[];if(!o)return u.lstatSync(d).isFile()&&u.rmSync(d),e.error(new t.InternalServerError);const i=this.path+"/"+o.data.avatar;if(u.existsSync(i)&&u.lstatSync(i).isFile()&&u.rmSync(i),o.changed("data",!0),o.data.avatar=n,yield o.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK")}}e.success("Record not Changed")})}token_new(){return h(this,void 0,void 0,function*(){var e;const t=o.uuidv7();return(null!==(e=yield this.model.count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t})}add(e){return h(this,void 0,void 0,function*(){yield this.create({ctx:e})})}all(e){return h(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}rows(e){return h(this,void 0,void 0,function*(){yield this.countAll({ctx:e})})}del(e,r,o){return h(this,void 0,void 0,function*(){if(o.id==r)return e.error(new t.NotFoundError);yield this.delete({ctx:e})})}get(e){return h(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e){return h(this,void 0,void 0,function*(){yield this.update({ctx:e})})}},g([t.Post("/avatar"),M(),t.Upload({file:{count:1,path:`${Env.API_HTTP_PUBLIC}/avatar`,types:["image/bmp","image/jpeg","image/png"],size:32}}),y(0,t.Ctx()),y(1,T()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel]),v("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),g([t.Post(),M(),C(),t.Validate(e=>({name:e.string().required(),email:e.string().email().required(),username:e.string().min(3).required(),description:e.string().empty(""),state:e.boolean().parse().empty(!0)})),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"add",null),g([t.Get(),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"all",null),g([t.Get("/count"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"rows",null),g([t.Delete("/:id"),M(),E(),y(0,t.Ctx()),y(1,t.Params("id")),y(2,T()),v("design:type",Function),v("design:paramtypes",[t.Context,String,exports.UserModel]),v("design:returntype",Promise)],exports.UsersController.prototype,"del",null),g([t.Get("/:id"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"get",null),g([t.Put("/:id"),M(),A(),t.Validate(e=>({name:e.string().empty(),email:e.string().email().empty(),username:e.string().min(3).empty(),description:e.string().empty(),state:e.boolean().parse().empty()})),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=g([t.Controller("/users"),t.Extends(exports.ModelController),v("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class UsersGroupsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.UserGroupModel,this.permissions=[]}all(e,r){return h(this,void 0,void 0,function*(){if(!(yield exports.UserModel.findByPk(r,{attributes:["id"]}).catch(this.error)))return e.error(new t.NotFoundError("User Not Found"));const o=this.include(exports.GroupModel,{ctx:e,required:!0});o&&(yield this.findAll({ctx:e,options:{where:{user_id:r},include:[o]},callback:e=>e.map(e=>e.group),query:!1}))})}set(e,r,s){return h(this,void 0,void 0,function*(){const n=yield exports.UserModel.findByPk(r,{attributes:["id"]}).catch(this.error);if(!n)return e.error(new t.NotFoundError("User Not Found"));const d=n.id,l=[];yield o.forEachSeries(o.uniqueArray(s),t=>h(this,void 0,void 0,function*(){var r;if(!(yield exports.GroupModel.count({where:{id:t}})))return;const[o]=null!==(r=yield exports.UserGroupModel.findOrCreate(Object.assign({where:{user_id:d,group_id:t},defaults:{user_id:d,group_id:t}},{ctx:e})).catch(this.error))&&void 0!==r?r:[];o&&l.push(t)})),yield exports.UserGroupModel.destroy(Object.assign({where:{user_id:d,group_id:{[i.Op.notIn]:l}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}},g([t.Get("/:id/groups"),M(),f("users"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),g([t.Put("/:id/groups"),M(),A("users"),t.Validate(e=>({groups:e.array(e.string())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("groups")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=g([t.Controller("/users"),t.Extends(exports.ModelController)],exports.UsersGroupsController),exports.UsersProfilesController=class UsersProfilesController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.UserProfileModel,this.permissions=[]}all(e){return h(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}get(e,r){return h(this,void 0,void 0,function*(){var o;const[s]=null!==(o=yield exports.UserProfileModel.findOrCreate(Object.assign({where:{user_id:r},defaults:{user_id:r}},{ctx:e})).catch(this.error))&&void 0!==o?o:[];if(!s)return e.error(new t.NotFoundError);e.json(s)})}set(e,r,s){return h(this,void 0,void 0,function*(){var i;const n=yield exports.UserModel.findByPk(r,{attributes:["id"]}).catch(this.error);if(!n)return e.error(new t.NotFoundError);const d=n.id,l=o.map(s,e=>String(e)),[a,p]=null!==(i=yield exports.UserProfileModel.findOrCreate(Object.assign({where:{user_id:d},defaults:{data:l,user_id:d}},{ctx:e})).catch(this.error))&&void 0!==i?i:[];a&&!p&&(a.changed("data",!0),a.data=o.merge(a.data,l),yield a.save(Object.assign({},{ctx:e})).catch(this.error)),e.success("OK")})}},g([t.Get("/profiles"),M(),f("users"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersProfilesController.prototype,"all",null),g([t.Get("/:id/profiles"),M(),f("users"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.UsersProfilesController.prototype,"get",null),g([t.Put("/:id/profiles"),M(),A("users"),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Object]),v("design:returntype",Promise)],exports.UsersProfilesController.prototype,"set",null),exports.UsersProfilesController=g([t.Controller("/users"),t.Extends(exports.ModelController)],exports.UsersProfilesController),exports.Application=Application,exports.Audit=b,exports.AuthService=AuthService,exports.CanCreate=C,exports.CanDelete=E,exports.CanRead=f,exports.CanUpdate=A,exports.Config=class Config extends Loggable{static all(e){return h(this,void 0,void 0,function*(){var t;const r=null!==(t=yield exports.ConfigModel.findAll({where:(null==e?void 0:e.length)?{key:{[i.Op.in]:e}}:{}}).catch(this.error))&&void 0!==t?t:[];return Object.fromEntries(r.map(e=>[e.key,e.value]))})}static del(e){return h(this,void 0,void 0,function*(){return((yield exports.ConfigModel.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return h(this,arguments,void 0,function*(e,t=""){const[r]=(yield exports.ConfigModel.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return r?r.value:t})}static set(e,t){return h(this,void 0,void 0,function*(){const[r,o]=(yield exports.ConfigModel.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];r&&!o&&(r.value=t,yield r.save().catch(this.error))})}},exports.Env=Env,exports.HasGroups=(...e)=>(r,s,i)=>{t.Use(r=>h(void 0,void 0,void 0,function*(){const{groups:s}=r.req;if(o.includesArray(e,null!=s?s:[]))return r.next();r.error(new t.UnauthorizedError("Access Denied"))}))(r,s,i)},exports.HasPermissions=(...e)=>(r,s,i)=>{t.Use(r=>h(void 0,void 0,void 0,function*(){const{permissions:s}=r.req;if(o.includesArray(e,null!=s?s:[]))return r.next();r.error(new t.UnauthorizedError("Access Denied"))}))(r,s,i)},exports.IsAuthenticated=M,exports.Log=Log,exports.Loggable=Loggable,exports.ModelService=ModelService,exports.ReqAuth=_,exports.ReqGroup=S,exports.ReqGroups=P,exports.ReqPermission=O,exports.ReqPermissions=U,exports.ReqUser=T,exports.SessionStore=SessionStore,exports.UserService=UserService,exports.canFactory=m,exports.sequelize=x;
7
+ "use strict";var e,t=require("@andrewcaires/express"),r=require("@andrewcaires/node"),o=require("@andrewcaires/utils.js"),s=require("ws"),i=require("@andrewcaires/sequelize"),n=require("dotenv"),d=require("bcrypt"),l=require("express-session"),a=require("jsonwebtoken"),p=require("@andrewcaires/decorator"),u=require("fs"),c=require("path");function g(e,t,r,o){var s,i=arguments.length,n=i<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,o);else for(var d=e.length-1;d>=0;d--)(s=e[d])&&(n=(i<3?s(n):i>3?s(t,r,n):s(t,r))||n);return i>3&&n&&Object.defineProperty(t,r,n),n}function y(e,t){return function(r,o){t(r,o,e)}}function v(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function h(e,t,r,o){return new(r||(r=Promise))(function(s,i){function n(e){try{l(o.next(e))}catch(e){i(e)}}function d(e){try{l(o.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(n,d)}l((o=o.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError,n.config({quiet:!0});class Env extends r.Env{}e=Env,Env.BASE_NAME=e.getString("BASE_NAME",""),Env.CONSOLE_ERROR=e.getBool("CONSOLE_ERROR",!1),Env.DATABASE_URI=e.getString("DATABASE_URI","",!0),Env.DATABASE_LOG=e.getBool("DATABASE_LOG",!1),Env.DATABASE_AUDIT=e.getBool("DATABASE_AUDIT",!0),Env.DATABASE_PREFIX=e.getString("DATABASE_PREFIX",""),Env.DATABASE_TIMEZONE=e.getString("DATABASE_TIMEZONE","+00:00"),Env.HTTP_CRT=e.getFile("HTTP_CRT"),Env.HTTP_KEY=e.getFile("HTTP_KEY"),Env.MODEL_LIMIT=e.getInt("MODEL_LIMIT",10),Env.MODEL_LIMIT_MAX=e.getInt("MODEL_LIMIT_MAX",100),Env.SLEEP_AUTH=e.getMs("SLEEP_AUTH","2s"),Env.SLEEP_FORGOT=e.getMs("SLEEP_FORGOT","5s"),Env.SLEEP_REGISTRY=e.getMs("SLEEP_REGISTRY","5s"),Env.TOKEN_CRT=e.getFile("TOKEN_CRT"),Env.TOKEN_KEY=e.getFile("TOKEN_KEY"),Env.TOKEN_TTL=e.getMs("TOKEN_TTL","1d"),Env.API_BODYPARSER_STRICT=e.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=e.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=e.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=e.getString("API_BODYPARSER_TYPE","json"),Env.API_HTTP_PORT=e.getInt("API_HTTP_PORT",3e3),Env.API_HTTP_PUBLIC=e.getString("API_HTTP_PUBLIC",""),Env.API_HTTP_CROSS=e.getBool("API_HTTP_CROSS",!1),Env.API_HTTP_HYBRID=e.getBool("API_HTTP_HYBRID",!1),Env.API_HTTP_NOTFOUND=e.getString("API_HTTP_NOTFOUND",""),Env.API_HTTP_PATH=e.getString("API_HTTP_PATH","/api"),Env.API_HTTP_REDIRECT=e.getString("API_HTTP_REDIRECT",""),Env.API_KEY_HASH=e.getString("API_KEY_HASH",""),Env.API_KEY_HEADER=e.getString("API_KEY_HEADER","x-api-key"),Env.API_SESSION_NAME=e.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=e.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=e.getString("API_SESSION_SECRET","yoursecret"),Env.API_TOKEN_COOKIE=e.getString("API_TOKEN_COOKIE","authorization"),Env.API_TOKEN_COOKIE_SET=e.getBool("API_TOKEN_COOKIE_SET",!0),Env.API_TOKEN_FORGOT=e.getMs("API_TOKEN_FORGOT","1d"),Env.API_TOKEN_HEADER=e.getString("API_TOKEN_HEADER","authorization"),Env.API_TOKEN_HEADER_KEY=e.getString("API_TOKEN_HEADER","bearer"),Env.API_TOKEN_RENEW=e.getMs("API_TOKEN_RENEW","1d"),Env.API_USER_HISTORY=e.getBool("API_USER_HISTORY",!0),Env.API_WEBSOCKET_START=e.getBool("API_WEBSOCKET_START",!1);const x=new i.Sequelize({uri:Env.DATABASE_URI,logging:!!Env.DATABASE_LOG&&(e=>r.Log.console(r.LogColor.Magenta,"sql",e)),prefix:Env.DATABASE_PREFIX,timezone:Env.DATABASE_TIMEZONE}),m=e=>r=>(s,i,n)=>{t.Use(s=>h(void 0,void 0,void 0,function*(){var i;let n=null!=r?r:"";o.isUndefined(r)&&(n=o.isFunction(s.controller.name)?s.controller.name():null===(i=s.controller.constructor)||void 0===i?void 0:i.name);const{permissions:d}=s.req;if((null!=d?d:[]).includes(`${n}.${e}`))return s.next();s.error(new t.UnauthorizedError("Access Denied"))}))(s,i,n)},C=m("create"),E=m("delete"),f=m("read"),A=m("update"),M=()=>(e,r,o)=>{t.Use(e=>h(void 0,void 0,void 0,function*(){yield(e=>h(void 0,void 0,void 0,function*(){var r,o,s,i;if(e.req.auth&&e.req.user)return e.next();const{[Env.API_KEY_HEADER]:n,[Env.API_TOKEN_HEADER]:d,"user-agent":l}=e.getHeaders(),a=e.getQuery(Env.API_KEY_HEADER),p=(null===(r=n||a)||void 0===r?void 0:r.toString())||"";let u=e.getCookie(Env.API_TOKEN_COOKIE);u=`${Env.API_TOKEN_HEADER_KEY} ${u}`;const[c,g]=null!==(s=null===(o=d||u)||void 0===o?void 0:o.split(" "))&&void 0!==s?s:["",""];if(!(p||g&&c.toLowerCase()==Env.API_TOKEN_HEADER_KEY))return e.error(new t.UnauthorizedError("Invalid token"));const{authService:y,userService:v}=e.app,{auth:h,user:x}=null!==(i=yield(p?y.key(p.toString()):y.user(g)).catch(t=>{e.error(t)}))&&void 0!==i?i:{};if(h&&x){if(!p&&h.user_agent&&h.user_agent!=l)return e.error(new t.UnauthorizedError("Invalid token"));e.req.auth=h,e.req.user=x,e.req.groups=yield v.getGroups(x.id),e.req.permissions=yield v.getPermissions(x.id),e.req.profile=yield v.getProfile(x.id),e.next()}}))(e)}))(e,r,o)},_=t.parameterFactory(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.auth}),S=t.parameterFactory(({ctx:e,key:t})=>{var r,o;return(null!==(o=null===(r=e.req)||void 0===r?void 0:r.groups)&&void 0!==o?o:[]).includes(t)}),P=t.parameterFactory(({ctx:e})=>{var t,r;return null!==(r=null===(t=e.req)||void 0===t?void 0:t.groups)&&void 0!==r?r:[]}),O=t.parameterFactory(({ctx:e,key:t})=>{var r,o;return(null!==(o=null===(r=e.req)||void 0===r?void 0:r.permissions)&&void 0!==o?o:[]).includes(t)}),U=t.parameterFactory(({ctx:e})=>{var t,r;return null!==(r=null===(t=e.req)||void 0===t?void 0:t.permissions)&&void 0!==r?r:[]}),T=t.parameterFactory(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.user}),I=(e,r,o)=>{var s,i,n,d,l,a,p,u,c,g;const y=o.ctx instanceof t.Context?o.ctx:null,v=null!==(d=null!==(n=null===(i=null===(s=null==y?void 0:y.req)||void 0===s?void 0:s.user)||void 0===i?void 0:i.id)&&void 0!==n?n:o.user_id)&&void 0!==d?d:null,h={type:e,model:null!==(l=null==r?void 0:r.getTableName())&&void 0!==l?l:null,app_name:null!==(a=Env.BASE_NAME)&&void 0!==a?a:"",state:!0,user_id:v};return y?Object.assign(Object.assign({},h),{full_url:null!==(p=null==y?void 0:y.getUrl())&&void 0!==p?p:"",ip_address:null!==(u=null==y?void 0:y.getIp())&&void 0!==u?u:"",user_agent:null!==(g=null===(c=null==y?void 0:y.req)||void 0===c?void 0:c.headers["user-agent"])&&void 0!==g?g:""}):h},b={afterCreate:(e,t)=>h(void 0,void 0,void 0,function*(){const s=o.getConstructor(e),{primaryKeyAttribute:i}=null!=s?s:{};yield exports.AuditModel.create(Object.assign(Object.assign({},I("CREATE",s,t)),{record:i?e.getDataValue(i):null,data:e.toJSON()})).catch(r.Log.catch)}),afterUpdate:(e,t)=>h(void 0,void 0,void 0,function*(){const s=o.getConstructor(e),{primaryKeyAttribute:i}=null!=s?s:{},n={},d=e.changed();d&&d.forEach(t=>n[t]=e.getDataValue(t)),yield exports.AuditModel.create(Object.assign(Object.assign({},I("UPDATE",s,t)),{record:i?e.getDataValue(i):null,data:n,previously:e.previous()})).catch(r.Log.catch)}),afterDestroy:(e,t)=>h(void 0,void 0,void 0,function*(){const s=o.getConstructor(e),{primaryKeyAttribute:i}=null!=s?s:{};yield exports.AuditModel.create(Object.assign(Object.assign({},I("DELETE",s,t)),{record:i?e.getDataValue(i):null,data:e.toJSON()})).catch(r.Log.catch)})},w=e=>(o.isUndefined(e)&&(e=Env.DATABASE_AUDIT),i.Hooks(e?b:{}));exports.RegisterModel=class RegisterModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.RegisterModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.RegisterModel.prototype,"secret",void 0),g([i.Column.FullDate(),v("design:type",Number)],exports.RegisterModel.prototype,"expired_at",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.RegisterModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.RegisterModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.RegisterModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.RegisterModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.RegisterModel.prototype,"user_id",void 0),exports.RegisterModel=g([i.Database(x),i.ModelName("register"),i.Version("5.0.0")],exports.RegisterModel),exports.UserAuthModel=class UserAuthModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserAuthModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"secret",void 0),g([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"ip_address",void 0),g([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"user_agent",void 0),g([i.Column.FullDate(),v("design:type",Object)],exports.UserAuthModel.prototype,"revoked_at",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserAuthModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserAuthModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserAuthModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserAuthModel.prototype,"user_id",void 0),exports.UserAuthModel=g([i.Database(x),i.ModelName("users_auth"),i.Version("5.0.0")],exports.UserAuthModel),exports.PermissionModel=class PermissionModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.PermissionModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.PermissionModel.prototype,"name",void 0),g([i.Column.String(),i.Unique(!0),v("design:type",String)],exports.PermissionModel.prototype,"key",void 0),g([i.Column.String(),v("design:type",String)],exports.PermissionModel.prototype,"tags",void 0),g([i.Column.Text(),v("design:type",String)],exports.PermissionModel.prototype,"description",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.PermissionModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.PermissionModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.PermissionModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.PermissionModel.prototype,"deleted_at",void 0),g([i.HasMany(()=>exports.GroupPermissionModel,"permission_id"),v("design:type",Array)],exports.PermissionModel.prototype,"groups_permissions",void 0),exports.PermissionModel=g([i.Database(x),i.ModelName("permission"),w(),i.Version("5.0.1")],exports.PermissionModel),exports.GroupPermissionModel=class GroupPermissionModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.GroupPermissionModel.prototype,"id",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.GroupPermissionModel.prototype,"created_at",void 0),g([i.Association.BelongsTo(()=>exports.GroupModel),v("design:type",String)],exports.GroupPermissionModel.prototype,"group_id",void 0),g([i.Association.BelongsTo(()=>exports.PermissionModel),v("design:type",String)],exports.GroupPermissionModel.prototype,"permission_id",void 0),exports.GroupPermissionModel=g([i.Database(x),i.ModelName("groups_permissions"),w(),i.Version("5.0.2")],exports.GroupPermissionModel),exports.GroupModel=class GroupModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.GroupModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.GroupModel.prototype,"name",void 0),g([i.Column.String(),v("design:type",String)],exports.GroupModel.prototype,"key",void 0),g([i.Column.String(),v("design:type",String)],exports.GroupModel.prototype,"tags",void 0),g([i.Column.Text(),v("design:type",String)],exports.GroupModel.prototype,"description",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.GroupModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.GroupModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.GroupModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.GroupModel.prototype,"deleted_at",void 0),g([i.Association.HasMany(()=>exports.UserGroupModel,"group_id"),v("design:type",Array)],exports.GroupModel.prototype,"users_groups",void 0),g([i.Association.HasMany(()=>exports.GroupPermissionModel,"group_id"),v("design:type",Array)],exports.GroupModel.prototype,"groups_Permission",void 0),exports.GroupModel=g([i.Database(x),i.ModelName("group"),w(),i.Version("5.0.1")],exports.GroupModel),exports.UserGroupModel=class UserGroupModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserGroupModel.prototype,"id",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserGroupModel.prototype,"created_at",void 0),g([i.Association.BelongsTo(()=>exports.GroupModel),v("design:type",String)],exports.UserGroupModel.prototype,"group_id",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserGroupModel.prototype,"user_id",void 0),exports.UserGroupModel=g([i.Database(x),i.ModelName("users_groups"),w(),i.Version("5.0.2")],exports.UserGroupModel),exports.UserPasswordModel=class UserPasswordModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserPasswordModel.prototype,"id",void 0),g([i.Column.String(),i.Value(e=>d.hashSync(e.value,12)),v("design:type",String)],exports.UserPasswordModel.prototype,"value",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.UserPasswordModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserPasswordModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserPasswordModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserPasswordModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserPasswordModel.prototype,"user_id",void 0),exports.UserPasswordModel=g([i.Database(x),i.ModelName("users_password"),w(),i.Version("5.0.0")],exports.UserPasswordModel),exports.UserProfileModel=class UserProfileModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserProfileModel.prototype,"id",void 0),g([i.Column.Json(),i.DefaultValue({}),v("design:type",Object)],exports.UserProfileModel.prototype,"data",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserProfileModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserProfileModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserProfileModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserProfileModel.prototype,"user_id",void 0),exports.UserProfileModel=g([i.Database(x),i.ModelName("users_profile"),w(),i.Version("5.0.1")],exports.UserProfileModel),exports.UserModel=class UserModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"name",void 0),g([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"email",void 0),g([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"username",void 0),g([i.Column.Text(),v("design:type",String)],exports.UserModel.prototype,"description",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.UserModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserModel.prototype,"deleted_at",void 0),g([i.Association.HasMany(()=>exports.AuditModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"audits",void 0),g([i.Association.HasMany(()=>exports.UserAuthModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"users_auths",void 0),g([i.Association.HasMany(()=>exports.RegisterModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"registers",void 0),g([i.Association.HasMany(()=>exports.UserGroupModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"users_groups",void 0),g([i.Association.HasMany(()=>exports.UserPasswordModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"users_passwords",void 0),g([i.Association.HasMany(()=>exports.UserProfileModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"users_profiles",void 0),exports.UserModel=g([i.Database(x),i.ModelName("user"),w(),i.Version("5.0.0")],exports.UserModel),exports.AuditModel=class AuditModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.AuditModel.prototype,"id",void 0),g([i.Column.Enum("CREATE","DELETE","UPDATE"),v("design:type",String)],exports.AuditModel.prototype,"type",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"model",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"record",void 0),g([i.Column.Json(),v("design:type",Object)],exports.AuditModel.prototype,"data",void 0),g([i.Column.Json(),v("design:type",Object)],exports.AuditModel.prototype,"previously",void 0),g([i.Column.Text(),v("design:type",String)],exports.AuditModel.prototype,"full_url",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"ip_address",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"user_agent",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"app_name",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.AuditModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.AuditModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.AuditModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.AuditModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.AuditModel.prototype,"user_id",void 0),exports.AuditModel=g([i.Database(x),i.ModelName("audit"),i.Version("5.0.1")],exports.AuditModel),exports.ConfigModel=class ConfigModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.ConfigModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.ConfigModel.prototype,"key",void 0),g([i.Column.String(),v("design:type",String)],exports.ConfigModel.prototype,"value",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.ConfigModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.ConfigModel.prototype,"updated_at",void 0),exports.ConfigModel=g([i.Database(x),i.ModelName("configs"),i.Version("5.0.0")],exports.ConfigModel),exports.ForgotModel=class ForgotModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.ForgotModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.ForgotModel.prototype,"secret",void 0),g([i.Column.FullDate(),v("design:type",Number)],exports.ForgotModel.prototype,"expired_at",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.ForgotModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.ForgotModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.ForgotModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.ForgotModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.ForgotModel.prototype,"user_id",void 0),exports.ForgotModel=g([i.Database(x),i.ModelName("forgot"),i.Version("5.0.0")],exports.ForgotModel),exports.LogModel=class LogModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.LogModel.prototype,"id",void 0),g([i.Column.Enum("info","warn","error"),i.DefaultValue("info"),v("design:type",String)],exports.LogModel.prototype,"level",void 0),g([i.Column.Text(),v("design:type",String)],exports.LogModel.prototype,"message",void 0),g([i.Column.String(),v("design:type",String)],exports.LogModel.prototype,"source",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.LogModel.prototype,"created_at",void 0),exports.LogModel=g([i.Database(x),i.ModelName("log"),i.Version("5.0.0")],exports.LogModel),exports.MigrationModel=class MigrationModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.MigrationModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.MigrationModel.prototype,"model",void 0),g([i.Column.String(),v("design:type",String)],exports.MigrationModel.prototype,"version",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.MigrationModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.MigrationModel.prototype,"updated_at",void 0),exports.MigrationModel=g([i.Database(x),i.ModelName("migration"),i.Version("5.0.2")],exports.MigrationModel),exports.SessionModel=class SessionModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.SessionModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.SessionModel.prototype,"session",void 0),g([i.Column.Text(),v("design:type",String)],exports.SessionModel.prototype,"json",void 0),g([i.Column.BigInt(),v("design:type",Number)],exports.SessionModel.prototype,"expired",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.SessionModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.SessionModel.prototype,"updated_at",void 0),exports.SessionModel=g([i.Database(x),i.ModelName("session"),i.Version("5.0.2")],exports.SessionModel),exports.UserMetadataModel=class UserMetadataModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserMetadataModel.prototype,"id",void 0),g([i.Column.Json(),i.DefaultValue({}),v("design:type",Object)],exports.UserMetadataModel.prototype,"data",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserMetadataModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserMetadataModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserMetadataModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserMetadataModel.prototype,"user_id",void 0),exports.UserMetadataModel=g([i.Database(x),i.ModelName("users_metadata"),w(),i.Version("5.0.1")],exports.UserMetadataModel);class Log{static error(e,t,r){return h(this,void 0,void 0,function*(){yield this.writeRaw("error",e,t,r)})}static info(e,t,r){return h(this,void 0,void 0,function*(){yield this.writeRaw("info",e,t,r)})}static warn(e,t,r){return h(this,void 0,void 0,function*(){yield this.writeRaw("warn",e,t,r)})}static writeRaw(e,t,o,s){return h(this,void 0,void 0,function*(){var i;s&&r.Log.console(null!==(i=this.colors[e])&&void 0!==i?i:r.LogColor.White,e,t),x&&(yield exports.LogModel.create({level:e,message:t,source:null!=o?o:""}).catch(r.Log.catch))})}}Log.colors={error:r.LogColor.Red,info:r.LogColor.Cyan,warn:r.LogColor.Yellow};class Loggable{get log(){return e=>Loggable.logInfo(this,e)}static get log(){return e=>this.logInfo(this,e)}get error(){return e=>Loggable.logError(this,e)}static get error(){return e=>this.logError(this,e)}static logError(e,t){var r,o;Log.error(null!==(o=null!==(r=null==t?void 0:t.message)&&void 0!==r?r:t)&&void 0!==o?o:"",this.source(e),Env.CONSOLE_ERROR)}static logInfo(e,t){Log.info(null!=t?t:"",this.source(e),Env.CONSOLE_ERROR)}static source(e){var t,r,o;const s=null!==(o=null!==(r=null===(t=null==e?void 0:e.constructor)||void 0===t?void 0:t.name)&&void 0!==r?r:null==e?void 0:e.name)&&void 0!==o?o:"null";return Env.BASE_NAME?`${Env.BASE_NAME}.${s}`:s}}class SessionStore extends l.Store{constructor(){super(),this.all=e=>h(this,void 0,void 0,function*(){e=e||o.noop;const t=yield exports.SessionModel.findAll({attributes:["session"],where:{expired:{[i.Op.gte]:Date.now()}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.session)),e()}),this.clear=e=>h(this,void 0,void 0,function*(){yield exports.SessionModel.destroy().catch(o.noop),e&&e()}),this.destroy=(e,t)=>h(this,void 0,void 0,function*(){yield exports.SessionModel.destroy({where:{session:e}}).catch(o.noop),t&&t()}),this.expired=()=>h(this,void 0,void 0,function*(){yield exports.SessionModel.destroy({where:{expired:{[i.Op.lt]:Date.now()}}}).catch(o.noop)}),this.get=(e,t)=>h(this,void 0,void 0,function*(){t=t||o.noop;const r=yield exports.SessionModel.findOne({where:{session:e,expired:{[i.Op.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(o.noop),void t(null)}return void t(null,e)}t(null)}),this.length=e=>h(this,void 0,void 0,function*(){e&&e(null,(yield exports.SessionModel.count().catch(o.noop))||0)}),this.set=(e,t,r)=>h(this,void 0,void 0,function*(){r=r||o.noop;const s=Date.now()+Env.API_SESSION_LIFETIME,i=JSON.stringify(t),[n,d]=(yield exports.SessionModel.findOrCreate({where:{session:e},defaults:{session:e,json:i,expired:s}}).catch(o.noop))||[];n&&(d||(n.json=i,n.expired=s,yield n.save().catch(o.noop))),r()}),this.loop=o.loop(this.expired,3e4),this.loop.start()}}exports.Service=class Service{},exports.Service=g([p.Trait(Loggable)],exports.Service);class AuthService extends exports.Service{create(e){return h(this,void 0,void 0,function*(){if(!Env.TOKEN_KEY)throw new t.NotFoundError("TOKEN_KEY not found");const{id:r}=e,s=o.uuidv7(),i=yield exports.UserAuthModel.create({secret:s,user_id:r}).catch(this.error);if(!i)throw new t.InternalServerError;return{auth:i,token:a.sign({id:r,secret:s},Env.TOKEN_KEY,this.options())}})}destroy(e){return h(this,void 0,void 0,function*(){return!(!e||e.revoked_at)&&(e.revoked_at=new Date,yield e.save(),!0)})}renew(e){return h(this,void 0,void 0,function*(){if(!Env.TOKEN_KEY)throw new t.NotFoundError("TOKEN_KEY not found");const{decode:r}=yield this.verify(e,Env.API_TOKEN_RENEW/1e3);if(!r)throw new t.UnauthorizedError("Invalid token");const{id:s,secret:i}=r;if(s&&i){const e=yield exports.UserModel.findOne({where:{id:s,state:!0}}).catch(this.error);if(e){const t=yield exports.UserAuthModel.findOne({where:{secret:i,user_id:e.id}}).catch(this.error);if(t&&!t.revoked_at){t.secret=o.uuidv7(),yield t.save().catch(this.error);return{auth:t,token:a.sign({id:s,secret:t.secret},Env.TOKEN_KEY,this.options())}}}}throw new t.UnauthorizedError("Invalid token")})}user(e){return h(this,void 0,void 0,function*(){const{decode:r}=yield this.verify(e);if(!r)throw new t.UnauthorizedError("Invalid token");const{id:o,secret:s}=r;if(o&&s){const e=yield exports.UserModel.findOne({where:{id:o,state:!0}}).catch(this.error);if(e){const t=yield exports.UserAuthModel.findOne({where:{secret:s,user_id:e.id}}).catch(this.error);if(t&&!t.revoked_at)return{auth:t,user:e}}}throw new t.UnauthorizedError("Invalid token")})}options(){return{algorithm:"RS256",expiresIn:`${Env.TOKEN_TTL}ms`}}verify(e,r){return h(this,void 0,void 0,function*(){if(!Env.TOKEN_CRT)throw new t.NotFoundError("TOKEN_CRT not found");if(!e||e.split(".").length<3)throw new t.UnauthorizedError("Invalid token");try{return{decode:a.verify(e,Env.TOKEN_CRT,{clockTolerance:r})}}catch(e){throw new t.UnauthorizedError("Invalid token")}})}key(e){return h(this,void 0,void 0,function*(){if(!e)throw new t.UnauthorizedError("Invalid token");const r=yield exports.UserModel.findOne({where:{token:e,state:!0}}).catch(this.error);if(r){const t=e.replace(/(-[\w]{4})/g,"-****"),[o]=(yield exports.UserAuthModel.findOrCreate({where:{secret:t,user_id:r.id},defaults:{secret:t,user_id:r.id}}).catch(this.error))||[];if(o)return o.revoked_at&&(o.revoked_at=null,yield o.save().catch(this.error)),{auth:o,user:r}}throw new t.UnauthorizedError("Invalid token")})}}class ModelService extends exports.Service{constructor(e,t){var r,o;super(),this.attributes=[],this.permissions=[],this.search=[],this.model=e,(null==t?void 0:t.permissions)&&(this.permissions=t.permissions);const s=Object.keys(e.getAttributes());this.attributes=this.filterAttributes(s,null!==(r=null==t?void 0:t.attributes)&&void 0!==r?r:[]),this.search=this.filterAttributes(s,null!==(o=null==t?void 0:t.search)&&void 0!==o?o:this.attributes)}applySelect(e,t,r){if(!t)return;const s=null==e?void 0:e.getQuery(r?`${r}_select`:"select"),i=t.attributes,n=e=>i.includes(e);t.attributes=[],o.isString(s)&&s.length&&t.attributes.push(...s.split(/\s*,\s*/g).filter(n)),t.attributes.length||(t.attributes=i)}applyOrders(e,t){if(!t)return;const r=null==e?void 0:e.getQuery("asc"),s=null==e?void 0:e.getQuery("desc"),i=[],n=t.attributes,d=e=>n.includes(e);o.isString(r)&&r.length&&i.push(...r.split(/\s*,\s*/g).filter(d).map(e=>[e,"ASC"])),o.isString(s)&&s.length&&i.push(...s.split(/\s*,\s*/g).filter(d).map(e=>[e,"DESC"])),i.length&&(t.order=i)}applyPagination(e,t){if(!t)return;const r=null==e?void 0:e.getQuery("limit"),s=null==e?void 0:e.getQuery("offset");o.isUndefined(t.limit)&&(t.limit=Env.MODEL_LIMIT,o.isString(r)&&(t.limit=parseInt(r)||0),t.limit=o.clamp(t.limit,-1,Env.MODEL_LIMIT_MAX)),t.limit<0&&(t.limit=void 0),o.isString(s)&&(t.offset=parseInt(s)||0,t.offset<0&&(t.offset=void 0))}applySearch(e,t){var r;if(!t)return;const s=null==e?void 0:e.getQuery("search");s&&o.isString(s)&&(t.where=Object.assign(Object.assign({},null!==(r=t.where)&&void 0!==r?r:{}),{[i.Op.or]:this.search.map(e=>({[e]:{[i.Op.substring]:s}}))}))}applyWhere(e,r,s){var n,d;if(!r)return null;const l=null==e?void 0:e.getQuery(s?`${s}_where`:"where");if(!o.isString(l))return null;const a=r.attributes,p=i.Where.parse(a,l);return o.isUndefined(p.error)?(r.where=Object.assign(Object.assign({},null!==(n=r.where)&&void 0!==n?n:{}),null!==(d=p.value)&&void 0!==d?d:{}),null):new t.ValidationError(p.error.join(", "))}countAll(e){return h(this,void 0,void 0,function*(){var r,s;const{ctx:i,options:n={}}=e,d=o.merge({},n);d.attributes=this.getAttributes(null!==(r=null==d?void 0:d.attributes)&&void 0!==r?r:[]),this.applySearch(i,d);const l=this.applyWhere(i,d);if(l)return null==i||i.error(l),0;this.applySelect(i,d);const a=null!==(s=yield this.model.count(Object.assign(Object.assign({},d),{distinct:!!d.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error))&&void 0!==s?s:0;return null==i||i.prepare(t.StatusCodes.OK,{count:a}),a})}create(e){return h(this,void 0,void 0,function*(){var r,s;const{body:i={},ctx:n,options:d={}}=e,l=o.merge({},d),a=yield this.model.create(Object.assign({},o.merge({},null!==(s=null===(r=null==n?void 0:n.req)||void 0===r?void 0:r.body)&&void 0!==s?s:{},i)),Object.assign(Object.assign({},l),{ctx:n})).catch(this.error);if(!a)return null==n||n.error(new t.InternalServerError),null;const{primaryKeyAttribute:p}=this.model;return null==n||n.prepare(t.StatusCodes.OK,{[p]:a.getDataValue(p)}),a})}delete(e){return h(this,void 0,void 0,function*(){var r,s;const{ctx:i,id:n,options:d={}}=e,{primaryKeyAttribute:l}=this.model,a=null!==(r=null==i?void 0:i.getParam(l))&&void 0!==r?r:n;if(o.isUndefined(a))return null==i||i.error(new t.BadRequestError),0;const p=o.merge({},d),u=yield this.model.destroy(Object.assign(Object.assign(Object.assign({},p),{where:Object.assign(Object.assign({},null!==(s=p.where)&&void 0!==s?s:{}),{[l]:a}),individualHooks:!0}),{ctx:i})).catch(this.error);return u?(null==i||i.success("OK"),u):(null==i||i.error(new t.NotFoundError),0)})}filterAttributes(e,t){if(o.isArray(t))return t.length?t.filter(t=>o.isString(t)&&e.includes(t)):e;const{exclude:r,include:s}=t,i=o.isUndefined(s)?e:s.filter(t=>o.isString(t)&&e.includes(t)),n=null!=r?r:[];return n.length?i.filter(e=>!n.includes(e)):i}findAll(e){return h(this,void 0,void 0,function*(){var r,s;const{ctx:i,callback:n,limited:d,options:l={},query:a=!0}=e,p=o.merge({},l);if(p.attributes=this.getAttributes(null!==(r=null==p?void 0:p.attributes)&&void 0!==r?r:[]),a&&this.applySelect(i,p),this.applyOrders(i,p),this.applyPagination(i,p),d&&(null!==(s=null==p?void 0:p.limit)&&void 0!==s?s:0)>Env.MODEL_LIMIT_MAX&&(p.limit=Env.MODEL_LIMIT_MAX),this.applySearch(i,p),a){const e=this.applyWhere(i,p);if(e)return null==i||i.error(e),{count:0,records:[]}}const[u,c]=yield Promise.all([this.model.count(Object.assign(Object.assign({},p),{distinct:!!p.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error).then(e=>null!=e?e:0),this.model.findAll(p).catch(this.error).then(e=>null!=e?e:[])]),g={count:u,records:n?yield n(c):c};return null==i||i.prepare(t.StatusCodes.OK,g),g})}findOne(e){return h(this,void 0,void 0,function*(){var r,s,i;const{callback:n,ctx:d,id:l,options:a={},query:p=!0}=e,{primaryKeyAttribute:u}=this.model,c=null!==(r=null==d?void 0:d.getParam(u))&&void 0!==r?r:l;if(o.isUndefined(c))return null==d||d.error(new t.BadRequestError),null;const g=o.merge({},a);g.attributes=this.getAttributes(null!==(s=null==g?void 0:g.attributes)&&void 0!==s?s:[]),p&&this.applySelect(d,g);const y=yield this.model.findOne(Object.assign(Object.assign({},g),{where:Object.assign(Object.assign({},null!==(i=null==g?void 0:g.where)&&void 0!==i?i:{}),{[u]:c})})).catch(this.error);return y?(null==d||d.prepare(t.StatusCodes.OK,n?yield n(y):y.toJSON()),y):(null==d||d.error(new t.NotFoundError),null)})}getAttributes(e){return this.filterAttributes(this.attributes,e)}include(e,t){var r;const s=o.clone(t),{ctx:i}=null!=t?t:{};s.attributes=this.filterAttributes(Object.keys(e.getAttributes()),null!==(r=s.attributes)&&void 0!==r?r:[]),this.applySearch(i,s);const n=this.applyWhere(i,s,t.name);return n?(null==i||i.error(n),null):(this.applySelect(i,s,t.name),Object.assign({model:e},s))}name(){return this.model.tableName}sync(){return h(this,void 0,void 0,function*(){if(!this.permissions.length)return;const e=this.name().toLowerCase(),t={description:"",state:!0};yield o.forEachAsync(this.permissions,r=>h(this,void 0,void 0,function*(){const s=`${e}.${r}`,i=o.upperCamelCase(e.replace(/_/g," ")," ");yield exports.PermissionModel.findOrCreate({where:{key:s},defaults:Object.assign({name:`${i} ${o.upperCamelCase(r," ")}`,key:s,tags:i},t)})}))})}update(e){return h(this,void 0,void 0,function*(){var r,s,i,n,d;const{ctx:l,body:a,id:p,options:u={}}=e,{primaryKeyAttribute:c}=this.model,g=null!==(r=null==l?void 0:l.getParam(c))&&void 0!==r?r:p;if(o.isUndefined(g))return null==l||l.error(new t.BadRequestError),!1;const y=o.merge({},u),[v]=null!==(d=yield this.model.update(Object.assign({},o.merge({},null!==(i=null===(s=null==l?void 0:l.req)||void 0===s?void 0:s.body)&&void 0!==i?i:{},null!=a?a:{})),Object.assign(Object.assign(Object.assign({},y),{where:Object.assign(Object.assign({},null!==(n=null==y?void 0:y.where)&&void 0!==n?n:{}),{[c]:g}),individualHooks:!0}),{ctx:l})).catch(this.error))&&void 0!==d?d:[];return v?(null==l||l.success("OK"),!0):(null==l||l.success("Record not changed"),!1)})}}class UserService extends exports.Service{getMetadata(e){return h(this,void 0,void 0,function*(){var t,r;const[o]=null!==(t=yield exports.UserMetadataModel.findOrCreate({where:{user_id:e},defaults:{user_id:e}}).catch(this.error))&&void 0!==t?t:[];return null!==(r=null==o?void 0:o.data)&&void 0!==r?r:{}})}getProfile(e){return h(this,void 0,void 0,function*(){var t,r;const[o]=null!==(t=yield exports.UserProfileModel.findOrCreate({where:{user_id:e},defaults:{user_id:e}}).catch(this.error))&&void 0!==t?t:[];return null!==(r=null==o?void 0:o.data)&&void 0!==r?r:{}})}getGroups(e){return h(this,void 0,void 0,function*(){var t;return(null!==(t=yield exports.GroupModel.findAll({attributes:["key"],where:{state:!0},include:[{model:exports.UserGroupModel,required:!0,where:{user_id:e}}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}getPermissions(e){return h(this,void 0,void 0,function*(){var t;return(null!==(t=yield exports.PermissionModel.findAll({attributes:["key"],where:{state:!0},include:[{model:exports.GroupPermissionModel,required:!0,include:[{model:exports.GroupModel,required:!0,attributes:["id"],where:{state:!0},include:[{model:exports.UserGroupModel,required:!0,where:{user_id:e}}]}]}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}}class Application extends t.Application{constructor(e,t){super(e,o.merge({},{cert:Env.HTTP_CRT,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:Env.HTTP_KEY,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 SessionStore,name:Env.API_SESSION_NAME,secret:Env.API_SESSION_SECRET,cookie:{maxAge:Env.API_SESSION_LIFETIME},genid:o.uuidv7}},null!=t?t:{})),this.hash=new r.Hash(Env.API_KEY_HASH)}error(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.error(e.message,t,Env.CONSOLE_ERROR)}log(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return h(this,void 0,void 0,function*(){yield x.sync(),yield this.migrations(x),yield o.forEachSeries(this.controllers,e=>h(this,void 0,void 0,function*(){o.isFunction(e.sync)&&(yield e.sync(this))})),this.authService=new AuthService,this.userService=new UserService,yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new s.WebSocketServer({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>h(this,void 0,void 0,function*(){t.url||(t.url=""),e.on("close",()=>{}),yield o.sleep(2e3)})))})}migrations(e){return h(this,void 0,void 0,function*(){const t=[];yield o.forEachSeries(Object.keys(e.models),r=>h(this,void 0,void 0,function*(){var o;const s=e.models[r],i=s.version();if(!i)return;const[n,d]=null!==(o=yield exports.MigrationModel.findOrCreate({where:{model:s.tableName},defaults:{model:s.tableName,version:""}}).catch(this.error))&&void 0!==o?o:[];n&&(d||n.version!=i)&&(n.version=i,yield n.save().catch(this.error),t.push(s))})),yield o.forEachSeries(t,e=>h(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}exports.BaseController=class BaseController extends o.EventEmitter{constructor(){super(...arguments),this.permissions=[]}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")}session(e,t,r){return h(this,void 0,void 0,function*(){r.auth&&r.user&&(r.user_agent?r.user_agent!=t&&r.regenerate(o.noop):(r.user_agent=t,r.save(o.noop))),e.next()})}sync(){return h(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield o.forEachSeries(this.permissions,r=>h(this,void 0,void 0,function*(){const s=`${e}.${r}`,i=o.upperCamelCase(e.replace(/_/g," ")," ");yield exports.PermissionModel.findOrCreate({where:{key:s},defaults:Object.assign({name:`${i} ${o.upperCamelCase(r," ")}`,key:s,tags:i},t)})}))})}},g([y(0,t.Ctx()),y(1,t.Headers("user-agent")),y(2,t.Session()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Object]),v("design:returntype",Promise)],exports.BaseController.prototype,"session",null),exports.BaseController=g([p.Trait(Loggable)],exports.BaseController),exports.ModelController=class ModelController extends exports.BaseController{constructor(){super(...arguments),this.attributes=[],this.permissions=["create","read","update","delete"],this.search=[]}countAll(e){return h(this,void 0,void 0,function*(){return yield this.service.countAll(e)})}create(e){return h(this,void 0,void 0,function*(){return yield this.service.create(e)})}delete(e){return h(this,void 0,void 0,function*(){return yield this.service.delete(e)})}findAll(e){return h(this,void 0,void 0,function*(){return yield this.service.findAll(e)})}findOne(e){return h(this,void 0,void 0,function*(){return yield this.service.findOne(e)})}include(e,t){return this.service.include(e,t)}sync(){return h(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield o.forEachSeries(this.permissions,r=>h(this,void 0,void 0,function*(){const s=`${e}.${r}`,i=o.upperCamelCase(e.replace(/_/g," ")," ");yield exports.PermissionModel.findOrCreate({where:{key:s},defaults:Object.assign({name:`${i} ${o.upperCamelCase(r," ")}`,key:s,tags:i},t)})})),this.service=new ModelService(this.model,{attributes:this.attributes.length?this.attributes:void 0,search:this.search.length?this.search:void 0})})}update(e){return h(this,void 0,void 0,function*(){return yield this.service.update(e)})}name(){return this.model.tableName}},exports.ModelController=g([t.Extends(exports.BaseController)],exports.ModelController),exports.AuditsController=class AuditsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.AuditModel,this.permissions=["read"]}all(e,t,r){return h(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 h(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}},g([t.Get(),M(),f(),y(0,t.Ctx()),y(1,t.Query("type")),y(2,t.Query("table")),v("design:type",Function),v("design:paramtypes",[t.Context,String,String]),v("design:returntype",Promise)],exports.AuditsController.prototype,"all",null),g([t.Get("/:id"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.AuditsController.prototype,"get",null),exports.AuditsController=g([t.Controller("/audits"),t.Extends(exports.ModelController)],exports.AuditsController),exports.AuthController=class AuthController extends exports.BaseController{constructor(e){super(),this.authService=e}login(e,r,s,n,l,a){return h(this,void 0,void 0,function*(){var p;yield o.sleep(Env.SLEEP_AUTH);const u=yield exports.UserModel.findOne({where:{[i.Op.or]:[{email:s},{username:s}]}}).catch(this.error);if(!u)return e.error(new t.UnauthorizedError("Invalid credentials")),a.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const c=yield exports.UserPasswordModel.findOne({where:{user_id:u.id,state:!0}}).catch(this.error);if(!c||!d.compareSync(n,c.value))return e.error(new t.UnauthorizedError("Invalid credentials")),a.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const g=yield exports.RegisterModel.findOne({where:{state:!0,user_id:u.id}}).catch(this.error);if(g)return e.error("ACTIVATION REQUIRED"),a.emit("auth.activation",{ctx:e,register:g,user:u}),void this.emit("auth.activation",{ctx:e,register:g,user:u});if(!u.state)return e.error(new t.UnauthorizedError("Invalid credentials")),a.emit("auth.failure",{ctx:e,user:u}),void this.emit("auth.failure",{ctx:e,user:u});const{auth:y,token:v}=null!==(p=yield this.authService.create(u).catch(t=>{e.error(t),a.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e})}))&&void 0!==p?p:{};y&&v&&(y.user_agent=r,y.ip_address=e.getIp(),yield y.save().catch(this.error),Env.API_TOKEN_COOKIE_SET&&e.setCookie(Env.API_TOKEN_COOKIE,v,{maxAge:l?Env.TOKEN_TTL:void 0}),e.json({token:v}),a.emit("auth.login",{ctx:e,auth:y,user:u}),this.emit("auth.login",{ctx:e,auth:y,user:u}))})}logout(e,r,o,s){return h(this,void 0,void 0,function*(){if(yield this.authService.destroy(r))return Env.API_TOKEN_COOKIE_SET&&e.clearCookie(Env.API_TOKEN_COOKIE),e.success("OK"),s.emit("auth.logout",{auth:r,ctx:e,user:o}),void this.emit("auth.logout",{auth:r,ctx:e,user:o});e.error(new t.UnauthorizedError("Access Denied"))})}renew(e,t,r,o){return h(this,void 0,void 0,function*(){var s;const{auth:i,token:n}=null!==(s=yield this.authService.renew(r).catch(t=>{e.error(t)}))&&void 0!==s?s:{};i&&n&&(i.user_agent=t,yield i.save().catch(this.error),e.json({token:n}),o.emit("auth.renew",{auth:i,ctx:e}),this.emit("auth.renew",{auth:i,ctx:e}))})}user(e,r){return h(this,void 0,void 0,function*(){const{groups:s,permissions:i,profile:n}=e.req;if(!s||!i)return e.error(new t.InternalServerError);e.json(Object.assign(Object.assign({},o.denied(r.toJSON(),["username","description"])),{groups:s,permissions:i,profile:n}))})}},g([t.Post("/login"),t.Validate(e=>({username:e.string().min(3).required(),password:e.string().min(5).required(),remember:e.boolean().parse().empty(!1)})),y(0,t.Ctx()),y(1,t.Headers("user-agent")),y(2,t.Body("username")),y(3,t.Body("password")),y(4,t.Body("remember")),y(5,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,String,Boolean,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"login",null),g([t.Get("/logout"),M(),y(0,t.Ctx()),y(1,_()),y(2,T()),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserAuthModel,exports.UserModel,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),g([t.Post("/renew"),t.Validate(e=>({token:e.string().required()})),y(0,t.Ctx()),y(1,t.Headers("user-agent")),y(2,t.Body("token")),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),g([t.Get(),t.Get("/me"),M(),y(0,t.Ctx()),y(1,T()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel]),v("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=g([t.Controller("/auth"),t.Extends(exports.BaseController),y(0,p.Inject(AuthService)),v("design:paramtypes",[AuthService])],exports.AuthController),exports.CrudController=class CrudController extends exports.ModelController{constructor(){super(...arguments),this._crud={}}CrudArgumentsCountAll(e){return{ctx:e}}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}}CrudValidateCreate(){return this._crud}CrudValidateUpdate(){return this._crud}add(e){return h(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return h(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}rows(e){return h(this,void 0,void 0,function*(){yield this.countAll(this.CrudArgumentsCountAll(e))})}del(e){return h(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return h(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return h(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validate(e,r){return h(this,void 0,void 0,function*(){var s,i;const n=o.Validation.object(r).parse(),{error:d,message:l,value:a}=yield n.validateAsync(null!==(i=null===(s=e.req)||void 0===s?void 0:s.body)&&void 0!==i?i:{});if(d)return e.error(new t.ValidationError(null!=l?l:d));e.req.body=a,e.next()})}validateCreate(e){return h(this,void 0,void 0,function*(){const r=this.CrudValidateCreate();if(r==this._crud)return e.error(new t.InternalServerError);yield this.validate(e,r)})}validateUpdate(e){return h(this,void 0,void 0,function*(){const r=this.CrudValidateUpdate();if(r==this._crud)return e.error(new t.InternalServerError);yield this.validate(e,r)})}},g([t.Post(),M(),C(),t.Middleware("validateCreate"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"add",null),g([t.Get(),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"all",null),g([t.Get("/count"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"rows",null),g([t.Delete("/:id"),M(),E(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"del",null),g([t.Get("/:id"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"get",null),g([t.Put("/:id"),M(),A(),t.Middleware("validateUpdate"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"set",null),g([y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"validateCreate",null),g([y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"validateUpdate",null),exports.CrudController=g([t.Extends(exports.ModelController)],exports.CrudController),exports.FilesController=class FilesController extends exports.BaseController{constructor(){super(...arguments),this.directory=Env.API_HTTP_PUBLIC||"./",this.permissions=["delete","download","edit","list","read","rename","upload","write"]}files(e){return h(this,void 0,void 0,function*(){let{path:r}=e.req;r=r.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const s=c.join(this.directory,r);if(!u.existsSync(s)||!u.statSync(s).isDirectory())return e.error(new t.NotFoundError);let i;return i=u.readdirSync(s),i=i.map(e=>this.info(c.join(s,e))),i=i.filter(o.isDef),Object.assign(Object.assign({},this.info(s)),{files:i})})}info(e){if(!u.existsSync(e))return null;const t=u.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 h(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=o.upperCamelCase(e.replace(/_/g," ")," "),r={description:"",state:!0};yield o.forEachSeries(this.permissions,s=>h(this,void 0,void 0,function*(){const i=`${e}.${s}`;yield exports.PermissionModel.findOrCreate({where:{key:i},defaults:Object.assign({name:`${t} ${o.upperCamelCase(s," ")}`,key:i,tags:t},r)})}))})}},g([t.Get("/path"),t.Get("/path/*path"),M(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.FilesController.prototype,"files",null),exports.FilesController=g([t.Controller("/files"),t.Extends(exports.BaseController)],exports.FilesController),exports.ForgotController=class ForgotController extends exports.BaseController{check(e,r){return h(this,void 0,void 0,function*(){const s=yield this.find(r);if(!s||!s.user)return e.error(new t.NotFoundError);s.secret=o.uniqueID(),yield s.save(),e.json({token:s.secret})})}forgot(e,r,s){return h(this,void 0,void 0,function*(){yield o.sleep(Env.SLEEP_FORGOT);const n=r,d=yield exports.UserModel.findOne({where:{[i.Op.or]:[{email:n},{username:r}]}}).catch(this.error);if(!d)return e.error(new t.NotFoundError);const l=o.uniqueID(),a=Date.now()+6e4*Env.API_TOKEN_FORGOT,p=yield exports.ForgotModel.create({token:l,timestamp:a,state:!0,user_id:d.id});e.success("OK"),s.emit("forgot.send",{ctx:e,forgot:p,user:d}),this.emit("forgot.send",{ctx:e,forgot:p,user:d})})}reset(e,r,o,s){return h(this,void 0,void 0,function*(){const o=yield this.find(r);if(!o)return e.error(new t.NotFoundError);o.state=!1,yield o.save().catch(this.error),yield o.user.save().catch(this.error),e.success("OK"),s.emit("forgot.reset",{ctx:e,user:o.user}),this.emit("forgot.reset",{ctx:e,user:o.user})})}find(e){return h(this,void 0,void 0,function*(){return yield exports.ForgotModel.findOne({where:{token:e,state:!0},include:[{model:exports.UserModel,required:!0}]}).catch(this.error)})}},g([t.Get("/check"),t.Validate(e=>({token:e.string().required()})),y(0,t.Ctx()),y(1,t.Body("token")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),g([t.Post(),t.Validate(e=>({username:e.string().min(4).required()})),y(0,t.Ctx()),y(1,t.Body("username")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),g([t.Post("/reset"),t.Validate(e=>({token:e.string().required(),password:e.string().min(5).required()})),y(0,t.Ctx()),y(1,t.Body("token")),y(2,t.Body("password")),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,Application]),v("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=g([t.Controller("/forgot"),t.Extends(exports.BaseController)],exports.ForgotController),exports.GroupsController=class GroupsController extends exports.CrudController{constructor(){super(...arguments),this.model=exports.GroupModel,this.schemaCreate={name:o.Validation.string().required(),key:o.Validation.string().required(),tags:o.Validation.string().empty(""),description:o.Validation.string().empty(""),state:o.Validation.boolean().parse().required()},this.schemaUpdate={name:o.Validation.string().empty(),tags:o.Validation.string().empty(),description:o.Validation.string().empty(),state:o.Validation.boolean().parse().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudalidateUpdate(){return this.schemaUpdate}},exports.GroupsController=g([t.Controller("/groups"),t.Extends(exports.CrudController)],exports.GroupsController),exports.GroupsPermissionsController=class GroupsPermissionsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.GroupPermissionModel,this.permissions=[]}all(e,t){return h(this,void 0,void 0,function*(){const r=this.include(exports.PermissionModel,{ctx:e,required:!0});r&&(yield this.findAll({ctx:e,options:{where:{group_id:t},include:[r]},callback:e=>e.map(e=>e.permission),query:!1}))})}set(e,r,s){return h(this,void 0,void 0,function*(){const n=yield exports.GroupModel.findByPk(r,{attributes:["id"]}).catch(this.error);if(!n)return e.error(new t.NotFoundError);const d=n.id,l=[];yield o.forEachSeries(o.uniqueArray(s),t=>h(this,void 0,void 0,function*(){var r;if(!(yield exports.PermissionModel.count({where:{id:t}})))return;const[o]=null!==(r=yield exports.GroupPermissionModel.findOrCreate(Object.assign({where:{group_id:d,permission_id:t},defaults:{group_id:d,permission_id:t}},{ctx:e})).catch(this.error))&&void 0!==r?r:[];o&&l.push(t)})),yield exports.GroupPermissionModel.destroy(Object.assign({where:{group_id:d,permission_id:{[i.Op.notIn]:l}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}},g([t.Get("/:id/permissions"),M(),f("groups"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"all",null),g([t.Put("/:id/permissions"),M(),A("groups"),t.Validate(e=>({permissions:e.array(e.string())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("permissions")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"set",null),exports.GroupsPermissionsController=g([t.Controller("/groups"),t.Extends(exports.ModelController)],exports.GroupsPermissionsController),exports.LogsController=class LogsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.LogModel,this.permissions=["read"]}all(e){return h(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{order:[["created_at","DESC"]]},limited:!0})})}},g([t.Get(),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.LogsController.prototype,"all",null),exports.LogsController=g([t.Controller("/logs"),t.Extends(exports.ModelController)],exports.LogsController),exports.PermissionsController=class PermissionsController extends exports.CrudController{constructor(){super(...arguments),this.model=exports.PermissionModel,this.schemaCreate={name:o.Validation.string().required(),key:o.Validation.string().required(),tags:o.Validation.string().empty(""),description:o.Validation.string().empty(""),state:o.Validation.boolean().parse().required()},this.schemaUpdate={name:o.Validation.string().empty(),tags:o.Validation.string().empty(),description:o.Validation.string().empty(),state:o.Validation.boolean().parse().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}},exports.PermissionsController=g([t.Controller("/permissions"),t.Extends(exports.CrudController)],exports.PermissionsController),exports.RegisterController=class RegisterController extends exports.BaseController{register(e,s,n){return h(this,void 0,void 0,function*(){yield o.sleep(Env.SLEEP_REGISTRY);const{name:d,date:l,email:a,username:p,password:u,confirm:c}=s,g=p||a,y=r.sha256(u);if(yield exports.UserModel.count({where:{[i.Op.or]:[{email:a},{username:g}]}}).catch(this.error))return e.error("INVALID EMAIL OR USERNAME");if(y!=r.sha256(c))return e.error("INVALID PASSWORD");const v=yield exports.UserModel.create({name:d,email:a,username:g,password:y,avatar:"",date:l,description:"",state:!1}).catch(this.error);if(!v)return e.error(new t.InternalServerError);const h=yield exports.RegisterModel.create({token:yield this.getId(),user_id:v.id,state:!0}).catch(this.error);if(!h)return yield v.destroy().catch(this.error),e.error(new t.InternalServerError);e.success("OK"),n.emit("register.user",{ctx:e,register:h,user:v}),this.emit("register.user",{ctx:e,register:h,user:v})})}confirm(e,r,o){return h(this,void 0,void 0,function*(){const s=yield exports.RegisterModel.findOne({where:{token:r,state:!0},include:[{model:exports.UserModel,required:!0}]}).catch(this.error);if(!s)return e.error(new t.NotFoundError);s.state=!1,yield s.save().catch(this.error),s.user.state=!0,yield s.user.save().catch(this.error),e.success("OK"),o.emit("register.confirm",{ctx:e,register:s,user:s.user}),this.emit("register.confirm",{ctx:e,register:s,user:s.user})})}send(e,r,o){return h(this,void 0,void 0,function*(){const s=r,n=yield exports.RegisterModel.findOne({where:{state:!0},include:[{model:exports.UserModel,required:!0,where:{[i.Op.or]:[{email:s},{username:r}]}}]}).catch(this.error);if(!n)return e.error(new t.NotFoundError);e.success("OK"),o.emit("register.send",{ctx:e,register:n,user:n.user}),this.emit("register.send",{ctx:e,register:n,user:n.user})})}getId(){return h(this,void 0,void 0,function*(){const e=o.uuidv7();return(yield exports.RegisterModel.count({where:{token:e}}))?this.getId():e})}},g([t.Post(),t.Validate(e=>({name:e.string().required(),date:e.date().required(),email:e.string().email().required(),username:e.string().min(4).empty(),password:e.string().min(5).required(),confirm:e.string().min(5).required()})),y(0,t.Ctx()),y(1,t.Body()),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,Object,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),g([t.Post("/confirm"),t.Validate(e=>({token:e.string().required()})),y(0,t.Ctx()),y(1,t.Body("token")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),g([t.Post("/send"),t.Validate(e=>({username:e.string().min(4).required()})),y(0,t.Ctx()),y(1,t.Body("username")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=g([t.Controller("/register"),t.Extends(exports.BaseController)],exports.RegisterController),exports.SetupController=class SetupController extends exports.BaseController{setup(e){return h(this,void 0,void 0,function*(){var t;if(yield exports.UserModel.count())return e.success("OK");const r=yield exports.UserModel.create({name:"Admin",email:"admin@localhost.com",username:"admin",description:"DEFAULT",state:!0},Object.assign({},{ctx:e}));yield exports.UserPasswordModel.create({value:"admin",state:!0,user_id:r.id});const s={description:"API CORE",state:!0},i=yield exports.GroupModel.create(Object.assign({name:"Admin",key:"admin",tags:"Admin"},s),Object.assign({},{ctx:e}));yield exports.UserGroupModel.create({user_id:r.id,group_id:i.id},Object.assign({},{ctx:e})),yield exports.GroupModel.create(Object.assign({name:"User",key:"user",tags:"user"},s),Object.assign({},{ctx:e}));const n=null!==(t=yield exports.PermissionModel.findAll({where:{state:!0}}).catch(this.error))&&void 0!==t?t:[];yield o.forEachSeries(n,t=>h(this,void 0,void 0,function*(){yield exports.GroupPermissionModel.create({group_id:i.id,permission_id:t.id},Object.assign({},{ctx:e}))})),e.success("OK")})}},g([t.Get(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=g([t.Controller("/setup"),t.Extends(exports.BaseController)],exports.SetupController),exports.UsersController=class UsersController extends exports.ModelController{constructor(){super(),this.model=exports.UserModel,this.path=Env.API_HTTP_PUBLIC+"/avatar",Env.API_HTTP_PUBLIC&&u.existsSync(Env.API_HTTP_PUBLIC)&&!u.existsSync(this.path)&&u.mkdirSync(this.path)}avatar(e,r){return h(this,void 0,void 0,function*(){var o,s;const i=e.getFiles();if(i.file&&i.file.length){const{filename:n,path:d}=null!==(o=i.file[0])&&void 0!==o?o:{};if(n){const[o]=null!==(s=yield exports.UserProfileModel.findOrCreate(Object.assign({where:{user_id:r.id},defaults:{user_id:r.id}},{ctx:e})).catch(this.error))&&void 0!==s?s:[];if(!o)return u.lstatSync(d).isFile()&&u.rmSync(d),e.error(new t.InternalServerError);const i=this.path+"/"+o.data.avatar;if(u.existsSync(i)&&u.lstatSync(i).isFile()&&u.rmSync(i),o.changed("data",!0),o.data.avatar=n,yield o.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK")}}e.success("Record not Changed")})}token_new(){return h(this,void 0,void 0,function*(){var e;const t=o.uuidv7();return(null!==(e=yield this.model.count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t})}add(e){return h(this,void 0,void 0,function*(){yield this.create({ctx:e})})}all(e){return h(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}rows(e){return h(this,void 0,void 0,function*(){yield this.countAll({ctx:e})})}del(e,r,o){return h(this,void 0,void 0,function*(){if(o.id==r)return e.error(new t.NotFoundError);yield this.delete({ctx:e})})}get(e){return h(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e){return h(this,void 0,void 0,function*(){yield this.update({ctx:e})})}},g([t.Post("/avatar"),M(),t.Upload({file:{count:1,path:`${Env.API_HTTP_PUBLIC}/avatar`,types:["image/bmp","image/jpeg","image/png"],size:32}}),y(0,t.Ctx()),y(1,T()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel]),v("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),g([t.Post(),M(),C(),t.Validate(e=>({name:e.string().required(),email:e.string().email().required(),username:e.string().min(3).required(),description:e.string().empty(""),state:e.boolean().parse().empty(!0)})),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"add",null),g([t.Get(),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"all",null),g([t.Get("/count"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"rows",null),g([t.Delete("/:id"),M(),E(),y(0,t.Ctx()),y(1,t.Params("id")),y(2,T()),v("design:type",Function),v("design:paramtypes",[t.Context,String,exports.UserModel]),v("design:returntype",Promise)],exports.UsersController.prototype,"del",null),g([t.Get("/:id"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"get",null),g([t.Put("/:id"),M(),A(),t.Validate(e=>({name:e.string().empty(),email:e.string().email().empty(),username:e.string().min(3).empty(),description:e.string().empty(),state:e.boolean().parse().empty()})),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=g([t.Controller("/users"),t.Extends(exports.ModelController),v("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class UsersGroupsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.UserGroupModel,this.permissions=[]}all(e,r){return h(this,void 0,void 0,function*(){if(!(yield exports.UserModel.findByPk(r,{attributes:["id"]}).catch(this.error)))return e.error(new t.NotFoundError("User Not Found"));const o=this.include(exports.GroupModel,{ctx:e,required:!0});o&&(yield this.findAll({ctx:e,options:{where:{user_id:r},include:[o]},callback:e=>e.map(e=>e.group),query:!1}))})}set(e,r,s){return h(this,void 0,void 0,function*(){const n=yield exports.UserModel.findByPk(r,{attributes:["id"]}).catch(this.error);if(!n)return e.error(new t.NotFoundError("User Not Found"));const d=n.id,l=[];yield o.forEachSeries(o.uniqueArray(s),t=>h(this,void 0,void 0,function*(){var r;if(!(yield exports.GroupModel.count({where:{id:t}})))return;const[o]=null!==(r=yield exports.UserGroupModel.findOrCreate(Object.assign({where:{user_id:d,group_id:t},defaults:{user_id:d,group_id:t}},{ctx:e})).catch(this.error))&&void 0!==r?r:[];o&&l.push(t)})),yield exports.UserGroupModel.destroy(Object.assign({where:{user_id:d,group_id:{[i.Op.notIn]:l}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}},g([t.Get("/:id/groups"),M(),f("users"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),g([t.Put("/:id/groups"),M(),A("users"),t.Validate(e=>({groups:e.array(e.string())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("groups")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=g([t.Controller("/users"),t.Extends(exports.ModelController)],exports.UsersGroupsController),exports.UsersProfilesController=class UsersProfilesController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.UserProfileModel,this.permissions=[]}all(e){return h(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}get(e,r){return h(this,void 0,void 0,function*(){var o;const[s]=null!==(o=yield exports.UserProfileModel.findOrCreate(Object.assign({where:{user_id:r},defaults:{user_id:r}},{ctx:e})).catch(this.error))&&void 0!==o?o:[];if(!s)return e.error(new t.NotFoundError);e.json(s)})}set(e,r,s){return h(this,void 0,void 0,function*(){var i;const n=yield exports.UserModel.findByPk(r,{attributes:["id"]}).catch(this.error);if(!n)return e.error(new t.NotFoundError);const d=n.id,l=o.map(s,e=>String(e)),[a,p]=null!==(i=yield exports.UserProfileModel.findOrCreate(Object.assign({where:{user_id:d},defaults:{data:l,user_id:d}},{ctx:e})).catch(this.error))&&void 0!==i?i:[];a&&!p&&(a.changed("data",!0),a.data=o.merge(a.data,l),yield a.save(Object.assign({},{ctx:e})).catch(this.error)),e.success("OK")})}},g([t.Get("/profiles"),M(),f("users"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersProfilesController.prototype,"all",null),g([t.Get("/:id/profiles"),M(),f("users"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.UsersProfilesController.prototype,"get",null),g([t.Put("/:id/profiles"),M(),A("users"),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Object]),v("design:returntype",Promise)],exports.UsersProfilesController.prototype,"set",null),exports.UsersProfilesController=g([t.Controller("/users"),t.Extends(exports.ModelController)],exports.UsersProfilesController),exports.Application=Application,exports.Audit=w,exports.AuthService=AuthService,exports.CanCreate=C,exports.CanDelete=E,exports.CanRead=f,exports.CanUpdate=A,exports.Config=class Config extends Loggable{static all(e){return h(this,void 0,void 0,function*(){var t;const r=null!==(t=yield exports.ConfigModel.findAll({where:(null==e?void 0:e.length)?{key:{[i.Op.in]:e}}:{}}).catch(this.error))&&void 0!==t?t:[];return Object.fromEntries(r.map(e=>[e.key,e.value]))})}static del(e){return h(this,void 0,void 0,function*(){return((yield exports.ConfigModel.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return h(this,arguments,void 0,function*(e,t=""){const[r]=(yield exports.ConfigModel.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return r?r.value:t})}static set(e,t){return h(this,void 0,void 0,function*(){const[r,o]=(yield exports.ConfigModel.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];r&&!o&&(r.value=t,yield r.save().catch(this.error))})}},exports.Env=Env,exports.HasGroups=(...e)=>(r,s,i)=>{t.Use(r=>h(void 0,void 0,void 0,function*(){const{groups:s}=r.req;if(o.includesArray(e,null!=s?s:[]))return r.next();r.error(new t.UnauthorizedError("Access Denied"))}))(r,s,i)},exports.HasPermissions=(...e)=>(r,s,i)=>{t.Use(r=>h(void 0,void 0,void 0,function*(){const{permissions:s}=r.req;if(o.includesArray(e,null!=s?s:[]))return r.next();r.error(new t.UnauthorizedError("Access Denied"))}))(r,s,i)},exports.IsAuthenticated=M,exports.Log=Log,exports.Loggable=Loggable,exports.ModelService=ModelService,exports.ReqAuth=_,exports.ReqGroup=S,exports.ReqGroups=P,exports.ReqPermission=O,exports.ReqPermissions=U,exports.ReqUser=T,exports.SessionStore=SessionStore,exports.UserService=UserService,exports.canFactory=m,exports.sequelize=x;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @andrewcaires/api v5.0.4
2
+ * @andrewcaires/api v5.0.5
3
3
  * Simple api for small applications using express, jsonwebtoken, sequelize and websocket
4
4
  * (c) 2026 Andrew Caires
5
5
  * @license: MIT
@@ -341,6 +341,7 @@ interface ModelArgumentsUpdate<M extends Model$1<M>> extends ModelArgumentsBase<
341
341
  interface ModelOptions {
342
342
  attributes?: FindAttributeOptions;
343
343
  permissions?: Array<string>;
344
+ search?: Array<string>;
344
345
  }
345
346
 
346
347
  interface ModelResultFindAll<M extends Model<M>> {
@@ -404,10 +405,12 @@ declare class ModelService<M extends Model$1<any>> extends Service {
404
405
  protected model: ModelStatic<M>;
405
406
  protected attributes: Array<string>;
406
407
  protected permissions: Array<string>;
408
+ protected search: Array<string>;
407
409
  constructor(model: ModelStatic<M>, options?: ModelOptions);
408
410
  private applySelect;
409
411
  private applyOrders;
410
412
  private applyPagination;
413
+ private applySearch;
411
414
  private applyWhere;
412
415
  countAll(options: ModelArgumentsCount<M>): Promise<number>;
413
416
  create(options: ModelArgumentsCreate<M>): Promise<M | null>;
@@ -455,6 +458,7 @@ declare abstract class ModelController<M extends Model$1<any>, T extends TypeAny
455
458
  protected readonly attributes: Array<string>;
456
459
  protected abstract readonly model: ModelStatic<M>;
457
460
  protected readonly permissions: Array<string>;
461
+ protected readonly search: Array<string>;
458
462
  private service;
459
463
  protected countAll(options: ModelArgumentsCount<M>): Promise<number>;
460
464
  protected create(options: ModelArgumentsCreate<M>): Promise<M | null>;
package/dist/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/api v5.0.4
2
+ * @andrewcaires/api v5.0.5
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{Use as e,UnauthorizedError as t,parameterFactory as i,Context as r,NotFoundError as n,InternalServerError as s,ValidationError as o,StatusCodes as d,BadRequestError as a,Application as l,Ctx as u,Headers as c,Session as p,Extends as g,Get as v,Query as y,Controller as h,Post as m,Validate as _,Body as f,App as E,Middleware as A,Delete as S,Put as O,Params as T,Upload as I}from"@andrewcaires/express";import{Env as P,Log as w,LogColor as b,Hash as x,sha256 as C}from"@andrewcaires/node";import{isUndefined as D,isFunction as R,includesArray as k,getConstructor as N,noop as U,loop as j,uuidv7 as K,isString as B,clamp as M,merge as L,isArray as F,clone as H,forEachAsync as q,upperCamelCase as Y,forEachSeries as $,sleep as G,EventEmitter as V,denied as W,Validation as J,isDef as z,uniqueID as Q,uniqueArray as X,map as Z}from"@andrewcaires/utils.js";import{WebSocketServer as ee}from"ws";import{Sequelize as te,Hooks as ie,Column as re,Association as ne,Database as se,ModelName as oe,Version as de,Model as ae,Unique as le,HasMany as ue,Value as ce,DefaultValue as pe,Op as ge,Where as ve}from"@andrewcaires/sequelize";import{config as ye}from"dotenv";import{hashSync as he,compareSync as me}from"bcrypt";import{Store as _e}from"express-session";import fe from"jsonwebtoken";import{Trait as Ee,Inject as Ae}from"@andrewcaires/decorator";import{existsSync as Se,statSync as Oe,readdirSync as Te,mkdirSync as Ie,lstatSync as Pe,rmSync as we}from"fs";import{join as be}from"path";function xe(e,t,i,r){var n,s=arguments.length,o=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,r);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(o=(s<3?n(o):s>3?n(t,i,o):n(t,i))||o);return s>3&&o&&Object.defineProperty(t,i,o),o}function Ce(e,t){return function(i,r){t(i,r,e)}}function De(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function Re(e,t,i,r){return new(i||(i=Promise))(function(n,s){function o(e){try{a(r.next(e))}catch(e){s(e)}}function d(e){try{a(r.throw(e))}catch(e){s(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(o,d)}a((r=r.apply(e,t||[])).next())})}var ke;"function"==typeof SuppressedError&&SuppressedError,ye({quiet:!0});class Env extends P{}ke=Env,Env.BASE_NAME=ke.getString("BASE_NAME",""),Env.CONSOLE_ERROR=ke.getBool("CONSOLE_ERROR",!1),Env.DATABASE_URI=ke.getString("DATABASE_URI","",!0),Env.DATABASE_LOG=ke.getBool("DATABASE_LOG",!1),Env.DATABASE_AUDIT=ke.getBool("DATABASE_AUDIT",!0),Env.DATABASE_PREFIX=ke.getString("DATABASE_PREFIX",""),Env.DATABASE_TIMEZONE=ke.getString("DATABASE_TIMEZONE","+00:00"),Env.HTTP_CRT=ke.getFile("HTTP_CRT"),Env.HTTP_KEY=ke.getFile("HTTP_KEY"),Env.MODEL_LIMIT=ke.getInt("MODEL_LIMIT",10),Env.MODEL_LIMIT_MAX=ke.getInt("MODEL_LIMIT_MAX",100),Env.SLEEP_AUTH=ke.getMs("SLEEP_AUTH","2s"),Env.SLEEP_FORGOT=ke.getMs("SLEEP_FORGOT","5s"),Env.SLEEP_REGISTRY=ke.getMs("SLEEP_REGISTRY","5s"),Env.TOKEN_CRT=ke.getFile("TOKEN_CRT"),Env.TOKEN_KEY=ke.getFile("TOKEN_KEY"),Env.TOKEN_TTL=ke.getMs("TOKEN_TTL","1d"),Env.API_BODYPARSER_STRICT=ke.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=ke.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=ke.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=ke.getString("API_BODYPARSER_TYPE","json"),Env.API_HTTP_PORT=ke.getInt("API_HTTP_PORT",3e3),Env.API_HTTP_PUBLIC=ke.getString("API_HTTP_PUBLIC",""),Env.API_HTTP_CROSS=ke.getBool("API_HTTP_CROSS",!1),Env.API_HTTP_HYBRID=ke.getBool("API_HTTP_HYBRID",!1),Env.API_HTTP_NOTFOUND=ke.getString("API_HTTP_NOTFOUND",""),Env.API_HTTP_PATH=ke.getString("API_HTTP_PATH","/api"),Env.API_HTTP_REDIRECT=ke.getString("API_HTTP_REDIRECT",""),Env.API_KEY_HASH=ke.getString("API_KEY_HASH",""),Env.API_KEY_HEADER=ke.getString("API_KEY_HEADER","x-api-key"),Env.API_SESSION_NAME=ke.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=ke.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=ke.getString("API_SESSION_SECRET","yoursecret"),Env.API_TOKEN_COOKIE=ke.getString("API_TOKEN_COOKIE","authorization"),Env.API_TOKEN_COOKIE_SET=ke.getBool("API_TOKEN_COOKIE_SET",!0),Env.API_TOKEN_FORGOT=ke.getMs("API_TOKEN_FORGOT","1d"),Env.API_TOKEN_HEADER=ke.getString("API_TOKEN_HEADER","authorization"),Env.API_TOKEN_HEADER_KEY=ke.getString("API_TOKEN_HEADER","bearer"),Env.API_TOKEN_RENEW=ke.getMs("API_TOKEN_RENEW","1d"),Env.API_USER_HISTORY=ke.getBool("API_USER_HISTORY",!0),Env.API_WEBSOCKET_START=ke.getBool("API_WEBSOCKET_START",!1);const Ne=new te({uri:Env.DATABASE_URI,logging:!!Env.DATABASE_LOG&&(e=>w.console(b.Magenta,"sql",e)),prefix:Env.DATABASE_PREFIX,timezone:Env.DATABASE_TIMEZONE}),Ue=i=>r=>(n,s,o)=>{e(e=>Re(void 0,void 0,void 0,function*(){var n;let s=null!=r?r:"";D(r)&&(s=R(e.controller.name)?e.controller.name():null===(n=e.controller.constructor)||void 0===n?void 0:n.name);const{permissions:o}=e.req;if((null!=o?o:[]).includes(`${s}.${i}`))return e.next();e.error(new t("Access Denied"))}))(n,s,o)},je=Ue("create"),Ke=Ue("delete"),Be=Ue("read"),Me=Ue("update"),Le=(...i)=>(r,n,s)=>{e(e=>Re(void 0,void 0,void 0,function*(){const{groups:r}=e.req;if(k(i,null!=r?r:[]))return e.next();e.error(new t("Access Denied"))}))(r,n,s)},Fe=(...i)=>(r,n,s)=>{e(e=>Re(void 0,void 0,void 0,function*(){const{permissions:r}=e.req;if(k(i,null!=r?r:[]))return e.next();e.error(new t("Access Denied"))}))(r,n,s)},He=()=>(i,r,n)=>{e(e=>Re(void 0,void 0,void 0,function*(){yield(e=>Re(void 0,void 0,void 0,function*(){var i,r,n,s;if(e.req.auth&&e.req.user)return e.next();const{[Env.API_KEY_HEADER]:o,[Env.API_TOKEN_HEADER]:d,"user-agent":a}=e.getHeaders(),l=e.getQuery(Env.API_KEY_HEADER),u=(null===(i=o||l)||void 0===i?void 0:i.toString())||"";let c=e.getCookie(Env.API_TOKEN_COOKIE);c=`${Env.API_TOKEN_HEADER_KEY} ${c}`;const[p,g]=null!==(n=null===(r=d||c)||void 0===r?void 0:r.split(" "))&&void 0!==n?n:["",""];if(!(u||g&&p.toLowerCase()==Env.API_TOKEN_HEADER_KEY))return e.error(new t("Invalid token"));const{authService:v,userService:y}=e.app,{auth:h,user:m}=null!==(s=yield(u?v.key(u.toString()):v.user(g)).catch(t=>{e.error(t)}))&&void 0!==s?s:{};if(h&&m){if(!u&&h.user_agent&&h.user_agent!=a)return e.error(new t("Invalid token"));e.req.auth=h,e.req.user=m,e.req.groups=yield y.getGroups(m.id),e.req.permissions=yield y.getPermissions(m.id),e.req.profile=yield y.getProfile(m.id),e.next()}}))(e)}))(i,r,n)},qe=i(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.auth}),Ye=i(({ctx:e,key:t})=>{var i,r;return(null!==(r=null===(i=e.req)||void 0===i?void 0:i.groups)&&void 0!==r?r:[]).includes(t)}),$e=i(({ctx:e})=>{var t,i;return null!==(i=null===(t=e.req)||void 0===t?void 0:t.groups)&&void 0!==i?i:[]}),Ge=i(({ctx:e,key:t})=>{var i,r;return(null!==(r=null===(i=e.req)||void 0===i?void 0:i.permissions)&&void 0!==r?r:[]).includes(t)}),Ve=i(({ctx:e})=>{var t,i;return null!==(i=null===(t=e.req)||void 0===t?void 0:t.permissions)&&void 0!==i?i:[]}),We=i(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.user}),Je=(e,t,i)=>{var n,s,o,d,a,l,u,c,p,g;const v=i.ctx instanceof r?i.ctx:null,y=null!==(d=null!==(o=null===(s=null===(n=null==v?void 0:v.req)||void 0===n?void 0:n.user)||void 0===s?void 0:s.id)&&void 0!==o?o:i.user_id)&&void 0!==d?d:null,h={type:e,model:null!==(a=null==t?void 0:t.getTableName())&&void 0!==a?a:null,app_name:null!==(l=Env.BASE_NAME)&&void 0!==l?l:"",state:!0,user_id:y};return v?Object.assign(Object.assign({},h),{full_url:null!==(u=null==v?void 0:v.getUrl())&&void 0!==u?u:"",ip_address:null!==(c=null==v?void 0:v.getIp())&&void 0!==c?c:"",user_agent:null!==(g=null===(p=null==v?void 0:v.req)||void 0===p?void 0:p.headers["user-agent"])&&void 0!==g?g:""}):h},ze={afterCreate:(e,t)=>Re(void 0,void 0,void 0,function*(){const i=N(e),{primaryKeyAttribute:r}=null!=i?i:{};yield dt.create(Object.assign(Object.assign({},Je("CREATE",i,t)),{record:r?e.getDataValue(r):null,data:e.toJSON()})).catch(w.catch)}),afterUpdate:(e,t)=>Re(void 0,void 0,void 0,function*(){const i=N(e),{primaryKeyAttribute:r}=null!=i?i:{},n={},s=e.changed();s&&s.forEach(t=>n[t]=e.getDataValue(t)),yield dt.create(Object.assign(Object.assign({},Je("UPDATE",i,t)),{record:r?e.getDataValue(r):null,data:n,previously:e.previous()})).catch(w.catch)}),afterDestroy:(e,t)=>Re(void 0,void 0,void 0,function*(){const i=N(e),{primaryKeyAttribute:r}=null!=i?i:{};yield dt.create(Object.assign(Object.assign({},Je("DELETE",i,t)),{record:r?e.getDataValue(r):null,data:e.toJSON()})).catch(w.catch)})},Qe=e=>(D(e)&&(e=Env.DATABASE_AUDIT),ie(e?ze:{}));let Xe=class RegisterModel extends ae{};xe([re.UUID(7),De("design:type",String)],Xe.prototype,"id",void 0),xe([re.String(),De("design:type",String)],Xe.prototype,"secret",void 0),xe([re.FullDate(),De("design:type",Number)],Xe.prototype,"expired_at",void 0),xe([re.Boolean(),De("design:type",Boolean)],Xe.prototype,"state",void 0),xe([re.CreatedAt(),De("design:type",Date)],Xe.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],Xe.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],Xe.prototype,"deleted_at",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],Xe.prototype,"user_id",void 0),Xe=xe([se(Ne),oe("register"),de("5.0.0")],Xe);let Ze=class UserAuthModel extends ae{};xe([re.UUID(7),De("design:type",String)],Ze.prototype,"id",void 0),xe([re.String(),De("design:type",String)],Ze.prototype,"secret",void 0),xe([re.String(),De("design:type",String)],Ze.prototype,"ip_address",void 0),xe([re.String(),De("design:type",String)],Ze.prototype,"user_agent",void 0),xe([re.FullDate(),De("design:type",Object)],Ze.prototype,"revoked_at",void 0),xe([re.CreatedAt(),De("design:type",Date)],Ze.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],Ze.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],Ze.prototype,"deleted_at",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],Ze.prototype,"user_id",void 0),Ze=xe([se(Ne),oe("users_auth"),de("5.0.0")],Ze);let et=class PermissionModel extends ae{};xe([re.UUID(7),De("design:type",String)],et.prototype,"id",void 0),xe([re.String(),De("design:type",String)],et.prototype,"name",void 0),xe([re.String(),le(!0),De("design:type",String)],et.prototype,"key",void 0),xe([re.String(),De("design:type",String)],et.prototype,"tags",void 0),xe([re.Text(),De("design:type",String)],et.prototype,"description",void 0),xe([re.Boolean(),De("design:type",Boolean)],et.prototype,"state",void 0),xe([re.CreatedAt(),De("design:type",Date)],et.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],et.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],et.prototype,"deleted_at",void 0),xe([ue(()=>tt,"permission_id"),De("design:type",Array)],et.prototype,"groups_permissions",void 0),et=xe([se(Ne),oe("permission"),Qe(),de("5.0.1")],et);let tt=class GroupPermissionModel extends ae{};xe([re.UUID(7),De("design:type",String)],tt.prototype,"id",void 0),xe([re.CreatedAt(),De("design:type",Date)],tt.prototype,"created_at",void 0),xe([ne.BelongsTo(()=>it),De("design:type",String)],tt.prototype,"group_id",void 0),xe([ne.BelongsTo(()=>et),De("design:type",String)],tt.prototype,"permission_id",void 0),tt=xe([se(Ne),oe("groups_permissions"),Qe(),de("5.0.2")],tt);let it=class GroupModel extends ae{};xe([re.UUID(7),De("design:type",String)],it.prototype,"id",void 0),xe([re.String(),De("design:type",String)],it.prototype,"name",void 0),xe([re.String(),De("design:type",String)],it.prototype,"key",void 0),xe([re.String(),De("design:type",String)],it.prototype,"tags",void 0),xe([re.Text(),De("design:type",String)],it.prototype,"description",void 0),xe([re.Boolean(),De("design:type",Boolean)],it.prototype,"state",void 0),xe([re.CreatedAt(),De("design:type",Date)],it.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],it.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],it.prototype,"deleted_at",void 0),xe([ne.HasMany(()=>rt,"group_id"),De("design:type",Array)],it.prototype,"users_groups",void 0),xe([ne.HasMany(()=>tt,"group_id"),De("design:type",Array)],it.prototype,"groups_Permission",void 0),it=xe([se(Ne),oe("group"),Qe(),de("5.0.1")],it);let rt=class UserGroupModel extends ae{};xe([re.UUID(7),De("design:type",String)],rt.prototype,"id",void 0),xe([re.CreatedAt(),De("design:type",Date)],rt.prototype,"created_at",void 0),xe([ne.BelongsTo(()=>it),De("design:type",String)],rt.prototype,"group_id",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],rt.prototype,"user_id",void 0),rt=xe([se(Ne),oe("users_groups"),Qe(),de("5.0.2")],rt);let nt=class UserPasswordModel extends ae{};xe([re.UUID(7),De("design:type",String)],nt.prototype,"id",void 0),xe([re.String(),ce(e=>he(e.value,12)),De("design:type",String)],nt.prototype,"value",void 0),xe([re.Boolean(),De("design:type",Boolean)],nt.prototype,"state",void 0),xe([re.CreatedAt(),De("design:type",Date)],nt.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],nt.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],nt.prototype,"deleted_at",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],nt.prototype,"user_id",void 0),nt=xe([se(Ne),oe("users_password"),Qe(),de("5.0.0")],nt);let st=class UserProfileModel extends ae{};xe([re.UUID(7),De("design:type",String)],st.prototype,"id",void 0),xe([re.Json(),pe({}),De("design:type",Object)],st.prototype,"data",void 0),xe([re.CreatedAt(),De("design:type",Date)],st.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],st.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],st.prototype,"deleted_at",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],st.prototype,"user_id",void 0),st=xe([se(Ne),oe("users_profile"),Qe(),de("5.0.1")],st);let ot=class UserModel extends ae{};xe([re.UUID(7),De("design:type",String)],ot.prototype,"id",void 0),xe([re.String(),De("design:type",String)],ot.prototype,"name",void 0),xe([re.String(),De("design:type",String)],ot.prototype,"email",void 0),xe([re.String(),De("design:type",String)],ot.prototype,"username",void 0),xe([re.Text(),De("design:type",String)],ot.prototype,"description",void 0),xe([re.Boolean(),De("design:type",Boolean)],ot.prototype,"state",void 0),xe([re.CreatedAt(),De("design:type",Date)],ot.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],ot.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],ot.prototype,"deleted_at",void 0),xe([ne.HasMany(()=>dt,"user_id"),De("design:type",Array)],ot.prototype,"audits",void 0),xe([ne.HasMany(()=>Ze,"user_id"),De("design:type",Array)],ot.prototype,"users_auths",void 0),xe([ne.HasMany(()=>Xe,"user_id"),De("design:type",Array)],ot.prototype,"registers",void 0),xe([ne.HasMany(()=>rt,"user_id"),De("design:type",Array)],ot.prototype,"users_groups",void 0),xe([ne.HasMany(()=>nt,"user_id"),De("design:type",Array)],ot.prototype,"users_passwords",void 0),xe([ne.HasMany(()=>st,"user_id"),De("design:type",Array)],ot.prototype,"users_profiles",void 0),ot=xe([se(Ne),oe("user"),Qe(),de("5.0.0")],ot);let dt=class AuditModel extends ae{};xe([re.UUID(7),De("design:type",String)],dt.prototype,"id",void 0),xe([re.Enum("CREATE","DELETE","UPDATE"),De("design:type",String)],dt.prototype,"type",void 0),xe([re.String(),De("design:type",String)],dt.prototype,"model",void 0),xe([re.String(),De("design:type",String)],dt.prototype,"record",void 0),xe([re.Json(),De("design:type",Object)],dt.prototype,"data",void 0),xe([re.Json(),De("design:type",Object)],dt.prototype,"previously",void 0),xe([re.Text(),De("design:type",String)],dt.prototype,"full_url",void 0),xe([re.String(),De("design:type",String)],dt.prototype,"ip_address",void 0),xe([re.String(),De("design:type",String)],dt.prototype,"user_agent",void 0),xe([re.String(),De("design:type",String)],dt.prototype,"app_name",void 0),xe([re.Boolean(),De("design:type",Boolean)],dt.prototype,"state",void 0),xe([re.CreatedAt(),De("design:type",Date)],dt.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],dt.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],dt.prototype,"deleted_at",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],dt.prototype,"user_id",void 0),dt=xe([se(Ne),oe("audit"),de("5.0.1")],dt);let at=class ConfigModel extends ae{};xe([re.UUID(7),De("design:type",String)],at.prototype,"id",void 0),xe([re.String(),De("design:type",String)],at.prototype,"key",void 0),xe([re.String(),De("design:type",String)],at.prototype,"value",void 0),xe([re.CreatedAt(),De("design:type",Date)],at.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],at.prototype,"updated_at",void 0),at=xe([se(Ne),oe("configs"),de("5.0.0")],at);let lt=class ForgotModel extends ae{};xe([re.UUID(7),De("design:type",String)],lt.prototype,"id",void 0),xe([re.String(),De("design:type",String)],lt.prototype,"secret",void 0),xe([re.FullDate(),De("design:type",Number)],lt.prototype,"expired_at",void 0),xe([re.Boolean(),De("design:type",Boolean)],lt.prototype,"state",void 0),xe([re.CreatedAt(),De("design:type",Date)],lt.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],lt.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],lt.prototype,"deleted_at",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],lt.prototype,"user_id",void 0),lt=xe([se(Ne),oe("forgot"),de("5.0.0")],lt);let ut=class LogModel extends ae{};xe([re.UUID(7),De("design:type",String)],ut.prototype,"id",void 0),xe([re.Enum("info","warn","error"),pe("info"),De("design:type",String)],ut.prototype,"level",void 0),xe([re.Text(),De("design:type",String)],ut.prototype,"message",void 0),xe([re.String(),De("design:type",String)],ut.prototype,"source",void 0),xe([re.CreatedAt(),De("design:type",Date)],ut.prototype,"created_at",void 0),ut=xe([se(Ne),oe("log"),de("5.0.0")],ut);let ct=class MigrationModel extends ae{};xe([re.UUID(7),De("design:type",String)],ct.prototype,"id",void 0),xe([re.String(),De("design:type",String)],ct.prototype,"model",void 0),xe([re.String(),De("design:type",String)],ct.prototype,"version",void 0),xe([re.CreatedAt(),De("design:type",Date)],ct.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],ct.prototype,"updated_at",void 0),ct=xe([se(Ne),oe("migration"),de("5.0.2")],ct);let pt=class SessionModel extends ae{};xe([re.UUID(7),De("design:type",String)],pt.prototype,"id",void 0),xe([re.String(),De("design:type",String)],pt.prototype,"session",void 0),xe([re.Text(),De("design:type",String)],pt.prototype,"json",void 0),xe([re.BigInt(),De("design:type",Number)],pt.prototype,"expired",void 0),xe([re.CreatedAt(),De("design:type",Date)],pt.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],pt.prototype,"updated_at",void 0),pt=xe([se(Ne),oe("session"),de("5.0.2")],pt);let gt=class UserMetadataModel extends ae{};xe([re.UUID(7),De("design:type",String)],gt.prototype,"id",void 0),xe([re.Json(),pe({}),De("design:type",Object)],gt.prototype,"data",void 0),xe([re.CreatedAt(),De("design:type",Date)],gt.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],gt.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],gt.prototype,"deleted_at",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],gt.prototype,"user_id",void 0),gt=xe([se(Ne),oe("users_metadata"),Qe(),de("5.0.1")],gt);class Log{static error(e,t,i){return Re(this,void 0,void 0,function*(){yield this.writeRaw("error",e,t,i)})}static info(e,t,i){return Re(this,void 0,void 0,function*(){yield this.writeRaw("info",e,t,i)})}static warn(e,t,i){return Re(this,void 0,void 0,function*(){yield this.writeRaw("warn",e,t,i)})}static writeRaw(e,t,i,r){return Re(this,void 0,void 0,function*(){var n;r&&w.console(null!==(n=this.colors[e])&&void 0!==n?n:b.White,e,t),Ne&&(yield ut.create({level:e,message:t,source:null!=i?i:""}).catch(w.catch))})}}Log.colors={error:b.Red,info:b.Cyan,warn:b.Yellow};class Loggable{get log(){return e=>Loggable.logInfo(this,e)}static get log(){return e=>this.logInfo(this,e)}get error(){return e=>Loggable.logError(this,e)}static get error(){return e=>this.logError(this,e)}static logError(e,t){var i,r;Log.error(null!==(r=null!==(i=null==t?void 0:t.message)&&void 0!==i?i:t)&&void 0!==r?r:"",this.source(e),Env.CONSOLE_ERROR)}static logInfo(e,t){Log.info(null!=t?t:"",this.source(e),Env.CONSOLE_ERROR)}static source(e){var t,i,r;const n=null!==(r=null!==(i=null===(t=null==e?void 0:e.constructor)||void 0===t?void 0:t.name)&&void 0!==i?i:null==e?void 0:e.name)&&void 0!==r?r:"null";return Env.BASE_NAME?`${Env.BASE_NAME}.${n}`:n}}class Config extends Loggable{static all(e){return Re(this,void 0,void 0,function*(){var t;const i=null!==(t=yield at.findAll({where:(null==e?void 0:e.length)?{key:{[ge.in]:e}}:{}}).catch(this.error))&&void 0!==t?t:[];return Object.fromEntries(i.map(e=>[e.key,e.value]))})}static del(e){return Re(this,void 0,void 0,function*(){return((yield at.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return Re(this,arguments,void 0,function*(e,t=""){const[i]=(yield at.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return i?i.value:t})}static set(e,t){return Re(this,void 0,void 0,function*(){const[i,r]=(yield at.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];i&&!r&&(i.value=t,yield i.save().catch(this.error))})}}class SessionStore extends _e{constructor(){super(),this.all=e=>Re(this,void 0,void 0,function*(){e=e||U;const t=yield pt.findAll({attributes:["session"],where:{expired:{[ge.gte]:Date.now()}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.session)),e()}),this.clear=e=>Re(this,void 0,void 0,function*(){yield pt.destroy().catch(U),e&&e()}),this.destroy=(e,t)=>Re(this,void 0,void 0,function*(){yield pt.destroy({where:{session:e}}).catch(U),t&&t()}),this.expired=()=>Re(this,void 0,void 0,function*(){yield pt.destroy({where:{expired:{[ge.lt]:Date.now()}}}).catch(U)}),this.get=(e,t)=>Re(this,void 0,void 0,function*(){t=t||U;const i=yield pt.findOne({where:{session:e,expired:{[ge.gte]:Date.now()}}}).catch(e=>(t(e),null));if(i){const e=JSON.parse(i.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield i.destroy().catch(U),void t(null)}return void t(null,e)}t(null)}),this.length=e=>Re(this,void 0,void 0,function*(){e&&e(null,(yield pt.count().catch(U))||0)}),this.set=(e,t,i)=>Re(this,void 0,void 0,function*(){i=i||U;const r=Date.now()+Env.API_SESSION_LIFETIME,n=JSON.stringify(t),[s,o]=(yield pt.findOrCreate({where:{session:e},defaults:{session:e,json:n,expired:r}}).catch(U))||[];s&&(o||(s.json=n,s.expired=r,yield s.save().catch(U))),i()}),this.loop=j(this.expired,3e4),this.loop.start()}}let vt=class Service{};vt=xe([Ee(Loggable)],vt);class AuthService extends vt{create(e){return Re(this,void 0,void 0,function*(){if(!Env.TOKEN_KEY)throw new n("TOKEN_KEY not found");const{id:t}=e,i=K(),r=yield Ze.create({secret:i,user_id:t}).catch(this.error);if(!r)throw new s;return{auth:r,token:fe.sign({id:t,secret:i},Env.TOKEN_KEY,this.options())}})}destroy(e){return Re(this,void 0,void 0,function*(){return!(!e||e.revoked_at)&&(e.revoked_at=new Date,yield e.save(),!0)})}renew(e){return Re(this,void 0,void 0,function*(){if(!Env.TOKEN_KEY)throw new n("TOKEN_KEY not found");const{decode:i}=yield this.verify(e,Env.API_TOKEN_RENEW/1e3);if(!i)throw new t("Invalid token");const{id:r,secret:s}=i;if(r&&s){const e=yield ot.findOne({where:{id:r,state:!0}}).catch(this.error);if(e){const t=yield Ze.findOne({where:{secret:s,user_id:e.id}}).catch(this.error);if(t&&!t.revoked_at){t.secret=K(),yield t.save().catch(this.error);return{auth:t,token:fe.sign({id:r,secret:t.secret},Env.TOKEN_KEY,this.options())}}}}throw new t("Invalid token")})}user(e){return Re(this,void 0,void 0,function*(){const{decode:i}=yield this.verify(e);if(!i)throw new t("Invalid token");const{id:r,secret:n}=i;if(r&&n){const e=yield ot.findOne({where:{id:r,state:!0}}).catch(this.error);if(e){const t=yield Ze.findOne({where:{secret:n,user_id:e.id}}).catch(this.error);if(t&&!t.revoked_at)return{auth:t,user:e}}}throw new t("Invalid token")})}options(){return{algorithm:"RS256",expiresIn:`${Env.TOKEN_TTL}ms`}}verify(e,i){return Re(this,void 0,void 0,function*(){if(!Env.TOKEN_CRT)throw new n("TOKEN_CRT not found");if(!e||e.split(".").length<3)throw new t("Invalid token");try{return{decode:fe.verify(e,Env.TOKEN_CRT,{clockTolerance:i})}}catch(e){throw new t("Invalid token")}})}key(e){return Re(this,void 0,void 0,function*(){if(!e)throw new t("Invalid token");const i=yield ot.findOne({where:{token:e,state:!0}}).catch(this.error);if(i){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield Ze.findOrCreate({where:{secret:t,user_id:i.id},defaults:{secret:t,user_id:i.id}}).catch(this.error))||[];if(r)return r.revoked_at&&(r.revoked_at=null,yield r.save().catch(this.error)),{auth:r,user:i}}throw new t("Invalid token")})}}class ModelService extends vt{constructor(e,t){var i;super(),this.attributes=[],this.permissions=[],this.model=e,(null==t?void 0:t.permissions)&&(this.permissions=t.permissions);const r=Object.keys(e.getAttributes());this.attributes=this.filterAttributes(r,null!==(i=null==t?void 0:t.attributes)&&void 0!==i?i:[])}applySelect(e,t,i){if(!t)return;const r=null==e?void 0:e.getQuery(i?`${i}_select`:"select"),n=t.attributes,s=e=>n.includes(e);t.attributes=[],B(r)&&r.length&&t.attributes.push(...r.split(/\s*,\s*/g).filter(s)),t.attributes.length||(t.attributes=n)}applyOrders(e,t){if(!t)return;const i=null==e?void 0:e.getQuery("asc"),r=null==e?void 0:e.getQuery("desc"),n=[],s=t.attributes,o=e=>s.includes(e);B(i)&&i.length&&n.push(...i.split(/\s*,\s*/g).filter(o).map(e=>[e,"ASC"])),B(r)&&r.length&&n.push(...r.split(/\s*,\s*/g).filter(o).map(e=>[e,"DESC"])),n.length&&(t.order=n)}applyPagination(e,t){if(!t)return;const i=null==e?void 0:e.getQuery("limit"),r=null==e?void 0:e.getQuery("offset");D(t.limit)&&(t.limit=Env.MODEL_LIMIT,B(i)&&(t.limit=parseInt(i)||0),t.limit=M(t.limit,-1,Env.MODEL_LIMIT_MAX)),t.limit<0&&(t.limit=void 0),B(r)&&(t.offset=parseInt(r)||0,t.offset<0&&(t.offset=void 0))}applyWhere(e,t,i){var r,n;if(!t)return null;const s=null==e?void 0:e.getQuery(i?`${i}_where`:"where"),d=t.attributes;if(B(s)){const e=ve.parse(d,s);if(!D(e.error))return new o(e.error.join(", "));t.where=Object.assign(Object.assign({},null!==(r=t.where)&&void 0!==r?r:{}),null!==(n=e.value)&&void 0!==n?n:{})}return null}countAll(e){return Re(this,void 0,void 0,function*(){var t,i;const{ctx:r,options:n={}}=e,s=L({},n);s.attributes=this.getAttributes(null!==(t=null==s?void 0:s.attributes)&&void 0!==t?t:[]);const o=this.applyWhere(r,s);if(o)return null==r||r.error(o),0;this.applySelect(r,s);const a=null!==(i=yield this.model.count(Object.assign(Object.assign({},s),{distinct:!!s.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error))&&void 0!==i?i:0;return null==r||r.prepare(d.OK,{count:a}),a})}create(e){return Re(this,void 0,void 0,function*(){var t,i;const{body:r={},ctx:n,options:o={}}=e,a=L({},o),l=yield this.model.create(Object.assign({},L({},null!==(i=null===(t=null==n?void 0:n.req)||void 0===t?void 0:t.body)&&void 0!==i?i:{},r)),Object.assign(Object.assign({},a),{ctx:n})).catch(this.error);if(!l)return null==n||n.error(new s),null;const{primaryKeyAttribute:u}=this.model;return null==n||n.prepare(d.OK,{[u]:l.getDataValue(u)}),l})}delete(e){return Re(this,void 0,void 0,function*(){var t,i;const{ctx:r,id:s,options:o={}}=e,{primaryKeyAttribute:d}=this.model,l=null!==(t=null==r?void 0:r.getParam(d))&&void 0!==t?t:s;if(D(l))return null==r||r.error(new a),0;const u=L({},o),c=yield this.model.destroy(Object.assign(Object.assign(Object.assign({},u),{where:Object.assign(Object.assign({},null!==(i=u.where)&&void 0!==i?i:{}),{[d]:l}),individualHooks:!0}),{ctx:r})).catch(this.error);return c?(null==r||r.success("OK"),c):(null==r||r.error(new n),0)})}filterAttributes(e,t){if(F(t))return t.length?t.filter(t=>B(t)&&e.includes(t)):e;const{exclude:i,include:r}=t,n=D(r)?e:r.filter(t=>B(t)&&e.includes(t)),s=null!=i?i:[];return s.length?n.filter(e=>!s.includes(e)):n}findAll(e){return Re(this,void 0,void 0,function*(){var t,i;const{ctx:r,callback:n,limited:s,options:o={},query:a=!0}=e,l=L({},o);if(l.attributes=this.getAttributes(null!==(t=null==l?void 0:l.attributes)&&void 0!==t?t:[]),a&&this.applySelect(r,l),this.applyOrders(r,l),this.applyPagination(r,l),s&&(null!==(i=null==l?void 0:l.limit)&&void 0!==i?i:0)>Env.MODEL_LIMIT_MAX&&(l.limit=Env.MODEL_LIMIT_MAX),a){const e=this.applyWhere(r,l);if(e)return null==r||r.error(e),{count:0,records:[]}}const[u,c]=yield Promise.all([this.model.count(Object.assign(Object.assign({},l),{distinct:!!l.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error).then(e=>null!=e?e:0),this.model.findAll(l).catch(this.error).then(e=>null!=e?e:[])]),p={count:u,records:n?yield n(c):c};return null==r||r.prepare(d.OK,p),p})}findOne(e){return Re(this,void 0,void 0,function*(){var t,i,r;const{callback:s,ctx:o,id:l,options:u={},query:c=!0}=e,{primaryKeyAttribute:p}=this.model,g=null!==(t=null==o?void 0:o.getParam(p))&&void 0!==t?t:l;if(D(g))return null==o||o.error(new a),null;const v=L({},u);v.attributes=this.getAttributes(null!==(i=null==v?void 0:v.attributes)&&void 0!==i?i:[]),c&&this.applySelect(o,v);const y=yield this.model.findOne(Object.assign(Object.assign({},v),{where:Object.assign(Object.assign({},null!==(r=null==v?void 0:v.where)&&void 0!==r?r:{}),{[p]:g})})).catch(this.error);return y?(null==o||o.prepare(d.OK,s?yield s(y):y.toJSON()),y):(null==o||o.error(new n),null)})}getAttributes(e){return this.filterAttributes(this.attributes,e)}include(e,t){var i;const r=H(t),{ctx:n}=null!=t?t:{};r.attributes=this.filterAttributes(Object.keys(e.getAttributes()),null!==(i=r.attributes)&&void 0!==i?i:[]);const s=this.applyWhere(n,r,t.name);return s?(null==n||n.error(s),null):(this.applySelect(n,r,t.name),Object.assign({model:e},r))}name(){return this.model.tableName}sync(){return Re(this,void 0,void 0,function*(){if(!this.permissions.length)return;const e=this.name().toLowerCase(),t={description:"",state:!0};yield q(this.permissions,i=>Re(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=Y(e.replace(/_/g," ")," ");yield et.findOrCreate({where:{key:r},defaults:Object.assign({name:`${n} ${Y(i," ")}`,key:r,tags:n},t)})}))})}update(e){return Re(this,void 0,void 0,function*(){var t,i,r,n,s;const{ctx:o,body:d,id:l,options:u={}}=e,{primaryKeyAttribute:c}=this.model,p=null!==(t=null==o?void 0:o.getParam(c))&&void 0!==t?t:l;if(D(p))return null==o||o.error(new a),!1;const g=L({},u),[v]=null!==(s=yield this.model.update(Object.assign({},L({},null!==(r=null===(i=null==o?void 0:o.req)||void 0===i?void 0:i.body)&&void 0!==r?r:{},null!=d?d:{})),Object.assign(Object.assign(Object.assign({},g),{where:Object.assign(Object.assign({},null!==(n=null==g?void 0:g.where)&&void 0!==n?n:{}),{[c]:p}),individualHooks:!0}),{ctx:o})).catch(this.error))&&void 0!==s?s:[];return v?(null==o||o.success("OK"),!0):(null==o||o.success("Record not changed"),!1)})}}class UserService extends vt{getMetadata(e){return Re(this,void 0,void 0,function*(){var t,i;const[r]=null!==(t=yield gt.findOrCreate({where:{user_id:e},defaults:{user_id:e}}).catch(this.error))&&void 0!==t?t:[];return null!==(i=null==r?void 0:r.data)&&void 0!==i?i:{}})}getProfile(e){return Re(this,void 0,void 0,function*(){var t,i;const[r]=null!==(t=yield st.findOrCreate({where:{user_id:e},defaults:{user_id:e}}).catch(this.error))&&void 0!==t?t:[];return null!==(i=null==r?void 0:r.data)&&void 0!==i?i:{}})}getGroups(e){return Re(this,void 0,void 0,function*(){var t;return(null!==(t=yield it.findAll({attributes:["key"],where:{state:!0},include:[{model:rt,required:!0,where:{user_id:e}}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}getPermissions(e){return Re(this,void 0,void 0,function*(){var t;return(null!==(t=yield et.findAll({attributes:["key"],where:{state:!0},include:[{model:tt,required:!0,include:[{model:it,required:!0,attributes:["id"],where:{state:!0},include:[{model:rt,required:!0,where:{user_id:e}}]}]}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}}class Application extends l{constructor(e,t){super(e,L({},{cert:Env.HTTP_CRT,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:Env.HTTP_KEY,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 SessionStore,name:Env.API_SESSION_NAME,secret:Env.API_SESSION_SECRET,cookie:{maxAge:Env.API_SESSION_LIFETIME},genid:K}},null!=t?t:{})),this.hash=new x(Env.API_KEY_HASH)}error(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.error(e.message,t,Env.CONSOLE_ERROR)}log(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return Re(this,void 0,void 0,function*(){yield Ne.sync(),yield this.migrations(Ne),yield $(this.controllers,e=>Re(this,void 0,void 0,function*(){R(e.sync)&&(yield e.sync(this))})),this.authService=new AuthService,this.userService=new UserService,yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new ee({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>Re(this,void 0,void 0,function*(){t.url||(t.url=""),e.on("close",()=>{}),yield G(2e3)})))})}migrations(e){return Re(this,void 0,void 0,function*(){const t=[];yield $(Object.keys(e.models),i=>Re(this,void 0,void 0,function*(){var r;const n=e.models[i],s=n.version();if(!s)return;const[o,d]=null!==(r=yield ct.findOrCreate({where:{model:n.tableName},defaults:{model:n.tableName,version:""}}).catch(this.error))&&void 0!==r?r:[];o&&(d||o.version!=s)&&(o.version=s,yield o.save().catch(this.error),t.push(n))})),yield $(t,e=>Re(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}let yt=class BaseController extends V{constructor(){super(...arguments),this.permissions=[]}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")}session(e,t,i){return Re(this,void 0,void 0,function*(){i.auth&&i.user&&(i.user_agent?i.user_agent!=t&&i.regenerate(U):(i.user_agent=t,i.save(U))),e.next()})}sync(){return Re(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield $(this.permissions,i=>Re(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=Y(e.replace(/_/g," ")," ");yield et.findOrCreate({where:{key:r},defaults:Object.assign({name:`${n} ${Y(i," ")}`,key:r,tags:n},t)})}))})}};xe([Ce(0,u()),Ce(1,c("user-agent")),Ce(2,p()),De("design:type",Function),De("design:paramtypes",[r,String,Object]),De("design:returntype",Promise)],yt.prototype,"session",null),yt=xe([Ee(Loggable)],yt);let ht=class ModelController extends yt{constructor(){super(...arguments),this.attributes=[],this.permissions=["create","read","update","delete"]}countAll(e){return Re(this,void 0,void 0,function*(){return yield this.service.countAll(e)})}create(e){return Re(this,void 0,void 0,function*(){return yield this.service.create(e)})}delete(e){return Re(this,void 0,void 0,function*(){return yield this.service.delete(e)})}findAll(e){return Re(this,void 0,void 0,function*(){return yield this.service.findAll(e)})}findOne(e){return Re(this,void 0,void 0,function*(){return yield this.service.findOne(e)})}include(e,t){return this.service.include(e,t)}sync(){return Re(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield $(this.permissions,i=>Re(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=Y(e.replace(/_/g," ")," ");yield et.findOrCreate({where:{key:r},defaults:Object.assign({name:`${n} ${Y(i," ")}`,key:r,tags:n},t)})})),this.service=new ModelService(this.model)})}update(e){return Re(this,void 0,void 0,function*(){return yield this.service.update(e)})}name(){return this.model.tableName}};ht=xe([g(yt)],ht);let mt=class AuditsController extends ht{constructor(){super(...arguments),this.model=dt,this.permissions=["read"]}all(e,t,i){return Re(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 Re(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}};xe([v(),He(),Be(),Ce(0,u()),Ce(1,y("type")),Ce(2,y("table")),De("design:type",Function),De("design:paramtypes",[r,String,String]),De("design:returntype",Promise)],mt.prototype,"all",null),xe([v("/:id"),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],mt.prototype,"get",null),mt=xe([h("/audits"),g(ht)],mt);let _t=class AuthController extends yt{constructor(e){super(),this.authService=e}login(e,i,r,n,s,o){return Re(this,void 0,void 0,function*(){var d;yield G(Env.SLEEP_AUTH);const a=yield ot.findOne({where:{[ge.or]:[{email:r},{username:r}]}}).catch(this.error);if(!a)return e.error(new t("Invalid credentials")),o.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const l=yield nt.findOne({where:{user_id:a.id,state:!0}}).catch(this.error);if(!l||!me(n,l.value))return e.error(new t("Invalid credentials")),o.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const u=yield Xe.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.error(new t("Invalid credentials")),o.emit("auth.failure",{ctx:e,user:a}),void this.emit("auth.failure",{ctx:e,user:a});const{auth:c,token:p}=null!==(d=yield this.authService.create(a).catch(t=>{e.error(t),o.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e})}))&&void 0!==d?d:{};c&&p&&(c.user_agent=i,c.ip_address=e.getIp(),yield c.save().catch(this.error),Env.API_TOKEN_COOKIE_SET&&e.setCookie(Env.API_TOKEN_COOKIE,p,{maxAge:s?Env.TOKEN_TTL:void 0}),e.json({token:p}),o.emit("auth.login",{ctx:e,auth:c,user:a}),this.emit("auth.login",{ctx:e,auth:c,user:a}))})}logout(e,i,r,n){return Re(this,void 0,void 0,function*(){if(yield this.authService.destroy(i))return Env.API_TOKEN_COOKIE_SET&&e.clearCookie(Env.API_TOKEN_COOKIE),e.success("OK"),n.emit("auth.logout",{auth:i,ctx:e,user:r}),void this.emit("auth.logout",{auth:i,ctx:e,user:r});e.error(new t("Access Denied"))})}renew(e,t,i,r){return Re(this,void 0,void 0,function*(){var n;const{auth:s,token:o}=null!==(n=yield this.authService.renew(i).catch(t=>{e.error(t)}))&&void 0!==n?n:{};s&&o&&(s.user_agent=t,yield s.save().catch(this.error),e.json({token:o}),r.emit("auth.renew",{auth:s,ctx:e}),this.emit("auth.renew",{auth:s,ctx:e}))})}user(e,t){return Re(this,void 0,void 0,function*(){const{groups:i,permissions:r,profile:n}=e.req;if(!i||!r)return e.error(new s);e.json(Object.assign(Object.assign({},W(t.toJSON(),["username","description"])),{groups:i,permissions:r,profile:n}))})}};xe([m("/login"),_(e=>({username:e.string().min(3).required(),password:e.string().min(5).required(),remember:e.boolean().parse().empty(!1)})),Ce(0,u()),Ce(1,c("user-agent")),Ce(2,f("username")),Ce(3,f("password")),Ce(4,f("remember")),Ce(5,E()),De("design:type",Function),De("design:paramtypes",[r,String,String,String,Boolean,Application]),De("design:returntype",Promise)],_t.prototype,"login",null),xe([v("/logout"),He(),Ce(0,u()),Ce(1,qe()),Ce(2,We()),Ce(3,E()),De("design:type",Function),De("design:paramtypes",[r,Ze,ot,Application]),De("design:returntype",Promise)],_t.prototype,"logout",null),xe([m("/renew"),_(e=>({token:e.string().required()})),Ce(0,u()),Ce(1,c("user-agent")),Ce(2,f("token")),Ce(3,E()),De("design:type",Function),De("design:paramtypes",[r,String,String,Application]),De("design:returntype",Promise)],_t.prototype,"renew",null),xe([v(),v("/me"),He(),Ce(0,u()),Ce(1,We()),De("design:type",Function),De("design:paramtypes",[r,ot]),De("design:returntype",Promise)],_t.prototype,"user",null),_t=xe([h("/auth"),g(yt),Ce(0,Ae(AuthService)),De("design:paramtypes",[AuthService])],_t);let ft=class CrudController extends ht{constructor(){super(...arguments),this._crud={}}CrudArgumentsCountAll(e){return{ctx:e}}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}}CrudValidateCreate(){return this._crud}CrudValidateUpdate(){return this._crud}add(e){return Re(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return Re(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}rows(e){return Re(this,void 0,void 0,function*(){yield this.countAll(this.CrudArgumentsCountAll(e))})}del(e){return Re(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return Re(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return Re(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validate(e,t){return Re(this,void 0,void 0,function*(){var i,r;const n=J.object(t).parse(),{error:s,message:d,value:a}=yield n.validateAsync(null!==(r=null===(i=e.req)||void 0===i?void 0:i.body)&&void 0!==r?r:{});if(s)return e.error(new o(null!=d?d:s));e.req.body=a,e.next()})}validateCreate(e){return Re(this,void 0,void 0,function*(){const t=this.CrudValidateCreate();if(t==this._crud)return e.error(new s);yield this.validate(e,t)})}validateUpdate(e){return Re(this,void 0,void 0,function*(){const t=this.CrudValidateUpdate();if(t==this._crud)return e.error(new s);yield this.validate(e,t)})}};xe([m(),He(),je(),A("validateCreate"),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"add",null),xe([v(),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"all",null),xe([v("/count"),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"rows",null),xe([S("/:id"),He(),Ke(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"del",null),xe([v("/:id"),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"get",null),xe([O("/:id"),He(),Me(),A("validateUpdate"),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"set",null),xe([Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"validateCreate",null),xe([Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"validateUpdate",null),ft=xe([g(ht)],ft);let Et=class FilesController extends yt{constructor(){super(...arguments),this.directory=Env.API_HTTP_PUBLIC||"./",this.permissions=["delete","download","edit","list","read","rename","upload","write"]}files(e){return Re(this,void 0,void 0,function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const i=be(this.directory,t);if(!Se(i)||!Oe(i).isDirectory())return e.error(new n);let r;return r=Te(i),r=r.map(e=>this.info(be(i,e))),r=r.filter(z),Object.assign(Object.assign({},this.info(i)),{files:r})})}info(e){if(!Se(e))return null;const t=Oe(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 Re(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=Y(e.replace(/_/g," ")," "),i={description:"",state:!0};yield $(this.permissions,r=>Re(this,void 0,void 0,function*(){const n=`${e}.${r}`;yield et.findOrCreate({where:{key:n},defaults:Object.assign({name:`${t} ${Y(r," ")}`,key:n,tags:t},i)})}))})}};xe([v("/path"),v("/path/*path"),He(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],Et.prototype,"files",null),Et=xe([h("/files"),g(yt)],Et);let At=class ForgotController extends yt{check(e,t){return Re(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i||!i.user)return e.error(new n);i.secret=Q(),yield i.save(),e.json({token:i.secret})})}forgot(e,t,i){return Re(this,void 0,void 0,function*(){yield G(Env.SLEEP_FORGOT);const r=t,s=yield ot.findOne({where:{[ge.or]:[{email:r},{username:t}]}}).catch(this.error);if(!s)return e.error(new n);const o=Q(),d=Date.now()+6e4*Env.API_TOKEN_FORGOT,a=yield lt.create({token:o,timestamp:d,state:!0,user_id:s.id});e.success("OK"),i.emit("forgot.send",{ctx:e,forgot:a,user:s}),this.emit("forgot.send",{ctx:e,forgot:a,user:s})})}reset(e,t,i,r){return Re(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i)return e.error(new n);i.state=!1,yield i.save().catch(this.error),yield i.user.save().catch(this.error),e.success("OK"),r.emit("forgot.reset",{ctx:e,user:i.user}),this.emit("forgot.reset",{ctx:e,user:i.user})})}find(e){return Re(this,void 0,void 0,function*(){return yield lt.findOne({where:{token:e,state:!0},include:[{model:ot,required:!0}]}).catch(this.error)})}};xe([v("/check"),_(e=>({token:e.string().required()})),Ce(0,u()),Ce(1,f("token")),De("design:type",Function),De("design:paramtypes",[r,String]),De("design:returntype",Promise)],At.prototype,"check",null),xe([m(),_(e=>({username:e.string().min(4).required()})),Ce(0,u()),Ce(1,f("username")),Ce(2,E()),De("design:type",Function),De("design:paramtypes",[r,String,Application]),De("design:returntype",Promise)],At.prototype,"forgot",null),xe([m("/reset"),_(e=>({token:e.string().required(),password:e.string().min(5).required()})),Ce(0,u()),Ce(1,f("token")),Ce(2,f("password")),Ce(3,E()),De("design:type",Function),De("design:paramtypes",[r,String,String,Application]),De("design:returntype",Promise)],At.prototype,"reset",null),At=xe([h("/forgot"),g(yt)],At);let St=class GroupsController extends ft{constructor(){super(...arguments),this.model=it,this.schemaCreate={name:J.string().required(),key:J.string().required(),tags:J.string().empty(""),description:J.string().empty(""),state:J.boolean().parse().required()},this.schemaUpdate={name:J.string().empty(),tags:J.string().empty(),description:J.string().empty(),state:J.boolean().parse().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudalidateUpdate(){return this.schemaUpdate}};St=xe([h("/groups"),g(ft)],St);let Ot=class GroupsPermissionsController extends ht{constructor(){super(...arguments),this.model=tt,this.permissions=[]}all(e,t){return Re(this,void 0,void 0,function*(){const i=this.include(et,{ctx:e,required:!0});i&&(yield this.findAll({ctx:e,options:{where:{group_id:t},include:[i]},callback:e=>e.map(e=>e.permission),query:!1}))})}set(e,t,i){return Re(this,void 0,void 0,function*(){const r=yield it.findByPk(t,{attributes:["id"]}).catch(this.error);if(!r)return e.error(new n);const s=r.id,o=[];yield $(X(i),t=>Re(this,void 0,void 0,function*(){var i;if(!(yield et.count({where:{id:t}})))return;const[r]=null!==(i=yield tt.findOrCreate(Object.assign({where:{group_id:s,permission_id:t},defaults:{group_id:s,permission_id:t}},{ctx:e})).catch(this.error))&&void 0!==i?i:[];r&&o.push(t)})),yield tt.destroy(Object.assign({where:{group_id:s,permission_id:{[ge.notIn]:o}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}};xe([v("/:id/permissions"),He(),Be("groups"),Ce(0,u()),Ce(1,T("id")),De("design:type",Function),De("design:paramtypes",[r,String]),De("design:returntype",Promise)],Ot.prototype,"all",null),xe([O("/:id/permissions"),He(),Me("groups"),_(e=>({permissions:e.array(e.string())})),Ce(0,u()),Ce(1,T("id")),Ce(2,f("permissions")),De("design:type",Function),De("design:paramtypes",[r,String,Array]),De("design:returntype",Promise)],Ot.prototype,"set",null),Ot=xe([h("/groups"),g(ht)],Ot);let Tt=class LogsController extends ht{constructor(){super(...arguments),this.model=ut,this.permissions=["read"]}all(e){return Re(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{order:[["created_at","DESC"]]},limited:!0})})}};xe([v(),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],Tt.prototype,"all",null),Tt=xe([h("/logs"),g(ht)],Tt);let It=class PermissionsController extends ft{constructor(){super(...arguments),this.model=et,this.schemaCreate={name:J.string().required(),key:J.string().required(),tags:J.string().empty(""),description:J.string().empty(""),state:J.boolean().parse().required()},this.schemaUpdate={name:J.string().empty(),tags:J.string().empty(),description:J.string().empty(),state:J.boolean().parse().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}};It=xe([h("/permissions"),g(ft)],It);let Pt=class RegisterController extends yt{register(e,t,i){return Re(this,void 0,void 0,function*(){yield G(Env.SLEEP_REGISTRY);const{name:r,date:n,email:o,username:d,password:a,confirm:l}=t,u=d||o,c=C(a);if(yield ot.count({where:{[ge.or]:[{email:o},{username:u}]}}).catch(this.error))return e.error("INVALID EMAIL OR USERNAME");if(c!=C(l))return e.error("INVALID PASSWORD");const p=yield ot.create({name:r,email:o,username:u,password:c,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!p)return e.error(new s);const g=yield Xe.create({token:yield this.getId(),user_id:p.id,state:!0}).catch(this.error);if(!g)return yield p.destroy().catch(this.error),e.error(new s);e.success("OK"),i.emit("register.user",{ctx:e,register:g,user:p}),this.emit("register.user",{ctx:e,register:g,user:p})})}confirm(e,t,i){return Re(this,void 0,void 0,function*(){const r=yield Xe.findOne({where:{token:t,state:!0},include:[{model:ot,required:!0}]}).catch(this.error);if(!r)return e.error(new n);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 Re(this,void 0,void 0,function*(){const r=t,s=yield Xe.findOne({where:{state:!0},include:[{model:ot,required:!0,where:{[ge.or]:[{email:r},{username:t}]}}]}).catch(this.error);if(!s)return e.error(new n);e.success("OK"),i.emit("register.send",{ctx:e,register:s,user:s.user}),this.emit("register.send",{ctx:e,register:s,user:s.user})})}getId(){return Re(this,void 0,void 0,function*(){const e=K();return(yield Xe.count({where:{token:e}}))?this.getId():e})}};xe([m(),_(e=>({name:e.string().required(),date:e.date().required(),email:e.string().email().required(),username:e.string().min(4).empty(),password:e.string().min(5).required(),confirm:e.string().min(5).required()})),Ce(0,u()),Ce(1,f()),Ce(2,E()),De("design:type",Function),De("design:paramtypes",[r,Object,Application]),De("design:returntype",Promise)],Pt.prototype,"register",null),xe([m("/confirm"),_(e=>({token:e.string().required()})),Ce(0,u()),Ce(1,f("token")),Ce(2,E()),De("design:type",Function),De("design:paramtypes",[r,String,Application]),De("design:returntype",Promise)],Pt.prototype,"confirm",null),xe([m("/send"),_(e=>({username:e.string().min(4).required()})),Ce(0,u()),Ce(1,f("username")),Ce(2,E()),De("design:type",Function),De("design:paramtypes",[r,String,Application]),De("design:returntype",Promise)],Pt.prototype,"send",null),Pt=xe([h("/register"),g(yt)],Pt);let wt=class SetupController extends yt{setup(e){return Re(this,void 0,void 0,function*(){var t;if(yield ot.count())return e.success("OK");const i=yield ot.create({name:"Admin",email:"admin@localhost.com",username:"admin",description:"DEFAULT",state:!0},Object.assign({},{ctx:e}));yield nt.create({value:"admin",state:!0,user_id:i.id});const r={description:"API CORE",state:!0},n=yield it.create(Object.assign({name:"Admin",key:"admin",tags:"Admin"},r),Object.assign({},{ctx:e}));yield rt.create({user_id:i.id,group_id:n.id},Object.assign({},{ctx:e})),yield it.create(Object.assign({name:"User",key:"user",tags:"user"},r),Object.assign({},{ctx:e}));const s=null!==(t=yield et.findAll({where:{state:!0}}).catch(this.error))&&void 0!==t?t:[];yield $(s,t=>Re(this,void 0,void 0,function*(){yield tt.create({group_id:n.id,permission_id:t.id},Object.assign({},{ctx:e}))})),e.success("OK")})}};xe([v(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],wt.prototype,"setup",null),wt=xe([h("/setup"),g(yt)],wt);let bt=class UsersController extends ht{constructor(){super(),this.model=ot,this.path=Env.API_HTTP_PUBLIC+"/avatar",Env.API_HTTP_PUBLIC&&Se(Env.API_HTTP_PUBLIC)&&!Se(this.path)&&Ie(this.path)}avatar(e,t){return Re(this,void 0,void 0,function*(){var i,r;const n=e.getFiles();if(n.file&&n.file.length){const{filename:o,path:d}=null!==(i=n.file[0])&&void 0!==i?i:{};if(o){const[i]=null!==(r=yield st.findOrCreate(Object.assign({where:{user_id:t.id},defaults:{user_id:t.id}},{ctx:e})).catch(this.error))&&void 0!==r?r:[];if(!i)return Pe(d).isFile()&&we(d),e.error(new s);const n=this.path+"/"+i.data.avatar;if(Se(n)&&Pe(n).isFile()&&we(n),i.changed("data",!0),i.data.avatar=o,yield i.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK")}}e.success("Record not Changed")})}token_new(){return Re(this,void 0,void 0,function*(){var e;const t=K();return(null!==(e=yield this.model.count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t})}add(e){return Re(this,void 0,void 0,function*(){yield this.create({ctx:e})})}all(e){return Re(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}rows(e){return Re(this,void 0,void 0,function*(){yield this.countAll({ctx:e})})}del(e,t,i){return Re(this,void 0,void 0,function*(){if(i.id==t)return e.error(new n);yield this.delete({ctx:e})})}get(e){return Re(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e){return Re(this,void 0,void 0,function*(){yield this.update({ctx:e})})}};xe([m("/avatar"),He(),I({file:{count:1,path:`${Env.API_HTTP_PUBLIC}/avatar`,types:["image/bmp","image/jpeg","image/png"],size:32}}),Ce(0,u()),Ce(1,We()),De("design:type",Function),De("design:paramtypes",[r,ot]),De("design:returntype",Promise)],bt.prototype,"avatar",null),xe([m(),He(),je(),_(e=>({name:e.string().required(),email:e.string().email().required(),username:e.string().min(3).required(),description:e.string().empty(""),state:e.boolean().parse().empty(!0)})),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],bt.prototype,"add",null),xe([v(),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],bt.prototype,"all",null),xe([v("/count"),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],bt.prototype,"rows",null),xe([S("/:id"),He(),Ke(),Ce(0,u()),Ce(1,T("id")),Ce(2,We()),De("design:type",Function),De("design:paramtypes",[r,String,ot]),De("design:returntype",Promise)],bt.prototype,"del",null),xe([v("/:id"),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],bt.prototype,"get",null),xe([O("/:id"),He(),Me(),_(e=>({name:e.string().empty(),email:e.string().email().empty(),username:e.string().min(3).empty(),description:e.string().empty(),state:e.boolean().parse().empty()})),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],bt.prototype,"set",null),bt=xe([h("/users"),g(ht),De("design:paramtypes",[])],bt);let xt=class UsersGroupsController extends ht{constructor(){super(...arguments),this.model=rt,this.permissions=[]}all(e,t){return Re(this,void 0,void 0,function*(){if(!(yield ot.findByPk(t,{attributes:["id"]}).catch(this.error)))return e.error(new n("User Not Found"));const i=this.include(it,{ctx:e,required:!0});i&&(yield this.findAll({ctx:e,options:{where:{user_id:t},include:[i]},callback:e=>e.map(e=>e.group),query:!1}))})}set(e,t,i){return Re(this,void 0,void 0,function*(){const r=yield ot.findByPk(t,{attributes:["id"]}).catch(this.error);if(!r)return e.error(new n("User Not Found"));const s=r.id,o=[];yield $(X(i),t=>Re(this,void 0,void 0,function*(){var i;if(!(yield it.count({where:{id:t}})))return;const[r]=null!==(i=yield rt.findOrCreate(Object.assign({where:{user_id:s,group_id:t},defaults:{user_id:s,group_id:t}},{ctx:e})).catch(this.error))&&void 0!==i?i:[];r&&o.push(t)})),yield rt.destroy(Object.assign({where:{user_id:s,group_id:{[ge.notIn]:o}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}};xe([v("/:id/groups"),He(),Be("users"),Ce(0,u()),Ce(1,T("id")),De("design:type",Function),De("design:paramtypes",[r,String]),De("design:returntype",Promise)],xt.prototype,"all",null),xe([O("/:id/groups"),He(),Me("users"),_(e=>({groups:e.array(e.string())})),Ce(0,u()),Ce(1,T("id")),Ce(2,f("groups")),De("design:type",Function),De("design:paramtypes",[r,String,Array]),De("design:returntype",Promise)],xt.prototype,"set",null),xt=xe([h("/users"),g(ht)],xt);let Ct=class UsersProfilesController extends ht{constructor(){super(...arguments),this.model=st,this.permissions=[]}all(e){return Re(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}get(e,t){return Re(this,void 0,void 0,function*(){var i;const[r]=null!==(i=yield st.findOrCreate(Object.assign({where:{user_id:t},defaults:{user_id:t}},{ctx:e})).catch(this.error))&&void 0!==i?i:[];if(!r)return e.error(new n);e.json(r)})}set(e,t,i){return Re(this,void 0,void 0,function*(){var r;const s=yield ot.findByPk(t,{attributes:["id"]}).catch(this.error);if(!s)return e.error(new n);const o=s.id,d=Z(i,e=>String(e)),[a,l]=null!==(r=yield st.findOrCreate(Object.assign({where:{user_id:o},defaults:{data:d,user_id:o}},{ctx:e})).catch(this.error))&&void 0!==r?r:[];a&&!l&&(a.changed("data",!0),a.data=L(a.data,d),yield a.save(Object.assign({},{ctx:e})).catch(this.error)),e.success("OK")})}};xe([v("/profiles"),He(),Be("users"),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],Ct.prototype,"all",null),xe([v("/:id/profiles"),He(),Be("users"),Ce(0,u()),Ce(1,T("id")),De("design:type",Function),De("design:paramtypes",[r,String]),De("design:returntype",Promise)],Ct.prototype,"get",null),xe([O("/:id/profiles"),He(),Me("users"),Ce(0,u()),Ce(1,T("id")),Ce(2,f()),De("design:type",Function),De("design:paramtypes",[r,String,Object]),De("design:returntype",Promise)],Ct.prototype,"set",null),Ct=xe([h("/users"),g(ht)],Ct);export{Application,Qe as Audit,dt as AuditModel,mt as AuditsController,_t as AuthController,AuthService,yt as BaseController,je as CanCreate,Ke as CanDelete,Be as CanRead,Me as CanUpdate,Config,at as ConfigModel,ft as CrudController,Env,Et as FilesController,At as ForgotController,lt as ForgotModel,it as GroupModel,tt as GroupPermissionModel,St as GroupsController,Ot as GroupsPermissionsController,Le as HasGroups,Fe as HasPermissions,He as IsAuthenticated,Log,ut as LogModel,Loggable,Tt as LogsController,ct as MigrationModel,ht as ModelController,ModelService,et as PermissionModel,It as PermissionsController,Pt as RegisterController,Xe as RegisterModel,qe as ReqAuth,Ye as ReqGroup,$e as ReqGroups,Ge as ReqPermission,Ve as ReqPermissions,We as ReqUser,vt as Service,pt as SessionModel,SessionStore,wt as SetupController,Ze as UserAuthModel,rt as UserGroupModel,gt as UserMetadataModel,ot as UserModel,nt as UserPasswordModel,st as UserProfileModel,UserService,bt as UsersController,xt as UsersGroupsController,Ct as UsersProfilesController,Ue as canFactory,Ne as sequelize};
7
+ import{Use as e,UnauthorizedError as t,parameterFactory as i,Context as r,NotFoundError as n,InternalServerError as s,ValidationError as o,StatusCodes as d,BadRequestError as a,Application as l,Ctx as u,Headers as c,Session as p,Extends as g,Get as v,Query as y,Controller as h,Post as m,Validate as _,Body as f,App as E,Middleware as A,Delete as S,Put as O,Params as T,Upload as I}from"@andrewcaires/express";import{Env as P,Log as w,LogColor as b,Hash as x,sha256 as C}from"@andrewcaires/node";import{isUndefined as D,isFunction as R,includesArray as k,getConstructor as N,noop as j,loop as U,uuidv7 as K,isString as B,clamp as M,merge as L,isArray as F,clone as H,forEachAsync as q,upperCamelCase as Y,forEachSeries as $,sleep as G,EventEmitter as V,denied as W,Validation as J,isDef as Q,uniqueID as z,uniqueArray as X,map as Z}from"@andrewcaires/utils.js";import{WebSocketServer as ee}from"ws";import{Sequelize as te,Hooks as ie,Column as re,Association as ne,Database as se,ModelName as oe,Version as de,Model as ae,Unique as le,HasMany as ue,Value as ce,DefaultValue as pe,Op as ge,Where as ve}from"@andrewcaires/sequelize";import{config as ye}from"dotenv";import{hashSync as he,compareSync as me}from"bcrypt";import{Store as _e}from"express-session";import fe from"jsonwebtoken";import{Trait as Ee,Inject as Ae}from"@andrewcaires/decorator";import{existsSync as Se,statSync as Oe,readdirSync as Te,mkdirSync as Ie,lstatSync as Pe,rmSync as we}from"fs";import{join as be}from"path";function xe(e,t,i,r){var n,s=arguments.length,o=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,r);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(o=(s<3?n(o):s>3?n(t,i,o):n(t,i))||o);return s>3&&o&&Object.defineProperty(t,i,o),o}function Ce(e,t){return function(i,r){t(i,r,e)}}function De(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function Re(e,t,i,r){return new(i||(i=Promise))(function(n,s){function o(e){try{a(r.next(e))}catch(e){s(e)}}function d(e){try{a(r.throw(e))}catch(e){s(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(o,d)}a((r=r.apply(e,t||[])).next())})}var ke;"function"==typeof SuppressedError&&SuppressedError,ye({quiet:!0});class Env extends P{}ke=Env,Env.BASE_NAME=ke.getString("BASE_NAME",""),Env.CONSOLE_ERROR=ke.getBool("CONSOLE_ERROR",!1),Env.DATABASE_URI=ke.getString("DATABASE_URI","",!0),Env.DATABASE_LOG=ke.getBool("DATABASE_LOG",!1),Env.DATABASE_AUDIT=ke.getBool("DATABASE_AUDIT",!0),Env.DATABASE_PREFIX=ke.getString("DATABASE_PREFIX",""),Env.DATABASE_TIMEZONE=ke.getString("DATABASE_TIMEZONE","+00:00"),Env.HTTP_CRT=ke.getFile("HTTP_CRT"),Env.HTTP_KEY=ke.getFile("HTTP_KEY"),Env.MODEL_LIMIT=ke.getInt("MODEL_LIMIT",10),Env.MODEL_LIMIT_MAX=ke.getInt("MODEL_LIMIT_MAX",100),Env.SLEEP_AUTH=ke.getMs("SLEEP_AUTH","2s"),Env.SLEEP_FORGOT=ke.getMs("SLEEP_FORGOT","5s"),Env.SLEEP_REGISTRY=ke.getMs("SLEEP_REGISTRY","5s"),Env.TOKEN_CRT=ke.getFile("TOKEN_CRT"),Env.TOKEN_KEY=ke.getFile("TOKEN_KEY"),Env.TOKEN_TTL=ke.getMs("TOKEN_TTL","1d"),Env.API_BODYPARSER_STRICT=ke.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=ke.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=ke.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=ke.getString("API_BODYPARSER_TYPE","json"),Env.API_HTTP_PORT=ke.getInt("API_HTTP_PORT",3e3),Env.API_HTTP_PUBLIC=ke.getString("API_HTTP_PUBLIC",""),Env.API_HTTP_CROSS=ke.getBool("API_HTTP_CROSS",!1),Env.API_HTTP_HYBRID=ke.getBool("API_HTTP_HYBRID",!1),Env.API_HTTP_NOTFOUND=ke.getString("API_HTTP_NOTFOUND",""),Env.API_HTTP_PATH=ke.getString("API_HTTP_PATH","/api"),Env.API_HTTP_REDIRECT=ke.getString("API_HTTP_REDIRECT",""),Env.API_KEY_HASH=ke.getString("API_KEY_HASH",""),Env.API_KEY_HEADER=ke.getString("API_KEY_HEADER","x-api-key"),Env.API_SESSION_NAME=ke.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=ke.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=ke.getString("API_SESSION_SECRET","yoursecret"),Env.API_TOKEN_COOKIE=ke.getString("API_TOKEN_COOKIE","authorization"),Env.API_TOKEN_COOKIE_SET=ke.getBool("API_TOKEN_COOKIE_SET",!0),Env.API_TOKEN_FORGOT=ke.getMs("API_TOKEN_FORGOT","1d"),Env.API_TOKEN_HEADER=ke.getString("API_TOKEN_HEADER","authorization"),Env.API_TOKEN_HEADER_KEY=ke.getString("API_TOKEN_HEADER","bearer"),Env.API_TOKEN_RENEW=ke.getMs("API_TOKEN_RENEW","1d"),Env.API_USER_HISTORY=ke.getBool("API_USER_HISTORY",!0),Env.API_WEBSOCKET_START=ke.getBool("API_WEBSOCKET_START",!1);const Ne=new te({uri:Env.DATABASE_URI,logging:!!Env.DATABASE_LOG&&(e=>w.console(b.Magenta,"sql",e)),prefix:Env.DATABASE_PREFIX,timezone:Env.DATABASE_TIMEZONE}),je=i=>r=>(n,s,o)=>{e(e=>Re(void 0,void 0,void 0,function*(){var n;let s=null!=r?r:"";D(r)&&(s=R(e.controller.name)?e.controller.name():null===(n=e.controller.constructor)||void 0===n?void 0:n.name);const{permissions:o}=e.req;if((null!=o?o:[]).includes(`${s}.${i}`))return e.next();e.error(new t("Access Denied"))}))(n,s,o)},Ue=je("create"),Ke=je("delete"),Be=je("read"),Me=je("update"),Le=(...i)=>(r,n,s)=>{e(e=>Re(void 0,void 0,void 0,function*(){const{groups:r}=e.req;if(k(i,null!=r?r:[]))return e.next();e.error(new t("Access Denied"))}))(r,n,s)},Fe=(...i)=>(r,n,s)=>{e(e=>Re(void 0,void 0,void 0,function*(){const{permissions:r}=e.req;if(k(i,null!=r?r:[]))return e.next();e.error(new t("Access Denied"))}))(r,n,s)},He=()=>(i,r,n)=>{e(e=>Re(void 0,void 0,void 0,function*(){yield(e=>Re(void 0,void 0,void 0,function*(){var i,r,n,s;if(e.req.auth&&e.req.user)return e.next();const{[Env.API_KEY_HEADER]:o,[Env.API_TOKEN_HEADER]:d,"user-agent":a}=e.getHeaders(),l=e.getQuery(Env.API_KEY_HEADER),u=(null===(i=o||l)||void 0===i?void 0:i.toString())||"";let c=e.getCookie(Env.API_TOKEN_COOKIE);c=`${Env.API_TOKEN_HEADER_KEY} ${c}`;const[p,g]=null!==(n=null===(r=d||c)||void 0===r?void 0:r.split(" "))&&void 0!==n?n:["",""];if(!(u||g&&p.toLowerCase()==Env.API_TOKEN_HEADER_KEY))return e.error(new t("Invalid token"));const{authService:v,userService:y}=e.app,{auth:h,user:m}=null!==(s=yield(u?v.key(u.toString()):v.user(g)).catch(t=>{e.error(t)}))&&void 0!==s?s:{};if(h&&m){if(!u&&h.user_agent&&h.user_agent!=a)return e.error(new t("Invalid token"));e.req.auth=h,e.req.user=m,e.req.groups=yield y.getGroups(m.id),e.req.permissions=yield y.getPermissions(m.id),e.req.profile=yield y.getProfile(m.id),e.next()}}))(e)}))(i,r,n)},qe=i(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.auth}),Ye=i(({ctx:e,key:t})=>{var i,r;return(null!==(r=null===(i=e.req)||void 0===i?void 0:i.groups)&&void 0!==r?r:[]).includes(t)}),$e=i(({ctx:e})=>{var t,i;return null!==(i=null===(t=e.req)||void 0===t?void 0:t.groups)&&void 0!==i?i:[]}),Ge=i(({ctx:e,key:t})=>{var i,r;return(null!==(r=null===(i=e.req)||void 0===i?void 0:i.permissions)&&void 0!==r?r:[]).includes(t)}),Ve=i(({ctx:e})=>{var t,i;return null!==(i=null===(t=e.req)||void 0===t?void 0:t.permissions)&&void 0!==i?i:[]}),We=i(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.user}),Je=(e,t,i)=>{var n,s,o,d,a,l,u,c,p,g;const v=i.ctx instanceof r?i.ctx:null,y=null!==(d=null!==(o=null===(s=null===(n=null==v?void 0:v.req)||void 0===n?void 0:n.user)||void 0===s?void 0:s.id)&&void 0!==o?o:i.user_id)&&void 0!==d?d:null,h={type:e,model:null!==(a=null==t?void 0:t.getTableName())&&void 0!==a?a:null,app_name:null!==(l=Env.BASE_NAME)&&void 0!==l?l:"",state:!0,user_id:y};return v?Object.assign(Object.assign({},h),{full_url:null!==(u=null==v?void 0:v.getUrl())&&void 0!==u?u:"",ip_address:null!==(c=null==v?void 0:v.getIp())&&void 0!==c?c:"",user_agent:null!==(g=null===(p=null==v?void 0:v.req)||void 0===p?void 0:p.headers["user-agent"])&&void 0!==g?g:""}):h},Qe={afterCreate:(e,t)=>Re(void 0,void 0,void 0,function*(){const i=N(e),{primaryKeyAttribute:r}=null!=i?i:{};yield dt.create(Object.assign(Object.assign({},Je("CREATE",i,t)),{record:r?e.getDataValue(r):null,data:e.toJSON()})).catch(w.catch)}),afterUpdate:(e,t)=>Re(void 0,void 0,void 0,function*(){const i=N(e),{primaryKeyAttribute:r}=null!=i?i:{},n={},s=e.changed();s&&s.forEach(t=>n[t]=e.getDataValue(t)),yield dt.create(Object.assign(Object.assign({},Je("UPDATE",i,t)),{record:r?e.getDataValue(r):null,data:n,previously:e.previous()})).catch(w.catch)}),afterDestroy:(e,t)=>Re(void 0,void 0,void 0,function*(){const i=N(e),{primaryKeyAttribute:r}=null!=i?i:{};yield dt.create(Object.assign(Object.assign({},Je("DELETE",i,t)),{record:r?e.getDataValue(r):null,data:e.toJSON()})).catch(w.catch)})},ze=e=>(D(e)&&(e=Env.DATABASE_AUDIT),ie(e?Qe:{}));let Xe=class RegisterModel extends ae{};xe([re.UUID(7),De("design:type",String)],Xe.prototype,"id",void 0),xe([re.String(),De("design:type",String)],Xe.prototype,"secret",void 0),xe([re.FullDate(),De("design:type",Number)],Xe.prototype,"expired_at",void 0),xe([re.Boolean(),De("design:type",Boolean)],Xe.prototype,"state",void 0),xe([re.CreatedAt(),De("design:type",Date)],Xe.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],Xe.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],Xe.prototype,"deleted_at",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],Xe.prototype,"user_id",void 0),Xe=xe([se(Ne),oe("register"),de("5.0.0")],Xe);let Ze=class UserAuthModel extends ae{};xe([re.UUID(7),De("design:type",String)],Ze.prototype,"id",void 0),xe([re.String(),De("design:type",String)],Ze.prototype,"secret",void 0),xe([re.String(),De("design:type",String)],Ze.prototype,"ip_address",void 0),xe([re.String(),De("design:type",String)],Ze.prototype,"user_agent",void 0),xe([re.FullDate(),De("design:type",Object)],Ze.prototype,"revoked_at",void 0),xe([re.CreatedAt(),De("design:type",Date)],Ze.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],Ze.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],Ze.prototype,"deleted_at",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],Ze.prototype,"user_id",void 0),Ze=xe([se(Ne),oe("users_auth"),de("5.0.0")],Ze);let et=class PermissionModel extends ae{};xe([re.UUID(7),De("design:type",String)],et.prototype,"id",void 0),xe([re.String(),De("design:type",String)],et.prototype,"name",void 0),xe([re.String(),le(!0),De("design:type",String)],et.prototype,"key",void 0),xe([re.String(),De("design:type",String)],et.prototype,"tags",void 0),xe([re.Text(),De("design:type",String)],et.prototype,"description",void 0),xe([re.Boolean(),De("design:type",Boolean)],et.prototype,"state",void 0),xe([re.CreatedAt(),De("design:type",Date)],et.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],et.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],et.prototype,"deleted_at",void 0),xe([ue(()=>tt,"permission_id"),De("design:type",Array)],et.prototype,"groups_permissions",void 0),et=xe([se(Ne),oe("permission"),ze(),de("5.0.1")],et);let tt=class GroupPermissionModel extends ae{};xe([re.UUID(7),De("design:type",String)],tt.prototype,"id",void 0),xe([re.CreatedAt(),De("design:type",Date)],tt.prototype,"created_at",void 0),xe([ne.BelongsTo(()=>it),De("design:type",String)],tt.prototype,"group_id",void 0),xe([ne.BelongsTo(()=>et),De("design:type",String)],tt.prototype,"permission_id",void 0),tt=xe([se(Ne),oe("groups_permissions"),ze(),de("5.0.2")],tt);let it=class GroupModel extends ae{};xe([re.UUID(7),De("design:type",String)],it.prototype,"id",void 0),xe([re.String(),De("design:type",String)],it.prototype,"name",void 0),xe([re.String(),De("design:type",String)],it.prototype,"key",void 0),xe([re.String(),De("design:type",String)],it.prototype,"tags",void 0),xe([re.Text(),De("design:type",String)],it.prototype,"description",void 0),xe([re.Boolean(),De("design:type",Boolean)],it.prototype,"state",void 0),xe([re.CreatedAt(),De("design:type",Date)],it.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],it.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],it.prototype,"deleted_at",void 0),xe([ne.HasMany(()=>rt,"group_id"),De("design:type",Array)],it.prototype,"users_groups",void 0),xe([ne.HasMany(()=>tt,"group_id"),De("design:type",Array)],it.prototype,"groups_Permission",void 0),it=xe([se(Ne),oe("group"),ze(),de("5.0.1")],it);let rt=class UserGroupModel extends ae{};xe([re.UUID(7),De("design:type",String)],rt.prototype,"id",void 0),xe([re.CreatedAt(),De("design:type",Date)],rt.prototype,"created_at",void 0),xe([ne.BelongsTo(()=>it),De("design:type",String)],rt.prototype,"group_id",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],rt.prototype,"user_id",void 0),rt=xe([se(Ne),oe("users_groups"),ze(),de("5.0.2")],rt);let nt=class UserPasswordModel extends ae{};xe([re.UUID(7),De("design:type",String)],nt.prototype,"id",void 0),xe([re.String(),ce(e=>he(e.value,12)),De("design:type",String)],nt.prototype,"value",void 0),xe([re.Boolean(),De("design:type",Boolean)],nt.prototype,"state",void 0),xe([re.CreatedAt(),De("design:type",Date)],nt.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],nt.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],nt.prototype,"deleted_at",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],nt.prototype,"user_id",void 0),nt=xe([se(Ne),oe("users_password"),ze(),de("5.0.0")],nt);let st=class UserProfileModel extends ae{};xe([re.UUID(7),De("design:type",String)],st.prototype,"id",void 0),xe([re.Json(),pe({}),De("design:type",Object)],st.prototype,"data",void 0),xe([re.CreatedAt(),De("design:type",Date)],st.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],st.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],st.prototype,"deleted_at",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],st.prototype,"user_id",void 0),st=xe([se(Ne),oe("users_profile"),ze(),de("5.0.1")],st);let ot=class UserModel extends ae{};xe([re.UUID(7),De("design:type",String)],ot.prototype,"id",void 0),xe([re.String(),De("design:type",String)],ot.prototype,"name",void 0),xe([re.String(),De("design:type",String)],ot.prototype,"email",void 0),xe([re.String(),De("design:type",String)],ot.prototype,"username",void 0),xe([re.Text(),De("design:type",String)],ot.prototype,"description",void 0),xe([re.Boolean(),De("design:type",Boolean)],ot.prototype,"state",void 0),xe([re.CreatedAt(),De("design:type",Date)],ot.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],ot.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],ot.prototype,"deleted_at",void 0),xe([ne.HasMany(()=>dt,"user_id"),De("design:type",Array)],ot.prototype,"audits",void 0),xe([ne.HasMany(()=>Ze,"user_id"),De("design:type",Array)],ot.prototype,"users_auths",void 0),xe([ne.HasMany(()=>Xe,"user_id"),De("design:type",Array)],ot.prototype,"registers",void 0),xe([ne.HasMany(()=>rt,"user_id"),De("design:type",Array)],ot.prototype,"users_groups",void 0),xe([ne.HasMany(()=>nt,"user_id"),De("design:type",Array)],ot.prototype,"users_passwords",void 0),xe([ne.HasMany(()=>st,"user_id"),De("design:type",Array)],ot.prototype,"users_profiles",void 0),ot=xe([se(Ne),oe("user"),ze(),de("5.0.0")],ot);let dt=class AuditModel extends ae{};xe([re.UUID(7),De("design:type",String)],dt.prototype,"id",void 0),xe([re.Enum("CREATE","DELETE","UPDATE"),De("design:type",String)],dt.prototype,"type",void 0),xe([re.String(),De("design:type",String)],dt.prototype,"model",void 0),xe([re.String(),De("design:type",String)],dt.prototype,"record",void 0),xe([re.Json(),De("design:type",Object)],dt.prototype,"data",void 0),xe([re.Json(),De("design:type",Object)],dt.prototype,"previously",void 0),xe([re.Text(),De("design:type",String)],dt.prototype,"full_url",void 0),xe([re.String(),De("design:type",String)],dt.prototype,"ip_address",void 0),xe([re.String(),De("design:type",String)],dt.prototype,"user_agent",void 0),xe([re.String(),De("design:type",String)],dt.prototype,"app_name",void 0),xe([re.Boolean(),De("design:type",Boolean)],dt.prototype,"state",void 0),xe([re.CreatedAt(),De("design:type",Date)],dt.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],dt.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],dt.prototype,"deleted_at",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],dt.prototype,"user_id",void 0),dt=xe([se(Ne),oe("audit"),de("5.0.1")],dt);let at=class ConfigModel extends ae{};xe([re.UUID(7),De("design:type",String)],at.prototype,"id",void 0),xe([re.String(),De("design:type",String)],at.prototype,"key",void 0),xe([re.String(),De("design:type",String)],at.prototype,"value",void 0),xe([re.CreatedAt(),De("design:type",Date)],at.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],at.prototype,"updated_at",void 0),at=xe([se(Ne),oe("configs"),de("5.0.0")],at);let lt=class ForgotModel extends ae{};xe([re.UUID(7),De("design:type",String)],lt.prototype,"id",void 0),xe([re.String(),De("design:type",String)],lt.prototype,"secret",void 0),xe([re.FullDate(),De("design:type",Number)],lt.prototype,"expired_at",void 0),xe([re.Boolean(),De("design:type",Boolean)],lt.prototype,"state",void 0),xe([re.CreatedAt(),De("design:type",Date)],lt.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],lt.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],lt.prototype,"deleted_at",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],lt.prototype,"user_id",void 0),lt=xe([se(Ne),oe("forgot"),de("5.0.0")],lt);let ut=class LogModel extends ae{};xe([re.UUID(7),De("design:type",String)],ut.prototype,"id",void 0),xe([re.Enum("info","warn","error"),pe("info"),De("design:type",String)],ut.prototype,"level",void 0),xe([re.Text(),De("design:type",String)],ut.prototype,"message",void 0),xe([re.String(),De("design:type",String)],ut.prototype,"source",void 0),xe([re.CreatedAt(),De("design:type",Date)],ut.prototype,"created_at",void 0),ut=xe([se(Ne),oe("log"),de("5.0.0")],ut);let ct=class MigrationModel extends ae{};xe([re.UUID(7),De("design:type",String)],ct.prototype,"id",void 0),xe([re.String(),De("design:type",String)],ct.prototype,"model",void 0),xe([re.String(),De("design:type",String)],ct.prototype,"version",void 0),xe([re.CreatedAt(),De("design:type",Date)],ct.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],ct.prototype,"updated_at",void 0),ct=xe([se(Ne),oe("migration"),de("5.0.2")],ct);let pt=class SessionModel extends ae{};xe([re.UUID(7),De("design:type",String)],pt.prototype,"id",void 0),xe([re.String(),De("design:type",String)],pt.prototype,"session",void 0),xe([re.Text(),De("design:type",String)],pt.prototype,"json",void 0),xe([re.BigInt(),De("design:type",Number)],pt.prototype,"expired",void 0),xe([re.CreatedAt(),De("design:type",Date)],pt.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],pt.prototype,"updated_at",void 0),pt=xe([se(Ne),oe("session"),de("5.0.2")],pt);let gt=class UserMetadataModel extends ae{};xe([re.UUID(7),De("design:type",String)],gt.prototype,"id",void 0),xe([re.Json(),pe({}),De("design:type",Object)],gt.prototype,"data",void 0),xe([re.CreatedAt(),De("design:type",Date)],gt.prototype,"created_at",void 0),xe([re.UpdatedAt(),De("design:type",Date)],gt.prototype,"updated_at",void 0),xe([re.DeletedAt(),De("design:type",Object)],gt.prototype,"deleted_at",void 0),xe([ne.BelongsTo(()=>ot),De("design:type",String)],gt.prototype,"user_id",void 0),gt=xe([se(Ne),oe("users_metadata"),ze(),de("5.0.1")],gt);class Log{static error(e,t,i){return Re(this,void 0,void 0,function*(){yield this.writeRaw("error",e,t,i)})}static info(e,t,i){return Re(this,void 0,void 0,function*(){yield this.writeRaw("info",e,t,i)})}static warn(e,t,i){return Re(this,void 0,void 0,function*(){yield this.writeRaw("warn",e,t,i)})}static writeRaw(e,t,i,r){return Re(this,void 0,void 0,function*(){var n;r&&w.console(null!==(n=this.colors[e])&&void 0!==n?n:b.White,e,t),Ne&&(yield ut.create({level:e,message:t,source:null!=i?i:""}).catch(w.catch))})}}Log.colors={error:b.Red,info:b.Cyan,warn:b.Yellow};class Loggable{get log(){return e=>Loggable.logInfo(this,e)}static get log(){return e=>this.logInfo(this,e)}get error(){return e=>Loggable.logError(this,e)}static get error(){return e=>this.logError(this,e)}static logError(e,t){var i,r;Log.error(null!==(r=null!==(i=null==t?void 0:t.message)&&void 0!==i?i:t)&&void 0!==r?r:"",this.source(e),Env.CONSOLE_ERROR)}static logInfo(e,t){Log.info(null!=t?t:"",this.source(e),Env.CONSOLE_ERROR)}static source(e){var t,i,r;const n=null!==(r=null!==(i=null===(t=null==e?void 0:e.constructor)||void 0===t?void 0:t.name)&&void 0!==i?i:null==e?void 0:e.name)&&void 0!==r?r:"null";return Env.BASE_NAME?`${Env.BASE_NAME}.${n}`:n}}class Config extends Loggable{static all(e){return Re(this,void 0,void 0,function*(){var t;const i=null!==(t=yield at.findAll({where:(null==e?void 0:e.length)?{key:{[ge.in]:e}}:{}}).catch(this.error))&&void 0!==t?t:[];return Object.fromEntries(i.map(e=>[e.key,e.value]))})}static del(e){return Re(this,void 0,void 0,function*(){return((yield at.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return Re(this,arguments,void 0,function*(e,t=""){const[i]=(yield at.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return i?i.value:t})}static set(e,t){return Re(this,void 0,void 0,function*(){const[i,r]=(yield at.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];i&&!r&&(i.value=t,yield i.save().catch(this.error))})}}class SessionStore extends _e{constructor(){super(),this.all=e=>Re(this,void 0,void 0,function*(){e=e||j;const t=yield pt.findAll({attributes:["session"],where:{expired:{[ge.gte]:Date.now()}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.session)),e()}),this.clear=e=>Re(this,void 0,void 0,function*(){yield pt.destroy().catch(j),e&&e()}),this.destroy=(e,t)=>Re(this,void 0,void 0,function*(){yield pt.destroy({where:{session:e}}).catch(j),t&&t()}),this.expired=()=>Re(this,void 0,void 0,function*(){yield pt.destroy({where:{expired:{[ge.lt]:Date.now()}}}).catch(j)}),this.get=(e,t)=>Re(this,void 0,void 0,function*(){t=t||j;const i=yield pt.findOne({where:{session:e,expired:{[ge.gte]:Date.now()}}}).catch(e=>(t(e),null));if(i){const e=JSON.parse(i.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield i.destroy().catch(j),void t(null)}return void t(null,e)}t(null)}),this.length=e=>Re(this,void 0,void 0,function*(){e&&e(null,(yield pt.count().catch(j))||0)}),this.set=(e,t,i)=>Re(this,void 0,void 0,function*(){i=i||j;const r=Date.now()+Env.API_SESSION_LIFETIME,n=JSON.stringify(t),[s,o]=(yield pt.findOrCreate({where:{session:e},defaults:{session:e,json:n,expired:r}}).catch(j))||[];s&&(o||(s.json=n,s.expired=r,yield s.save().catch(j))),i()}),this.loop=U(this.expired,3e4),this.loop.start()}}let vt=class Service{};vt=xe([Ee(Loggable)],vt);class AuthService extends vt{create(e){return Re(this,void 0,void 0,function*(){if(!Env.TOKEN_KEY)throw new n("TOKEN_KEY not found");const{id:t}=e,i=K(),r=yield Ze.create({secret:i,user_id:t}).catch(this.error);if(!r)throw new s;return{auth:r,token:fe.sign({id:t,secret:i},Env.TOKEN_KEY,this.options())}})}destroy(e){return Re(this,void 0,void 0,function*(){return!(!e||e.revoked_at)&&(e.revoked_at=new Date,yield e.save(),!0)})}renew(e){return Re(this,void 0,void 0,function*(){if(!Env.TOKEN_KEY)throw new n("TOKEN_KEY not found");const{decode:i}=yield this.verify(e,Env.API_TOKEN_RENEW/1e3);if(!i)throw new t("Invalid token");const{id:r,secret:s}=i;if(r&&s){const e=yield ot.findOne({where:{id:r,state:!0}}).catch(this.error);if(e){const t=yield Ze.findOne({where:{secret:s,user_id:e.id}}).catch(this.error);if(t&&!t.revoked_at){t.secret=K(),yield t.save().catch(this.error);return{auth:t,token:fe.sign({id:r,secret:t.secret},Env.TOKEN_KEY,this.options())}}}}throw new t("Invalid token")})}user(e){return Re(this,void 0,void 0,function*(){const{decode:i}=yield this.verify(e);if(!i)throw new t("Invalid token");const{id:r,secret:n}=i;if(r&&n){const e=yield ot.findOne({where:{id:r,state:!0}}).catch(this.error);if(e){const t=yield Ze.findOne({where:{secret:n,user_id:e.id}}).catch(this.error);if(t&&!t.revoked_at)return{auth:t,user:e}}}throw new t("Invalid token")})}options(){return{algorithm:"RS256",expiresIn:`${Env.TOKEN_TTL}ms`}}verify(e,i){return Re(this,void 0,void 0,function*(){if(!Env.TOKEN_CRT)throw new n("TOKEN_CRT not found");if(!e||e.split(".").length<3)throw new t("Invalid token");try{return{decode:fe.verify(e,Env.TOKEN_CRT,{clockTolerance:i})}}catch(e){throw new t("Invalid token")}})}key(e){return Re(this,void 0,void 0,function*(){if(!e)throw new t("Invalid token");const i=yield ot.findOne({where:{token:e,state:!0}}).catch(this.error);if(i){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield Ze.findOrCreate({where:{secret:t,user_id:i.id},defaults:{secret:t,user_id:i.id}}).catch(this.error))||[];if(r)return r.revoked_at&&(r.revoked_at=null,yield r.save().catch(this.error)),{auth:r,user:i}}throw new t("Invalid token")})}}class ModelService extends vt{constructor(e,t){var i,r;super(),this.attributes=[],this.permissions=[],this.search=[],this.model=e,(null==t?void 0:t.permissions)&&(this.permissions=t.permissions);const n=Object.keys(e.getAttributes());this.attributes=this.filterAttributes(n,null!==(i=null==t?void 0:t.attributes)&&void 0!==i?i:[]),this.search=this.filterAttributes(n,null!==(r=null==t?void 0:t.search)&&void 0!==r?r:this.attributes)}applySelect(e,t,i){if(!t)return;const r=null==e?void 0:e.getQuery(i?`${i}_select`:"select"),n=t.attributes,s=e=>n.includes(e);t.attributes=[],B(r)&&r.length&&t.attributes.push(...r.split(/\s*,\s*/g).filter(s)),t.attributes.length||(t.attributes=n)}applyOrders(e,t){if(!t)return;const i=null==e?void 0:e.getQuery("asc"),r=null==e?void 0:e.getQuery("desc"),n=[],s=t.attributes,o=e=>s.includes(e);B(i)&&i.length&&n.push(...i.split(/\s*,\s*/g).filter(o).map(e=>[e,"ASC"])),B(r)&&r.length&&n.push(...r.split(/\s*,\s*/g).filter(o).map(e=>[e,"DESC"])),n.length&&(t.order=n)}applyPagination(e,t){if(!t)return;const i=null==e?void 0:e.getQuery("limit"),r=null==e?void 0:e.getQuery("offset");D(t.limit)&&(t.limit=Env.MODEL_LIMIT,B(i)&&(t.limit=parseInt(i)||0),t.limit=M(t.limit,-1,Env.MODEL_LIMIT_MAX)),t.limit<0&&(t.limit=void 0),B(r)&&(t.offset=parseInt(r)||0,t.offset<0&&(t.offset=void 0))}applySearch(e,t){var i;if(!t)return;const r=null==e?void 0:e.getQuery("search");r&&B(r)&&(t.where=Object.assign(Object.assign({},null!==(i=t.where)&&void 0!==i?i:{}),{[ge.or]:this.search.map(e=>({[e]:{[ge.substring]:r}}))}))}applyWhere(e,t,i){var r,n;if(!t)return null;const s=null==e?void 0:e.getQuery(i?`${i}_where`:"where");if(!B(s))return null;const d=t.attributes,a=ve.parse(d,s);return D(a.error)?(t.where=Object.assign(Object.assign({},null!==(r=t.where)&&void 0!==r?r:{}),null!==(n=a.value)&&void 0!==n?n:{}),null):new o(a.error.join(", "))}countAll(e){return Re(this,void 0,void 0,function*(){var t,i;const{ctx:r,options:n={}}=e,s=L({},n);s.attributes=this.getAttributes(null!==(t=null==s?void 0:s.attributes)&&void 0!==t?t:[]),this.applySearch(r,s);const o=this.applyWhere(r,s);if(o)return null==r||r.error(o),0;this.applySelect(r,s);const a=null!==(i=yield this.model.count(Object.assign(Object.assign({},s),{distinct:!!s.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error))&&void 0!==i?i:0;return null==r||r.prepare(d.OK,{count:a}),a})}create(e){return Re(this,void 0,void 0,function*(){var t,i;const{body:r={},ctx:n,options:o={}}=e,a=L({},o),l=yield this.model.create(Object.assign({},L({},null!==(i=null===(t=null==n?void 0:n.req)||void 0===t?void 0:t.body)&&void 0!==i?i:{},r)),Object.assign(Object.assign({},a),{ctx:n})).catch(this.error);if(!l)return null==n||n.error(new s),null;const{primaryKeyAttribute:u}=this.model;return null==n||n.prepare(d.OK,{[u]:l.getDataValue(u)}),l})}delete(e){return Re(this,void 0,void 0,function*(){var t,i;const{ctx:r,id:s,options:o={}}=e,{primaryKeyAttribute:d}=this.model,l=null!==(t=null==r?void 0:r.getParam(d))&&void 0!==t?t:s;if(D(l))return null==r||r.error(new a),0;const u=L({},o),c=yield this.model.destroy(Object.assign(Object.assign(Object.assign({},u),{where:Object.assign(Object.assign({},null!==(i=u.where)&&void 0!==i?i:{}),{[d]:l}),individualHooks:!0}),{ctx:r})).catch(this.error);return c?(null==r||r.success("OK"),c):(null==r||r.error(new n),0)})}filterAttributes(e,t){if(F(t))return t.length?t.filter(t=>B(t)&&e.includes(t)):e;const{exclude:i,include:r}=t,n=D(r)?e:r.filter(t=>B(t)&&e.includes(t)),s=null!=i?i:[];return s.length?n.filter(e=>!s.includes(e)):n}findAll(e){return Re(this,void 0,void 0,function*(){var t,i;const{ctx:r,callback:n,limited:s,options:o={},query:a=!0}=e,l=L({},o);if(l.attributes=this.getAttributes(null!==(t=null==l?void 0:l.attributes)&&void 0!==t?t:[]),a&&this.applySelect(r,l),this.applyOrders(r,l),this.applyPagination(r,l),s&&(null!==(i=null==l?void 0:l.limit)&&void 0!==i?i:0)>Env.MODEL_LIMIT_MAX&&(l.limit=Env.MODEL_LIMIT_MAX),this.applySearch(r,l),a){const e=this.applyWhere(r,l);if(e)return null==r||r.error(e),{count:0,records:[]}}const[u,c]=yield Promise.all([this.model.count(Object.assign(Object.assign({},l),{distinct:!!l.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error).then(e=>null!=e?e:0),this.model.findAll(l).catch(this.error).then(e=>null!=e?e:[])]),p={count:u,records:n?yield n(c):c};return null==r||r.prepare(d.OK,p),p})}findOne(e){return Re(this,void 0,void 0,function*(){var t,i,r;const{callback:s,ctx:o,id:l,options:u={},query:c=!0}=e,{primaryKeyAttribute:p}=this.model,g=null!==(t=null==o?void 0:o.getParam(p))&&void 0!==t?t:l;if(D(g))return null==o||o.error(new a),null;const v=L({},u);v.attributes=this.getAttributes(null!==(i=null==v?void 0:v.attributes)&&void 0!==i?i:[]),c&&this.applySelect(o,v);const y=yield this.model.findOne(Object.assign(Object.assign({},v),{where:Object.assign(Object.assign({},null!==(r=null==v?void 0:v.where)&&void 0!==r?r:{}),{[p]:g})})).catch(this.error);return y?(null==o||o.prepare(d.OK,s?yield s(y):y.toJSON()),y):(null==o||o.error(new n),null)})}getAttributes(e){return this.filterAttributes(this.attributes,e)}include(e,t){var i;const r=H(t),{ctx:n}=null!=t?t:{};r.attributes=this.filterAttributes(Object.keys(e.getAttributes()),null!==(i=r.attributes)&&void 0!==i?i:[]),this.applySearch(n,r);const s=this.applyWhere(n,r,t.name);return s?(null==n||n.error(s),null):(this.applySelect(n,r,t.name),Object.assign({model:e},r))}name(){return this.model.tableName}sync(){return Re(this,void 0,void 0,function*(){if(!this.permissions.length)return;const e=this.name().toLowerCase(),t={description:"",state:!0};yield q(this.permissions,i=>Re(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=Y(e.replace(/_/g," ")," ");yield et.findOrCreate({where:{key:r},defaults:Object.assign({name:`${n} ${Y(i," ")}`,key:r,tags:n},t)})}))})}update(e){return Re(this,void 0,void 0,function*(){var t,i,r,n,s;const{ctx:o,body:d,id:l,options:u={}}=e,{primaryKeyAttribute:c}=this.model,p=null!==(t=null==o?void 0:o.getParam(c))&&void 0!==t?t:l;if(D(p))return null==o||o.error(new a),!1;const g=L({},u),[v]=null!==(s=yield this.model.update(Object.assign({},L({},null!==(r=null===(i=null==o?void 0:o.req)||void 0===i?void 0:i.body)&&void 0!==r?r:{},null!=d?d:{})),Object.assign(Object.assign(Object.assign({},g),{where:Object.assign(Object.assign({},null!==(n=null==g?void 0:g.where)&&void 0!==n?n:{}),{[c]:p}),individualHooks:!0}),{ctx:o})).catch(this.error))&&void 0!==s?s:[];return v?(null==o||o.success("OK"),!0):(null==o||o.success("Record not changed"),!1)})}}class UserService extends vt{getMetadata(e){return Re(this,void 0,void 0,function*(){var t,i;const[r]=null!==(t=yield gt.findOrCreate({where:{user_id:e},defaults:{user_id:e}}).catch(this.error))&&void 0!==t?t:[];return null!==(i=null==r?void 0:r.data)&&void 0!==i?i:{}})}getProfile(e){return Re(this,void 0,void 0,function*(){var t,i;const[r]=null!==(t=yield st.findOrCreate({where:{user_id:e},defaults:{user_id:e}}).catch(this.error))&&void 0!==t?t:[];return null!==(i=null==r?void 0:r.data)&&void 0!==i?i:{}})}getGroups(e){return Re(this,void 0,void 0,function*(){var t;return(null!==(t=yield it.findAll({attributes:["key"],where:{state:!0},include:[{model:rt,required:!0,where:{user_id:e}}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}getPermissions(e){return Re(this,void 0,void 0,function*(){var t;return(null!==(t=yield et.findAll({attributes:["key"],where:{state:!0},include:[{model:tt,required:!0,include:[{model:it,required:!0,attributes:["id"],where:{state:!0},include:[{model:rt,required:!0,where:{user_id:e}}]}]}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}}class Application extends l{constructor(e,t){super(e,L({},{cert:Env.HTTP_CRT,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:Env.HTTP_KEY,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 SessionStore,name:Env.API_SESSION_NAME,secret:Env.API_SESSION_SECRET,cookie:{maxAge:Env.API_SESSION_LIFETIME},genid:K}},null!=t?t:{})),this.hash=new x(Env.API_KEY_HASH)}error(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.error(e.message,t,Env.CONSOLE_ERROR)}log(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return Re(this,void 0,void 0,function*(){yield Ne.sync(),yield this.migrations(Ne),yield $(this.controllers,e=>Re(this,void 0,void 0,function*(){R(e.sync)&&(yield e.sync(this))})),this.authService=new AuthService,this.userService=new UserService,yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new ee({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>Re(this,void 0,void 0,function*(){t.url||(t.url=""),e.on("close",()=>{}),yield G(2e3)})))})}migrations(e){return Re(this,void 0,void 0,function*(){const t=[];yield $(Object.keys(e.models),i=>Re(this,void 0,void 0,function*(){var r;const n=e.models[i],s=n.version();if(!s)return;const[o,d]=null!==(r=yield ct.findOrCreate({where:{model:n.tableName},defaults:{model:n.tableName,version:""}}).catch(this.error))&&void 0!==r?r:[];o&&(d||o.version!=s)&&(o.version=s,yield o.save().catch(this.error),t.push(n))})),yield $(t,e=>Re(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}let yt=class BaseController extends V{constructor(){super(...arguments),this.permissions=[]}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")}session(e,t,i){return Re(this,void 0,void 0,function*(){i.auth&&i.user&&(i.user_agent?i.user_agent!=t&&i.regenerate(j):(i.user_agent=t,i.save(j))),e.next()})}sync(){return Re(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield $(this.permissions,i=>Re(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=Y(e.replace(/_/g," ")," ");yield et.findOrCreate({where:{key:r},defaults:Object.assign({name:`${n} ${Y(i," ")}`,key:r,tags:n},t)})}))})}};xe([Ce(0,u()),Ce(1,c("user-agent")),Ce(2,p()),De("design:type",Function),De("design:paramtypes",[r,String,Object]),De("design:returntype",Promise)],yt.prototype,"session",null),yt=xe([Ee(Loggable)],yt);let ht=class ModelController extends yt{constructor(){super(...arguments),this.attributes=[],this.permissions=["create","read","update","delete"],this.search=[]}countAll(e){return Re(this,void 0,void 0,function*(){return yield this.service.countAll(e)})}create(e){return Re(this,void 0,void 0,function*(){return yield this.service.create(e)})}delete(e){return Re(this,void 0,void 0,function*(){return yield this.service.delete(e)})}findAll(e){return Re(this,void 0,void 0,function*(){return yield this.service.findAll(e)})}findOne(e){return Re(this,void 0,void 0,function*(){return yield this.service.findOne(e)})}include(e,t){return this.service.include(e,t)}sync(){return Re(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield $(this.permissions,i=>Re(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=Y(e.replace(/_/g," ")," ");yield et.findOrCreate({where:{key:r},defaults:Object.assign({name:`${n} ${Y(i," ")}`,key:r,tags:n},t)})})),this.service=new ModelService(this.model,{attributes:this.attributes.length?this.attributes:void 0,search:this.search.length?this.search:void 0})})}update(e){return Re(this,void 0,void 0,function*(){return yield this.service.update(e)})}name(){return this.model.tableName}};ht=xe([g(yt)],ht);let mt=class AuditsController extends ht{constructor(){super(...arguments),this.model=dt,this.permissions=["read"]}all(e,t,i){return Re(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 Re(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}};xe([v(),He(),Be(),Ce(0,u()),Ce(1,y("type")),Ce(2,y("table")),De("design:type",Function),De("design:paramtypes",[r,String,String]),De("design:returntype",Promise)],mt.prototype,"all",null),xe([v("/:id"),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],mt.prototype,"get",null),mt=xe([h("/audits"),g(ht)],mt);let _t=class AuthController extends yt{constructor(e){super(),this.authService=e}login(e,i,r,n,s,o){return Re(this,void 0,void 0,function*(){var d;yield G(Env.SLEEP_AUTH);const a=yield ot.findOne({where:{[ge.or]:[{email:r},{username:r}]}}).catch(this.error);if(!a)return e.error(new t("Invalid credentials")),o.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const l=yield nt.findOne({where:{user_id:a.id,state:!0}}).catch(this.error);if(!l||!me(n,l.value))return e.error(new t("Invalid credentials")),o.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const u=yield Xe.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.error(new t("Invalid credentials")),o.emit("auth.failure",{ctx:e,user:a}),void this.emit("auth.failure",{ctx:e,user:a});const{auth:c,token:p}=null!==(d=yield this.authService.create(a).catch(t=>{e.error(t),o.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e})}))&&void 0!==d?d:{};c&&p&&(c.user_agent=i,c.ip_address=e.getIp(),yield c.save().catch(this.error),Env.API_TOKEN_COOKIE_SET&&e.setCookie(Env.API_TOKEN_COOKIE,p,{maxAge:s?Env.TOKEN_TTL:void 0}),e.json({token:p}),o.emit("auth.login",{ctx:e,auth:c,user:a}),this.emit("auth.login",{ctx:e,auth:c,user:a}))})}logout(e,i,r,n){return Re(this,void 0,void 0,function*(){if(yield this.authService.destroy(i))return Env.API_TOKEN_COOKIE_SET&&e.clearCookie(Env.API_TOKEN_COOKIE),e.success("OK"),n.emit("auth.logout",{auth:i,ctx:e,user:r}),void this.emit("auth.logout",{auth:i,ctx:e,user:r});e.error(new t("Access Denied"))})}renew(e,t,i,r){return Re(this,void 0,void 0,function*(){var n;const{auth:s,token:o}=null!==(n=yield this.authService.renew(i).catch(t=>{e.error(t)}))&&void 0!==n?n:{};s&&o&&(s.user_agent=t,yield s.save().catch(this.error),e.json({token:o}),r.emit("auth.renew",{auth:s,ctx:e}),this.emit("auth.renew",{auth:s,ctx:e}))})}user(e,t){return Re(this,void 0,void 0,function*(){const{groups:i,permissions:r,profile:n}=e.req;if(!i||!r)return e.error(new s);e.json(Object.assign(Object.assign({},W(t.toJSON(),["username","description"])),{groups:i,permissions:r,profile:n}))})}};xe([m("/login"),_(e=>({username:e.string().min(3).required(),password:e.string().min(5).required(),remember:e.boolean().parse().empty(!1)})),Ce(0,u()),Ce(1,c("user-agent")),Ce(2,f("username")),Ce(3,f("password")),Ce(4,f("remember")),Ce(5,E()),De("design:type",Function),De("design:paramtypes",[r,String,String,String,Boolean,Application]),De("design:returntype",Promise)],_t.prototype,"login",null),xe([v("/logout"),He(),Ce(0,u()),Ce(1,qe()),Ce(2,We()),Ce(3,E()),De("design:type",Function),De("design:paramtypes",[r,Ze,ot,Application]),De("design:returntype",Promise)],_t.prototype,"logout",null),xe([m("/renew"),_(e=>({token:e.string().required()})),Ce(0,u()),Ce(1,c("user-agent")),Ce(2,f("token")),Ce(3,E()),De("design:type",Function),De("design:paramtypes",[r,String,String,Application]),De("design:returntype",Promise)],_t.prototype,"renew",null),xe([v(),v("/me"),He(),Ce(0,u()),Ce(1,We()),De("design:type",Function),De("design:paramtypes",[r,ot]),De("design:returntype",Promise)],_t.prototype,"user",null),_t=xe([h("/auth"),g(yt),Ce(0,Ae(AuthService)),De("design:paramtypes",[AuthService])],_t);let ft=class CrudController extends ht{constructor(){super(...arguments),this._crud={}}CrudArgumentsCountAll(e){return{ctx:e}}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}}CrudValidateCreate(){return this._crud}CrudValidateUpdate(){return this._crud}add(e){return Re(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return Re(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}rows(e){return Re(this,void 0,void 0,function*(){yield this.countAll(this.CrudArgumentsCountAll(e))})}del(e){return Re(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return Re(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return Re(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validate(e,t){return Re(this,void 0,void 0,function*(){var i,r;const n=J.object(t).parse(),{error:s,message:d,value:a}=yield n.validateAsync(null!==(r=null===(i=e.req)||void 0===i?void 0:i.body)&&void 0!==r?r:{});if(s)return e.error(new o(null!=d?d:s));e.req.body=a,e.next()})}validateCreate(e){return Re(this,void 0,void 0,function*(){const t=this.CrudValidateCreate();if(t==this._crud)return e.error(new s);yield this.validate(e,t)})}validateUpdate(e){return Re(this,void 0,void 0,function*(){const t=this.CrudValidateUpdate();if(t==this._crud)return e.error(new s);yield this.validate(e,t)})}};xe([m(),He(),Ue(),A("validateCreate"),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"add",null),xe([v(),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"all",null),xe([v("/count"),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"rows",null),xe([S("/:id"),He(),Ke(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"del",null),xe([v("/:id"),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"get",null),xe([O("/:id"),He(),Me(),A("validateUpdate"),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"set",null),xe([Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"validateCreate",null),xe([Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"validateUpdate",null),ft=xe([g(ht)],ft);let Et=class FilesController extends yt{constructor(){super(...arguments),this.directory=Env.API_HTTP_PUBLIC||"./",this.permissions=["delete","download","edit","list","read","rename","upload","write"]}files(e){return Re(this,void 0,void 0,function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const i=be(this.directory,t);if(!Se(i)||!Oe(i).isDirectory())return e.error(new n);let r;return r=Te(i),r=r.map(e=>this.info(be(i,e))),r=r.filter(Q),Object.assign(Object.assign({},this.info(i)),{files:r})})}info(e){if(!Se(e))return null;const t=Oe(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 Re(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=Y(e.replace(/_/g," ")," "),i={description:"",state:!0};yield $(this.permissions,r=>Re(this,void 0,void 0,function*(){const n=`${e}.${r}`;yield et.findOrCreate({where:{key:n},defaults:Object.assign({name:`${t} ${Y(r," ")}`,key:n,tags:t},i)})}))})}};xe([v("/path"),v("/path/*path"),He(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],Et.prototype,"files",null),Et=xe([h("/files"),g(yt)],Et);let At=class ForgotController extends yt{check(e,t){return Re(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i||!i.user)return e.error(new n);i.secret=z(),yield i.save(),e.json({token:i.secret})})}forgot(e,t,i){return Re(this,void 0,void 0,function*(){yield G(Env.SLEEP_FORGOT);const r=t,s=yield ot.findOne({where:{[ge.or]:[{email:r},{username:t}]}}).catch(this.error);if(!s)return e.error(new n);const o=z(),d=Date.now()+6e4*Env.API_TOKEN_FORGOT,a=yield lt.create({token:o,timestamp:d,state:!0,user_id:s.id});e.success("OK"),i.emit("forgot.send",{ctx:e,forgot:a,user:s}),this.emit("forgot.send",{ctx:e,forgot:a,user:s})})}reset(e,t,i,r){return Re(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i)return e.error(new n);i.state=!1,yield i.save().catch(this.error),yield i.user.save().catch(this.error),e.success("OK"),r.emit("forgot.reset",{ctx:e,user:i.user}),this.emit("forgot.reset",{ctx:e,user:i.user})})}find(e){return Re(this,void 0,void 0,function*(){return yield lt.findOne({where:{token:e,state:!0},include:[{model:ot,required:!0}]}).catch(this.error)})}};xe([v("/check"),_(e=>({token:e.string().required()})),Ce(0,u()),Ce(1,f("token")),De("design:type",Function),De("design:paramtypes",[r,String]),De("design:returntype",Promise)],At.prototype,"check",null),xe([m(),_(e=>({username:e.string().min(4).required()})),Ce(0,u()),Ce(1,f("username")),Ce(2,E()),De("design:type",Function),De("design:paramtypes",[r,String,Application]),De("design:returntype",Promise)],At.prototype,"forgot",null),xe([m("/reset"),_(e=>({token:e.string().required(),password:e.string().min(5).required()})),Ce(0,u()),Ce(1,f("token")),Ce(2,f("password")),Ce(3,E()),De("design:type",Function),De("design:paramtypes",[r,String,String,Application]),De("design:returntype",Promise)],At.prototype,"reset",null),At=xe([h("/forgot"),g(yt)],At);let St=class GroupsController extends ft{constructor(){super(...arguments),this.model=it,this.schemaCreate={name:J.string().required(),key:J.string().required(),tags:J.string().empty(""),description:J.string().empty(""),state:J.boolean().parse().required()},this.schemaUpdate={name:J.string().empty(),tags:J.string().empty(),description:J.string().empty(),state:J.boolean().parse().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudalidateUpdate(){return this.schemaUpdate}};St=xe([h("/groups"),g(ft)],St);let Ot=class GroupsPermissionsController extends ht{constructor(){super(...arguments),this.model=tt,this.permissions=[]}all(e,t){return Re(this,void 0,void 0,function*(){const i=this.include(et,{ctx:e,required:!0});i&&(yield this.findAll({ctx:e,options:{where:{group_id:t},include:[i]},callback:e=>e.map(e=>e.permission),query:!1}))})}set(e,t,i){return Re(this,void 0,void 0,function*(){const r=yield it.findByPk(t,{attributes:["id"]}).catch(this.error);if(!r)return e.error(new n);const s=r.id,o=[];yield $(X(i),t=>Re(this,void 0,void 0,function*(){var i;if(!(yield et.count({where:{id:t}})))return;const[r]=null!==(i=yield tt.findOrCreate(Object.assign({where:{group_id:s,permission_id:t},defaults:{group_id:s,permission_id:t}},{ctx:e})).catch(this.error))&&void 0!==i?i:[];r&&o.push(t)})),yield tt.destroy(Object.assign({where:{group_id:s,permission_id:{[ge.notIn]:o}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}};xe([v("/:id/permissions"),He(),Be("groups"),Ce(0,u()),Ce(1,T("id")),De("design:type",Function),De("design:paramtypes",[r,String]),De("design:returntype",Promise)],Ot.prototype,"all",null),xe([O("/:id/permissions"),He(),Me("groups"),_(e=>({permissions:e.array(e.string())})),Ce(0,u()),Ce(1,T("id")),Ce(2,f("permissions")),De("design:type",Function),De("design:paramtypes",[r,String,Array]),De("design:returntype",Promise)],Ot.prototype,"set",null),Ot=xe([h("/groups"),g(ht)],Ot);let Tt=class LogsController extends ht{constructor(){super(...arguments),this.model=ut,this.permissions=["read"]}all(e){return Re(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{order:[["created_at","DESC"]]},limited:!0})})}};xe([v(),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],Tt.prototype,"all",null),Tt=xe([h("/logs"),g(ht)],Tt);let It=class PermissionsController extends ft{constructor(){super(...arguments),this.model=et,this.schemaCreate={name:J.string().required(),key:J.string().required(),tags:J.string().empty(""),description:J.string().empty(""),state:J.boolean().parse().required()},this.schemaUpdate={name:J.string().empty(),tags:J.string().empty(),description:J.string().empty(),state:J.boolean().parse().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}};It=xe([h("/permissions"),g(ft)],It);let Pt=class RegisterController extends yt{register(e,t,i){return Re(this,void 0,void 0,function*(){yield G(Env.SLEEP_REGISTRY);const{name:r,date:n,email:o,username:d,password:a,confirm:l}=t,u=d||o,c=C(a);if(yield ot.count({where:{[ge.or]:[{email:o},{username:u}]}}).catch(this.error))return e.error("INVALID EMAIL OR USERNAME");if(c!=C(l))return e.error("INVALID PASSWORD");const p=yield ot.create({name:r,email:o,username:u,password:c,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!p)return e.error(new s);const g=yield Xe.create({token:yield this.getId(),user_id:p.id,state:!0}).catch(this.error);if(!g)return yield p.destroy().catch(this.error),e.error(new s);e.success("OK"),i.emit("register.user",{ctx:e,register:g,user:p}),this.emit("register.user",{ctx:e,register:g,user:p})})}confirm(e,t,i){return Re(this,void 0,void 0,function*(){const r=yield Xe.findOne({where:{token:t,state:!0},include:[{model:ot,required:!0}]}).catch(this.error);if(!r)return e.error(new n);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 Re(this,void 0,void 0,function*(){const r=t,s=yield Xe.findOne({where:{state:!0},include:[{model:ot,required:!0,where:{[ge.or]:[{email:r},{username:t}]}}]}).catch(this.error);if(!s)return e.error(new n);e.success("OK"),i.emit("register.send",{ctx:e,register:s,user:s.user}),this.emit("register.send",{ctx:e,register:s,user:s.user})})}getId(){return Re(this,void 0,void 0,function*(){const e=K();return(yield Xe.count({where:{token:e}}))?this.getId():e})}};xe([m(),_(e=>({name:e.string().required(),date:e.date().required(),email:e.string().email().required(),username:e.string().min(4).empty(),password:e.string().min(5).required(),confirm:e.string().min(5).required()})),Ce(0,u()),Ce(1,f()),Ce(2,E()),De("design:type",Function),De("design:paramtypes",[r,Object,Application]),De("design:returntype",Promise)],Pt.prototype,"register",null),xe([m("/confirm"),_(e=>({token:e.string().required()})),Ce(0,u()),Ce(1,f("token")),Ce(2,E()),De("design:type",Function),De("design:paramtypes",[r,String,Application]),De("design:returntype",Promise)],Pt.prototype,"confirm",null),xe([m("/send"),_(e=>({username:e.string().min(4).required()})),Ce(0,u()),Ce(1,f("username")),Ce(2,E()),De("design:type",Function),De("design:paramtypes",[r,String,Application]),De("design:returntype",Promise)],Pt.prototype,"send",null),Pt=xe([h("/register"),g(yt)],Pt);let wt=class SetupController extends yt{setup(e){return Re(this,void 0,void 0,function*(){var t;if(yield ot.count())return e.success("OK");const i=yield ot.create({name:"Admin",email:"admin@localhost.com",username:"admin",description:"DEFAULT",state:!0},Object.assign({},{ctx:e}));yield nt.create({value:"admin",state:!0,user_id:i.id});const r={description:"API CORE",state:!0},n=yield it.create(Object.assign({name:"Admin",key:"admin",tags:"Admin"},r),Object.assign({},{ctx:e}));yield rt.create({user_id:i.id,group_id:n.id},Object.assign({},{ctx:e})),yield it.create(Object.assign({name:"User",key:"user",tags:"user"},r),Object.assign({},{ctx:e}));const s=null!==(t=yield et.findAll({where:{state:!0}}).catch(this.error))&&void 0!==t?t:[];yield $(s,t=>Re(this,void 0,void 0,function*(){yield tt.create({group_id:n.id,permission_id:t.id},Object.assign({},{ctx:e}))})),e.success("OK")})}};xe([v(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],wt.prototype,"setup",null),wt=xe([h("/setup"),g(yt)],wt);let bt=class UsersController extends ht{constructor(){super(),this.model=ot,this.path=Env.API_HTTP_PUBLIC+"/avatar",Env.API_HTTP_PUBLIC&&Se(Env.API_HTTP_PUBLIC)&&!Se(this.path)&&Ie(this.path)}avatar(e,t){return Re(this,void 0,void 0,function*(){var i,r;const n=e.getFiles();if(n.file&&n.file.length){const{filename:o,path:d}=null!==(i=n.file[0])&&void 0!==i?i:{};if(o){const[i]=null!==(r=yield st.findOrCreate(Object.assign({where:{user_id:t.id},defaults:{user_id:t.id}},{ctx:e})).catch(this.error))&&void 0!==r?r:[];if(!i)return Pe(d).isFile()&&we(d),e.error(new s);const n=this.path+"/"+i.data.avatar;if(Se(n)&&Pe(n).isFile()&&we(n),i.changed("data",!0),i.data.avatar=o,yield i.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK")}}e.success("Record not Changed")})}token_new(){return Re(this,void 0,void 0,function*(){var e;const t=K();return(null!==(e=yield this.model.count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t})}add(e){return Re(this,void 0,void 0,function*(){yield this.create({ctx:e})})}all(e){return Re(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}rows(e){return Re(this,void 0,void 0,function*(){yield this.countAll({ctx:e})})}del(e,t,i){return Re(this,void 0,void 0,function*(){if(i.id==t)return e.error(new n);yield this.delete({ctx:e})})}get(e){return Re(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e){return Re(this,void 0,void 0,function*(){yield this.update({ctx:e})})}};xe([m("/avatar"),He(),I({file:{count:1,path:`${Env.API_HTTP_PUBLIC}/avatar`,types:["image/bmp","image/jpeg","image/png"],size:32}}),Ce(0,u()),Ce(1,We()),De("design:type",Function),De("design:paramtypes",[r,ot]),De("design:returntype",Promise)],bt.prototype,"avatar",null),xe([m(),He(),Ue(),_(e=>({name:e.string().required(),email:e.string().email().required(),username:e.string().min(3).required(),description:e.string().empty(""),state:e.boolean().parse().empty(!0)})),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],bt.prototype,"add",null),xe([v(),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],bt.prototype,"all",null),xe([v("/count"),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],bt.prototype,"rows",null),xe([S("/:id"),He(),Ke(),Ce(0,u()),Ce(1,T("id")),Ce(2,We()),De("design:type",Function),De("design:paramtypes",[r,String,ot]),De("design:returntype",Promise)],bt.prototype,"del",null),xe([v("/:id"),He(),Be(),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],bt.prototype,"get",null),xe([O("/:id"),He(),Me(),_(e=>({name:e.string().empty(),email:e.string().email().empty(),username:e.string().min(3).empty(),description:e.string().empty(),state:e.boolean().parse().empty()})),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],bt.prototype,"set",null),bt=xe([h("/users"),g(ht),De("design:paramtypes",[])],bt);let xt=class UsersGroupsController extends ht{constructor(){super(...arguments),this.model=rt,this.permissions=[]}all(e,t){return Re(this,void 0,void 0,function*(){if(!(yield ot.findByPk(t,{attributes:["id"]}).catch(this.error)))return e.error(new n("User Not Found"));const i=this.include(it,{ctx:e,required:!0});i&&(yield this.findAll({ctx:e,options:{where:{user_id:t},include:[i]},callback:e=>e.map(e=>e.group),query:!1}))})}set(e,t,i){return Re(this,void 0,void 0,function*(){const r=yield ot.findByPk(t,{attributes:["id"]}).catch(this.error);if(!r)return e.error(new n("User Not Found"));const s=r.id,o=[];yield $(X(i),t=>Re(this,void 0,void 0,function*(){var i;if(!(yield it.count({where:{id:t}})))return;const[r]=null!==(i=yield rt.findOrCreate(Object.assign({where:{user_id:s,group_id:t},defaults:{user_id:s,group_id:t}},{ctx:e})).catch(this.error))&&void 0!==i?i:[];r&&o.push(t)})),yield rt.destroy(Object.assign({where:{user_id:s,group_id:{[ge.notIn]:o}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}};xe([v("/:id/groups"),He(),Be("users"),Ce(0,u()),Ce(1,T("id")),De("design:type",Function),De("design:paramtypes",[r,String]),De("design:returntype",Promise)],xt.prototype,"all",null),xe([O("/:id/groups"),He(),Me("users"),_(e=>({groups:e.array(e.string())})),Ce(0,u()),Ce(1,T("id")),Ce(2,f("groups")),De("design:type",Function),De("design:paramtypes",[r,String,Array]),De("design:returntype",Promise)],xt.prototype,"set",null),xt=xe([h("/users"),g(ht)],xt);let Ct=class UsersProfilesController extends ht{constructor(){super(...arguments),this.model=st,this.permissions=[]}all(e){return Re(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}get(e,t){return Re(this,void 0,void 0,function*(){var i;const[r]=null!==(i=yield st.findOrCreate(Object.assign({where:{user_id:t},defaults:{user_id:t}},{ctx:e})).catch(this.error))&&void 0!==i?i:[];if(!r)return e.error(new n);e.json(r)})}set(e,t,i){return Re(this,void 0,void 0,function*(){var r;const s=yield ot.findByPk(t,{attributes:["id"]}).catch(this.error);if(!s)return e.error(new n);const o=s.id,d=Z(i,e=>String(e)),[a,l]=null!==(r=yield st.findOrCreate(Object.assign({where:{user_id:o},defaults:{data:d,user_id:o}},{ctx:e})).catch(this.error))&&void 0!==r?r:[];a&&!l&&(a.changed("data",!0),a.data=L(a.data,d),yield a.save(Object.assign({},{ctx:e})).catch(this.error)),e.success("OK")})}};xe([v("/profiles"),He(),Be("users"),Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],Ct.prototype,"all",null),xe([v("/:id/profiles"),He(),Be("users"),Ce(0,u()),Ce(1,T("id")),De("design:type",Function),De("design:paramtypes",[r,String]),De("design:returntype",Promise)],Ct.prototype,"get",null),xe([O("/:id/profiles"),He(),Me("users"),Ce(0,u()),Ce(1,T("id")),Ce(2,f()),De("design:type",Function),De("design:paramtypes",[r,String,Object]),De("design:returntype",Promise)],Ct.prototype,"set",null),Ct=xe([h("/users"),g(ht)],Ct);export{Application,ze as Audit,dt as AuditModel,mt as AuditsController,_t as AuthController,AuthService,yt as BaseController,Ue as CanCreate,Ke as CanDelete,Be as CanRead,Me as CanUpdate,Config,at as ConfigModel,ft as CrudController,Env,Et as FilesController,At as ForgotController,lt as ForgotModel,it as GroupModel,tt as GroupPermissionModel,St as GroupsController,Ot as GroupsPermissionsController,Le as HasGroups,Fe as HasPermissions,He as IsAuthenticated,Log,ut as LogModel,Loggable,Tt as LogsController,ct as MigrationModel,ht as ModelController,ModelService,et as PermissionModel,It as PermissionsController,Pt as RegisterController,Xe as RegisterModel,qe as ReqAuth,Ye as ReqGroup,$e as ReqGroups,Ge as ReqPermission,Ve as ReqPermissions,We as ReqUser,vt as Service,pt as SessionModel,SessionStore,wt as SetupController,Ze as UserAuthModel,rt as UserGroupModel,gt as UserMetadataModel,ot as UserModel,nt as UserPasswordModel,st as UserProfileModel,UserService,bt as UsersController,xt as UsersGroupsController,Ct as UsersProfilesController,je as canFactory,Ne as sequelize};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrewcaires/api",
3
- "version": "5.0.4",
3
+ "version": "5.0.5",
4
4
  "description": "Simple api for small applications using express, jsonwebtoken, sequelize and websocket",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs.js",
@@ -51,7 +51,7 @@
51
51
  "@andrewcaires/express": "^2.1.1",
52
52
  "@andrewcaires/node": "^1.3.1",
53
53
  "@andrewcaires/sequelize": "^3.0.2",
54
- "@andrewcaires/utils.js": "^0.4.31",
54
+ "@andrewcaires/utils.js": "^0.4.32",
55
55
  "bcrypt": "^6.0.0",
56
56
  "cors": "^2.8.6",
57
57
  "dotenv": "^17.3.1",