@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 +2 -2
- package/dist/index.d.ts +193 -93
- package/dist/index.esm.js +2 -2
- package/package.json +14 -12
package/dist/index.cjs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/api v5.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.
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
328
|
-
constructor(model: ModelStatic<M>,
|
|
329
|
-
|
|
330
|
-
|
|
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(
|
|
333
|
-
findOne(
|
|
416
|
+
findAll(options: ModelArgumentsFindAll<M>): Promise<ModelResultFindAll<M>>;
|
|
417
|
+
findOne(options: ModelArgumentsFindOne<M>): Promise<M | null>;
|
|
334
418
|
getAttributes(options: FindAttributeOptions): Array<string>;
|
|
335
|
-
|
|
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
|
|
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
|
|
374
|
-
protected
|
|
375
|
-
protected
|
|
376
|
-
protected
|
|
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:
|
|
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
|
|
486
|
+
declare abstract class CrudController<M extends Model$1<any>, T extends TypeAnyObject = TypeAnyObject> extends ModelController<M, T> {
|
|
398
487
|
private _crud;
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
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 {
|
|
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.
|
|
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.
|
|
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.
|
|
51
|
-
"@andrewcaires/node": "^1.
|
|
52
|
-
"@andrewcaires/sequelize": "^3.0.
|
|
53
|
-
"@andrewcaires/utils.js": "^0.4.
|
|
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.
|
|
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
|
|
72
|
+
"@types/node": "^25.3.0",
|
|
71
73
|
"@types/ws": "^8.18.1",
|
|
72
|
-
"eslint": "^
|
|
73
|
-
"mariadb": "^3.
|
|
74
|
-
"rollup": "^4.
|
|
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.
|
|
79
|
+
"typescript-eslint": "^8.56.1"
|
|
78
80
|
}
|
|
79
81
|
}
|