@andrewcaires/api 5.0.0 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/api v5.0.0
2
+ * @andrewcaires/api v5.0.2
3
3
  * Simple api for small applications using express, jsonwebtoken, sequelize and websocket
4
4
  * (c) 2026 Andrew Caires
5
5
  * @license: MIT
6
6
  */
7
- "use strict";var e,t=require("@andrewcaires/express"),r=require("@andrewcaires/node"),o=require("@andrewcaires/utils.js"),i=require("ws"),s=require("@andrewcaires/sequelize"),n=require("dotenv"),d=require("bcrypt"),l=require("express-session"),a=require("@andrewcaires/decorator"),p=require("jsonwebtoken"),u=require("fs"),c=require("path");function g(e,t,r,o){var i,s=arguments.length,n=s<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,o);else for(var d=e.length-1;d>=0;d--)(i=e[d])&&(n=(s<3?i(n):s>3?i(t,r,n):i(t,r))||n);return s>3&&n&&Object.defineProperty(t,r,n),n}function v(e,t){return function(r,o){t(r,o,e)}}function y(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function x(e,t,r,o){return new(r||(r=Promise))(function(i,s){function n(e){try{l(o.next(e))}catch(e){s(e)}}function d(e){try{l(o.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?i(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",""),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.TOKEN_CRT=e.getFile("TOKEN_CRT"),Env.TOKEN_KEY=e.getFile("TOKEN_KEY"),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_MODEL_LIMIT=e.getInt("API_MODEL_LIMIT",10),Env.API_MODEL_LIMIT_MAX=e.getInt("API_MODEL_LIMIT_MAX",500),Env.API_SLEEP_AUTH=e.getMs("API_SLEEP_AUTH","2s"),Env.API_SLEEP_FORGOT=e.getMs("API_SLEEP_FORGOT","5s"),Env.API_SLEEP_REGISTRY=e.getMs("API_SLEEP_REGISTRY","5s"),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_LIFETIME=e.getMs("API_TOKEN_LIFETIME","1d"),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 h=new s.Sequelize({uri:Env.DATABASE_URI,logging:Env.DATABASE_LOG,prefix:Env.DATABASE_PREFIX,timezone:Env.DATABASE_TIMEZONE}),m=e=>r=>(i,s,n)=>{t.Use(i=>x(void 0,void 0,void 0,function*(){var s;let n=null!=r?r:"";o.isUndefined(r)&&(n=o.isFunction(i.controller.name)?i.controller.name():null===(s=i.controller.constructor)||void 0===s?void 0:s.name);const{permissions:d}=i.req;if((null!=d?d:[]).includes(`${n}.${e}`))return i.next();i.error(new t.UnauthorizedError("Access Denied"))}))(i,s,n)},C=m("create"),E=m("delete"),A=m("read"),M=m("update"),_=()=>(e,r,o)=>{t.Use(e=>x(void 0,void 0,void 0,function*(){yield(e=>x(void 0,void 0,void 0,function*(){var r,o,i,s;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!==(i=null===(o=d||u)||void 0===o?void 0:o.split(" "))&&void 0!==i?i:["",""];if(!(p||g&&c.toLowerCase()==Env.API_TOKEN_HEADER_KEY))return e.error(new t.UnauthorizedError("Invalid token"));const{authService:v,userService:y}=e.app,{auth:x,user:h}=null!==(s=yield(p?v.key(p.toString()):v.user(g)).catch(t=>{e.error(t)}))&&void 0!==s?s:{};if(x&&h){if(!p&&x.user_agent&&x.user_agent!=l)return e.error(new t.UnauthorizedError("Invalid token"));e.req.auth=x,e.req.user=h,e.req.groups=yield y.getGroups(h.id),e.req.permissions=yield y.getPermissions(h.id),e.req.profile=yield y.getProfile(h.id),e.next()}}))(e)}))(e,r,o)},f=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)}),I=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:[]}),U=t.parameterFactory(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.user}),T=(e,r,o)=>{var i,s,n,d,l,a,p,u,c;const g=o.ctx instanceof t.Context?o.ctx:null,v=null!==(d=null!==(n=null===(s=null===(i=null==g?void 0:g.req)||void 0===i?void 0:i.user)||void 0===s?void 0:s.id)&&void 0!==n?n:o.user_id)&&void 0!==d?d:null,y={type:e,model:null!==(l=null==r?void 0:r.getTableName())&&void 0!==l?l:null,state:!0,user_id:v};return g?Object.assign(Object.assign({},y),{full_url:null!==(a=null==g?void 0:g.getUrl())&&void 0!==a?a:"",ip_address:null!==(p=null==g?void 0:g.getIp())&&void 0!==p?p:"",user_agent:null!==(c=null===(u=null==g?void 0:g.req)||void 0===u?void 0:u.headers["user-agent"])&&void 0!==c?c:""}):y},w={afterCreate:(e,t)=>x(void 0,void 0,void 0,function*(){const i=o.getConstructor(e),{primaryKeyAttribute:s}=null!=i?i:{};yield exports.AuditModel.create(Object.assign(Object.assign({},T("CREATE",i,t)),{record:s?e.getDataValue(s):null,data:e.toJSON()})).catch(r.Log.catch)}),afterUpdate:(e,t)=>x(void 0,void 0,void 0,function*(){const i=o.getConstructor(e),{primaryKeyAttribute:s}=null!=i?i:{},n={},d=e.changed();d&&d.forEach(t=>n[t]=e.getDataValue(t)),yield exports.AuditModel.create(Object.assign(Object.assign({},T("UPDATE",i,t)),{record:s?e.getDataValue(s):null,data:n,previously:e.previous()})).catch(r.Log.catch)}),afterDestroy:(e,t)=>x(void 0,void 0,void 0,function*(){const i=o.getConstructor(e),{primaryKeyAttribute:s}=null!=i?i:{};yield exports.AuditModel.create(Object.assign(Object.assign({},T("DELETE",i,t)),{record:s?e.getDataValue(s):null,data:e.toJSON()})).catch(r.Log.catch)})},b=e=>(o.isUndefined(e)&&(e=Env.DATABASE_AUDIT),s.Hooks(e?w:{}));exports.RegisterModel=class RegisterModel extends s.Model{},g([s.Column.UUID(7),y("design:type",String)],exports.RegisterModel.prototype,"id",void 0),g([s.Column.String(),y("design:type",String)],exports.RegisterModel.prototype,"secret",void 0),g([s.Column.FullDate(),y("design:type",Number)],exports.RegisterModel.prototype,"expired_at",void 0),g([s.Column.Boolean(),y("design:type",Boolean)],exports.RegisterModel.prototype,"state",void 0),g([s.Column.CreatedAt(),y("design:type",Date)],exports.RegisterModel.prototype,"created_at",void 0),g([s.Column.UpdatedAt(),y("design:type",Date)],exports.RegisterModel.prototype,"updated_at",void 0),g([s.Column.DeletedAt(),y("design:type",Object)],exports.RegisterModel.prototype,"deleted_at",void 0),g([s.Association.BelongsTo(()=>exports.UserModel),y("design:type",String)],exports.RegisterModel.prototype,"user_id",void 0),exports.RegisterModel=g([s.Database(h),s.ModelName("register"),s.Version("5.0.0")],exports.RegisterModel),exports.UserAuthModel=class UserAuthModel extends s.Model{},g([s.Column.UUID(7),y("design:type",String)],exports.UserAuthModel.prototype,"id",void 0),g([s.Column.String(),y("design:type",String)],exports.UserAuthModel.prototype,"secret",void 0),g([s.Column.String(),y("design:type",String)],exports.UserAuthModel.prototype,"ip_address",void 0),g([s.Column.String(),y("design:type",String)],exports.UserAuthModel.prototype,"user_agent",void 0),g([s.Column.FullDate(),y("design:type",Object)],exports.UserAuthModel.prototype,"revoked_at",void 0),g([s.Column.CreatedAt(),y("design:type",Date)],exports.UserAuthModel.prototype,"created_at",void 0),g([s.Column.UpdatedAt(),y("design:type",Date)],exports.UserAuthModel.prototype,"updated_at",void 0),g([s.Column.DeletedAt(),y("design:type",Object)],exports.UserAuthModel.prototype,"deleted_at",void 0),g([s.Association.BelongsTo(()=>exports.UserModel),y("design:type",String)],exports.UserAuthModel.prototype,"user_id",void 0),exports.UserAuthModel=g([s.Database(h),s.ModelName("users_auth"),s.Version("5.0.0")],exports.UserAuthModel),exports.PermissionModel=class PermissionModel extends s.Model{},g([s.Column.UUID(7),y("design:type",String)],exports.PermissionModel.prototype,"id",void 0),g([s.Column.String(),y("design:type",String)],exports.PermissionModel.prototype,"name",void 0),g([s.Column.String(),s.Unique(!0),y("design:type",String)],exports.PermissionModel.prototype,"key",void 0),g([s.Column.String(),y("design:type",String)],exports.PermissionModel.prototype,"tag",void 0),g([s.Column.Text(),y("design:type",String)],exports.PermissionModel.prototype,"description",void 0),g([s.Column.Boolean(),y("design:type",Boolean)],exports.PermissionModel.prototype,"state",void 0),g([s.Column.CreatedAt(),y("design:type",Date)],exports.PermissionModel.prototype,"created_at",void 0),g([s.Column.UpdatedAt(),y("design:type",Date)],exports.PermissionModel.prototype,"updated_at",void 0),g([s.Column.DeletedAt(),y("design:type",Object)],exports.PermissionModel.prototype,"deleted_at",void 0),g([s.HasMany(()=>exports.GroupPermissionModel,"permission_id"),y("design:type",Array)],exports.PermissionModel.prototype,"groups_permissions",void 0),exports.PermissionModel=g([s.Database(h),s.ModelName("permission"),b(),s.Version("5.0.0")],exports.PermissionModel),exports.GroupPermissionModel=class GroupPermissionModel extends s.Model{},g([s.Column.CreatedAt(),y("design:type",Date)],exports.GroupPermissionModel.prototype,"created_at",void 0),g([s.Association.BelongsTo(()=>exports.GroupModel),y("design:type",String)],exports.GroupPermissionModel.prototype,"group_id",void 0),g([s.Association.BelongsTo(()=>exports.PermissionModel),y("design:type",String)],exports.GroupPermissionModel.prototype,"permission_id",void 0),exports.GroupPermissionModel=g([s.Database(h),s.ModelName("groups_permissions"),b(),s.Version("5.0.0")],exports.GroupPermissionModel),exports.GroupModel=class GroupModel extends s.Model{},g([s.Column.UUID(7),y("design:type",String)],exports.GroupModel.prototype,"id",void 0),g([s.Column.String(),y("design:type",String)],exports.GroupModel.prototype,"name",void 0),g([s.Column.String(),y("design:type",String)],exports.GroupModel.prototype,"key",void 0),g([s.Column.Text(),y("design:type",String)],exports.GroupModel.prototype,"description",void 0),g([s.Column.Boolean(),y("design:type",Boolean)],exports.GroupModel.prototype,"state",void 0),g([s.Column.CreatedAt(),y("design:type",Date)],exports.GroupModel.prototype,"created_at",void 0),g([s.Column.UpdatedAt(),y("design:type",Date)],exports.GroupModel.prototype,"updated_at",void 0),g([s.Column.DeletedAt(),y("design:type",Object)],exports.GroupModel.prototype,"deleted_at",void 0),g([s.Association.HasMany(()=>exports.UserGroupModel,"group_id"),y("design:type",Array)],exports.GroupModel.prototype,"users_groups",void 0),g([s.Association.HasMany(()=>exports.GroupPermissionModel,"group_id"),y("design:type",Array)],exports.GroupModel.prototype,"groups_Permission",void 0),exports.GroupModel=g([s.Database(h),s.ModelName("group"),b(),s.Version("5.0.0")],exports.GroupModel),exports.UserGroupModel=class UserGroupModel extends s.Model{},g([s.Column.CreatedAt(),y("design:type",Date)],exports.UserGroupModel.prototype,"created_at",void 0),g([s.Association.BelongsTo(()=>exports.GroupModel),y("design:type",String)],exports.UserGroupModel.prototype,"group_id",void 0),g([s.Association.BelongsTo(()=>exports.UserModel),y("design:type",String)],exports.UserGroupModel.prototype,"user_id",void 0),exports.UserGroupModel=g([s.Database(h),s.ModelName("users_groups"),b(),s.Version("5.0.0")],exports.UserGroupModel),exports.UserPasswordModel=class UserPasswordModel extends s.Model{},g([s.Column.UUID(7),y("design:type",String)],exports.UserPasswordModel.prototype,"id",void 0),g([s.Column.String(),s.Value(e=>d.hashSync(e.value,12)),y("design:type",String)],exports.UserPasswordModel.prototype,"value",void 0),g([s.Column.Boolean(),y("design:type",Boolean)],exports.UserPasswordModel.prototype,"state",void 0),g([s.Column.CreatedAt(),y("design:type",Date)],exports.UserPasswordModel.prototype,"created_at",void 0),g([s.Column.UpdatedAt(),y("design:type",Date)],exports.UserPasswordModel.prototype,"updated_at",void 0),g([s.Column.DeletedAt(),y("design:type",Object)],exports.UserPasswordModel.prototype,"deleted_at",void 0),g([s.Association.BelongsTo(()=>exports.UserModel),y("design:type",String)],exports.UserPasswordModel.prototype,"user_id",void 0),exports.UserPasswordModel=g([s.Database(h),s.ModelName("users_password"),b(),s.Version("5.0.0")],exports.UserPasswordModel),exports.UserModel=class UserModel extends s.Model{},g([s.Column.UUID(7),y("design:type",String)],exports.UserModel.prototype,"id",void 0),g([s.Column.String(),y("design:type",String)],exports.UserModel.prototype,"name",void 0),g([s.Column.String(),y("design:type",String)],exports.UserModel.prototype,"email",void 0),g([s.Column.String(),y("design:type",String)],exports.UserModel.prototype,"username",void 0),g([s.Column.Text(),y("design:type",String)],exports.UserModel.prototype,"description",void 0),g([s.Column.Boolean(),y("design:type",Boolean)],exports.UserModel.prototype,"state",void 0),g([s.Column.CreatedAt(),y("design:type",Date)],exports.UserModel.prototype,"created_at",void 0),g([s.Column.UpdatedAt(),y("design:type",Date)],exports.UserModel.prototype,"updated_at",void 0),g([s.Column.DeletedAt(),y("design:type",Object)],exports.UserModel.prototype,"deleted_at",void 0),g([s.Association.HasMany(()=>exports.AuditModel,"user_id"),y("design:type",Array)],exports.UserModel.prototype,"audits",void 0),g([s.Association.HasMany(()=>exports.UserAuthModel,"user_id"),y("design:type",Array)],exports.UserModel.prototype,"users_auths",void 0),g([s.Association.HasMany(()=>exports.RegisterModel,"user_id"),y("design:type",Array)],exports.UserModel.prototype,"registers",void 0),g([s.Association.HasMany(()=>exports.UserGroupModel,"user_id"),y("design:type",Array)],exports.UserModel.prototype,"users_groups",void 0),g([s.Association.HasMany(()=>exports.UserPasswordModel,"user_id"),y("design:type",Array)],exports.UserModel.prototype,"users_passwords",void 0),exports.UserModel=g([s.Database(h),s.ModelName("user"),b(),s.Version("5.0.0")],exports.UserModel),exports.AuditModel=class AuditModel extends s.Model{},g([s.Column.UUID(7),y("design:type",String)],exports.AuditModel.prototype,"id",void 0),g([s.Column.Enum("CREATE","DELETE","UPDATE"),y("design:type",String)],exports.AuditModel.prototype,"type",void 0),g([s.Column.String(),y("design:type",String)],exports.AuditModel.prototype,"model",void 0),g([s.Column.String(),y("design:type",String)],exports.AuditModel.prototype,"record",void 0),g([s.Column.Json(),y("design:type",Object)],exports.AuditModel.prototype,"data",void 0),g([s.Column.Json(),y("design:type",Object)],exports.AuditModel.prototype,"previously",void 0),g([s.Column.Text(),y("design:type",String)],exports.AuditModel.prototype,"full_url",void 0),g([s.Column.String(),y("design:type",String)],exports.AuditModel.prototype,"ip_address",void 0),g([s.Column.String(),y("design:type",String)],exports.AuditModel.prototype,"user_agent",void 0),g([s.Column.Boolean(),y("design:type",Boolean)],exports.AuditModel.prototype,"state",void 0),g([s.Column.CreatedAt(),y("design:type",Date)],exports.AuditModel.prototype,"created_at",void 0),g([s.Column.UpdatedAt(),y("design:type",Date)],exports.AuditModel.prototype,"updated_at",void 0),g([s.Column.DeletedAt(),y("design:type",Object)],exports.AuditModel.prototype,"deleted_at",void 0),g([s.Association.BelongsTo(()=>exports.UserModel),y("design:type",String)],exports.AuditModel.prototype,"user_id",void 0),exports.AuditModel=g([s.Database(h),s.ModelName("audit"),s.Version("5.0.0")],exports.AuditModel),exports.ConfigModel=class ConfigModel extends s.Model{},g([s.Column.UUID(7),y("design:type",String)],exports.ConfigModel.prototype,"id",void 0),g([s.Column.String(),y("design:type",String)],exports.ConfigModel.prototype,"key",void 0),g([s.Column.String(),y("design:type",String)],exports.ConfigModel.prototype,"value",void 0),g([s.Column.CreatedAt(),y("design:type",Date)],exports.ConfigModel.prototype,"created_at",void 0),g([s.Column.UpdatedAt(),y("design:type",Date)],exports.ConfigModel.prototype,"updated_at",void 0),exports.ConfigModel=g([s.Database(h),s.ModelName("configs"),s.Version("5.0.0")],exports.ConfigModel),exports.ForgotModel=class ForgotModel extends s.Model{},g([s.Column.UUID(7),y("design:type",String)],exports.ForgotModel.prototype,"id",void 0),g([s.Column.String(),y("design:type",String)],exports.ForgotModel.prototype,"secret",void 0),g([s.Column.FullDate(),y("design:type",Number)],exports.ForgotModel.prototype,"expired_at",void 0),g([s.Column.Boolean(),y("design:type",Boolean)],exports.ForgotModel.prototype,"state",void 0),g([s.Column.CreatedAt(),y("design:type",Date)],exports.ForgotModel.prototype,"created_at",void 0),g([s.Column.UpdatedAt(),y("design:type",Date)],exports.ForgotModel.prototype,"updated_at",void 0),g([s.Column.DeletedAt(),y("design:type",Object)],exports.ForgotModel.prototype,"deleted_at",void 0),g([s.Association.BelongsTo(()=>exports.UserModel),y("design:type",String)],exports.ForgotModel.prototype,"user_id",void 0),exports.ForgotModel=g([s.Database(h),s.ModelName("forgot"),s.Version("5.0.0")],exports.ForgotModel),exports.LogModel=class LogModel extends s.Model{},g([s.Column.UUID(7),y("design:type",String)],exports.LogModel.prototype,"id",void 0),g([s.Column.Enum("info","warn","error"),s.DefaultValue("info"),y("design:type",String)],exports.LogModel.prototype,"level",void 0),g([s.Column.Text(),y("design:type",String)],exports.LogModel.prototype,"message",void 0),g([s.Column.String(),y("design:type",String)],exports.LogModel.prototype,"source",void 0),g([s.Column.CreatedAt(),y("design:type",Date)],exports.LogModel.prototype,"created_at",void 0),exports.LogModel=g([s.Database(h),s.ModelName("log"),s.Version("5.0.0")],exports.LogModel),exports.MigrationModel=class MigrationModel extends s.Model{},g([s.Column.String(),y("design:type",String)],exports.MigrationModel.prototype,"model",void 0),g([s.Column.String(),y("design:type",String)],exports.MigrationModel.prototype,"version",void 0),g([s.Column.CreatedAt(),y("design:type",Date)],exports.MigrationModel.prototype,"created_at",void 0),g([s.Column.UpdatedAt(),y("design:type",Date)],exports.MigrationModel.prototype,"updated_at",void 0),exports.MigrationModel=g([s.Database(h),s.ModelName("migration"),s.Version("5.0.0")],exports.MigrationModel),exports.SessionModel=class SessionModel extends s.Model{},g([s.Column.String(),y("design:type",String)],exports.SessionModel.prototype,"session",void 0),g([s.Column.Text(),y("design:type",String)],exports.SessionModel.prototype,"json",void 0),g([s.Column.BigInt(),y("design:type",Number)],exports.SessionModel.prototype,"expired",void 0),g([s.Column.CreatedAt(),y("design:type",Date)],exports.SessionModel.prototype,"created_at",void 0),g([s.Column.UpdatedAt(),y("design:type",Date)],exports.SessionModel.prototype,"updated_at",void 0),exports.SessionModel=g([s.Database(h),s.ModelName("session"),s.Version("5.0.0")],exports.SessionModel),exports.UserMetadataModel=class UserMetadataModel extends s.Model{},g([s.Column.UUID(7),y("design:type",String)],exports.UserMetadataModel.prototype,"id",void 0),g([s.Column.String(),y("design:type",String)],exports.UserMetadataModel.prototype,"key",void 0),g([s.Column.Text("medium"),y("design:type",String)],exports.UserMetadataModel.prototype,"value",void 0),g([s.Column.CreatedAt(),y("design:type",Date)],exports.UserMetadataModel.prototype,"created_at",void 0),g([s.Column.UpdatedAt(),y("design:type",Date)],exports.UserMetadataModel.prototype,"updated_at",void 0),g([s.Column.DeletedAt(),y("design:type",Object)],exports.UserMetadataModel.prototype,"deleted_at",void 0),g([s.Association.BelongsTo(()=>exports.UserModel),y("design:type",String)],exports.UserMetadataModel.prototype,"user_id",void 0),exports.UserMetadataModel=g([s.Database(h),s.ModelName("users_metadata"),b(),s.Version("5.0.0")],exports.UserMetadataModel),exports.UserProfileModel=class UserProfileModel extends s.Model{},g([s.Column.UUID(7),y("design:type",String)],exports.UserProfileModel.prototype,"id",void 0),g([s.Column.String(),y("design:type",String)],exports.UserProfileModel.prototype,"key",void 0),g([s.Column.Text("medium"),y("design:type",String)],exports.UserProfileModel.prototype,"value",void 0),g([s.Column.CreatedAt(),y("design:type",Date)],exports.UserProfileModel.prototype,"created_at",void 0),g([s.Column.UpdatedAt(),y("design:type",Date)],exports.UserProfileModel.prototype,"updated_at",void 0),g([s.Column.DeletedAt(),y("design:type",Object)],exports.UserProfileModel.prototype,"deleted_at",void 0),g([s.Association.BelongsTo(()=>exports.UserModel),y("design:type",String)],exports.UserProfileModel.prototype,"user_id",void 0),exports.UserProfileModel=g([s.Database(h),s.ModelName("users_profile"),b(),s.Version("5.0.0")],exports.UserProfileModel);class Log{static error(e,t,r){return x(this,void 0,void 0,function*(){yield this.writeRaw("error",e,t,r)})}static info(e,t,r){return x(this,void 0,void 0,function*(){yield this.writeRaw("info",e,t,r)})}static warn(e,t,r){return x(this,void 0,void 0,function*(){yield this.writeRaw("warn",e,t,r)})}static writeRaw(e,t,o,i){return x(this,void 0,void 0,function*(){var s;i&&r.Log.console(null!==(s=this.colors[e])&&void 0!==s?s:r.LogColor.White,e,t),h&&(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 i=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}.${i}`:i}}class SessionStore extends l.Store{constructor(){super(),this.all=e=>x(this,void 0,void 0,function*(){e=e||o.noop;const t=yield exports.SessionModel.findAll({attributes:["session"],where:{expired:{[s.Op.gte]:Date.now()}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.session)),e()}),this.clear=e=>x(this,void 0,void 0,function*(){yield exports.SessionModel.destroy().catch(o.noop),e&&e()}),this.destroy=(e,t)=>x(this,void 0,void 0,function*(){yield exports.SessionModel.destroy({where:{session:e}}).catch(o.noop),t&&t()}),this.expired=()=>x(this,void 0,void 0,function*(){yield exports.SessionModel.destroy({where:{expired:{[s.Op.lt]:Date.now()}}}).catch(o.noop)}),this.get=(e,t)=>x(this,void 0,void 0,function*(){t=t||o.noop;const r=yield exports.SessionModel.findOne({where:{session:e,expired:{[s.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=>x(this,void 0,void 0,function*(){e&&e(null,(yield exports.SessionModel.count().catch(o.noop))||0)}),this.set=(e,t,r)=>x(this,void 0,void 0,function*(){r=r||o.noop;const i=Date.now()+Env.API_SESSION_LIFETIME,s=JSON.stringify(t),[n,d]=(yield exports.SessionModel.findOrCreate({where:{session:e},defaults:{session:e,json:s,expired:i}}).catch(o.noop))||[];n&&(d||(n.json=s,n.expired=i,yield n.save().catch(o.noop))),r()}),this.loop=o.loop(this.expired,3e4),this.loop.start()}}exports.Service=class Service{},exports.Service=g([a.Trait(Loggable)],exports.Service),exports.AuthService=class AuthService extends exports.Service{create(e){return x(this,void 0,void 0,function*(){if(!Env.TOKEN_KEY)throw new t.NotFoundError("TOKEN_KEY not found");const{id:r}=e,i=o.uuidv7(),s=yield exports.UserAuthModel.create({secret:i,user_id:r}).catch(this.error);if(!s)throw new t.InternalServerError;return{auth:s,token:p.sign({id:r,secret:i},Env.TOKEN_KEY,this.options())}})}destroy(e){return x(this,void 0,void 0,function*(){return!(!e||e.revoked_at)&&(e.revoked_at=new Date,yield e.save(),!0)})}renew(e){return x(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:i,secret:s}=r;if(i&&s){const e=yield exports.UserModel.findOne({where:{id:i,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){t.secret=o.uuidv7(),yield t.save().catch(this.error);return{auth:t,token:p.sign({id:i,secret:t.secret},Env.TOKEN_KEY,this.options())}}}}throw new t.UnauthorizedError("Invalid token")})}user(e){return x(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:i}=r;if(o&&i){const e=yield exports.UserModel.findOne({where:{id:o,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)return{auth:t,user:e}}}throw new t.UnauthorizedError("Invalid token")})}options(){return{algorithm:"RS256",expiresIn:`${Env.API_TOKEN_LIFETIME}ms`}}verify(e,r){return x(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:p.verify(e,Env.TOKEN_CRT,{clockTolerance:r})}}catch(e){throw new t.UnauthorizedError("Invalid token")}})}key(e){return x(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")})}},exports.AuthService=g([a.Singleton()],exports.AuthService);class ModelService extends exports.Service{constructor(e,t){super(),this.attributes=[],this.filter=[],this.model=e,t&&(this.filter=t)}create(e){return x(this,arguments,void 0,function*({ctx:e,options:r,body:i}){var s,n;const d=Object.assign({},r||{}),l=yield this.model.create(Object.assign({},o.merge({},null!==(n=null===(s=null==e?void 0:e.req)||void 0===s?void 0:s.body)&&void 0!==n?n:{},null!=i?i:{})),Object.assign(Object.assign({},d),{ctx:e})).catch(this.error);if(l){const{primaryKeyAttribute:r}=this.model;return null==e||e.prepare(t.Status.OK,{[r]:l.getDataValue(r)}),l}return null==e||e.error(new t.InternalServerError),null})}delete(e){return x(this,arguments,void 0,function*({ctx:e,options:r,id:o}){var i,s,n;const d=Object.assign({},r||{}),{primaryKeyAttribute:l}=this.model,{[l]:a}=null!==(s=null===(i=null==e?void 0:e.req)||void 0===i?void 0:i.params)&&void 0!==s?s:{[l]:null!=o?o:0};if(!a)return null==e||e.error(new t.InternalServerError),0;const p=yield this.model.destroy(Object.assign(Object.assign(Object.assign({},d),{where:Object.assign(Object.assign({},null!==(n=d.where)&&void 0!==n?n:{}),{[l]:a}),individualHooks:!0}),{ctx:e})).catch(this.error);return p?(null==e||e.success("OK"),p):(null==e||e.error(new t.NotFoundError),0)})}filterAttributes(e,t){if(o.isArray(t))return t.length?t.map(t=>o.isString(t)&&-1!=e.indexOf(t)?t:void 0).filter(o.isString):e;const{exclude:r,include:i}=t,s=o.isUndefined(i)?e:i.map(t=>o.isString(t)&&-1!=e.indexOf(t)?t:void 0).filter(o.isString),n=null!=r?r:[];return n.length?s.filter(e=>-1==n.indexOf(e)):s}findAll(e){return x(this,arguments,void 0,function*({ctx:e,options:r,callback:i,advanced:n,limited:d}){var l,a,p,u,c,g,v;const y=Object.assign({},r||{}),{attributes:x,limit:h,offset:m,asc:C,desc:E,search:A,where:M}=null!==(a=null===(l=null==e?void 0:e.req)||void 0===l?void 0:l.query)&&void 0!==a?a:{};if(o.isUndefined(y.limit)){let e=Env.API_MODEL_LIMIT;o.isString(h)&&(e=parseInt(h)||0),e=o.clamp(e,-1,Env.API_MODEL_LIMIT_MAX),y.limit=e>0?e:d?Env.API_MODEL_LIMIT:void 0}if(o.isNumber(y.limit)&&(y.limit=y.limit>0?y.limit:void 0),o.isString(m)){const e=parseInt(m)||0;y.offset=e>0?e:void 0}const _=this.getAttributes(null!==(p=null==y?void 0:y.attributes)&&void 0!==p?p:[]),f=e=>_.indexOf(e)>=0;y.attributes=[],o.isString(x)&&x.length&&y.attributes.push(...x.split(";").filter(f)),y.attributes.length||(y.attributes=_);const S=[];if(o.isString(C)&&C.length&&S.push(...C.split(";").filter(f).map(e=>[e,"ASC"])),o.isString(E)&&E.length&&S.push(...E.split(";").filter(f).map(e=>[e,"DESC"])),S.length&&(y.order=S),y.where=Object.assign({},y.where||{}),o.isString(M)&&(null==n||n)){const r=s.Where.parse(_,M);if(!o.isUndefined(r.error))return null==e||e.error(new t.ValidationError(r.error.join(", "))),{count:0,records:[]};y.where=Object.assign(Object.assign({},y.where),null!==(u=r.value)&&void 0!==u?u:{})}else{const e=[];_.forEach(t=>{o.isString(A)&&A.length&&e.push({[t]:{[s.Op.like]:`%${A}%`}})}),e.length&&(y.where=Object.assign(Object.assign({},y.where),{[s.Op.or]:[...e]}))}const P=this.model.count(Object.assign(Object.assign({},y),{distinct:!!y.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error),O=this.model.findAll(y).catch(this.error);yield Promise.allSettled([P,O]);const I=null!==(c=yield P)&&void 0!==c?c:0;let U=null!==(g=yield O)&&void 0!==g?g:[];const T={count:I};return U?(U=i?yield i(U):U,(o.isNumber(null==r?void 0:r.limit)||0==I)&&(T.count=null!==(v=null==U?void 0:U.length)&&void 0!==v?v:0),null==e||e.prepare(t.Status.OK,Object.assign(Object.assign({},T),{records:U})),Object.assign(Object.assign({},T),{records:U})):(null==e||e.error(new t.InternalServerError),Object.assign(Object.assign({},T),{records:[]}))})}findOne(e){return x(this,arguments,void 0,function*({ctx:e,options:r,callback:i}){var s,n,d,l,a;const p=Object.assign({},r||{}),{primaryKeyAttribute:u}=this.model,{[u]:c}=null!==(s=null==e?void 0:e.req.params)&&void 0!==s?s:{},g=this.getAttributes(null!==(n=null==p?void 0:p.attributes)&&void 0!==n?n:[]),v=e=>g.indexOf(e)>=0,{attributes:y}=null!==(l=null===(d=null==e?void 0:e.req)||void 0===d?void 0:d.query)&&void 0!==l?l:{};o.isString(y)&&(p.attributes=y.split(";").filter(v));const x=yield this.model.findOne(Object.assign(Object.assign({},p),{where:Object.assign(Object.assign({},null!==(a=null==p?void 0:p.where)&&void 0!==a?a:{}),{[u]:c})})).catch(this.error);return x?(null==e||e.prepare(t.Status.OK,i?yield i(x):x.toJSON()),x):x?(null==e||e.error(new t.InternalServerError),null):(null==e||e.error(new t.NotFoundError),null)})}getAttributes(e){return 0==this.attributes.length&&(this.attributes=this.filterAttributes(Object.keys(this.model.getAttributes()),this.filter)),this.filterAttributes(this.attributes,e)}update(e){return x(this,arguments,void 0,function*({ctx:e,options:t,body:r,id:i}){var s,n,d,l,a,p;const u=Object.assign({},t||{}),{primaryKeyAttribute:c}=this.model,{[c]:g}=null!==(n=null===(s=null==e?void 0:e.req)||void 0===s?void 0:s.params)&&void 0!==n?n:{[c]:null!=i?i:0},[v]=null!==(p=yield this.model.update(Object.assign({},o.merge({},null!==(l=null===(d=null==e?void 0:e.req)||void 0===d?void 0:d.body)&&void 0!==l?l:{},null!=r?r:{})),Object.assign(Object.assign(Object.assign({},u),{where:Object.assign(Object.assign({},null!==(a=null==u?void 0:u.where)&&void 0!==a?a:{}),{[c]:g}),individualHooks:!0}),{ctx:e})).catch(this.error))&&void 0!==p?p:[];return v?(null==e||e.success("OK"),!0):(null==e||e.success("Record not changed"),!1)})}name(){return this.model.tableName}}exports.UserService=class UserService extends exports.Service{getMetadata(e){return x(this,void 0,void 0,function*(){var t;return Object.fromEntries((null!==(t=yield exports.UserMetadataModel.findAll({where:{user_id:e}}).catch(this.error))&&void 0!==t?t:[]).map(e=>[e.key,e.value]))})}getProfile(e){return x(this,void 0,void 0,function*(){var t;return Object.fromEntries((null!==(t=yield exports.UserProfileModel.findAll({where:{user_id:e}}).catch(this.error))&&void 0!==t?t:[]).map(e=>[e.key,e.value]))})}getGroups(e){return x(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 x(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)})}},exports.UserService=g([a.Singleton()],exports.UserService);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 x(this,void 0,void 0,function*(){yield h.sync(),yield this.migrations(h),yield o.forEachSeries(this.controllers,e=>x(this,void 0,void 0,function*(){o.isFunction(e.sync)&&(yield e.sync(this))})),this.authService=new exports.AuthService,this.userService=new exports.UserService,yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new i.WebSocketServer({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>x(this,void 0,void 0,function*(){t.url||(t.url=""),!(t.url.length<=1)&&t.url.replace(/\//g,"."),e.on("close",()=>{}),yield o.sleep(2e3),e.close()})))})}migrations(e){return x(this,void 0,void 0,function*(){const t=[];yield o.forEachSeries(Object.keys(e.models),r=>x(this,void 0,void 0,function*(){var o;const i=e.models[r],s=i.version();if(!s)return;const[n,d]=null!==(o=yield exports.MigrationModel.findOrCreate({where:{model:i.tableName},defaults:{model:i.tableName,version:""}}).catch(this.error))&&void 0!==o?o:[];n&&(d||n.version!=s)&&(n.version=s,yield n.save().catch(this.error),t.push(i))})),yield o.forEachSeries(t,e=>x(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 x(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 x(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield o.forEachSeries(this.permissions,r=>x(this,void 0,void 0,function*(){const i=`${e}.${r}`,s=o.upperCamelCase(e.replace(/_/g," ")," ");yield exports.PermissionModel.findOrCreate({where:{key:i},defaults:Object.assign({name:`${s} ${o.upperCamelCase(r," ")}`,key:i,tag:s},t)})}))})}},g([v(0,t.Ctx()),v(1,t.Headers("user-agent")),v(2,t.Session()),y("design:type",Function),y("design:paramtypes",[t.Context,String,Object]),y("design:returntype",Promise)],exports.BaseController.prototype,"session",null),exports.BaseController=g([a.Trait(Loggable)],exports.BaseController),exports.ModelController=class ModelController extends exports.BaseController{constructor(){super(...arguments),this.attributes=[],this.permissions=["create","read","update","delete"]}create(e){return x(this,void 0,void 0,function*(){return yield this.service.create(e)})}delete(e){return x(this,void 0,void 0,function*(){return yield this.service.delete(e)})}findAll(e){return x(this,void 0,void 0,function*(){return yield this.service.findAll(e)})}findOne(e){return x(this,void 0,void 0,function*(){return yield this.service.findOne(e)})}sync(){return x(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield o.forEachSeries(this.permissions,r=>x(this,void 0,void 0,function*(){const i=`${e}.${r}`,s=o.upperCamelCase(e.replace(/_/g," ")," ");yield exports.PermissionModel.findOrCreate({where:{key:i},defaults:Object.assign({name:`${s} ${o.upperCamelCase(r," ")}`,key:i,tag:s},t)})})),this.service=new ModelService(this.model)})}update(e){return x(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}all(e,t,r){return x(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 x(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}},g([t.Get(),_(),A(),v(0,t.Ctx()),v(1,t.Query("type")),v(2,t.Query("table")),y("design:type",Function),y("design:paramtypes",[t.Context,String,String]),y("design:returntype",Promise)],exports.AuditsController.prototype,"all",null),g([t.Get("/:id"),_(),A(),v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("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,i,n,l,a){return x(this,void 0,void 0,function*(){var p;yield o.sleep(Env.API_SLEEP_AUTH);const u=yield exports.UserModel.findOne({where:{[s.Op.or]:[{email:i},{username:i}]}}).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:v,token:y}=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:{};v&&y&&(v.user_agent=r,v.ip_address=e.getIp(),yield v.save().catch(this.error),Env.API_TOKEN_COOKIE_SET&&e.cookie(Env.API_TOKEN_COOKIE,y,{maxAge:l?Env.API_TOKEN_LIFETIME:void 0}),e.json({token:y}),a.emit("auth.login",{ctx:e,auth:v,user:u}),this.emit("auth.login",{ctx:e,auth:v,user:u}))})}logout(e,r,o,i){return x(this,void 0,void 0,function*(){if(yield this.authService.destroy(r))return e.success("OK"),i.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 x(this,void 0,void 0,function*(){var i;const{auth:s,token:n}=null!==(i=yield this.authService.renew(r).catch(t=>{e.error(t)}))&&void 0!==i?i:{};s&&n&&(s.user_agent=t,yield s.save().catch(this.error),e.json({token:n}),o.emit("auth.renew",{auth:s,ctx:e}),this.emit("auth.renew",{auth:s,ctx:e}))})}user(e,r){return x(this,void 0,void 0,function*(){const{groups:i,permissions:s,profile:n}=e.req;if(!i||!s)return e.error(new t.InternalServerError);e.json(Object.assign(Object.assign({},o.denied(["username","description"],r.toJSON())),{groups:i,permissions:s,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)})),v(0,t.Ctx()),v(1,t.Headers("user-agent")),v(2,t.Body("username")),v(3,t.Body("password")),v(4,t.Body("remember")),v(5,t.App()),y("design:type",Function),y("design:paramtypes",[t.Context,String,String,String,Boolean,Application]),y("design:returntype",Promise)],exports.AuthController.prototype,"login",null),g([t.Get("/logout"),_(),v(0,t.Ctx()),v(1,f()),v(2,U()),v(3,t.App()),y("design:type",Function),y("design:paramtypes",[t.Context,exports.UserAuthModel,exports.UserModel,Application]),y("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),g([t.Post("/renew"),t.Validate(e=>({token:e.string().required()})),v(0,t.Ctx()),v(1,t.Headers("user-agent")),v(2,t.Body("token")),v(3,t.App()),y("design:type",Function),y("design:paramtypes",[t.Context,String,String,Application]),y("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),g([t.Get(),_(),v(0,t.Ctx()),v(1,U()),y("design:type",Function),y("design:paramtypes",[t.Context,exports.UserModel]),y("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=g([t.Controller("/auth"),t.Extends(exports.BaseController),v(0,a.Inject(exports.AuthService)),y("design:paramtypes",[exports.AuthService])],exports.AuthController),exports.CrudController=class CrudController extends exports.ModelController{constructor(){super(...arguments),this._crud={}}CrudArgumentsCreate(e){return{ctx:e}}CrudArgumentsFindAll(e){return{ctx:e}}CrudArgumentsFindOne(e){return{ctx:e}}CrudArgumentsDelete(e){return{ctx:e}}CrudArgumentsUpdate(e){return{ctx:e}}CrudValidationCreate(){return this._crud}CrudValidationUpdate(){return this._crud}add(e){return x(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return x(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}del(e){return x(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return x(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return x(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validationCreate(e){return x(this,void 0,void 0,function*(){if(this.CrudValidationCreate()==this._crud)return e.error(new t.InternalServerError)})}validationUpdate(e){return x(this,void 0,void 0,function*(){if(this.CrudValidationUpdate()==this._crud)return e.error(new t.InternalServerError)})}},g([t.Post(),_(),C(),t.Middleware("validationCreate"),v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("design:returntype",Promise)],exports.CrudController.prototype,"add",null),g([t.Get(),_(),A(),v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("design:returntype",Promise)],exports.CrudController.prototype,"all",null),g([t.Delete("/:id"),_(),E(),v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("design:returntype",Promise)],exports.CrudController.prototype,"del",null),g([t.Get("/:id"),_(),A(),v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("design:returntype",Promise)],exports.CrudController.prototype,"get",null),g([t.Put("/:id"),_(),M(),t.Middleware("validationUpdate"),v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("design:returntype",Promise)],exports.CrudController.prototype,"set",null),g([v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("design:returntype",Promise)],exports.CrudController.prototype,"validationCreate",null),g([v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("design:returntype",Promise)],exports.CrudController.prototype,"validationUpdate",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 x(this,void 0,void 0,function*(){let{path:r}=e.req;r=r.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const i=c.join(this.directory,r);if(!u.existsSync(i)||!u.statSync(i).isDirectory())return e.error(new t.NotFoundError);let s=[];return s=u.readdirSync(i),s=s.map(e=>this.info(c.join(i,e))),s=s.filter(o.isDef),Object.assign(Object.assign({},this.info(i)),{files:s})})}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 x(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,i=>x(this,void 0,void 0,function*(){const s=`${e}.${i}`;yield exports.PermissionModel.findOrCreate({where:{key:s},defaults:Object.assign({name:`${t} ${o.upperCamelCase(i," ")}`,key:s,tag:t},r)})}))})}},g([t.Get("/path"),t.Get("/path/*path"),_(),v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("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 x(this,void 0,void 0,function*(){const i=yield this.find(r);if(!i||!i.user)return e.error(new t.NotFoundError);i.secret=o.uniqueID(),yield i.save(),e.json({token:i.secret})})}forgot(e,r,i){return x(this,void 0,void 0,function*(){yield o.sleep(Env.API_SLEEP_FORGOT);const n=r,d=yield exports.UserModel.findOne({where:{[s.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"),i.emit("forgot.send",{ctx:e,forgot:p,user:d}),this.emit("forgot.send",{ctx:e,forgot:p,user:d})})}reset(e,r,o,i){return x(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"),i.emit("forgot.reset",{ctx:e,user:o.user}),this.emit("forgot.reset",{ctx:e,user:o.user})})}find(e){return x(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()})),v(0,t.Ctx()),v(1,t.Body("token")),y("design:type",Function),y("design:paramtypes",[t.Context,String]),y("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),g([t.Post(),t.Validate(e=>({username:e.string().min(4).required()})),v(0,t.Ctx()),v(1,t.Body("username")),v(2,t.App()),y("design:type",Function),y("design:paramtypes",[t.Context,String,Application]),y("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()})),v(0,t.Ctx()),v(1,t.Body("token")),v(2,t.Body("password")),v(3,t.App()),y("design:type",Function),y("design:paramtypes",[t.Context,String,String,Application]),y("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(),description:o.Validation.string().empty(""),state:o.Validation.boolean().parse().required()},this.schemaUpdate={name:o.Validation.string().empty(),description:o.Validation.string().empty(),state:o.Validation.boolean().parse().empty()}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){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}all(e,t){return x(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{group_id:t},include:[{model:exports.PermissionModel,required:!0}]},callback:e=>e.map(e=>e.permission)})})}me(e,t){return x(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(e,r,i){return x(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(i,t=>x(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:{[s.Op.notIn]:l}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}},g([t.Get("/:id/permissions"),_(),A("groups"),v(0,t.Ctx()),v(1,t.Params("id")),y("design:type",Function),y("design:paramtypes",[t.Context,String]),y("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"all",null),g([t.Get("/permissions"),_(),A("users"),v(0,t.Ctx()),v(1,U()),y("design:type",Function),y("design:paramtypes",[t.Context,exports.UserModel]),y("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"me",null),g([t.Put("/:id/permissions"),_(),M("groups"),t.Validate(e=>({permissions:e.array(e.string())})),v(0,t.Ctx()),v(1,t.Params("id")),v(2,t.Body("permissions")),y("design:type",Function),y("design:paramtypes",[t.Context,String,Array]),y("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 x(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{order:[["created_at","DESC"]]},limited:!0})})}},g([t.Get(),_(),A(),v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("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(),tag:o.Validation.string().required(),description:o.Validation.string().empty(""),state:o.Validation.boolean().parse().required()},this.schemaUpdate={name:o.Validation.string().empty(),key:o.Validation.string().empty(),tag:o.Validation.string().empty(),description:o.Validation.string().empty(),state:o.Validation.boolean().parse().empty()}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}},exports.PermissionsController=g([t.Controller("/permissions"),t.Extends(exports.CrudController)],exports.PermissionsController),exports.RegisterController=class RegisterController extends exports.BaseController{register(e,i,n){return x(this,void 0,void 0,function*(){yield o.sleep(Env.API_SLEEP_REGISTRY);const{name:d,date:l,email:a,username:p,password:u,confirm:c}=i,g=p||a,v=r.sha256(u);if(yield exports.UserModel.count({where:{[s.Op.or]:[{email:a},{username:g}]}}).catch(this.error))return e.error("INVALID EMAIL OR USERNAME");if(v!=r.sha256(c))return e.error("INVALID PASSWORD");const y=yield exports.UserModel.create({name:d,email:a,username:g,password:v,avatar:"",date:l,description:"",state:!1}).catch(this.error);if(!y)return e.error(new t.InternalServerError);const x=yield exports.RegisterModel.create({token:yield this.getId(),user_id:y.id,state:!0}).catch(this.error);if(!x)return yield y.destroy().catch(this.error),e.error(new t.InternalServerError);e.success("OK"),n.emit("register.user",{ctx:e,register:x,user:y}),this.emit("register.user",{ctx:e,register:x,user:y})})}confirm(e,r,o){return x(this,void 0,void 0,function*(){const i=yield exports.RegisterModel.findOne({where:{token:r,state:!0},include:[{model:exports.UserModel,required:!0}]}).catch(this.error);if(!i)return e.error(new t.NotFoundError);i.state=!1,yield i.save().catch(this.error),i.user.state=!0,yield i.user.save().catch(this.error),e.success("OK"),o.emit("register.confirm",{ctx:e,register:i,user:i.user}),this.emit("register.confirm",{ctx:e,register:i,user:i.user})})}send(e,r,o){return x(this,void 0,void 0,function*(){const i=r,n=yield exports.RegisterModel.findOne({where:{state:!0},include:[{model:exports.UserModel,required:!0,where:{[s.Op.or]:[{email:i},{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 x(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()})),v(0,t.Ctx()),v(1,t.Body()),v(2,t.App()),y("design:type",Function),y("design:paramtypes",[t.Context,Object,Application]),y("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),g([t.Post("/confirm"),t.Validate(e=>({token:e.string().required()})),v(0,t.Ctx()),v(1,t.Body("token")),v(2,t.App()),y("design:type",Function),y("design:paramtypes",[t.Context,String,Application]),y("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),g([t.Post("/send"),t.Validate(e=>({username:e.string().min(4).required()})),v(0,t.Ctx()),v(1,t.Body("username")),v(2,t.App()),y("design:type",Function),y("design:paramtypes",[t.Context,String,Application]),y("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 x(this,void 0,void 0,function*(){var t;if(yield exports.UserModel.count())return e.success("OK");const i=o.uniqueID(),s=yield exports.UserModel.create({name:"Admin",email:"admin@localhost",username:"admin",password:r.sha256("admin"+i),salt:i,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0},Object.assign({},{ctx:e}));yield exports.UserPasswordModel.create({value:"admin",state:!0,user_id:s.id});const n=yield exports.GroupModel.create(Object.assign({name:"Admin"},{description:"API CORE",state:!0}),Object.assign({},{ctx:e}));yield exports.UserGroupModel.create({user_id:s.id,group_id:n.id},Object.assign({},{ctx:e}));const d=null!==(t=yield exports.PermissionModel.findAll({where:{state:!0}}).catch(this.error))&&void 0!==t?t:[];yield o.forEachSeries(d,t=>x(this,void 0,void 0,function*(){yield exports.GroupPermissionModel.create({group_id:n.id,permission_id:t.id},Object.assign({},{ctx:e}))})),e.success("OK")})}},g([t.Get(),v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("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 x(this,void 0,void 0,function*(){var o,i;const s=e.getFiles();if(s.file&&s.file.length){const{filename:n,path:d}=null!==(o=s.file[0])&&void 0!==o?o:{};if(n){const[o]=null!==(i=yield exports.UserProfileModel.findOrCreate(Object.assign({where:{key:"avatar",user_id:r.id},defaults:{key:"avatar",user_id:r.id}},{ctx:e})).catch(this.error))&&void 0!==i?i:[];if(!o)return u.lstatSync(d).isFile()&&u.rmSync(d),e.error(new t.InternalServerError);const s=this.path+"/"+o.value;if(u.existsSync(s)&&u.lstatSync(s).isFile()&&u.rmSync(s),o.value=n,yield o.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK")}}e.success("Record not Changed")})}token_new(){return x(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 x(this,void 0,void 0,function*(){yield this.create({ctx:e})})}all(e){return x(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}del(e,r,o){return x(this,void 0,void 0,function*(){if(o.id.toString()==r)return e.error(new t.NotFoundError);yield this.delete({ctx:e})})}get(e){return x(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e){return x(this,void 0,void 0,function*(){yield this.update({ctx:e})})}},g([t.Post("/avatar"),_(),t.Upload({file:{count:1,path:`${Env.API_HTTP_PUBLIC}/avatar`,types:["image/bmp","image/jpeg","image/png"],size:32}}),v(0,t.Ctx()),v(1,U()),y("design:type",Function),y("design:paramtypes",[t.Context,exports.UserModel]),y("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),g([t.Post(),_(),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)})),v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("design:returntype",Promise)],exports.UsersController.prototype,"add",null),g([t.Get(),_(),A(),v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("design:returntype",Promise)],exports.UsersController.prototype,"all",null),g([t.Delete("/:id"),_(),E(),v(0,t.Ctx()),v(1,t.Params("id")),v(2,U()),y("design:type",Function),y("design:paramtypes",[t.Context,String,exports.UserModel]),y("design:returntype",Promise)],exports.UsersController.prototype,"del",null),g([t.Get("/:id"),_(),A(),v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("design:returntype",Promise)],exports.UsersController.prototype,"get",null),g([t.Put("/:id"),_(),M(),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()})),v(0,t.Ctx()),y("design:type",Function),y("design:paramtypes",[t.Context]),y("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=g([t.Controller("/users"),t.Extends(exports.ModelController),y("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class UsersGroupsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.UserGroupModel}all(e,t){return x(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{user_id:t},include:[{model:exports.GroupModel,required:!0}]},callback:e=>e.map(e=>e.group)})})}me(e,t){return x(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(e,r,i){return x(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);const d=n.id,l=[];yield o.forEachSeries(i,t=>x(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:{[s.Op.notIn]:l}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}},g([t.Get("/:id/groups"),_(),A("users"),v(0,t.Ctx()),v(1,t.Params("id")),y("design:type",Function),y("design:paramtypes",[t.Context,String]),y("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),g([t.Get("/groups"),_(),A("users"),v(0,t.Ctx()),v(1,U()),y("design:type",Function),y("design:paramtypes",[t.Context,exports.UserModel]),y("design:returntype",Promise)],exports.UsersGroupsController.prototype,"me",null),g([t.Put("/:id/groups"),_(),M("users"),t.Validate(e=>({groups:e.array(e.string())})),v(0,t.Ctx()),v(1,t.Params("id")),v(2,t.Body("groups")),y("design:type",Function),y("design:paramtypes",[t.Context,String,Array]),y("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=g([t.Controller("/users"),t.Extends(exports.ModelController)],exports.UsersGroupsController),exports.Application=Application,exports.Audit=b,exports.CanCreate=C,exports.CanDelete=E,exports.CanRead=A,exports.CanUpdate=M,exports.Config=class Config extends Loggable{static all(){return x(this,void 0,void 0,function*(){const e=yield exports.ConfigModel.findAll().catch(this.error),t={};return e&&e.forEach(e=>t[e.key]=e.value),t})}static del(e,t){return x(this,void 0,void 0,function*(){var r;const o=null!==(r=null==t?void 0:t.id)&&void 0!==r?r:null;return((yield exports.ConfigModel.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:o})).catch(this.error))||0)>0})}static get(e){return x(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,r){return x(this,void 0,void 0,function*(){var o;const i=null!==(o=null==r?void 0:r.id)&&void 0!==o?o:null,[s]=(yield exports.ConfigModel.findOrCreate(Object.assign({where:{key:e}},{user_id:i})).catch(this.error))||[];s&&(s.value=t,yield s.save().catch(this.error))})}},exports.Env=Env,exports.HasGroups=(...e)=>(r,i,s)=>{t.Use(r=>x(void 0,void 0,void 0,function*(){const{groups:i}=r.req;if(o.includesArray(e,null!=i?i:[]))return r.next();r.error(new t.UnauthorizedError("Access Denied"))}))(r,i,s)},exports.HasPermissions=(...e)=>(r,i,s)=>{t.Use(r=>x(void 0,void 0,void 0,function*(){const{permissions:i}=r.req;if(o.includesArray(e,null!=i?i:[]))return r.next();r.error(new t.UnauthorizedError("Access Denied"))}))(r,i,s)},exports.IsAuthenticated=_,exports.Log=Log,exports.Loggable=Loggable,exports.ModelService=ModelService,exports.ReqAuth=f,exports.ReqGroup=S,exports.ReqGroups=P,exports.ReqPermission=O,exports.ReqPermissions=I,exports.ReqUser=U,exports.SessionStore=SessionStore,exports.canFactory=m,exports.sequelize=h;
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.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_MODEL_LIMIT=e.getInt("API_MODEL_LIMIT",10),Env.API_MODEL_LIMIT_MAX=e.getInt("API_MODEL_LIMIT_MAX",500),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"),A=m("read"),f=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:[]}),I=t.parameterFactory(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.user}),T=(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({},T("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({},T("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({},T("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;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.API_MODEL_LIMIT,o.isString(r)&&(t.limit=parseInt(r)||0),t.limit=o.clamp(t.limit,-1,Env.API_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.API_MODEL_LIMIT&&(p.limit=Env.API_MODEL_LIMIT),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(),A(),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(),A(),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,I()),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,I()),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}}CrudValidationCreate(){return this._crud}CrudValidationUpdate(){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))})}number(e){return h(this,void 0,void 0,function*(){yield this.countAll(this.CrudArgumentsFindAll(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))})}validationCreate(e){return h(this,void 0,void 0,function*(){if(this.CrudValidationCreate()==this._crud)return e.error(new t.InternalServerError)})}validationUpdate(e){return h(this,void 0,void 0,function*(){if(this.CrudValidationUpdate()==this._crud)return e.error(new t.InternalServerError)})}},g([t.Post(),M(),C(),t.Middleware("validationCreate"),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(),A(),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(),A(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"number",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(),A(),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(),f(),t.Middleware("validationUpdate"),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,"validationCreate",null),g([y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"validationUpdate",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()}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){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(),A("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(),f("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(),A(),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()}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){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})})}number(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,I()),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(),A(),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(),A(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"number",null),g([t.Delete("/:id"),M(),E(),y(0,t.Ctx()),y(1,t.Params("id")),y(2,I()),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(),A(),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(),f(),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(),A("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(),f("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(),A("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(),A("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(),f("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=A,exports.CanUpdate=f,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=I,exports.SessionStore=SessionStore,exports.UserService=UserService,exports.canFactory=m,exports.sequelize=x;
package/dist/index.d.ts CHANGED
@@ -1,15 +1,15 @@
1
1
  /*!
2
- * @andrewcaires/api v5.0.0
2
+ * @andrewcaires/api v5.0.2
3
3
  * Simple api for small applications using express, jsonwebtoken, sequelize and websocket
4
4
  * (c) 2026 Andrew Caires
5
5
  * @license: MIT
6
6
  */
7
7
  import { Context, Application as Application$1, IOptions, IStore } from '@andrewcaires/express';
8
8
  import { Hash, Env as Env$1 } from '@andrewcaires/node';
9
- import { Model, Sequelize } from '@andrewcaires/sequelize';
9
+ import { Model, ModelFindOptions, ModelUpdateOptions, Sequelize } from '@andrewcaires/sequelize';
10
10
  import { TypeAnyObject, TypeObjectString, TypeAnyFunction, TypeAnyConstructor, EventEmitter, TypeObject, ValidationBase } from '@andrewcaires/utils.js';
11
11
  import { WebSocketServer } from 'ws';
12
- import { Model as Model$1, CreateOptions, Attributes, FindOptions, UpdateOptions, ModelStatic, FindAttributeOptions } from 'sequelize';
12
+ import { Model as Model$1, CreateOptions, Attributes, FindOptions, IncludeOptions, FindAttributeOptions, ModelStatic } from 'sequelize';
13
13
  import { Store, SessionData } from 'express-session';
14
14
 
15
15
  declare class RegisterModel extends Model {
@@ -41,7 +41,7 @@ declare class PermissionModel extends Model {
41
41
  readonly id: string;
42
42
  name: string;
43
43
  key: string;
44
- tag: string;
44
+ tags: string;
45
45
  description: string;
46
46
  state: boolean;
47
47
  readonly created_at: Date;
@@ -51,6 +51,7 @@ declare class PermissionModel extends Model {
51
51
  }
52
52
 
53
53
  declare class GroupPermissionModel extends Model {
54
+ readonly id: string;
54
55
  readonly created_at: Date;
55
56
  group_id: string;
56
57
  group: GroupModel;
@@ -62,6 +63,7 @@ declare class GroupModel extends Model {
62
63
  readonly id: string;
63
64
  name: string;
64
65
  key: string;
66
+ tags: string;
65
67
  description: string;
66
68
  state: boolean;
67
69
  readonly created_at: Date;
@@ -72,6 +74,7 @@ declare class GroupModel extends Model {
72
74
  }
73
75
 
74
76
  declare class UserGroupModel extends Model {
77
+ readonly id: string;
75
78
  readonly created_at: Date;
76
79
  group_id: string;
77
80
  group: GroupModel;
@@ -90,6 +93,16 @@ declare class UserPasswordModel extends Model {
90
93
  user: UserModel;
91
94
  }
92
95
 
96
+ declare class UserProfileModel extends Model {
97
+ readonly id: string;
98
+ data: TypeAnyObject;
99
+ readonly created_at: Date;
100
+ readonly updated_at: Date;
101
+ readonly deleted_at: Date | null;
102
+ user_id: string;
103
+ user: UserModel;
104
+ }
105
+
93
106
  declare class UserModel extends Model {
94
107
  readonly id: string;
95
108
  name: string;
@@ -105,6 +118,7 @@ declare class UserModel extends Model {
105
118
  registers: Array<RegisterModel>;
106
119
  users_groups: Array<UserGroupModel>;
107
120
  users_passwords: Array<UserPasswordModel>;
121
+ users_profiles: Array<UserProfileModel>;
108
122
  }
109
123
 
110
124
  declare class AuditModel extends Model {
@@ -117,6 +131,7 @@ declare class AuditModel extends Model {
117
131
  full_url: string;
118
132
  ip_address: string;
119
133
  user_agent: string;
134
+ app_name: string;
120
135
  state: boolean;
121
136
  readonly created_at: Date;
122
137
  readonly updated_at: Date;
@@ -154,6 +169,7 @@ declare class LogModel extends Model {
154
169
  }
155
170
 
156
171
  declare class MigrationModel extends Model {
172
+ readonly id: string;
157
173
  model: string;
158
174
  version: string;
159
175
  readonly created_at: Date;
@@ -161,6 +177,7 @@ declare class MigrationModel extends Model {
161
177
  }
162
178
 
163
179
  declare class SessionModel extends Model {
180
+ readonly id: string;
164
181
  session: string;
165
182
  json: string;
166
183
  expired: number;
@@ -170,19 +187,7 @@ declare class SessionModel extends Model {
170
187
 
171
188
  declare class UserMetadataModel extends Model {
172
189
  readonly id: string;
173
- key: string;
174
- value: string;
175
- readonly created_at: Date;
176
- readonly updated_at: Date;
177
- readonly deleted_at: Date | null;
178
- user_id: string;
179
- user: UserModel;
180
- }
181
-
182
- declare class UserProfileModel extends Model {
183
- readonly id: string;
184
- key: string;
185
- value: string;
190
+ data: TypeAnyObject;
186
191
  readonly created_at: Date;
187
192
  readonly updated_at: Date;
188
193
  readonly deleted_at: Date | null;
@@ -190,47 +195,6 @@ declare class UserProfileModel extends Model {
190
195
  user: UserModel;
191
196
  }
192
197
 
193
- interface ArgumentsModel<M extends Model$1<M>> {
194
- ctx?: Context;
195
- }
196
-
197
- interface ArgumentsModelCreate<M extends Model$1<M>> extends ArgumentsModel<M> {
198
- options?: CreateOptions<Attributes<M>>;
199
- body?: TypeAnyObject;
200
- }
201
-
202
- interface ArgumentsModelDelete<M extends Model$1<M>> extends ArgumentsModel<M> {
203
- id?: string | number;
204
- options?: FindOptions<Attributes<M>>;
205
- }
206
-
207
- type CallbackModelFindAll<M> = (_records: Array<M>) => Array<any> | Promise<Array<any>>;
208
-
209
- interface ArgumentsModelFindAll<M extends Model$1<any>> extends ArgumentsModel<M> {
210
- options?: FindOptions<Attributes<M>>;
211
- callback?: CallbackModelFindAll<M>;
212
- advanced?: boolean;
213
- limited?: boolean;
214
- }
215
-
216
- type CallbackModelFindOne<M> = (_records: M) => any | Promise<any>;
217
-
218
- interface ArgumentsModelFindOne<M extends Model$1<M>> extends ArgumentsModel<M> {
219
- options?: FindOptions<Attributes<M>>;
220
- callback?: CallbackModelFindOne<M>;
221
- }
222
-
223
- interface ArgumentsModelUpdate<M extends Model$1<M>> extends ArgumentsModel<M> {
224
- id?: string | number;
225
- options?: UpdateOptions<Attributes<M>>;
226
- body?: TypeAnyObject;
227
- }
228
-
229
- interface ResultModelFindAll<M extends Model<M>> {
230
- count: number;
231
- records: Array<M>;
232
- }
233
-
234
198
  interface IAuthParameters {
235
199
  auth?: UserAuthModel;
236
200
  decode?: TypeAnyObject;
@@ -239,6 +203,65 @@ interface IAuthParameters {
239
203
  user?: UserModel;
240
204
  }
241
205
 
206
+ interface AuthEvents {
207
+ "auth.activation": {
208
+ ctx: Context;
209
+ register: RegisterModel;
210
+ user: UserModel;
211
+ };
212
+ "auth.failure": {
213
+ ctx: Context;
214
+ user?: UserModel;
215
+ };
216
+ "auth.login": {
217
+ ctx: Context;
218
+ auth: UserAuthModel;
219
+ user: UserModel;
220
+ };
221
+ "auth.logout": {
222
+ ctx: Context;
223
+ auth: UserAuthModel;
224
+ user: UserModel;
225
+ };
226
+ "auth.renew": {
227
+ ctx: Context;
228
+ auth: UserAuthModel;
229
+ };
230
+ }
231
+
232
+ interface ForgotEvents {
233
+ "forgot.reset": {
234
+ ctx: Context;
235
+ user?: UserModel;
236
+ };
237
+ "forgot.send": {
238
+ ctx: Context;
239
+ forgot: ForgotModel;
240
+ user: UserModel;
241
+ };
242
+ }
243
+
244
+ interface RegisterEvents {
245
+ "register.confirm": {
246
+ ctx: Context;
247
+ register: RegisterModel;
248
+ user?: UserModel;
249
+ };
250
+ "register.send": {
251
+ ctx: Context;
252
+ register: RegisterModel;
253
+ user?: UserModel;
254
+ };
255
+ "register.user": {
256
+ ctx: Context;
257
+ register: RegisterModel;
258
+ user?: UserModel;
259
+ };
260
+ }
261
+
262
+ interface ApplicationEvents extends AuthEvents, ForgotEvents, RegisterEvents {
263
+ }
264
+
242
265
  declare module "express-serve-static-core" {
243
266
  interface Request {
244
267
  auth?: UserAuthModel;
@@ -269,6 +292,62 @@ declare module "express-serve-static-core" {
269
292
  }
270
293
  }
271
294
 
295
+ interface ModelArgumentsBase<M extends Model$1<M>> {
296
+ ctx?: Context;
297
+ }
298
+
299
+ interface ModelArgumentsCount<M extends Model$1<any>> extends ModelArgumentsBase<M> {
300
+ options?: ModelFindOptions<M>;
301
+ }
302
+
303
+ interface ModelArgumentsCreate<M extends Model$1<M>> extends ModelArgumentsBase<M> {
304
+ body?: TypeAnyObject;
305
+ options?: CreateOptions<Attributes<M>>;
306
+ }
307
+
308
+ interface ModelArgumentsDelete<M extends Model$1<M>> extends ModelArgumentsBase<M> {
309
+ id?: string | number;
310
+ options?: FindOptions<Attributes<M>>;
311
+ }
312
+
313
+ type ModelCallbackFindAll<M> = (_records: Array<M>) => Array<any> | Promise<Array<any>>;
314
+
315
+ interface ModelArgumentsFindAll<M extends Model$1<any>> extends ModelArgumentsBase<M> {
316
+ callback?: ModelCallbackFindAll<M>;
317
+ limited?: boolean;
318
+ options?: FindOptions<Attributes<M>>;
319
+ query?: boolean;
320
+ }
321
+
322
+ type ModelCallbackFindOne<M> = (_records: M) => any | Promise<any>;
323
+
324
+ interface ModelArgumentsFindOne<M extends Model$1<M>> extends ModelArgumentsBase<M> {
325
+ callback?: ModelCallbackFindOne<M>;
326
+ id?: string | number;
327
+ options?: FindOptions<Attributes<M>>;
328
+ query?: boolean;
329
+ }
330
+
331
+ interface ModelArgumentsInclude extends Omit<IncludeOptions, "model">, ModelArgumentsBase<any> {
332
+ name?: string;
333
+ }
334
+
335
+ interface ModelArgumentsUpdate<M extends Model$1<M>> extends ModelArgumentsBase<M> {
336
+ body?: TypeAnyObject;
337
+ id?: string | number;
338
+ options?: ModelUpdateOptions<M>;
339
+ }
340
+
341
+ interface ModelOptions {
342
+ attributes?: FindAttributeOptions;
343
+ permissions?: Array<string>;
344
+ }
345
+
346
+ interface ModelResultFindAll<M extends Model<M>> {
347
+ count: number;
348
+ records: Array<M>;
349
+ }
350
+
272
351
  declare class Loggable {
273
352
  get log(): (message: string) => void;
274
353
  static get log(): (message: string) => void;
@@ -280,10 +359,10 @@ declare class Loggable {
280
359
  }
281
360
 
282
361
  declare class Config extends Loggable {
283
- static all(): Promise<TypeObjectString>;
284
- static del(key: string, user?: UserModel): Promise<boolean>;
362
+ static all(keys?: Array<string>): Promise<TypeObjectString>;
363
+ static del(key: string): Promise<boolean>;
285
364
  static get(key: string, value?: string): Promise<string>;
286
- static set(key: string, value: string, user?: UserModel): Promise<void>;
365
+ static set(key: string, value: string): Promise<void>;
287
366
  }
288
367
 
289
368
  declare class Log {
@@ -324,16 +403,23 @@ declare class AuthService extends Service {
324
403
  declare class ModelService<M extends Model$1<any>> extends Service {
325
404
  protected model: ModelStatic<M>;
326
405
  protected attributes: Array<string>;
327
- protected filter: FindAttributeOptions;
328
- constructor(model: ModelStatic<M>, attributes?: FindAttributeOptions);
329
- create({ ctx, options, body }: ArgumentsModelCreate<M>): Promise<M | null>;
330
- delete({ ctx, options, id: _id }: ArgumentsModelDelete<M>): Promise<number>;
406
+ protected permissions: Array<string>;
407
+ constructor(model: ModelStatic<M>, options?: ModelOptions);
408
+ private applySelect;
409
+ private applyOrders;
410
+ private applyPagination;
411
+ private applyWhere;
412
+ countAll(options: ModelArgumentsCount<M>): Promise<number>;
413
+ create(options: ModelArgumentsCreate<M>): Promise<M | null>;
414
+ delete(options: ModelArgumentsDelete<M>): Promise<number>;
331
415
  private filterAttributes;
332
- findAll({ ctx, options, callback, advanced, limited }: ArgumentsModelFindAll<M>): Promise<ResultModelFindAll<M>>;
333
- findOne({ ctx, options, callback }: ArgumentsModelFindOne<M>): Promise<M | null>;
416
+ findAll(options: ModelArgumentsFindAll<M>): Promise<ModelResultFindAll<M>>;
417
+ findOne(options: ModelArgumentsFindOne<M>): Promise<M | null>;
334
418
  getAttributes(options: FindAttributeOptions): Array<string>;
335
- update({ ctx, options, body, id: _id }: ArgumentsModelUpdate<M>): Promise<boolean>;
419
+ include(model: ModelStatic<any>, options: ModelArgumentsInclude): IncludeOptions | null;
336
420
  name(): string;
421
+ sync(): Promise<void>;
422
+ update(options: ModelArgumentsUpdate<M>): Promise<boolean>;
337
423
  }
338
424
 
339
425
  declare class UserService extends Service {
@@ -343,7 +429,7 @@ declare class UserService extends Service {
343
429
  getPermissions(user_id: string): Promise<Array<string>>;
344
430
  }
345
431
 
346
- declare class Application extends Application$1 {
432
+ declare class Application<T extends TypeAnyObject = ApplicationEvents> extends Application$1<T> {
347
433
  readonly hash: Hash;
348
434
  authService: AuthService;
349
435
  userService: UserService;
@@ -358,34 +444,37 @@ declare class Application extends Application$1 {
358
444
 
359
445
  interface BaseController extends Loggable {
360
446
  }
361
- declare abstract class BaseController extends EventEmitter {
447
+ declare abstract class BaseController<T extends TypeAnyObject = TypeAnyObject> extends EventEmitter<T> {
362
448
  protected readonly permissions: Array<string>;
363
449
  name(): string;
364
450
  session(ctx: Context, user_agent: string, store: IStore): Promise<void>;
365
451
  sync(): Promise<void>;
366
452
  }
367
453
 
368
- declare abstract class ModelController<M extends Model$1<any>> extends BaseController {
454
+ declare abstract class ModelController<M extends Model$1<any>, T extends TypeAnyObject = TypeAnyObject> extends BaseController<T> {
369
455
  protected readonly attributes: Array<string>;
370
456
  protected abstract readonly model: ModelStatic<M>;
371
457
  protected readonly permissions: Array<string>;
372
458
  private service;
373
- protected create(options: ArgumentsModelCreate<M>): Promise<M | null>;
374
- protected delete(options: ArgumentsModelDelete<M>): Promise<number>;
375
- protected findAll(options: ArgumentsModelFindAll<M>): Promise<ResultModelFindAll<M>>;
376
- protected findOne(options: ArgumentsModelFindOne<M>): Promise<M | null>;
459
+ protected countAll(options: ModelArgumentsCount<M>): Promise<number>;
460
+ protected create(options: ModelArgumentsCreate<M>): Promise<M | null>;
461
+ protected delete(options: ModelArgumentsDelete<M>): Promise<number>;
462
+ protected findAll(options: ModelArgumentsFindAll<M>): Promise<ModelResultFindAll<M>>;
463
+ protected findOne(options: ModelArgumentsFindOne<M>): Promise<M | null>;
464
+ protected include(model: ModelStatic<any>, options: ModelArgumentsInclude): IncludeOptions | null;
377
465
  sync(): Promise<void>;
378
- protected update(options: ArgumentsModelUpdate<M>): Promise<boolean>;
466
+ protected update(options: ModelArgumentsUpdate<M>): Promise<boolean>;
379
467
  name(): string;
380
468
  }
381
469
 
382
470
  declare class AuditsController extends ModelController<AuditModel> {
383
471
  protected readonly model: typeof AuditModel;
472
+ protected readonly permissions: string[];
384
473
  protected all(ctx: Context, type: string, table: string): Promise<void>;
385
474
  protected get(ctx: Context): Promise<void>;
386
475
  }
387
476
 
388
- declare class AuthController extends BaseController {
477
+ declare class AuthController extends BaseController<AuthEvents> {
389
478
  protected readonly authService: AuthService;
390
479
  constructor(authService: AuthService);
391
480
  protected login(ctx: Context, user_agent: string, username: string, password: string, remember: boolean, app: Application): Promise<void>;
@@ -394,17 +483,19 @@ declare class AuthController extends BaseController {
394
483
  protected user(ctx: Context, user: UserModel): Promise<void>;
395
484
  }
396
485
 
397
- declare abstract class CrudController<M extends Model$1<any>> extends ModelController<M> {
486
+ declare abstract class CrudController<M extends Model$1<any>, T extends TypeAnyObject = TypeAnyObject> extends ModelController<M, T> {
398
487
  private _crud;
399
- CrudArgumentsCreate(ctx: Context): ArgumentsModelUpdate<M>;
400
- CrudArgumentsFindAll(ctx: Context): ArgumentsModelFindAll<M>;
401
- CrudArgumentsFindOne(ctx: Context): ArgumentsModelFindOne<M>;
402
- CrudArgumentsDelete(ctx: Context): ArgumentsModelDelete<M>;
403
- CrudArgumentsUpdate(ctx: Context): ArgumentsModelUpdate<M>;
488
+ CrudArgumentscountAll(ctx: Context): ModelArgumentsUpdate<M>;
489
+ CrudArgumentsCreate(ctx: Context): ModelArgumentsUpdate<M>;
490
+ CrudArgumentsFindAll(ctx: Context): ModelArgumentsFindAll<M>;
491
+ CrudArgumentsFindOne(ctx: Context): ModelArgumentsFindOne<M>;
492
+ CrudArgumentsDelete(ctx: Context): ModelArgumentsDelete<M>;
493
+ CrudArgumentsUpdate(ctx: Context): ModelArgumentsUpdate<M>;
404
494
  CrudValidationCreate(): TypeObject<ValidationBase>;
405
495
  CrudValidationUpdate(): TypeObject<ValidationBase>;
406
496
  protected add(ctx: Context): Promise<void>;
407
497
  protected all(ctx: Context): Promise<void>;
498
+ protected number(ctx: Context): Promise<void>;
408
499
  protected del(ctx: Context): Promise<void>;
409
500
  protected get(ctx: Context): Promise<void>;
410
501
  protected set(ctx: Context): Promise<void>;
@@ -421,7 +512,7 @@ declare class FilesController extends BaseController {
421
512
  sync(): Promise<void>;
422
513
  }
423
514
 
424
- declare class ForgotController extends BaseController {
515
+ declare class ForgotController extends BaseController<ForgotEvents> {
425
516
  protected check(ctx: Context, token: string): Promise<void>;
426
517
  protected forgot(ctx: Context, username: string, app: Application): Promise<void>;
427
518
  protected reset(ctx: Context, token: string, password: string, app: Application): Promise<void>;
@@ -438,8 +529,8 @@ declare class GroupsController extends CrudController<GroupModel> {
438
529
 
439
530
  declare class GroupsPermissionsController extends ModelController<GroupPermissionModel> {
440
531
  protected readonly model: typeof GroupPermissionModel;
532
+ protected readonly permissions: never[];
441
533
  protected all(ctx: Context, group_id: string): Promise<void>;
442
- protected me(ctx: Context, user: UserModel): Promise<void>;
443
534
  protected set(ctx: Context, id: string, permissions: Array<string>): Promise<void>;
444
535
  }
445
536
 
@@ -457,7 +548,7 @@ declare class PermissionsController extends CrudController<PermissionModel> {
457
548
  CrudValidationUpdate(): TypeObject<ValidationBase>;
458
549
  }
459
550
 
460
- declare class RegisterController extends BaseController {
551
+ declare class RegisterController extends BaseController<RegisterEvents> {
461
552
  protected register(ctx: Context, body: TypeAnyObject, app: Application): Promise<void>;
462
553
  protected confirm(ctx: Context, token: string, app: Application): Promise<void>;
463
554
  protected send(ctx: Context, username: string, app: Application): Promise<void>;
@@ -476,6 +567,7 @@ declare class UsersController extends ModelController<UserModel> {
476
567
  private token_new;
477
568
  protected add(ctx: Context): Promise<void>;
478
569
  protected all(ctx: Context): Promise<void>;
570
+ protected number(ctx: Context): Promise<void>;
479
571
  protected del(ctx: Context, id: string, user: UserModel): Promise<void>;
480
572
  protected get(ctx: Context): Promise<void>;
481
573
  protected set(ctx: Context): Promise<void>;
@@ -483,11 +575,19 @@ declare class UsersController extends ModelController<UserModel> {
483
575
 
484
576
  declare class UsersGroupsController extends ModelController<UserGroupModel> {
485
577
  protected readonly model: typeof UserGroupModel;
578
+ protected readonly permissions: never[];
486
579
  protected all(ctx: Context, user_id: string): Promise<void>;
487
- protected me(ctx: Context, user: UserModel): Promise<void>;
488
580
  protected set(ctx: Context, id: string, groups: Array<string>): Promise<void>;
489
581
  }
490
582
 
583
+ declare class UsersProfilesController extends ModelController<UserProfileModel> {
584
+ protected readonly model: typeof UserProfileModel;
585
+ protected readonly permissions: never[];
586
+ protected all(ctx: Context): Promise<void>;
587
+ protected get(ctx: Context, user_id: string): Promise<void>;
588
+ protected set(ctx: Context, id: string, body: TypeAnyObject): Promise<void>;
589
+ }
590
+
491
591
  declare const sequelize: Sequelize;
492
592
 
493
593
  declare const CanCreate: (name?: string) => MethodDecorator;
@@ -530,8 +630,12 @@ declare class Env extends Env$1 {
530
630
  static readonly DATABASE_TIMEZONE: string;
531
631
  static readonly HTTP_CRT: Buffer<ArrayBufferLike> | null;
532
632
  static readonly HTTP_KEY: Buffer<ArrayBufferLike> | null;
633
+ static readonly SLEEP_AUTH: number;
634
+ static readonly SLEEP_FORGOT: number;
635
+ static readonly SLEEP_REGISTRY: number;
533
636
  static readonly TOKEN_CRT: Buffer<ArrayBufferLike> | null;
534
637
  static readonly TOKEN_KEY: Buffer<ArrayBufferLike> | null;
638
+ static readonly TOKEN_TTL: number;
535
639
  static readonly API_BODYPARSER_STRICT: boolean;
536
640
  static readonly API_BODYPARSER_INFLATE: boolean;
537
641
  static readonly API_BODYPARSER_LIMIT: string;
@@ -547,9 +651,6 @@ declare class Env extends Env$1 {
547
651
  static readonly API_KEY_HEADER: string;
548
652
  static readonly API_MODEL_LIMIT: number;
549
653
  static readonly API_MODEL_LIMIT_MAX: number;
550
- static readonly API_SLEEP_AUTH: number;
551
- static readonly API_SLEEP_FORGOT: number;
552
- static readonly API_SLEEP_REGISTRY: number;
553
654
  static readonly API_SESSION_NAME: string;
554
655
  static readonly API_SESSION_LIFETIME: number;
555
656
  static readonly API_SESSION_SECRET: string;
@@ -558,11 +659,10 @@ declare class Env extends Env$1 {
558
659
  static readonly API_TOKEN_FORGOT: number;
559
660
  static readonly API_TOKEN_HEADER: string;
560
661
  static readonly API_TOKEN_HEADER_KEY: string;
561
- static readonly API_TOKEN_LIFETIME: number;
562
662
  static readonly API_TOKEN_RENEW: number;
563
663
  static readonly API_USER_HISTORY: boolean;
564
664
  static readonly API_WEBSOCKET_START: boolean;
565
665
  }
566
666
 
567
- export { Application, Audit, AuditModel, AuditsController, AuthController, AuthService, BaseController, CanCreate, CanDelete, CanRead, CanUpdate, Config, ConfigModel, CrudController, Env, FilesController, ForgotController, ForgotModel, GroupModel, GroupPermissionModel, GroupsController, GroupsPermissionsController, HasGroups, HasPermissions, IsAuthenticated, Log, LogModel, Loggable, LogsController, MigrationModel, ModelController, ModelService, PermissionModel, PermissionsController, RegisterController, RegisterModel, ReqAuth, ReqGroup, ReqGroups, ReqPermission, ReqPermissions, ReqUser, Service, SessionModel, SessionStore, SetupController, UserAuthModel, UserGroupModel, UserMetadataModel, UserModel, UserPasswordModel, UserProfileModel, UserService, UsersController, UsersGroupsController, canFactory, sequelize };
568
- export type { ArgumentsModel, ArgumentsModelCreate, ArgumentsModelDelete, ArgumentsModelFindAll, ArgumentsModelFindOne, ArgumentsModelUpdate, CallbackModelFindAll, CallbackModelFindOne, IAuthParameters, ResultModelFindAll };
667
+ export { Application, Audit, AuditModel, AuditsController, AuthController, AuthService, BaseController, CanCreate, CanDelete, CanRead, CanUpdate, Config, ConfigModel, CrudController, Env, FilesController, ForgotController, ForgotModel, GroupModel, GroupPermissionModel, GroupsController, GroupsPermissionsController, HasGroups, HasPermissions, IsAuthenticated, Log, LogModel, Loggable, LogsController, MigrationModel, ModelController, ModelService, PermissionModel, PermissionsController, RegisterController, RegisterModel, ReqAuth, ReqGroup, ReqGroups, ReqPermission, ReqPermissions, ReqUser, Service, SessionModel, SessionStore, SetupController, UserAuthModel, UserGroupModel, UserMetadataModel, UserModel, UserPasswordModel, UserProfileModel, UserService, UsersController, UsersGroupsController, UsersProfilesController, canFactory, sequelize };
668
+ export type { ApplicationEvents, AuthEvents, ForgotEvents, IAuthParameters, ModelArgumentsBase, ModelArgumentsCount, ModelArgumentsCreate, ModelArgumentsDelete, ModelArgumentsFindAll, ModelArgumentsFindOne, ModelArgumentsInclude, ModelArgumentsUpdate, ModelCallbackFindAll, ModelCallbackFindOne, ModelOptions, ModelResultFindAll, RegisterEvents };
package/dist/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/api v5.0.0
2
+ * @andrewcaires/api v5.0.2
3
3
  * Simple api for small applications using express, jsonwebtoken, sequelize and websocket
4
4
  * (c) 2026 Andrew Caires
5
5
  * @license: MIT
6
6
  */
7
- import{Use as e,UnauthorizedError as t,parameterFactory as i,Context as r,NotFoundError as n,InternalServerError as o,Status as s,ValidationError as d,Application as a,Ctx as l,Headers as u,Session as p,Extends as c,Get as g,Query as v,Controller as y,Post as h,Validate as m,Body as _,App as E,Middleware as f,Delete as A,Put as S,Params as O,Upload as I}from"@andrewcaires/express";import{Env as T,Log as P,LogColor as w,Hash as b,sha256 as x}from"@andrewcaires/node";import{isUndefined as D,isFunction as C,includesArray as R,getConstructor as k,noop as j,loop as N,uuidv7 as B,merge as K,isArray as U,isString as M,clamp as L,isNumber as F,forEachSeries as H,sleep as q,EventEmitter as Y,upperCamelCase as $,denied as G,isDef as V,uniqueID as W,Validation as z}from"@andrewcaires/utils.js";import{WebSocketServer as J}from"ws";import{Sequelize as X,Hooks as Z,Column as Q,Association as ee,Database as te,ModelName as ie,Version as re,Model as ne,Unique as oe,HasMany as se,Value as de,DefaultValue as ae,Op as le,Where as ue}from"@andrewcaires/sequelize";import{config as pe}from"dotenv";import{hashSync as ce,compareSync as ge}from"bcrypt";import{Store as ve}from"express-session";import{Trait as ye,Singleton as he,Inject as me}from"@andrewcaires/decorator";import _e from"jsonwebtoken";import{existsSync as Ee,statSync as fe,readdirSync as Ae,mkdirSync as Se,lstatSync as Oe,rmSync as Ie}from"fs";import{join as Te}from"path";function Pe(e,t,i,r){var n,o=arguments.length,s=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,r);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(s=(o<3?n(s):o>3?n(t,i,s):n(t,i))||s);return o>3&&s&&Object.defineProperty(t,i,s),s}function we(e,t){return function(i,r){t(i,r,e)}}function be(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function xe(e,t,i,r){return new(i||(i=Promise))(function(n,o){function s(e){try{a(r.next(e))}catch(e){o(e)}}function d(e){try{a(r.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(s,d)}a((r=r.apply(e,t||[])).next())})}var De;"function"==typeof SuppressedError&&SuppressedError,pe({quiet:!0});class Env extends T{}De=Env,Env.BASE_NAME=De.getString("BASE_NAME",""),Env.CONSOLE_ERROR=De.getBool("CONSOLE_ERROR",!1),Env.DATABASE_URI=De.getString("DATABASE_URI",""),Env.DATABASE_LOG=De.getBool("DATABASE_LOG",!1),Env.DATABASE_AUDIT=De.getBool("DATABASE_AUDIT",!0),Env.DATABASE_PREFIX=De.getString("DATABASE_PREFIX",""),Env.DATABASE_TIMEZONE=De.getString("DATABASE_TIMEZONE","+00:00"),Env.HTTP_CRT=De.getFile("HTTP_CRT"),Env.HTTP_KEY=De.getFile("HTTP_KEY"),Env.TOKEN_CRT=De.getFile("TOKEN_CRT"),Env.TOKEN_KEY=De.getFile("TOKEN_KEY"),Env.API_BODYPARSER_STRICT=De.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=De.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=De.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=De.getString("API_BODYPARSER_TYPE","json"),Env.API_HTTP_PORT=De.getInt("API_HTTP_PORT",3e3),Env.API_HTTP_PUBLIC=De.getString("API_HTTP_PUBLIC",""),Env.API_HTTP_CROSS=De.getBool("API_HTTP_CROSS",!1),Env.API_HTTP_HYBRID=De.getBool("API_HTTP_HYBRID",!1),Env.API_HTTP_NOTFOUND=De.getString("API_HTTP_NOTFOUND",""),Env.API_HTTP_PATH=De.getString("API_HTTP_PATH","/api"),Env.API_HTTP_REDIRECT=De.getString("API_HTTP_REDIRECT",""),Env.API_KEY_HASH=De.getString("API_KEY_HASH",""),Env.API_KEY_HEADER=De.getString("API_KEY_HEADER","x-api-key"),Env.API_MODEL_LIMIT=De.getInt("API_MODEL_LIMIT",10),Env.API_MODEL_LIMIT_MAX=De.getInt("API_MODEL_LIMIT_MAX",500),Env.API_SLEEP_AUTH=De.getMs("API_SLEEP_AUTH","2s"),Env.API_SLEEP_FORGOT=De.getMs("API_SLEEP_FORGOT","5s"),Env.API_SLEEP_REGISTRY=De.getMs("API_SLEEP_REGISTRY","5s"),Env.API_SESSION_NAME=De.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=De.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=De.getString("API_SESSION_SECRET","yoursecret"),Env.API_TOKEN_COOKIE=De.getString("API_TOKEN_COOKIE","authorization"),Env.API_TOKEN_COOKIE_SET=De.getBool("API_TOKEN_COOKIE_SET",!0),Env.API_TOKEN_FORGOT=De.getMs("API_TOKEN_FORGOT","1d"),Env.API_TOKEN_HEADER=De.getString("API_TOKEN_HEADER","authorization"),Env.API_TOKEN_HEADER_KEY=De.getString("API_TOKEN_HEADER","bearer"),Env.API_TOKEN_LIFETIME=De.getMs("API_TOKEN_LIFETIME","1d"),Env.API_TOKEN_RENEW=De.getMs("API_TOKEN_RENEW","1d"),Env.API_USER_HISTORY=De.getBool("API_USER_HISTORY",!0),Env.API_WEBSOCKET_START=De.getBool("API_WEBSOCKET_START",!1);const Ce=new X({uri:Env.DATABASE_URI,logging:Env.DATABASE_LOG,prefix:Env.DATABASE_PREFIX,timezone:Env.DATABASE_TIMEZONE}),Re=i=>r=>(n,o,s)=>{e(e=>xe(void 0,void 0,void 0,function*(){var n;let o=null!=r?r:"";D(r)&&(o=C(e.controller.name)?e.controller.name():null===(n=e.controller.constructor)||void 0===n?void 0:n.name);const{permissions:s}=e.req;if((null!=s?s:[]).includes(`${o}.${i}`))return e.next();e.error(new t("Access Denied"))}))(n,o,s)},ke=Re("create"),je=Re("delete"),Ne=Re("read"),Be=Re("update"),Ke=(...i)=>(r,n,o)=>{e(e=>xe(void 0,void 0,void 0,function*(){const{groups:r}=e.req;if(R(i,null!=r?r:[]))return e.next();e.error(new t("Access Denied"))}))(r,n,o)},Ue=(...i)=>(r,n,o)=>{e(e=>xe(void 0,void 0,void 0,function*(){const{permissions:r}=e.req;if(R(i,null!=r?r:[]))return e.next();e.error(new t("Access Denied"))}))(r,n,o)},Me=()=>(i,r,n)=>{e(e=>xe(void 0,void 0,void 0,function*(){yield(e=>xe(void 0,void 0,void 0,function*(){var i,r,n,o;if(e.req.auth&&e.req.user)return e.next();const{[Env.API_KEY_HEADER]:s,[Env.API_TOKEN_HEADER]:d,"user-agent":a}=e.getHeaders(),l=e.getQuery(Env.API_KEY_HEADER),u=(null===(i=s||l)||void 0===i?void 0:i.toString())||"";let p=e.getCookie(Env.API_TOKEN_COOKIE);p=`${Env.API_TOKEN_HEADER_KEY} ${p}`;const[c,g]=null!==(n=null===(r=d||p)||void 0===r?void 0:r.split(" "))&&void 0!==n?n:["",""];if(!(u||g&&c.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!==(o=yield(u?v.key(u.toString()):v.user(g)).catch(t=>{e.error(t)}))&&void 0!==o?o:{};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)},Le=i(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.auth}),Fe=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)}),He=i(({ctx:e})=>{var t,i;return null!==(i=null===(t=e.req)||void 0===t?void 0:t.groups)&&void 0!==i?i:[]}),qe=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)}),Ye=i(({ctx:e})=>{var t,i;return null!==(i=null===(t=e.req)||void 0===t?void 0:t.permissions)&&void 0!==i?i:[]}),$e=i(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.user}),Ge=(e,t,i)=>{var n,o,s,d,a,l,u,p,c;const g=i.ctx instanceof r?i.ctx:null,v=null!==(d=null!==(s=null===(o=null===(n=null==g?void 0:g.req)||void 0===n?void 0:n.user)||void 0===o?void 0:o.id)&&void 0!==s?s:i.user_id)&&void 0!==d?d:null,y={type:e,model:null!==(a=null==t?void 0:t.getTableName())&&void 0!==a?a:null,state:!0,user_id:v};return g?Object.assign(Object.assign({},y),{full_url:null!==(l=null==g?void 0:g.getUrl())&&void 0!==l?l:"",ip_address:null!==(u=null==g?void 0:g.getIp())&&void 0!==u?u:"",user_agent:null!==(c=null===(p=null==g?void 0:g.req)||void 0===p?void 0:p.headers["user-agent"])&&void 0!==c?c:""}):y},Ve={afterCreate:(e,t)=>xe(void 0,void 0,void 0,function*(){const i=k(e),{primaryKeyAttribute:r}=null!=i?i:{};yield rt.create(Object.assign(Object.assign({},Ge("CREATE",i,t)),{record:r?e.getDataValue(r):null,data:e.toJSON()})).catch(P.catch)}),afterUpdate:(e,t)=>xe(void 0,void 0,void 0,function*(){const i=k(e),{primaryKeyAttribute:r}=null!=i?i:{},n={},o=e.changed();o&&o.forEach(t=>n[t]=e.getDataValue(t)),yield rt.create(Object.assign(Object.assign({},Ge("UPDATE",i,t)),{record:r?e.getDataValue(r):null,data:n,previously:e.previous()})).catch(P.catch)}),afterDestroy:(e,t)=>xe(void 0,void 0,void 0,function*(){const i=k(e),{primaryKeyAttribute:r}=null!=i?i:{};yield rt.create(Object.assign(Object.assign({},Ge("DELETE",i,t)),{record:r?e.getDataValue(r):null,data:e.toJSON()})).catch(P.catch)})},We=e=>(D(e)&&(e=Env.DATABASE_AUDIT),Z(e?Ve:{}));let ze=class RegisterModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],ze.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],ze.prototype,"secret",void 0),Pe([Q.FullDate(),be("design:type",Number)],ze.prototype,"expired_at",void 0),Pe([Q.Boolean(),be("design:type",Boolean)],ze.prototype,"state",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],ze.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],ze.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],ze.prototype,"deleted_at",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],ze.prototype,"user_id",void 0),ze=Pe([te(Ce),ie("register"),re("5.0.0")],ze);let Je=class UserAuthModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],Je.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],Je.prototype,"secret",void 0),Pe([Q.String(),be("design:type",String)],Je.prototype,"ip_address",void 0),Pe([Q.String(),be("design:type",String)],Je.prototype,"user_agent",void 0),Pe([Q.FullDate(),be("design:type",Object)],Je.prototype,"revoked_at",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],Je.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],Je.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],Je.prototype,"deleted_at",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],Je.prototype,"user_id",void 0),Je=Pe([te(Ce),ie("users_auth"),re("5.0.0")],Je);let Xe=class PermissionModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],Xe.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],Xe.prototype,"name",void 0),Pe([Q.String(),oe(!0),be("design:type",String)],Xe.prototype,"key",void 0),Pe([Q.String(),be("design:type",String)],Xe.prototype,"tag",void 0),Pe([Q.Text(),be("design:type",String)],Xe.prototype,"description",void 0),Pe([Q.Boolean(),be("design:type",Boolean)],Xe.prototype,"state",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],Xe.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],Xe.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],Xe.prototype,"deleted_at",void 0),Pe([se(()=>Ze,"permission_id"),be("design:type",Array)],Xe.prototype,"groups_permissions",void 0),Xe=Pe([te(Ce),ie("permission"),We(),re("5.0.0")],Xe);let Ze=class GroupPermissionModel extends ne{};Pe([Q.CreatedAt(),be("design:type",Date)],Ze.prototype,"created_at",void 0),Pe([ee.BelongsTo(()=>Qe),be("design:type",String)],Ze.prototype,"group_id",void 0),Pe([ee.BelongsTo(()=>Xe),be("design:type",String)],Ze.prototype,"permission_id",void 0),Ze=Pe([te(Ce),ie("groups_permissions"),We(),re("5.0.0")],Ze);let Qe=class GroupModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],Qe.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],Qe.prototype,"name",void 0),Pe([Q.String(),be("design:type",String)],Qe.prototype,"key",void 0),Pe([Q.Text(),be("design:type",String)],Qe.prototype,"description",void 0),Pe([Q.Boolean(),be("design:type",Boolean)],Qe.prototype,"state",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],Qe.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],Qe.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],Qe.prototype,"deleted_at",void 0),Pe([ee.HasMany(()=>et,"group_id"),be("design:type",Array)],Qe.prototype,"users_groups",void 0),Pe([ee.HasMany(()=>Ze,"group_id"),be("design:type",Array)],Qe.prototype,"groups_Permission",void 0),Qe=Pe([te(Ce),ie("group"),We(),re("5.0.0")],Qe);let et=class UserGroupModel extends ne{};Pe([Q.CreatedAt(),be("design:type",Date)],et.prototype,"created_at",void 0),Pe([ee.BelongsTo(()=>Qe),be("design:type",String)],et.prototype,"group_id",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],et.prototype,"user_id",void 0),et=Pe([te(Ce),ie("users_groups"),We(),re("5.0.0")],et);let tt=class UserPasswordModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],tt.prototype,"id",void 0),Pe([Q.String(),de(e=>ce(e.value,12)),be("design:type",String)],tt.prototype,"value",void 0),Pe([Q.Boolean(),be("design:type",Boolean)],tt.prototype,"state",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],tt.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],tt.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],tt.prototype,"deleted_at",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],tt.prototype,"user_id",void 0),tt=Pe([te(Ce),ie("users_password"),We(),re("5.0.0")],tt);let it=class UserModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],it.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],it.prototype,"name",void 0),Pe([Q.String(),be("design:type",String)],it.prototype,"email",void 0),Pe([Q.String(),be("design:type",String)],it.prototype,"username",void 0),Pe([Q.Text(),be("design:type",String)],it.prototype,"description",void 0),Pe([Q.Boolean(),be("design:type",Boolean)],it.prototype,"state",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],it.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],it.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],it.prototype,"deleted_at",void 0),Pe([ee.HasMany(()=>rt,"user_id"),be("design:type",Array)],it.prototype,"audits",void 0),Pe([ee.HasMany(()=>Je,"user_id"),be("design:type",Array)],it.prototype,"users_auths",void 0),Pe([ee.HasMany(()=>ze,"user_id"),be("design:type",Array)],it.prototype,"registers",void 0),Pe([ee.HasMany(()=>et,"user_id"),be("design:type",Array)],it.prototype,"users_groups",void 0),Pe([ee.HasMany(()=>tt,"user_id"),be("design:type",Array)],it.prototype,"users_passwords",void 0),it=Pe([te(Ce),ie("user"),We(),re("5.0.0")],it);let rt=class AuditModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],rt.prototype,"id",void 0),Pe([Q.Enum("CREATE","DELETE","UPDATE"),be("design:type",String)],rt.prototype,"type",void 0),Pe([Q.String(),be("design:type",String)],rt.prototype,"model",void 0),Pe([Q.String(),be("design:type",String)],rt.prototype,"record",void 0),Pe([Q.Json(),be("design:type",Object)],rt.prototype,"data",void 0),Pe([Q.Json(),be("design:type",Object)],rt.prototype,"previously",void 0),Pe([Q.Text(),be("design:type",String)],rt.prototype,"full_url",void 0),Pe([Q.String(),be("design:type",String)],rt.prototype,"ip_address",void 0),Pe([Q.String(),be("design:type",String)],rt.prototype,"user_agent",void 0),Pe([Q.Boolean(),be("design:type",Boolean)],rt.prototype,"state",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],rt.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],rt.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],rt.prototype,"deleted_at",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],rt.prototype,"user_id",void 0),rt=Pe([te(Ce),ie("audit"),re("5.0.0")],rt);let nt=class ConfigModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],nt.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],nt.prototype,"key",void 0),Pe([Q.String(),be("design:type",String)],nt.prototype,"value",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],nt.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],nt.prototype,"updated_at",void 0),nt=Pe([te(Ce),ie("configs"),re("5.0.0")],nt);let ot=class ForgotModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],ot.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],ot.prototype,"secret",void 0),Pe([Q.FullDate(),be("design:type",Number)],ot.prototype,"expired_at",void 0),Pe([Q.Boolean(),be("design:type",Boolean)],ot.prototype,"state",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],ot.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],ot.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],ot.prototype,"deleted_at",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],ot.prototype,"user_id",void 0),ot=Pe([te(Ce),ie("forgot"),re("5.0.0")],ot);let st=class LogModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],st.prototype,"id",void 0),Pe([Q.Enum("info","warn","error"),ae("info"),be("design:type",String)],st.prototype,"level",void 0),Pe([Q.Text(),be("design:type",String)],st.prototype,"message",void 0),Pe([Q.String(),be("design:type",String)],st.prototype,"source",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],st.prototype,"created_at",void 0),st=Pe([te(Ce),ie("log"),re("5.0.0")],st);let dt=class MigrationModel extends ne{};Pe([Q.String(),be("design:type",String)],dt.prototype,"model",void 0),Pe([Q.String(),be("design:type",String)],dt.prototype,"version",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],dt.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],dt.prototype,"updated_at",void 0),dt=Pe([te(Ce),ie("migration"),re("5.0.0")],dt);let at=class SessionModel extends ne{};Pe([Q.String(),be("design:type",String)],at.prototype,"session",void 0),Pe([Q.Text(),be("design:type",String)],at.prototype,"json",void 0),Pe([Q.BigInt(),be("design:type",Number)],at.prototype,"expired",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],at.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],at.prototype,"updated_at",void 0),at=Pe([te(Ce),ie("session"),re("5.0.0")],at);let lt=class UserMetadataModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],lt.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],lt.prototype,"key",void 0),Pe([Q.Text("medium"),be("design:type",String)],lt.prototype,"value",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],lt.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],lt.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],lt.prototype,"deleted_at",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],lt.prototype,"user_id",void 0),lt=Pe([te(Ce),ie("users_metadata"),We(),re("5.0.0")],lt);let ut=class UserProfileModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],ut.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],ut.prototype,"key",void 0),Pe([Q.Text("medium"),be("design:type",String)],ut.prototype,"value",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],ut.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],ut.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],ut.prototype,"deleted_at",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],ut.prototype,"user_id",void 0),ut=Pe([te(Ce),ie("users_profile"),We(),re("5.0.0")],ut);class Log{static error(e,t,i){return xe(this,void 0,void 0,function*(){yield this.writeRaw("error",e,t,i)})}static info(e,t,i){return xe(this,void 0,void 0,function*(){yield this.writeRaw("info",e,t,i)})}static warn(e,t,i){return xe(this,void 0,void 0,function*(){yield this.writeRaw("warn",e,t,i)})}static writeRaw(e,t,i,r){return xe(this,void 0,void 0,function*(){var n;r&&P.console(null!==(n=this.colors[e])&&void 0!==n?n:w.White,e,t),Ce&&(yield st.create({level:e,message:t,source:null!=i?i:""}).catch(P.catch))})}}Log.colors={error:w.Red,info:w.Cyan,warn:w.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(){return xe(this,void 0,void 0,function*(){const e=yield nt.findAll().catch(this.error),t={};return e&&e.forEach(e=>t[e.key]=e.value),t})}static del(e,t){return xe(this,void 0,void 0,function*(){var i;const r=null!==(i=null==t?void 0:t.id)&&void 0!==i?i:null;return((yield nt.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:r})).catch(this.error))||0)>0})}static get(e){return xe(this,arguments,void 0,function*(e,t=""){const[i]=(yield nt.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return i?i.value:t})}static set(e,t,i){return xe(this,void 0,void 0,function*(){var r;const n=null!==(r=null==i?void 0:i.id)&&void 0!==r?r:null,[o]=(yield nt.findOrCreate(Object.assign({where:{key:e}},{user_id:n})).catch(this.error))||[];o&&(o.value=t,yield o.save().catch(this.error))})}}class SessionStore extends ve{constructor(){super(),this.all=e=>xe(this,void 0,void 0,function*(){e=e||j;const t=yield at.findAll({attributes:["session"],where:{expired:{[le.gte]:Date.now()}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.session)),e()}),this.clear=e=>xe(this,void 0,void 0,function*(){yield at.destroy().catch(j),e&&e()}),this.destroy=(e,t)=>xe(this,void 0,void 0,function*(){yield at.destroy({where:{session:e}}).catch(j),t&&t()}),this.expired=()=>xe(this,void 0,void 0,function*(){yield at.destroy({where:{expired:{[le.lt]:Date.now()}}}).catch(j)}),this.get=(e,t)=>xe(this,void 0,void 0,function*(){t=t||j;const i=yield at.findOne({where:{session:e,expired:{[le.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=>xe(this,void 0,void 0,function*(){e&&e(null,(yield at.count().catch(j))||0)}),this.set=(e,t,i)=>xe(this,void 0,void 0,function*(){i=i||j;const r=Date.now()+Env.API_SESSION_LIFETIME,n=JSON.stringify(t),[o,s]=(yield at.findOrCreate({where:{session:e},defaults:{session:e,json:n,expired:r}}).catch(j))||[];o&&(s||(o.json=n,o.expired=r,yield o.save().catch(j))),i()}),this.loop=N(this.expired,3e4),this.loop.start()}}let pt=class Service{};pt=Pe([ye(Loggable)],pt);let ct=class AuthService extends pt{create(e){return xe(this,void 0,void 0,function*(){if(!Env.TOKEN_KEY)throw new n("TOKEN_KEY not found");const{id:t}=e,i=B(),r=yield Je.create({secret:i,user_id:t}).catch(this.error);if(!r)throw new o;return{auth:r,token:_e.sign({id:t,secret:i},Env.TOKEN_KEY,this.options())}})}destroy(e){return xe(this,void 0,void 0,function*(){return!(!e||e.revoked_at)&&(e.revoked_at=new Date,yield e.save(),!0)})}renew(e){return xe(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:o}=i;if(r&&o){const e=yield it.findOne({where:{id:r,state:!0}}).catch(this.error);if(e){const t=yield Je.findOne({where:{secret:o,user_id:e.id}}).catch(this.error);if(t&&!t.revoked_at){t.secret=B(),yield t.save().catch(this.error);return{auth:t,token:_e.sign({id:r,secret:t.secret},Env.TOKEN_KEY,this.options())}}}}throw new t("Invalid token")})}user(e){return xe(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 it.findOne({where:{id:r,state:!0}}).catch(this.error);if(e){const t=yield Je.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.API_TOKEN_LIFETIME}ms`}}verify(e,i){return xe(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:_e.verify(e,Env.TOKEN_CRT,{clockTolerance:i})}}catch(e){throw new t("Invalid token")}})}key(e){return xe(this,void 0,void 0,function*(){if(!e)throw new t("Invalid token");const i=yield it.findOne({where:{token:e,state:!0}}).catch(this.error);if(i){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield Je.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")})}};ct=Pe([he()],ct);class ModelService extends pt{constructor(e,t){super(),this.attributes=[],this.filter=[],this.model=e,t&&(this.filter=t)}create(e){return xe(this,arguments,void 0,function*({ctx:e,options:t,body:i}){var r,n;const d=Object.assign({},t||{}),a=yield this.model.create(Object.assign({},K({},null!==(n=null===(r=null==e?void 0:e.req)||void 0===r?void 0:r.body)&&void 0!==n?n:{},null!=i?i:{})),Object.assign(Object.assign({},d),{ctx:e})).catch(this.error);if(a){const{primaryKeyAttribute:t}=this.model;return null==e||e.prepare(s.OK,{[t]:a.getDataValue(t)}),a}return null==e||e.error(new o),null})}delete(e){return xe(this,arguments,void 0,function*({ctx:e,options:t,id:i}){var r,s,d;const a=Object.assign({},t||{}),{primaryKeyAttribute:l}=this.model,{[l]:u}=null!==(s=null===(r=null==e?void 0:e.req)||void 0===r?void 0:r.params)&&void 0!==s?s:{[l]:null!=i?i:0};if(!u)return null==e||e.error(new o),0;const p=yield this.model.destroy(Object.assign(Object.assign(Object.assign({},a),{where:Object.assign(Object.assign({},null!==(d=a.where)&&void 0!==d?d:{}),{[l]:u}),individualHooks:!0}),{ctx:e})).catch(this.error);return p?(null==e||e.success("OK"),p):(null==e||e.error(new n),0)})}filterAttributes(e,t){if(U(t))return t.length?t.map(t=>M(t)&&-1!=e.indexOf(t)?t:void 0).filter(M):e;const{exclude:i,include:r}=t,n=D(r)?e:r.map(t=>M(t)&&-1!=e.indexOf(t)?t:void 0).filter(M),o=null!=i?i:[];return o.length?n.filter(e=>-1==o.indexOf(e)):n}findAll(e){return xe(this,arguments,void 0,function*({ctx:e,options:t,callback:i,advanced:r,limited:n}){var a,l,u,p,c,g,v;const y=Object.assign({},t||{}),{attributes:h,limit:m,offset:_,asc:E,desc:f,search:A,where:S}=null!==(l=null===(a=null==e?void 0:e.req)||void 0===a?void 0:a.query)&&void 0!==l?l:{};if(D(y.limit)){let e=Env.API_MODEL_LIMIT;M(m)&&(e=parseInt(m)||0),e=L(e,-1,Env.API_MODEL_LIMIT_MAX),y.limit=e>0?e:n?Env.API_MODEL_LIMIT:void 0}if(F(y.limit)&&(y.limit=y.limit>0?y.limit:void 0),M(_)){const e=parseInt(_)||0;y.offset=e>0?e:void 0}const O=this.getAttributes(null!==(u=null==y?void 0:y.attributes)&&void 0!==u?u:[]),I=e=>O.indexOf(e)>=0;y.attributes=[],M(h)&&h.length&&y.attributes.push(...h.split(";").filter(I)),y.attributes.length||(y.attributes=O);const T=[];if(M(E)&&E.length&&T.push(...E.split(";").filter(I).map(e=>[e,"ASC"])),M(f)&&f.length&&T.push(...f.split(";").filter(I).map(e=>[e,"DESC"])),T.length&&(y.order=T),y.where=Object.assign({},y.where||{}),M(S)&&(null==r||r)){const t=ue.parse(O,S);if(!D(t.error))return null==e||e.error(new d(t.error.join(", "))),{count:0,records:[]};y.where=Object.assign(Object.assign({},y.where),null!==(p=t.value)&&void 0!==p?p:{})}else{const e=[];O.forEach(t=>{M(A)&&A.length&&e.push({[t]:{[le.like]:`%${A}%`}})}),e.length&&(y.where=Object.assign(Object.assign({},y.where),{[le.or]:[...e]}))}const P=this.model.count(Object.assign(Object.assign({},y),{distinct:!!y.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error),w=this.model.findAll(y).catch(this.error);yield Promise.allSettled([P,w]);const b=null!==(c=yield P)&&void 0!==c?c:0;let x=null!==(g=yield w)&&void 0!==g?g:[];const C={count:b};return x?(x=i?yield i(x):x,(F(null==t?void 0:t.limit)||0==b)&&(C.count=null!==(v=null==x?void 0:x.length)&&void 0!==v?v:0),null==e||e.prepare(s.OK,Object.assign(Object.assign({},C),{records:x})),Object.assign(Object.assign({},C),{records:x})):(null==e||e.error(new o),Object.assign(Object.assign({},C),{records:[]}))})}findOne(e){return xe(this,arguments,void 0,function*({ctx:e,options:t,callback:i}){var r,d,a,l,u;const p=Object.assign({},t||{}),{primaryKeyAttribute:c}=this.model,{[c]:g}=null!==(r=null==e?void 0:e.req.params)&&void 0!==r?r:{},v=this.getAttributes(null!==(d=null==p?void 0:p.attributes)&&void 0!==d?d:[]),y=e=>v.indexOf(e)>=0,{attributes:h}=null!==(l=null===(a=null==e?void 0:e.req)||void 0===a?void 0:a.query)&&void 0!==l?l:{};M(h)&&(p.attributes=h.split(";").filter(y));const m=yield this.model.findOne(Object.assign(Object.assign({},p),{where:Object.assign(Object.assign({},null!==(u=null==p?void 0:p.where)&&void 0!==u?u:{}),{[c]:g})})).catch(this.error);return m?(null==e||e.prepare(s.OK,i?yield i(m):m.toJSON()),m):m?(null==e||e.error(new o),null):(null==e||e.error(new n),null)})}getAttributes(e){return 0==this.attributes.length&&(this.attributes=this.filterAttributes(Object.keys(this.model.getAttributes()),this.filter)),this.filterAttributes(this.attributes,e)}update(e){return xe(this,arguments,void 0,function*({ctx:e,options:t,body:i,id:r}){var n,o,s,d,a,l;const u=Object.assign({},t||{}),{primaryKeyAttribute:p}=this.model,{[p]:c}=null!==(o=null===(n=null==e?void 0:e.req)||void 0===n?void 0:n.params)&&void 0!==o?o:{[p]:null!=r?r:0},[g]=null!==(l=yield this.model.update(Object.assign({},K({},null!==(d=null===(s=null==e?void 0:e.req)||void 0===s?void 0:s.body)&&void 0!==d?d:{},null!=i?i:{})),Object.assign(Object.assign(Object.assign({},u),{where:Object.assign(Object.assign({},null!==(a=null==u?void 0:u.where)&&void 0!==a?a:{}),{[p]:c}),individualHooks:!0}),{ctx:e})).catch(this.error))&&void 0!==l?l:[];return g?(null==e||e.success("OK"),!0):(null==e||e.success("Record not changed"),!1)})}name(){return this.model.tableName}}let gt=class UserService extends pt{getMetadata(e){return xe(this,void 0,void 0,function*(){var t;return Object.fromEntries((null!==(t=yield lt.findAll({where:{user_id:e}}).catch(this.error))&&void 0!==t?t:[]).map(e=>[e.key,e.value]))})}getProfile(e){return xe(this,void 0,void 0,function*(){var t;return Object.fromEntries((null!==(t=yield ut.findAll({where:{user_id:e}}).catch(this.error))&&void 0!==t?t:[]).map(e=>[e.key,e.value]))})}getGroups(e){return xe(this,void 0,void 0,function*(){var t;return(null!==(t=yield Qe.findAll({attributes:["key"],where:{state:!0},include:[{model:et,required:!0,where:{user_id:e}}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}getPermissions(e){return xe(this,void 0,void 0,function*(){var t;return(null!==(t=yield Xe.findAll({attributes:["key"],where:{state:!0},include:[{model:Ze,required:!0,include:[{model:Qe,required:!0,attributes:["id"],where:{state:!0},include:[{model:et,required:!0,where:{user_id:e}}]}]}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}};gt=Pe([he()],gt);class Application extends a{constructor(e,t){super(e,K({},{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:B}},null!=t?t:{})),this.hash=new b(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 xe(this,void 0,void 0,function*(){yield Ce.sync(),yield this.migrations(Ce),yield H(this.controllers,e=>xe(this,void 0,void 0,function*(){C(e.sync)&&(yield e.sync(this))})),this.authService=new ct,this.userService=new gt,yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new J({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>xe(this,void 0,void 0,function*(){t.url||(t.url=""),!(t.url.length<=1)&&t.url.replace(/\//g,"."),e.on("close",()=>{}),yield q(2e3),e.close()})))})}migrations(e){return xe(this,void 0,void 0,function*(){const t=[];yield H(Object.keys(e.models),i=>xe(this,void 0,void 0,function*(){var r;const n=e.models[i],o=n.version();if(!o)return;const[s,d]=null!==(r=yield dt.findOrCreate({where:{model:n.tableName},defaults:{model:n.tableName,version:""}}).catch(this.error))&&void 0!==r?r:[];s&&(d||s.version!=o)&&(s.version=o,yield s.save().catch(this.error),t.push(n))})),yield H(t,e=>xe(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}let vt=class BaseController extends Y{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 xe(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 xe(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield H(this.permissions,i=>xe(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=$(e.replace(/_/g," ")," ");yield Xe.findOrCreate({where:{key:r},defaults:Object.assign({name:`${n} ${$(i," ")}`,key:r,tag:n},t)})}))})}};Pe([we(0,l()),we(1,u("user-agent")),we(2,p()),be("design:type",Function),be("design:paramtypes",[r,String,Object]),be("design:returntype",Promise)],vt.prototype,"session",null),vt=Pe([ye(Loggable)],vt);let yt=class ModelController extends vt{constructor(){super(...arguments),this.attributes=[],this.permissions=["create","read","update","delete"]}create(e){return xe(this,void 0,void 0,function*(){return yield this.service.create(e)})}delete(e){return xe(this,void 0,void 0,function*(){return yield this.service.delete(e)})}findAll(e){return xe(this,void 0,void 0,function*(){return yield this.service.findAll(e)})}findOne(e){return xe(this,void 0,void 0,function*(){return yield this.service.findOne(e)})}sync(){return xe(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield H(this.permissions,i=>xe(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=$(e.replace(/_/g," ")," ");yield Xe.findOrCreate({where:{key:r},defaults:Object.assign({name:`${n} ${$(i," ")}`,key:r,tag:n},t)})})),this.service=new ModelService(this.model)})}update(e){return xe(this,void 0,void 0,function*(){return yield this.service.update(e)})}name(){return this.model.tableName}};yt=Pe([c(vt)],yt);let ht=class AuditsController extends yt{constructor(){super(...arguments),this.model=rt}all(e,t,i){return xe(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 xe(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}};Pe([g(),Me(),Ne(),we(0,l()),we(1,v("type")),we(2,v("table")),be("design:type",Function),be("design:paramtypes",[r,String,String]),be("design:returntype",Promise)],ht.prototype,"all",null),Pe([g("/:id"),Me(),Ne(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],ht.prototype,"get",null),ht=Pe([y("/audits"),c(yt)],ht);let mt=class AuthController extends vt{constructor(e){super(),this.authService=e}login(e,i,r,n,o,s){return xe(this,void 0,void 0,function*(){var d;yield q(Env.API_SLEEP_AUTH);const a=yield it.findOne({where:{[le.or]:[{email:r},{username:r}]}}).catch(this.error);if(!a)return e.error(new t("Invalid credentials")),s.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const l=yield tt.findOne({where:{user_id:a.id,state:!0}}).catch(this.error);if(!l||!ge(n,l.value))return e.error(new t("Invalid credentials")),s.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const u=yield ze.findOne({where:{state:!0,user_id:a.id}}).catch(this.error);if(u)return e.error("ACTIVATION REQUIRED"),s.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")),s.emit("auth.failure",{ctx:e,user:a}),void this.emit("auth.failure",{ctx:e,user:a});const{auth:p,token:c}=null!==(d=yield this.authService.create(a).catch(t=>{e.error(t),s.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e})}))&&void 0!==d?d:{};p&&c&&(p.user_agent=i,p.ip_address=e.getIp(),yield p.save().catch(this.error),Env.API_TOKEN_COOKIE_SET&&e.cookie(Env.API_TOKEN_COOKIE,c,{maxAge:o?Env.API_TOKEN_LIFETIME:void 0}),e.json({token:c}),s.emit("auth.login",{ctx:e,auth:p,user:a}),this.emit("auth.login",{ctx:e,auth:p,user:a}))})}logout(e,i,r,n){return xe(this,void 0,void 0,function*(){if(yield this.authService.destroy(i))return 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 xe(this,void 0,void 0,function*(){var n;const{auth:o,token:s}=null!==(n=yield this.authService.renew(i).catch(t=>{e.error(t)}))&&void 0!==n?n:{};o&&s&&(o.user_agent=t,yield o.save().catch(this.error),e.json({token:s}),r.emit("auth.renew",{auth:o,ctx:e}),this.emit("auth.renew",{auth:o,ctx:e}))})}user(e,t){return xe(this,void 0,void 0,function*(){const{groups:i,permissions:r,profile:n}=e.req;if(!i||!r)return e.error(new o);e.json(Object.assign(Object.assign({},G(["username","description"],t.toJSON())),{groups:i,permissions:r,profile:n}))})}};Pe([h("/login"),m(e=>({username:e.string().min(3).required(),password:e.string().min(5).required(),remember:e.boolean().parse().empty(!1)})),we(0,l()),we(1,u("user-agent")),we(2,_("username")),we(3,_("password")),we(4,_("remember")),we(5,E()),be("design:type",Function),be("design:paramtypes",[r,String,String,String,Boolean,Application]),be("design:returntype",Promise)],mt.prototype,"login",null),Pe([g("/logout"),Me(),we(0,l()),we(1,Le()),we(2,$e()),we(3,E()),be("design:type",Function),be("design:paramtypes",[r,Je,it,Application]),be("design:returntype",Promise)],mt.prototype,"logout",null),Pe([h("/renew"),m(e=>({token:e.string().required()})),we(0,l()),we(1,u("user-agent")),we(2,_("token")),we(3,E()),be("design:type",Function),be("design:paramtypes",[r,String,String,Application]),be("design:returntype",Promise)],mt.prototype,"renew",null),Pe([g(),Me(),we(0,l()),we(1,$e()),be("design:type",Function),be("design:paramtypes",[r,it]),be("design:returntype",Promise)],mt.prototype,"user",null),mt=Pe([y("/auth"),c(vt),we(0,me(ct)),be("design:paramtypes",[ct])],mt);let _t=class CrudController extends yt{constructor(){super(...arguments),this._crud={}}CrudArgumentsCreate(e){return{ctx:e}}CrudArgumentsFindAll(e){return{ctx:e}}CrudArgumentsFindOne(e){return{ctx:e}}CrudArgumentsDelete(e){return{ctx:e}}CrudArgumentsUpdate(e){return{ctx:e}}CrudValidationCreate(){return this._crud}CrudValidationUpdate(){return this._crud}add(e){return xe(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return xe(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}del(e){return xe(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return xe(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return xe(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validationCreate(e){return xe(this,void 0,void 0,function*(){if(this.CrudValidationCreate()==this._crud)return e.error(new o)})}validationUpdate(e){return xe(this,void 0,void 0,function*(){if(this.CrudValidationUpdate()==this._crud)return e.error(new o)})}};Pe([h(),Me(),ke(),f("validationCreate"),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],_t.prototype,"add",null),Pe([g(),Me(),Ne(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],_t.prototype,"all",null),Pe([A("/:id"),Me(),je(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],_t.prototype,"del",null),Pe([g("/:id"),Me(),Ne(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],_t.prototype,"get",null),Pe([S("/:id"),Me(),Be(),f("validationUpdate"),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],_t.prototype,"set",null),Pe([we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],_t.prototype,"validationCreate",null),Pe([we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],_t.prototype,"validationUpdate",null),_t=Pe([c(yt)],_t);let Et=class FilesController extends vt{constructor(){super(...arguments),this.directory=Env.API_HTTP_PUBLIC||"./",this.permissions=["delete","download","edit","list","read","rename","upload","write"]}files(e){return xe(this,void 0,void 0,function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const i=Te(this.directory,t);if(!Ee(i)||!fe(i).isDirectory())return e.error(new n);let r=[];return r=Ae(i),r=r.map(e=>this.info(Te(i,e))),r=r.filter(V),Object.assign(Object.assign({},this.info(i)),{files:r})})}info(e){if(!Ee(e))return null;const t=fe(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 xe(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=$(e.replace(/_/g," ")," "),i={description:"",state:!0};yield H(this.permissions,r=>xe(this,void 0,void 0,function*(){const n=`${e}.${r}`;yield Xe.findOrCreate({where:{key:n},defaults:Object.assign({name:`${t} ${$(r," ")}`,key:n,tag:t},i)})}))})}};Pe([g("/path"),g("/path/*path"),Me(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],Et.prototype,"files",null),Et=Pe([y("/files"),c(vt)],Et);let ft=class ForgotController extends vt{check(e,t){return xe(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i||!i.user)return e.error(new n);i.secret=W(),yield i.save(),e.json({token:i.secret})})}forgot(e,t,i){return xe(this,void 0,void 0,function*(){yield q(Env.API_SLEEP_FORGOT);const r=t,o=yield it.findOne({where:{[le.or]:[{email:r},{username:t}]}}).catch(this.error);if(!o)return e.error(new n);const s=W(),d=Date.now()+6e4*Env.API_TOKEN_FORGOT,a=yield ot.create({token:s,timestamp:d,state:!0,user_id:o.id});e.success("OK"),i.emit("forgot.send",{ctx:e,forgot:a,user:o}),this.emit("forgot.send",{ctx:e,forgot:a,user:o})})}reset(e,t,i,r){return xe(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 xe(this,void 0,void 0,function*(){return yield ot.findOne({where:{token:e,state:!0},include:[{model:it,required:!0}]}).catch(this.error)})}};Pe([g("/check"),m(e=>({token:e.string().required()})),we(0,l()),we(1,_("token")),be("design:type",Function),be("design:paramtypes",[r,String]),be("design:returntype",Promise)],ft.prototype,"check",null),Pe([h(),m(e=>({username:e.string().min(4).required()})),we(0,l()),we(1,_("username")),we(2,E()),be("design:type",Function),be("design:paramtypes",[r,String,Application]),be("design:returntype",Promise)],ft.prototype,"forgot",null),Pe([h("/reset"),m(e=>({token:e.string().required(),password:e.string().min(5).required()})),we(0,l()),we(1,_("token")),we(2,_("password")),we(3,E()),be("design:type",Function),be("design:paramtypes",[r,String,String,Application]),be("design:returntype",Promise)],ft.prototype,"reset",null),ft=Pe([y("/forgot"),c(vt)],ft);let At=class GroupsController extends _t{constructor(){super(...arguments),this.model=Qe,this.schemaCreate={name:z.string().required(),description:z.string().empty(""),state:z.boolean().parse().required()},this.schemaUpdate={name:z.string().empty(),description:z.string().empty(),state:z.boolean().parse().empty()}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}};At=Pe([y("/groups"),c(_t)],At);let St=class GroupsPermissionsController extends yt{constructor(){super(...arguments),this.model=Ze}all(e,t){return xe(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{group_id:t},include:[{model:Xe,required:!0}]},callback:e=>e.map(e=>e.permission)})})}me(e,t){return xe(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(e,t,i){return xe(this,void 0,void 0,function*(){const r=yield Qe.findByPk(t,{attributes:["id"]}).catch(this.error);if(!r)return e.error(new n);const o=r.id,s=[];yield H(i,t=>xe(this,void 0,void 0,function*(){var i;if(!(yield Xe.count({where:{id:t}})))return;const[r]=null!==(i=yield Ze.findOrCreate(Object.assign({where:{group_id:o,permission_id:t},defaults:{group_id:o,permission_id:t}},{ctx:e})).catch(this.error))&&void 0!==i?i:[];r&&s.push(t)})),yield Ze.destroy(Object.assign({where:{group_id:o,permission_id:{[le.notIn]:s}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}};Pe([g("/:id/permissions"),Me(),Ne("groups"),we(0,l()),we(1,O("id")),be("design:type",Function),be("design:paramtypes",[r,String]),be("design:returntype",Promise)],St.prototype,"all",null),Pe([g("/permissions"),Me(),Ne("users"),we(0,l()),we(1,$e()),be("design:type",Function),be("design:paramtypes",[r,it]),be("design:returntype",Promise)],St.prototype,"me",null),Pe([S("/:id/permissions"),Me(),Be("groups"),m(e=>({permissions:e.array(e.string())})),we(0,l()),we(1,O("id")),we(2,_("permissions")),be("design:type",Function),be("design:paramtypes",[r,String,Array]),be("design:returntype",Promise)],St.prototype,"set",null),St=Pe([y("/groups"),c(yt)],St);let Ot=class LogsController extends yt{constructor(){super(...arguments),this.model=st,this.permissions=["read"]}all(e){return xe(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{order:[["created_at","DESC"]]},limited:!0})})}};Pe([g(),Me(),Ne(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],Ot.prototype,"all",null),Ot=Pe([y("/logs"),c(yt)],Ot);let It=class PermissionsController extends _t{constructor(){super(...arguments),this.model=Xe,this.schemaCreate={name:z.string().required(),key:z.string().required(),tag:z.string().required(),description:z.string().empty(""),state:z.boolean().parse().required()},this.schemaUpdate={name:z.string().empty(),key:z.string().empty(),tag:z.string().empty(),description:z.string().empty(),state:z.boolean().parse().empty()}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}};It=Pe([y("/permissions"),c(_t)],It);let Tt=class RegisterController extends vt{register(e,t,i){return xe(this,void 0,void 0,function*(){yield q(Env.API_SLEEP_REGISTRY);const{name:r,date:n,email:s,username:d,password:a,confirm:l}=t,u=d||s,p=x(a);if(yield it.count({where:{[le.or]:[{email:s},{username:u}]}}).catch(this.error))return e.error("INVALID EMAIL OR USERNAME");if(p!=x(l))return e.error("INVALID PASSWORD");const c=yield it.create({name:r,email:s,username:u,password:p,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!c)return e.error(new o);const g=yield ze.create({token:yield this.getId(),user_id:c.id,state:!0}).catch(this.error);if(!g)return yield c.destroy().catch(this.error),e.error(new o);e.success("OK"),i.emit("register.user",{ctx:e,register:g,user:c}),this.emit("register.user",{ctx:e,register:g,user:c})})}confirm(e,t,i){return xe(this,void 0,void 0,function*(){const r=yield ze.findOne({where:{token:t,state:!0},include:[{model:it,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 xe(this,void 0,void 0,function*(){const r=t,o=yield ze.findOne({where:{state:!0},include:[{model:it,required:!0,where:{[le.or]:[{email:r},{username:t}]}}]}).catch(this.error);if(!o)return e.error(new n);e.success("OK"),i.emit("register.send",{ctx:e,register:o,user:o.user}),this.emit("register.send",{ctx:e,register:o,user:o.user})})}getId(){return xe(this,void 0,void 0,function*(){const e=B();return(yield ze.count({where:{token:e}}))?this.getId():e})}};Pe([h(),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()})),we(0,l()),we(1,_()),we(2,E()),be("design:type",Function),be("design:paramtypes",[r,Object,Application]),be("design:returntype",Promise)],Tt.prototype,"register",null),Pe([h("/confirm"),m(e=>({token:e.string().required()})),we(0,l()),we(1,_("token")),we(2,E()),be("design:type",Function),be("design:paramtypes",[r,String,Application]),be("design:returntype",Promise)],Tt.prototype,"confirm",null),Pe([h("/send"),m(e=>({username:e.string().min(4).required()})),we(0,l()),we(1,_("username")),we(2,E()),be("design:type",Function),be("design:paramtypes",[r,String,Application]),be("design:returntype",Promise)],Tt.prototype,"send",null),Tt=Pe([y("/register"),c(vt)],Tt);let Pt=class SetupController extends vt{setup(e){return xe(this,void 0,void 0,function*(){var t;if(yield it.count())return e.success("OK");const i=W(),r=yield it.create({name:"Admin",email:"admin@localhost",username:"admin",password:x("admin"+i),salt:i,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0},Object.assign({},{ctx:e}));yield tt.create({value:"admin",state:!0,user_id:r.id});const n=yield Qe.create(Object.assign({name:"Admin"},{description:"API CORE",state:!0}),Object.assign({},{ctx:e}));yield et.create({user_id:r.id,group_id:n.id},Object.assign({},{ctx:e}));const o=null!==(t=yield Xe.findAll({where:{state:!0}}).catch(this.error))&&void 0!==t?t:[];yield H(o,t=>xe(this,void 0,void 0,function*(){yield Ze.create({group_id:n.id,permission_id:t.id},Object.assign({},{ctx:e}))})),e.success("OK")})}};Pe([g(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],Pt.prototype,"setup",null),Pt=Pe([y("/setup"),c(vt)],Pt);let wt=class UsersController extends yt{constructor(){super(),this.model=it,this.path=Env.API_HTTP_PUBLIC+"/avatar",Env.API_HTTP_PUBLIC&&Ee(Env.API_HTTP_PUBLIC)&&!Ee(this.path)&&Se(this.path)}avatar(e,t){return xe(this,void 0,void 0,function*(){var i,r;const n=e.getFiles();if(n.file&&n.file.length){const{filename:s,path:d}=null!==(i=n.file[0])&&void 0!==i?i:{};if(s){const[i]=null!==(r=yield ut.findOrCreate(Object.assign({where:{key:"avatar",user_id:t.id},defaults:{key:"avatar",user_id:t.id}},{ctx:e})).catch(this.error))&&void 0!==r?r:[];if(!i)return Oe(d).isFile()&&Ie(d),e.error(new o);const n=this.path+"/"+i.value;if(Ee(n)&&Oe(n).isFile()&&Ie(n),i.value=s,yield i.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK")}}e.success("Record not Changed")})}token_new(){return xe(this,void 0,void 0,function*(){var e;const t=B();return(null!==(e=yield this.model.count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t})}add(e){return xe(this,void 0,void 0,function*(){yield this.create({ctx:e})})}all(e){return xe(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}del(e,t,i){return xe(this,void 0,void 0,function*(){if(i.id.toString()==t)return e.error(new n);yield this.delete({ctx:e})})}get(e){return xe(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e){return xe(this,void 0,void 0,function*(){yield this.update({ctx:e})})}};Pe([h("/avatar"),Me(),I({file:{count:1,path:`${Env.API_HTTP_PUBLIC}/avatar`,types:["image/bmp","image/jpeg","image/png"],size:32}}),we(0,l()),we(1,$e()),be("design:type",Function),be("design:paramtypes",[r,it]),be("design:returntype",Promise)],wt.prototype,"avatar",null),Pe([h(),Me(),ke(),m(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)})),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],wt.prototype,"add",null),Pe([g(),Me(),Ne(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],wt.prototype,"all",null),Pe([A("/:id"),Me(),je(),we(0,l()),we(1,O("id")),we(2,$e()),be("design:type",Function),be("design:paramtypes",[r,String,it]),be("design:returntype",Promise)],wt.prototype,"del",null),Pe([g("/:id"),Me(),Ne(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],wt.prototype,"get",null),Pe([S("/:id"),Me(),Be(),m(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()})),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],wt.prototype,"set",null),wt=Pe([y("/users"),c(yt),be("design:paramtypes",[])],wt);let bt=class UsersGroupsController extends yt{constructor(){super(...arguments),this.model=et}all(e,t){return xe(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{user_id:t},include:[{model:Qe,required:!0}]},callback:e=>e.map(e=>e.group)})})}me(e,t){return xe(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(e,t,i){return xe(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 o=r.id,s=[];yield H(i,t=>xe(this,void 0,void 0,function*(){var i;if(!(yield Qe.count({where:{id:t}})))return;const[r]=null!==(i=yield et.findOrCreate(Object.assign({where:{user_id:o,group_id:t},defaults:{user_id:o,group_id:t}},{ctx:e})).catch(this.error))&&void 0!==i?i:[];r&&s.push(t)})),yield et.destroy(Object.assign({where:{user_id:o,group_id:{[le.notIn]:s}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}};Pe([g("/:id/groups"),Me(),Ne("users"),we(0,l()),we(1,O("id")),be("design:type",Function),be("design:paramtypes",[r,String]),be("design:returntype",Promise)],bt.prototype,"all",null),Pe([g("/groups"),Me(),Ne("users"),we(0,l()),we(1,$e()),be("design:type",Function),be("design:paramtypes",[r,it]),be("design:returntype",Promise)],bt.prototype,"me",null),Pe([S("/:id/groups"),Me(),Be("users"),m(e=>({groups:e.array(e.string())})),we(0,l()),we(1,O("id")),we(2,_("groups")),be("design:type",Function),be("design:paramtypes",[r,String,Array]),be("design:returntype",Promise)],bt.prototype,"set",null),bt=Pe([y("/users"),c(yt)],bt);export{Application,We as Audit,rt as AuditModel,ht as AuditsController,mt as AuthController,ct as AuthService,vt as BaseController,ke as CanCreate,je as CanDelete,Ne as CanRead,Be as CanUpdate,Config,nt as ConfigModel,_t as CrudController,Env,Et as FilesController,ft as ForgotController,ot as ForgotModel,Qe as GroupModel,Ze as GroupPermissionModel,At as GroupsController,St as GroupsPermissionsController,Ke as HasGroups,Ue as HasPermissions,Me as IsAuthenticated,Log,st as LogModel,Loggable,Ot as LogsController,dt as MigrationModel,yt as ModelController,ModelService,Xe as PermissionModel,It as PermissionsController,Tt as RegisterController,ze as RegisterModel,Le as ReqAuth,Fe as ReqGroup,He as ReqGroups,qe as ReqPermission,Ye as ReqPermissions,$e as ReqUser,pt as Service,at as SessionModel,SessionStore,Pt as SetupController,Je as UserAuthModel,et as UserGroupModel,lt as UserMetadataModel,it as UserModel,tt as UserPasswordModel,ut as UserProfileModel,gt as UserService,wt as UsersController,bt as UsersGroupsController,Re as canFactory,Ce 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 U,loop as j,uuidv7 as K,isString as B,clamp as L,merge as M,isArray as F,clone as H,forEachAsync as q,upperCamelCase as Y,forEachSeries as $,sleep as G,EventEmitter as V,denied as W,isDef as J,uniqueID as z,Validation 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.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_MODEL_LIMIT=ke.getInt("API_MODEL_LIMIT",10),Env.API_MODEL_LIMIT_MAX=ke.getInt("API_MODEL_LIMIT_MAX",500),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"),Le=Ue("update"),Me=(...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.API_MODEL_LIMIT,B(i)&&(t.limit=parseInt(i)||0),t.limit=L(t.limit,-1,Env.API_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=M({},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=M({},o),l=yield this.model.create(Object.assign({},M({},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=M({},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=M({},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.API_MODEL_LIMIT&&(l.limit=Env.API_MODEL_LIMIT),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=M({},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=M({},u),[v]=null!==(s=yield this.model.update(Object.assign({},M({},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,M({},{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}}CrudValidationCreate(){return this._crud}CrudValidationUpdate(){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))})}number(e){return Re(this,void 0,void 0,function*(){yield this.countAll(this.CrudArgumentsFindAll(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))})}validationCreate(e){return Re(this,void 0,void 0,function*(){if(this.CrudValidationCreate()==this._crud)return e.error(new s)})}validationUpdate(e){return Re(this,void 0,void 0,function*(){if(this.CrudValidationUpdate()==this._crud)return e.error(new s)})}};xe([m(),He(),je(),A("validationCreate"),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,"number",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(),Le(),A("validationUpdate"),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,"validationCreate",null),xe([Ce(0,u()),De("design:type",Function),De("design:paramtypes",[r]),De("design:returntype",Promise)],ft.prototype,"validationUpdate",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(J),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:Q.string().required(),key:Q.string().required(),tags:Q.string().empty(""),description:Q.string().empty(""),state:Q.boolean().parse().required()},this.schemaUpdate={name:Q.string().empty(),tags:Q.string().empty(),description:Q.string().empty(),state:Q.boolean().parse().empty()}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){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(),Le("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:Q.string().required(),key:Q.string().required(),tags:Q.string().empty(""),description:Q.string().empty(""),state:Q.boolean().parse().required()},this.schemaUpdate={name:Q.string().empty(),tags:Q.string().empty(),description:Q.string().empty(),state:Q.boolean().parse().empty()}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){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})})}number(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,"number",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(),Le(),_(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(),Le("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=M(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(),Le("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,Le 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,Me 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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrewcaires/api",
3
- "version": "5.0.0",
3
+ "version": "5.0.2",
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",
@@ -20,7 +20,8 @@
20
20
  ],
21
21
  "scripts": {
22
22
  "dev": "tsx-dev --watch --clear ./src/dev.ts",
23
- "build": "rollup --bundleConfigAsCjs -c rollup.config.js"
23
+ "build": "npm run lint && rollup --bundleConfigAsCjs -c rollup.config.js",
24
+ "lint": "eslint \"src/**/*.{ts,tsx,js,jsx}\" --max-warnings=0"
24
25
  },
25
26
  "repository": {
26
27
  "type": "git",
@@ -47,19 +48,20 @@
47
48
  "homepage": "https://github.com/andrewcaires/npm/tree/main/api#readme",
48
49
  "dependencies": {
49
50
  "@andrewcaires/decorator": "^1.1.1",
50
- "@andrewcaires/express": "^2.0.4",
51
- "@andrewcaires/node": "^1.2.10",
52
- "@andrewcaires/sequelize": "^3.0.0",
53
- "@andrewcaires/utils.js": "^0.4.26",
51
+ "@andrewcaires/express": "^2.1.1",
52
+ "@andrewcaires/node": "^1.3.1",
53
+ "@andrewcaires/sequelize": "^3.0.1",
54
+ "@andrewcaires/utils.js": "^0.4.31",
54
55
  "bcrypt": "^6.0.0",
55
56
  "cors": "^2.8.6",
56
- "dotenv": "^17.2.3",
57
+ "dotenv": "^17.3.1",
57
58
  "express-session": "^1.19.0",
58
59
  "jsonwebtoken": "^9.0.3",
59
60
  "tsx": "^4.21.0",
60
61
  "ws": "^8.19.0"
61
62
  },
62
63
  "devDependencies": {
64
+ "@eslint/js": "^10.0.1",
63
65
  "@rollup/plugin-commonjs": "^29.0.0",
64
66
  "@rollup/plugin-terser": "^0.4.4",
65
67
  "@rollup/plugin-typescript": "^12.3.0",
@@ -67,13 +69,13 @@
67
69
  "@types/cors": "^2.8.19",
68
70
  "@types/express-session": "^1.18.2",
69
71
  "@types/jsonwebtoken": "^9.0.10",
70
- "@types/node": "^25.0.10",
72
+ "@types/node": "^25.3.0",
71
73
  "@types/ws": "^8.18.1",
72
- "eslint": "^9.39.2",
73
- "mariadb": "^3.4.5",
74
- "rollup": "^4.56.0",
74
+ "eslint": "^10.0.2",
75
+ "mariadb": "^3.5.1",
76
+ "rollup": "^4.59.0",
75
77
  "rollup-plugin-dts": "^6.3.0",
76
78
  "tslib": "^2.8.1",
77
- "typescript-eslint": "^8.53.1"
79
+ "typescript-eslint": "^8.56.1"
78
80
  }
79
81
  }