@andrewcaires/api 5.0.6 → 5.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +2 -2
- package/dist/index.d.ts +214 -218
- package/dist/index.esm.js +2 -2
- package/package.json +14 -14
package/dist/index.cjs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/api v5.
|
|
2
|
+
* @andrewcaires/api v5.1.1
|
|
3
3
|
* Simple api for small applications using express, jsonwebtoken, sequelize and websocket
|
|
4
4
|
* (c) 2026 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
6
6
|
*/
|
|
7
|
-
"use strict";var e,t=require("@andrewcaires/express"),r=require("@andrewcaires/node"),o=require("@andrewcaires/utils.js"),s=require("ws"),i=require("@andrewcaires/sequelize"),n=require("dotenv"),d=require("bcrypt"),l=require("express-session"),a=require("jsonwebtoken"),p=require("@andrewcaires/decorator"),u=require("fs"),c=require("path");function g(e,t,r,o){var s,i=arguments.length,n=i<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,o);else for(var d=e.length-1;d>=0;d--)(s=e[d])&&(n=(i<3?s(n):i>3?s(t,r,n):s(t,r))||n);return i>3&&n&&Object.defineProperty(t,r,n),n}function y(e,t){return function(r,o){t(r,o,e)}}function v(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function h(e,t,r,o){return new(r||(r=Promise))(function(s,i){function n(e){try{l(o.next(e))}catch(e){i(e)}}function d(e){try{l(o.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(n,d)}l((o=o.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError,n.config({quiet:!0});class Env extends r.Env{}e=Env,Env.BASE_NAME=e.getString("BASE_NAME",""),Env.CONSOLE_ERROR=e.getBool("CONSOLE_ERROR",!1),Env.DATABASE_URI=e.getString("DATABASE_URI","",!0),Env.DATABASE_LOG=e.getBool("DATABASE_LOG",!1),Env.DATABASE_AUDIT=e.getBool("DATABASE_AUDIT",!0),Env.DATABASE_PREFIX=e.getString("DATABASE_PREFIX",""),Env.DATABASE_TIMEZONE=e.getString("DATABASE_TIMEZONE","+00:00"),Env.HTTP_CRT=e.getFile("HTTP_CRT"),Env.HTTP_KEY=e.getFile("HTTP_KEY"),Env.MODEL_LIMIT=e.getInt("MODEL_LIMIT",10),Env.MODEL_LIMIT_MAX=e.getInt("MODEL_LIMIT_MAX",100),Env.SLEEP_AUTH=e.getMs("SLEEP_AUTH","2s"),Env.SLEEP_FORGOT=e.getMs("SLEEP_FORGOT","5s"),Env.SLEEP_REGISTRY=e.getMs("SLEEP_REGISTRY","5s"),Env.TOKEN_CRT=e.getFile("TOKEN_CRT"),Env.TOKEN_KEY=e.getFile("TOKEN_KEY"),Env.TOKEN_TTL=e.getMs("TOKEN_TTL","1d"),Env.API_BODYPARSER_STRICT=e.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=e.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=e.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=e.getString("API_BODYPARSER_TYPE","json"),Env.API_HTTP_PORT=e.getInt("API_HTTP_PORT",3e3),Env.API_HTTP_PUBLIC=e.getString("API_HTTP_PUBLIC",""),Env.API_HTTP_CROSS=e.getBool("API_HTTP_CROSS",!1),Env.API_HTTP_HYBRID=e.getBool("API_HTTP_HYBRID",!1),Env.API_HTTP_NOTFOUND=e.getString("API_HTTP_NOTFOUND",""),Env.API_HTTP_PATH=e.getString("API_HTTP_PATH","/api"),Env.API_HTTP_REDIRECT=e.getString("API_HTTP_REDIRECT",""),Env.API_KEY_HASH=e.getString("API_KEY_HASH",""),Env.API_KEY_HEADER=e.getString("API_KEY_HEADER","x-api-key"),Env.API_SESSION_NAME=e.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=e.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=e.getString("API_SESSION_SECRET","yoursecret"),Env.API_TOKEN_COOKIE=e.getString("API_TOKEN_COOKIE","authorization"),Env.API_TOKEN_COOKIE_SET=e.getBool("API_TOKEN_COOKIE_SET",!0),Env.API_TOKEN_FORGOT=e.getMs("API_TOKEN_FORGOT","1d"),Env.API_TOKEN_HEADER=e.getString("API_TOKEN_HEADER","authorization"),Env.API_TOKEN_HEADER_KEY=e.getString("API_TOKEN_HEADER","bearer"),Env.API_TOKEN_RENEW=e.getMs("API_TOKEN_RENEW","1d"),Env.API_USER_HISTORY=e.getBool("API_USER_HISTORY",!0),Env.API_WEBSOCKET_START=e.getBool("API_WEBSOCKET_START",!1);const x=new i.Sequelize({uri:Env.DATABASE_URI,logging:!!Env.DATABASE_LOG&&(e=>r.Log.console(r.LogColor.Magenta,"sql",e)),prefix:Env.DATABASE_PREFIX,timezone:Env.DATABASE_TIMEZONE}),m=e=>r=>(s,i,n)=>{t.Use(s=>h(void 0,void 0,void 0,function*(){var i;let n=null!=r?r:"";o.isUndefined(r)&&(n=o.isFunction(s.controller.name)?s.controller.name():null===(i=s.controller.constructor)||void 0===i?void 0:i.name);const{permissions:d}=s.req;if((null!=d?d:[]).includes(`${n}.${e}`))return s.next();s.error(new t.UnauthorizedError("Access Denied"))}))(s,i,n)},C=m("create"),E=m("delete"),f=m("read"),A=m("update"),M=()=>(e,r,o)=>{t.Use(e=>h(void 0,void 0,void 0,function*(){yield(e=>h(void 0,void 0,void 0,function*(){var r,o,s,i;if(e.req.auth&&e.req.user)return e.next();const{[Env.API_KEY_HEADER]:n,[Env.API_TOKEN_HEADER]:d,"user-agent":l}=e.getHeaders(),a=e.getQuery(Env.API_KEY_HEADER),p=(null===(r=n||a)||void 0===r?void 0:r.toString())||"";let u=e.getCookie(Env.API_TOKEN_COOKIE);u=`${Env.API_TOKEN_HEADER_KEY} ${u}`;const[c,g]=null!==(s=null===(o=d||u)||void 0===o?void 0:o.split(" "))&&void 0!==s?s:["",""];if(!(p||g&&c.toLowerCase()==Env.API_TOKEN_HEADER_KEY))return e.error(new t.UnauthorizedError("Invalid token"));const{authService:y,userService:v}=e.app,{auth:h,user:x}=null!==(i=yield(p?y.key(p.toString()):y.user(g)).catch(t=>{e.error(t)}))&&void 0!==i?i:{};if(h&&x){if(!p&&h.user_agent&&h.user_agent!=l)return e.error(new t.UnauthorizedError("Invalid token"));e.req.auth=h,e.req.user=x,e.req.groups=yield v.getGroups(x.id),e.req.permissions=yield v.getPermissions(x.id),e.req.profile=yield v.getProfile(x.id),e.next()}}))(e)}))(e,r,o)},_=t.parameterFactory(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.auth}),S=t.parameterFactory(({ctx:e,key:t})=>{var r,o;return(null!==(o=null===(r=e.req)||void 0===r?void 0:r.groups)&&void 0!==o?o:[]).includes(t)}),P=t.parameterFactory(({ctx:e})=>{var t,r;return null!==(r=null===(t=e.req)||void 0===t?void 0:t.groups)&&void 0!==r?r:[]}),O=t.parameterFactory(({ctx:e,key:t})=>{var r,o;return(null!==(o=null===(r=e.req)||void 0===r?void 0:r.permissions)&&void 0!==o?o:[]).includes(t)}),U=t.parameterFactory(({ctx:e})=>{var t,r;return null!==(r=null===(t=e.req)||void 0===t?void 0:t.permissions)&&void 0!==r?r:[]}),T=t.parameterFactory(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.user}),I=(e,r,o)=>{var s,i,n,d,l,a,p,u,c,g;const y=o.ctx instanceof t.Context?o.ctx:null,v=null!==(d=null!==(n=null===(i=null===(s=null==y?void 0:y.req)||void 0===s?void 0:s.user)||void 0===i?void 0:i.id)&&void 0!==n?n:o.user_id)&&void 0!==d?d:null,h={type:e,model:null!==(l=null==r?void 0:r.getTableName())&&void 0!==l?l:null,app_name:null!==(a=Env.BASE_NAME)&&void 0!==a?a:"",state:!0,user_id:v};return y?Object.assign(Object.assign({},h),{full_url:null!==(p=null==y?void 0:y.getUrl())&&void 0!==p?p:"",ip_address:null!==(u=null==y?void 0:y.getIp())&&void 0!==u?u:"",user_agent:null!==(g=null===(c=null==y?void 0:y.req)||void 0===c?void 0:c.headers["user-agent"])&&void 0!==g?g:""}):h},b={afterCreate:(e,t)=>h(void 0,void 0,void 0,function*(){const s=o.getConstructor(e),{primaryKeyAttribute:i}=null!=s?s:{};yield exports.AuditModel.create(Object.assign(Object.assign({},I("CREATE",s,t)),{record:i?e.getDataValue(i):null,data:e.toJSON()})).catch(r.Log.catch)}),afterUpdate:(e,t)=>h(void 0,void 0,void 0,function*(){const s=o.getConstructor(e),{primaryKeyAttribute:i}=null!=s?s:{},n={},d=e.changed();d&&d.forEach(t=>n[t]=e.getDataValue(t)),yield exports.AuditModel.create(Object.assign(Object.assign({},I("UPDATE",s,t)),{record:i?e.getDataValue(i):null,data:n,previously:e.previous()})).catch(r.Log.catch)}),afterDestroy:(e,t)=>h(void 0,void 0,void 0,function*(){const s=o.getConstructor(e),{primaryKeyAttribute:i}=null!=s?s:{};yield exports.AuditModel.create(Object.assign(Object.assign({},I("DELETE",s,t)),{record:i?e.getDataValue(i):null,data:e.toJSON()})).catch(r.Log.catch)})},w=e=>(o.isUndefined(e)&&(e=Env.DATABASE_AUDIT),i.Hooks(e?b:{}));exports.RegisterModel=class RegisterModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.RegisterModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.RegisterModel.prototype,"secret",void 0),g([i.Column.FullDate(),v("design:type",Number)],exports.RegisterModel.prototype,"expired_at",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.RegisterModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.RegisterModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.RegisterModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.RegisterModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.RegisterModel.prototype,"user_id",void 0),exports.RegisterModel=g([i.Database(x),i.ModelName("register"),i.Version("5.0.0")],exports.RegisterModel),exports.UserAuthModel=class UserAuthModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserAuthModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"secret",void 0),g([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"ip_address",void 0),g([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"user_agent",void 0),g([i.Column.FullDate(),v("design:type",Object)],exports.UserAuthModel.prototype,"revoked_at",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserAuthModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserAuthModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserAuthModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserAuthModel.prototype,"user_id",void 0),exports.UserAuthModel=g([i.Database(x),i.ModelName("users_auth"),i.Version("5.0.0")],exports.UserAuthModel),exports.PermissionModel=class PermissionModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.PermissionModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.PermissionModel.prototype,"name",void 0),g([i.Column.String(),i.Unique(!0),v("design:type",String)],exports.PermissionModel.prototype,"key",void 0),g([i.Column.String(),v("design:type",String)],exports.PermissionModel.prototype,"tags",void 0),g([i.Column.Text(),v("design:type",String)],exports.PermissionModel.prototype,"description",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.PermissionModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.PermissionModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.PermissionModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.PermissionModel.prototype,"deleted_at",void 0),g([i.HasMany(()=>exports.GroupPermissionModel,"permission_id"),v("design:type",Array)],exports.PermissionModel.prototype,"groups_permissions",void 0),exports.PermissionModel=g([i.Database(x),i.ModelName("permission"),w(),i.Version("5.0.1")],exports.PermissionModel),exports.GroupPermissionModel=class GroupPermissionModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.GroupPermissionModel.prototype,"id",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.GroupPermissionModel.prototype,"created_at",void 0),g([i.Association.BelongsTo(()=>exports.GroupModel),v("design:type",String)],exports.GroupPermissionModel.prototype,"group_id",void 0),g([i.Association.BelongsTo(()=>exports.PermissionModel),v("design:type",String)],exports.GroupPermissionModel.prototype,"permission_id",void 0),exports.GroupPermissionModel=g([i.Database(x),i.ModelName("groups_permissions"),w(),i.Version("5.0.2")],exports.GroupPermissionModel),exports.GroupModel=class GroupModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.GroupModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.GroupModel.prototype,"name",void 0),g([i.Column.String(),v("design:type",String)],exports.GroupModel.prototype,"key",void 0),g([i.Column.String(),v("design:type",String)],exports.GroupModel.prototype,"tags",void 0),g([i.Column.Text(),v("design:type",String)],exports.GroupModel.prototype,"description",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.GroupModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.GroupModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.GroupModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.GroupModel.prototype,"deleted_at",void 0),g([i.Association.HasMany(()=>exports.UserGroupModel,"group_id"),v("design:type",Array)],exports.GroupModel.prototype,"users_groups",void 0),g([i.Association.HasMany(()=>exports.GroupPermissionModel,"group_id"),v("design:type",Array)],exports.GroupModel.prototype,"groups_Permission",void 0),exports.GroupModel=g([i.Database(x),i.ModelName("group"),w(),i.Version("5.0.1")],exports.GroupModel),exports.UserGroupModel=class UserGroupModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserGroupModel.prototype,"id",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserGroupModel.prototype,"created_at",void 0),g([i.Association.BelongsTo(()=>exports.GroupModel),v("design:type",String)],exports.UserGroupModel.prototype,"group_id",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserGroupModel.prototype,"user_id",void 0),exports.UserGroupModel=g([i.Database(x),i.ModelName("users_groups"),w(),i.Version("5.0.2")],exports.UserGroupModel),exports.UserPasswordModel=class UserPasswordModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserPasswordModel.prototype,"id",void 0),g([i.Column.String(),i.Value(e=>d.hashSync(e.value,12)),v("design:type",String)],exports.UserPasswordModel.prototype,"value",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.UserPasswordModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserPasswordModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserPasswordModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserPasswordModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserPasswordModel.prototype,"user_id",void 0),exports.UserPasswordModel=g([i.Database(x),i.ModelName("users_password"),w(),i.Version("5.0.0")],exports.UserPasswordModel),exports.UserProfileModel=class UserProfileModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserProfileModel.prototype,"id",void 0),g([i.Column.Json(),i.DefaultValue({}),v("design:type",Object)],exports.UserProfileModel.prototype,"data",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserProfileModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserProfileModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserProfileModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserProfileModel.prototype,"user_id",void 0),exports.UserProfileModel=g([i.Database(x),i.ModelName("users_profile"),w(),i.Version("5.0.1")],exports.UserProfileModel),exports.UserModel=class UserModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"name",void 0),g([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"email",void 0),g([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"username",void 0),g([i.Column.Text(),v("design:type",String)],exports.UserModel.prototype,"description",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.UserModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserModel.prototype,"deleted_at",void 0),g([i.Association.HasMany(()=>exports.AuditModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"audits",void 0),g([i.Association.HasMany(()=>exports.UserAuthModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"users_auths",void 0),g([i.Association.HasMany(()=>exports.RegisterModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"registers",void 0),g([i.Association.HasMany(()=>exports.UserGroupModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"users_groups",void 0),g([i.Association.HasMany(()=>exports.UserPasswordModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"users_passwords",void 0),g([i.Association.HasMany(()=>exports.UserProfileModel,"user_id"),v("design:type",Array)],exports.UserModel.prototype,"users_profiles",void 0),exports.UserModel=g([i.Database(x),i.ModelName("user"),w(),i.Version("5.0.0")],exports.UserModel),exports.AuditModel=class AuditModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.AuditModel.prototype,"id",void 0),g([i.Column.Enum("CREATE","DELETE","UPDATE"),v("design:type",String)],exports.AuditModel.prototype,"type",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"model",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"record",void 0),g([i.Column.Json(),v("design:type",Object)],exports.AuditModel.prototype,"data",void 0),g([i.Column.Json(),v("design:type",Object)],exports.AuditModel.prototype,"previously",void 0),g([i.Column.Text(),v("design:type",String)],exports.AuditModel.prototype,"full_url",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"ip_address",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"user_agent",void 0),g([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"app_name",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.AuditModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.AuditModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.AuditModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.AuditModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.AuditModel.prototype,"user_id",void 0),exports.AuditModel=g([i.Database(x),i.ModelName("audit"),i.Version("5.0.1")],exports.AuditModel),exports.ConfigModel=class ConfigModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.ConfigModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.ConfigModel.prototype,"key",void 0),g([i.Column.String(),v("design:type",String)],exports.ConfigModel.prototype,"value",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.ConfigModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.ConfigModel.prototype,"updated_at",void 0),exports.ConfigModel=g([i.Database(x),i.ModelName("configs"),i.Version("5.0.0")],exports.ConfigModel),exports.ForgotModel=class ForgotModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.ForgotModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.ForgotModel.prototype,"secret",void 0),g([i.Column.FullDate(),v("design:type",Number)],exports.ForgotModel.prototype,"expired_at",void 0),g([i.Column.Boolean(),v("design:type",Boolean)],exports.ForgotModel.prototype,"state",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.ForgotModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.ForgotModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.ForgotModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.ForgotModel.prototype,"user_id",void 0),exports.ForgotModel=g([i.Database(x),i.ModelName("forgot"),i.Version("5.0.0")],exports.ForgotModel),exports.LogModel=class LogModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.LogModel.prototype,"id",void 0),g([i.Column.Enum("info","warn","error"),i.DefaultValue("info"),v("design:type",String)],exports.LogModel.prototype,"level",void 0),g([i.Column.Text(),v("design:type",String)],exports.LogModel.prototype,"message",void 0),g([i.Column.String(),v("design:type",String)],exports.LogModel.prototype,"source",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.LogModel.prototype,"created_at",void 0),exports.LogModel=g([i.Database(x),i.ModelName("log"),i.Version("5.0.0")],exports.LogModel),exports.MigrationModel=class MigrationModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.MigrationModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.MigrationModel.prototype,"model",void 0),g([i.Column.String(),v("design:type",String)],exports.MigrationModel.prototype,"version",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.MigrationModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.MigrationModel.prototype,"updated_at",void 0),exports.MigrationModel=g([i.Database(x),i.ModelName("migration"),i.Version("5.0.2")],exports.MigrationModel),exports.SessionModel=class SessionModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.SessionModel.prototype,"id",void 0),g([i.Column.String(),v("design:type",String)],exports.SessionModel.prototype,"session",void 0),g([i.Column.Text(),v("design:type",String)],exports.SessionModel.prototype,"json",void 0),g([i.Column.BigInt(),v("design:type",Number)],exports.SessionModel.prototype,"expired",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.SessionModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.SessionModel.prototype,"updated_at",void 0),exports.SessionModel=g([i.Database(x),i.ModelName("session"),i.Version("5.0.2")],exports.SessionModel),exports.UserMetadataModel=class UserMetadataModel extends i.Model{},g([i.Column.UUID(7),v("design:type",String)],exports.UserMetadataModel.prototype,"id",void 0),g([i.Column.Json(),i.DefaultValue({}),v("design:type",Object)],exports.UserMetadataModel.prototype,"data",void 0),g([i.Column.CreatedAt(),v("design:type",Date)],exports.UserMetadataModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserMetadataModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),v("design:type",Object)],exports.UserMetadataModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserMetadataModel.prototype,"user_id",void 0),exports.UserMetadataModel=g([i.Database(x),i.ModelName("users_metadata"),w(),i.Version("5.0.1")],exports.UserMetadataModel);class Log{static error(e,t,r){return h(this,void 0,void 0,function*(){yield this.writeRaw("error",e,t,r)})}static info(e,t,r){return h(this,void 0,void 0,function*(){yield this.writeRaw("info",e,t,r)})}static warn(e,t,r){return h(this,void 0,void 0,function*(){yield this.writeRaw("warn",e,t,r)})}static writeRaw(e,t,o,s){return h(this,void 0,void 0,function*(){var i;s&&r.Log.console(null!==(i=this.colors[e])&&void 0!==i?i:r.LogColor.White,e,t),x&&(yield exports.LogModel.create({level:e,message:t,source:null!=o?o:""}).catch(r.Log.catch))})}}Log.colors={error:r.LogColor.Red,info:r.LogColor.Cyan,warn:r.LogColor.Yellow};class Loggable{get log(){return e=>Loggable.logInfo(this,e)}static get log(){return e=>this.logInfo(this,e)}get error(){return e=>Loggable.logError(this,e)}static get error(){return e=>this.logError(this,e)}static logError(e,t){var r,o;Log.error(null!==(o=null!==(r=null==t?void 0:t.message)&&void 0!==r?r:t)&&void 0!==o?o:"",this.source(e),Env.CONSOLE_ERROR)}static logInfo(e,t){Log.info(null!=t?t:"",this.source(e),Env.CONSOLE_ERROR)}static source(e){var t,r,o;const s=null!==(o=null!==(r=null===(t=null==e?void 0:e.constructor)||void 0===t?void 0:t.name)&&void 0!==r?r:null==e?void 0:e.name)&&void 0!==o?o:"null";return Env.BASE_NAME?`${Env.BASE_NAME}.${s}`:s}}class SessionStore extends l.Store{constructor(){super(),this.all=e=>h(this,void 0,void 0,function*(){e=e||o.noop;const t=yield exports.SessionModel.findAll({attributes:["session"],where:{expired:{[i.Op.gte]:Date.now()}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.session)),e()}),this.clear=e=>h(this,void 0,void 0,function*(){yield exports.SessionModel.destroy().catch(o.noop),e&&e()}),this.destroy=(e,t)=>h(this,void 0,void 0,function*(){yield exports.SessionModel.destroy({where:{session:e}}).catch(o.noop),t&&t()}),this.expired=()=>h(this,void 0,void 0,function*(){yield exports.SessionModel.destroy({where:{expired:{[i.Op.lt]:Date.now()}}}).catch(o.noop)}),this.get=(e,t)=>h(this,void 0,void 0,function*(){t=t||o.noop;const r=yield exports.SessionModel.findOne({where:{session:e,expired:{[i.Op.gte]:Date.now()}}}).catch(e=>(t(e),null));if(r){const e=JSON.parse(r.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield r.destroy().catch(o.noop),void t(null)}return void t(null,e)}t(null)}),this.length=e=>h(this,void 0,void 0,function*(){e&&e(null,(yield exports.SessionModel.count().catch(o.noop))||0)}),this.set=(e,t,r)=>h(this,void 0,void 0,function*(){r=r||o.noop;const s=Date.now()+Env.API_SESSION_LIFETIME,i=JSON.stringify(t),[n,d]=(yield exports.SessionModel.findOrCreate({where:{session:e},defaults:{session:e,json:i,expired:s}}).catch(o.noop))||[];n&&(d||(n.json=i,n.expired=s,yield n.save().catch(o.noop))),r()}),this.loop=o.loop(this.expired,3e4),this.loop.start()}}exports.Service=class Service{},exports.Service=g([p.Trait(Loggable)],exports.Service);class AuthService extends exports.Service{create(e){return h(this,void 0,void 0,function*(){if(!Env.TOKEN_KEY)throw new t.NotFoundError("TOKEN_KEY not found");const{id:r}=e,s=o.uuidv7(),i=yield exports.UserAuthModel.create({secret:s,user_id:r}).catch(this.error);if(!i)throw new t.InternalServerError;return{auth:i,token:a.sign({id:r,secret:s},Env.TOKEN_KEY,this.options())}})}destroy(e){return h(this,void 0,void 0,function*(){return!(!e||e.revoked_at)&&(e.revoked_at=new Date,yield e.save(),!0)})}renew(e){return h(this,void 0,void 0,function*(){if(!Env.TOKEN_KEY)throw new t.NotFoundError("TOKEN_KEY not found");const{decode:r}=yield this.verify(e,Env.API_TOKEN_RENEW/1e3);if(!r)throw new t.UnauthorizedError("Invalid token");const{id:s,secret:i}=r;if(s&&i){const e=yield exports.UserModel.findOne({where:{id:s,state:!0}}).catch(this.error);if(e){const t=yield exports.UserAuthModel.findOne({where:{secret:i,user_id:e.id}}).catch(this.error);if(t&&!t.revoked_at){t.secret=o.uuidv7(),yield t.save().catch(this.error);return{auth:t,token:a.sign({id:s,secret:t.secret},Env.TOKEN_KEY,this.options())}}}}throw new t.UnauthorizedError("Invalid token")})}user(e){return h(this,void 0,void 0,function*(){const{decode:r}=yield this.verify(e);if(!r)throw new t.UnauthorizedError("Invalid token");const{id:o,secret:s}=r;if(o&&s){const e=yield exports.UserModel.findOne({where:{id:o,state:!0}}).catch(this.error);if(e){const t=yield exports.UserAuthModel.findOne({where:{secret:s,user_id:e.id}}).catch(this.error);if(t&&!t.revoked_at)return{auth:t,user:e}}}throw new t.UnauthorizedError("Invalid token")})}options(){return{algorithm:"RS256",expiresIn:`${Env.TOKEN_TTL}ms`}}verify(e,r){return h(this,void 0,void 0,function*(){if(!Env.TOKEN_CRT)throw new t.NotFoundError("TOKEN_CRT not found");if(!e||e.split(".").length<3)throw new t.UnauthorizedError("Invalid token");try{return{decode:a.verify(e,Env.TOKEN_CRT,{clockTolerance:r})}}catch(e){throw new t.UnauthorizedError("Invalid token")}})}key(e){return h(this,void 0,void 0,function*(){if(!e)throw new t.UnauthorizedError("Invalid token");const r=yield exports.UserModel.findOne({where:{token:e,state:!0}}).catch(this.error);if(r){const t=e.replace(/(-[\w]{4})/g,"-****"),[o]=(yield exports.UserAuthModel.findOrCreate({where:{secret:t,user_id:r.id},defaults:{secret:t,user_id:r.id}}).catch(this.error))||[];if(o)return o.revoked_at&&(o.revoked_at=null,yield o.save().catch(this.error)),{auth:o,user:r}}throw new t.UnauthorizedError("Invalid token")})}}class ModelService extends exports.Service{constructor(e,t){var r,o;super(),this.attributes=[],this.permissions=[],this.search=[],this.model=e,(null==t?void 0:t.permissions)&&(this.permissions=t.permissions);const s=Object.keys(e.getAttributes());this.attributes=this.filterAttributes(s,null!==(r=null==t?void 0:t.attributes)&&void 0!==r?r:[]),this.search=this.filterAttributes(s,null!==(o=null==t?void 0:t.search)&&void 0!==o?o:this.attributes)}applySelect(e,t,r){if(!t)return;const s=null==e?void 0:e.getQuery(r?`${r}_select`:"select"),i=t.attributes,n=e=>i.includes(e);t.attributes=[],o.isString(s)&&s.length&&t.attributes.push(...s.split(/\s*,\s*/g).filter(n)),t.attributes.length||(t.attributes=i)}applyOrders(e,t){if(!t)return;const r=null==e?void 0:e.getQuery("asc"),s=null==e?void 0:e.getQuery("desc"),i=[],n=t.attributes,d=e=>n.includes(e);o.isString(r)&&r.length&&i.push(...r.split(/\s*,\s*/g).filter(d).map(e=>[e,"ASC"])),o.isString(s)&&s.length&&i.push(...s.split(/\s*,\s*/g).filter(d).map(e=>[e,"DESC"])),i.length&&(t.order=i)}applyPagination(e,t){if(!t)return;const r=null==e?void 0:e.getQuery("limit"),s=null==e?void 0:e.getQuery("offset");o.isUndefined(t.limit)&&(t.limit=Env.MODEL_LIMIT,o.isString(r)&&(t.limit=parseInt(r)||0),t.limit=o.clamp(t.limit,-1,Env.MODEL_LIMIT_MAX)),t.limit<0&&(t.limit=void 0),o.isString(s)&&(t.offset=parseInt(s)||0,t.offset<0&&(t.offset=void 0))}applySearch(e,t){var r;if(!t)return;const s=null==e?void 0:e.getQuery("search");s&&o.isString(s)&&(t.where=Object.assign(Object.assign({},null!==(r=t.where)&&void 0!==r?r:{}),{[i.Op.or]:this.search.map(e=>({[e]:{[i.Op.substring]:s}}))}))}applyWhere(e,r,s){var n,d;if(!r)return null;const l=null==e?void 0:e.getQuery(s?`${s}_where`:"where");if(!o.isString(l))return null;const a=r.attributes,p=i.Where.parse(a,l);return o.isUndefined(p.error)?(r.where=Object.assign(Object.assign({},null!==(n=r.where)&&void 0!==n?n:{}),null!==(d=p.value)&&void 0!==d?d:{}),null):new t.ValidationError(p.error.join(", "))}countAll(e){return h(this,void 0,void 0,function*(){var r,s;const{ctx:i,options:n={}}=e,d=o.merge({},n);d.attributes=this.getAttributes(null!==(r=null==d?void 0:d.attributes)&&void 0!==r?r:[]),this.applySearch(i,d);const l=this.applyWhere(i,d);if(l)return null==i||i.error(l),0;this.applySelect(i,d);const a=null!==(s=yield this.model.count(Object.assign(Object.assign({},d),{distinct:!!d.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error))&&void 0!==s?s:0;return null==i||i.prepare(t.StatusCodes.OK,{count:a}),a})}create(e){return h(this,void 0,void 0,function*(){var r,s;const{body:i={},ctx:n,options:d={}}=e,l=o.merge({},d),a=yield this.model.create(Object.assign({},o.merge({},null!==(s=null===(r=null==n?void 0:n.req)||void 0===r?void 0:r.body)&&void 0!==s?s:{},i)),Object.assign(Object.assign({},l),{ctx:n})).catch(this.error);if(!a)return null==n||n.error(new t.InternalServerError),null;const{primaryKeyAttribute:p}=this.model;return null==n||n.prepare(t.StatusCodes.OK,{[p]:a.getDataValue(p)}),a})}delete(e){return h(this,void 0,void 0,function*(){var r,s;const{ctx:i,id:n,options:d={}}=e,{primaryKeyAttribute:l}=this.model,a=null!==(r=null==i?void 0:i.getParam(l))&&void 0!==r?r:n;if(o.isUndefined(a))return null==i||i.error(new t.BadRequestError),0;const p=o.merge({},d),u=yield this.model.destroy(Object.assign(Object.assign(Object.assign({},p),{where:Object.assign(Object.assign({},null!==(s=p.where)&&void 0!==s?s:{}),{[l]:a}),individualHooks:!0}),{ctx:i})).catch(this.error);return u?(null==i||i.success("OK"),u):(null==i||i.error(new t.NotFoundError),0)})}filterAttributes(e,t){if(o.isArray(t))return t.length?t.filter(t=>o.isString(t)&&e.includes(t)):e;const{exclude:r,include:s}=t,i=o.isUndefined(s)?e:s.filter(t=>o.isString(t)&&e.includes(t)),n=null!=r?r:[];return n.length?i.filter(e=>!n.includes(e)):i}findAll(e){return h(this,void 0,void 0,function*(){var r,s;const{ctx:i,callback:n,limited:d,options:l={},query:a=!0}=e,p=o.merge({},l);if(p.attributes=this.getAttributes(null!==(r=null==p?void 0:p.attributes)&&void 0!==r?r:[]),a&&this.applySelect(i,p),this.applyOrders(i,p),this.applyPagination(i,p),d&&(null!==(s=null==p?void 0:p.limit)&&void 0!==s?s:0)>Env.MODEL_LIMIT_MAX&&(p.limit=Env.MODEL_LIMIT_MAX),this.applySearch(i,p),a){const e=this.applyWhere(i,p);if(e)return null==i||i.error(e),{count:0,records:[]}}const[u,c]=yield Promise.all([this.model.count(Object.assign(Object.assign({},p),{distinct:!!p.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error).then(e=>null!=e?e:0),this.model.findAll(p).catch(this.error).then(e=>null!=e?e:[])]),g={count:u,records:n?yield n(c):c};return null==i||i.prepare(t.StatusCodes.OK,g),g})}findOne(e){return h(this,void 0,void 0,function*(){var r,s,i;const{callback:n,ctx:d,id:l,options:a={},query:p=!0}=e,{primaryKeyAttribute:u}=this.model,c=null!==(r=null==d?void 0:d.getParam(u))&&void 0!==r?r:l;if(o.isUndefined(c))return null==d||d.error(new t.BadRequestError),null;const g=o.merge({},a);g.attributes=this.getAttributes(null!==(s=null==g?void 0:g.attributes)&&void 0!==s?s:[]),p&&this.applySelect(d,g);const y=yield this.model.findOne(Object.assign(Object.assign({},g),{where:Object.assign(Object.assign({},null!==(i=null==g?void 0:g.where)&&void 0!==i?i:{}),{[u]:c})})).catch(this.error);return y?(null==d||d.prepare(t.StatusCodes.OK,n?yield n(y):y.toJSON()),y):(null==d||d.error(new t.NotFoundError),null)})}getAttributes(e){return this.filterAttributes(this.attributes,e)}include(e,t){var r;const s=o.clone(t),{ctx:i}=null!=t?t:{};s.attributes=this.filterAttributes(Object.keys(e.getAttributes()),null!==(r=s.attributes)&&void 0!==r?r:[]),this.applySearch(i,s);const n=this.applyWhere(i,s,t.name);return n?(null==i||i.error(n),null):(this.applySelect(i,s,t.name),Object.assign({model:e},s))}name(){return this.model.tableName}sync(){return h(this,void 0,void 0,function*(){if(!this.permissions.length)return;const e=this.name().toLowerCase(),t={description:"",state:!0};yield o.forEachAsync(this.permissions,r=>h(this,void 0,void 0,function*(){const s=`${e}.${r}`,i=o.upperCamelCase(e.replace(/_/g," ")," ");yield exports.PermissionModel.findOrCreate({where:{key:s},defaults:Object.assign({name:`${i} ${o.upperCamelCase(r," ")}`,key:s,tags:i},t)})}))})}update(e){return h(this,void 0,void 0,function*(){var r,s,i,n,d;const{ctx:l,body:a,id:p,options:u={}}=e,{primaryKeyAttribute:c}=this.model,g=null!==(r=null==l?void 0:l.getParam(c))&&void 0!==r?r:p;if(o.isUndefined(g))return null==l||l.error(new t.BadRequestError),!1;const y=o.merge({},u),[v]=null!==(d=yield this.model.update(Object.assign({},o.merge({},null!==(i=null===(s=null==l?void 0:l.req)||void 0===s?void 0:s.body)&&void 0!==i?i:{},null!=a?a:{})),Object.assign(Object.assign(Object.assign({},y),{where:Object.assign(Object.assign({},null!==(n=null==y?void 0:y.where)&&void 0!==n?n:{}),{[c]:g}),individualHooks:!0}),{ctx:l})).catch(this.error))&&void 0!==d?d:[];return v?(null==l||l.success("OK"),!0):(null==l||l.success("Record not changed"),!1)})}}class UserService extends exports.Service{getMetadata(e){return h(this,void 0,void 0,function*(){var t,r;const[o]=null!==(t=yield exports.UserMetadataModel.findOrCreate({where:{user_id:e},defaults:{user_id:e}}).catch(this.error))&&void 0!==t?t:[];return null!==(r=null==o?void 0:o.data)&&void 0!==r?r:{}})}getProfile(e){return h(this,void 0,void 0,function*(){var t,r;const[o]=null!==(t=yield exports.UserProfileModel.findOrCreate({where:{user_id:e},defaults:{user_id:e}}).catch(this.error))&&void 0!==t?t:[];return null!==(r=null==o?void 0:o.data)&&void 0!==r?r:{}})}getGroups(e){return h(this,void 0,void 0,function*(){var t;return(null!==(t=yield exports.GroupModel.findAll({attributes:["key"],where:{state:!0},include:[{model:exports.UserGroupModel,required:!0,where:{user_id:e}}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}getPermissions(e){return h(this,void 0,void 0,function*(){var t;return(null!==(t=yield exports.PermissionModel.findAll({attributes:["key"],where:{state:!0},include:[{model:exports.GroupPermissionModel,required:!0,include:[{model:exports.GroupModel,required:!0,attributes:["id"],where:{state:!0},include:[{model:exports.UserGroupModel,required:!0,where:{user_id:e}}]}]}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}}class Application extends t.Application{constructor(e,t){super(e,o.merge({},{cert:Env.HTTP_CRT,cross:Env.API_HTTP_CROSS,hybrid:Env.API_HTTP_HYBRID,json:{strict:Env.API_BODYPARSER_STRICT,inflate:Env.API_BODYPARSER_INFLATE,limit:Env.API_BODYPARSER_LIMIT,type:Env.API_BODYPARSER_TYPE},key:Env.HTTP_KEY,notfound:Env.API_HTTP_NOTFOUND,path:Env.API_HTTP_PATH,port:Env.API_HTTP_PORT,public:Env.API_HTTP_PUBLIC,redirect:Env.API_HTTP_REDIRECT,session:{store:new SessionStore,name:Env.API_SESSION_NAME,secret:Env.API_SESSION_SECRET,cookie:{maxAge:Env.API_SESSION_LIFETIME},genid:o.uuidv7}},null!=t?t:{})),this.hash=new r.Hash(Env.API_KEY_HASH)}error(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.error(e.message,t,Env.CONSOLE_ERROR)}log(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return h(this,void 0,void 0,function*(){yield x.sync(),yield this.migrations(x),yield o.forEachSeries(this.controllers,e=>h(this,void 0,void 0,function*(){o.isFunction(e.sync)&&(yield e.sync(this))})),this.authService=new AuthService,this.userService=new UserService,yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new s.WebSocketServer({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>h(this,void 0,void 0,function*(){t.url||(t.url=""),e.on("close",()=>{}),yield o.sleep(2e3)})))})}migrations(e){return h(this,void 0,void 0,function*(){const t=[];yield o.forEachSeries(Object.keys(e.models),r=>h(this,void 0,void 0,function*(){var o;const s=e.models[r],i=s.version();if(!i)return;const[n,d]=null!==(o=yield exports.MigrationModel.findOrCreate({where:{model:s.tableName},defaults:{model:s.tableName,version:""}}).catch(this.error))&&void 0!==o?o:[];n&&(d||n.version!=i)&&(n.version=i,yield n.save().catch(this.error),t.push(s))})),yield o.forEachSeries(t,e=>h(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}exports.BaseController=class BaseController extends o.EventEmitter{constructor(){super(...arguments),this.permissions=[]}name(){var e,t;return(null!==(t=null===(e=this.constructor)||void 0===e?void 0:e.name)&&void 0!==t?t:"api").replace(/(([a-z])([A-Z]))/g,"$2_$3")}session(e,t,r){return h(this,void 0,void 0,function*(){r.auth&&r.user&&(r.user_agent?r.user_agent!=t&&r.regenerate(o.noop):(r.user_agent=t,r.save(o.noop))),e.next()})}sync(){return h(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield o.forEachSeries(this.permissions,r=>h(this,void 0,void 0,function*(){const s=`${e}.${r}`,i=o.upperCamelCase(e.replace(/_/g," ")," ");yield exports.PermissionModel.findOrCreate({where:{key:s},defaults:Object.assign({name:`${i} ${o.upperCamelCase(r," ")}`,key:s,tags:i},t)})}))})}},g([y(0,t.Ctx()),y(1,t.Headers("user-agent")),y(2,t.Session()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Object]),v("design:returntype",Promise)],exports.BaseController.prototype,"session",null),exports.BaseController=g([p.Trait(Loggable)],exports.BaseController),exports.ModelController=class ModelController extends exports.BaseController{constructor(){super(...arguments),this.attributes=[],this.permissions=["create","read","update","delete"],this.search=[]}countAll(e){return h(this,void 0,void 0,function*(){return yield this.service.countAll(e)})}create(e){return h(this,void 0,void 0,function*(){return yield this.service.create(e)})}delete(e){return h(this,void 0,void 0,function*(){return yield this.service.delete(e)})}findAll(e){return h(this,void 0,void 0,function*(){return yield this.service.findAll(e)})}findOne(e){return h(this,void 0,void 0,function*(){return yield this.service.findOne(e)})}include(e,t){return this.service.include(e,t)}sync(){return h(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield o.forEachSeries(this.permissions,r=>h(this,void 0,void 0,function*(){const s=`${e}.${r}`,i=o.upperCamelCase(e.replace(/_/g," ")," ");yield exports.PermissionModel.findOrCreate({where:{key:s},defaults:Object.assign({name:`${i} ${o.upperCamelCase(r," ")}`,key:s,tags:i},t)})})),this.service=new ModelService(this.model,{attributes:this.attributes.length?this.attributes:void 0,search:this.search.length?this.search:void 0})})}update(e){return h(this,void 0,void 0,function*(){return yield this.service.update(e)})}name(){return this.model.tableName}},exports.ModelController=g([t.Extends(exports.BaseController)],exports.ModelController),exports.AuditsController=class AuditsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.AuditModel,this.permissions=["read"]}all(e,t,r){return h(this,void 0,void 0,function*(){const o={};t&&(o.type=t),r&&(o.table=r),yield this.findAll({ctx:e,options:{attributes:{exclude:["data","previously"]},where:o,order:[["created_at","DESC"]]},limited:!0})})}get(e){return h(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}},g([t.Get(),M(),f(),y(0,t.Ctx()),y(1,t.Query("type")),y(2,t.Query("table")),v("design:type",Function),v("design:paramtypes",[t.Context,String,String]),v("design:returntype",Promise)],exports.AuditsController.prototype,"all",null),g([t.Get("/:id"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.AuditsController.prototype,"get",null),exports.AuditsController=g([t.Controller("/audits"),t.Extends(exports.ModelController)],exports.AuditsController),exports.AuthController=class AuthController extends exports.BaseController{constructor(e){super(),this.authService=e}login(e,r,s,n,l,a){return h(this,void 0,void 0,function*(){var p;yield o.sleep(Env.SLEEP_AUTH);const u=yield exports.UserModel.findOne({where:{[i.Op.or]:[{email:s},{username:s}]}}).catch(this.error);if(!u)return e.error(new t.UnauthorizedError("Invalid credentials")),a.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const c=yield exports.UserPasswordModel.findOne({where:{user_id:u.id,state:!0}}).catch(this.error);if(!c||!d.compareSync(n,c.value))return e.error(new t.UnauthorizedError("Invalid credentials")),a.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const g=yield exports.RegisterModel.findOne({where:{state:!0,user_id:u.id}}).catch(this.error);if(g)return e.error("ACTIVATION REQUIRED"),a.emit("auth.activation",{ctx:e,register:g,user:u}),void this.emit("auth.activation",{ctx:e,register:g,user:u});if(!u.state)return e.error(new t.UnauthorizedError("Invalid credentials")),a.emit("auth.failure",{ctx:e,user:u}),void this.emit("auth.failure",{ctx:e,user:u});const{auth:y,token:v}=null!==(p=yield this.authService.create(u).catch(t=>{e.error(t),a.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e})}))&&void 0!==p?p:{};y&&v&&(y.user_agent=r,y.ip_address=e.getIp(),yield y.save().catch(this.error),Env.API_TOKEN_COOKIE_SET&&e.setCookie(Env.API_TOKEN_COOKIE,v,{maxAge:l?Env.TOKEN_TTL:void 0}),e.json({token:v}),a.emit("auth.login",{ctx:e,auth:y,user:u}),this.emit("auth.login",{ctx:e,auth:y,user:u}))})}logout(e,r,o,s){return h(this,void 0,void 0,function*(){if(yield this.authService.destroy(r))return Env.API_TOKEN_COOKIE_SET&&e.clearCookie(Env.API_TOKEN_COOKIE),e.success("OK"),s.emit("auth.logout",{auth:r,ctx:e,user:o}),void this.emit("auth.logout",{auth:r,ctx:e,user:o});e.error(new t.UnauthorizedError("Access Denied"))})}renew(e,t,r,o){return h(this,void 0,void 0,function*(){var s;const{auth:i,token:n}=null!==(s=yield this.authService.renew(r).catch(t=>{e.error(t)}))&&void 0!==s?s:{};i&&n&&(i.user_agent=t,yield i.save().catch(this.error),e.json({token:n}),o.emit("auth.renew",{auth:i,ctx:e}),this.emit("auth.renew",{auth:i,ctx:e}))})}user(e,r){return h(this,void 0,void 0,function*(){const{groups:s,permissions:i,profile:n}=e.req;if(!s||!i)return e.error(new t.InternalServerError);e.json(Object.assign(Object.assign({},o.denied(r.toJSON(),["username","description"])),{groups:s,permissions:i,profile:n}))})}},g([t.Post("/login"),t.Validate(e=>({username:e.string().min(3).required(),password:e.string().min(5).required(),remember:e.boolean().parse().empty(!1)})),y(0,t.Ctx()),y(1,t.Headers("user-agent")),y(2,t.Body("username")),y(3,t.Body("password")),y(4,t.Body("remember")),y(5,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,String,Boolean,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"login",null),g([t.Get("/logout"),M(),y(0,t.Ctx()),y(1,_()),y(2,T()),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserAuthModel,exports.UserModel,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),g([t.Post("/renew"),t.Validate(e=>({token:e.string().required()})),y(0,t.Ctx()),y(1,t.Headers("user-agent")),y(2,t.Body("token")),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),g([t.Get(),t.Get("/me"),M(),y(0,t.Ctx()),y(1,T()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel]),v("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=g([t.Controller("/auth"),t.Extends(exports.BaseController),y(0,p.Inject(AuthService)),v("design:paramtypes",[AuthService])],exports.AuthController),exports.CrudController=class CrudController extends exports.ModelController{constructor(){super(...arguments),this._crud={}}CrudArgumentsCountAll(e){return{ctx:e}}CrudArgumentsCreate(e){return{ctx:e}}CrudArgumentsFindAll(e){return{ctx:e}}CrudArgumentsFindOne(e){return{ctx:e}}CrudArgumentsDelete(e){return{ctx:e}}CrudArgumentsUpdate(e){return{ctx:e}}CrudValidateCreate(){return this._crud}CrudValidateUpdate(){return this._crud}add(e){return h(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return h(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}rows(e){return h(this,void 0,void 0,function*(){yield this.countAll(this.CrudArgumentsCountAll(e))})}del(e){return h(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return h(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return h(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validate(e,r){return h(this,void 0,void 0,function*(){var s,i;const n=o.Validation.object(r).parse(),{error:d,message:l,value:a}=yield n.validateAsync(null!==(i=null===(s=e.req)||void 0===s?void 0:s.body)&&void 0!==i?i:{});if(d)return e.error(new t.ValidationError(null!=l?l:d));e.req.body=a,e.next()})}validateCreate(e){return h(this,void 0,void 0,function*(){const r=this.CrudValidateCreate();if(r==this._crud)return e.error(new t.InternalServerError);yield this.validate(e,r)})}validateUpdate(e){return h(this,void 0,void 0,function*(){const r=this.CrudValidateUpdate();if(r==this._crud)return e.error(new t.InternalServerError);yield this.validate(e,r)})}},g([t.Post(),M(),C(),t.Middleware("validateCreate"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"add",null),g([t.Get(),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"all",null),g([t.Get("/count"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"rows",null),g([t.Delete("/:id"),M(),E(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"del",null),g([t.Get("/:id"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"get",null),g([t.Put("/:id"),M(),A(),t.Middleware("validateUpdate"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"set",null),g([y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"validateCreate",null),g([y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.CrudController.prototype,"validateUpdate",null),exports.CrudController=g([t.Extends(exports.ModelController)],exports.CrudController),exports.FilesController=class FilesController extends exports.BaseController{constructor(){super(...arguments),this.directory=Env.API_HTTP_PUBLIC||"./",this.permissions=["delete","download","edit","list","read","rename","upload","write"]}files(e){return h(this,void 0,void 0,function*(){let{path:r}=e.req;r=r.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const s=c.join(this.directory,r);if(!u.existsSync(s)||!u.statSync(s).isDirectory())return e.error(new t.NotFoundError);let i;return i=u.readdirSync(s),i=i.map(e=>this.info(c.join(s,e))),i=i.filter(o.isDef),Object.assign(Object.assign({},this.info(s)),{files:i})})}info(e){if(!u.existsSync(e))return null;const t=u.statSync(e),r=e.split("/").pop();e=e.replace(this.directory,"/").replace(/^\/\//,"/");const o=t.isDirectory();return{name:r,path:e.replace(/^\/\//,"/"),size:t.size,extension:o?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:o,symlink:t.isSymbolicLink()}}name(){return"files"}sync(){return h(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=o.upperCamelCase(e.replace(/_/g," ")," "),r={description:"",state:!0};yield o.forEachSeries(this.permissions,s=>h(this,void 0,void 0,function*(){const i=`${e}.${s}`;yield exports.PermissionModel.findOrCreate({where:{key:i},defaults:Object.assign({name:`${t} ${o.upperCamelCase(s," ")}`,key:i,tags:t},r)})}))})}},g([t.Get("/path"),t.Get("/path/*path"),M(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.FilesController.prototype,"files",null),exports.FilesController=g([t.Controller("/files"),t.Extends(exports.BaseController)],exports.FilesController),exports.ForgotController=class ForgotController extends exports.BaseController{check(e,r){return h(this,void 0,void 0,function*(){const s=yield this.find(r);if(!s||!s.user)return e.error(new t.NotFoundError);s.secret=o.uniqueID(),yield s.save(),e.json({token:s.secret})})}forgot(e,r,s){return h(this,void 0,void 0,function*(){yield o.sleep(Env.SLEEP_FORGOT);const n=r,d=yield exports.UserModel.findOne({where:{[i.Op.or]:[{email:n},{username:r}]}}).catch(this.error);if(!d)return e.error(new t.NotFoundError);const l=o.uniqueID(),a=Date.now()+6e4*Env.API_TOKEN_FORGOT,p=yield exports.ForgotModel.create({token:l,timestamp:a,state:!0,user_id:d.id});e.success("OK"),s.emit("forgot.send",{ctx:e,forgot:p,user:d}),this.emit("forgot.send",{ctx:e,forgot:p,user:d})})}reset(e,r,o,s){return h(this,void 0,void 0,function*(){const o=yield this.find(r);if(!o)return e.error(new t.NotFoundError);o.state=!1,yield o.save().catch(this.error),yield o.user.save().catch(this.error),e.success("OK"),s.emit("forgot.reset",{ctx:e,user:o.user}),this.emit("forgot.reset",{ctx:e,user:o.user})})}find(e){return h(this,void 0,void 0,function*(){return yield exports.ForgotModel.findOne({where:{token:e,state:!0},include:[{model:exports.UserModel,required:!0}]}).catch(this.error)})}},g([t.Get("/check"),t.Validate(e=>({token:e.string().required()})),y(0,t.Ctx()),y(1,t.Body("token")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),g([t.Post(),t.Validate(e=>({username:e.string().min(4).required()})),y(0,t.Ctx()),y(1,t.Body("username")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),g([t.Post("/reset"),t.Validate(e=>({token:e.string().required(),password:e.string().min(5).required()})),y(0,t.Ctx()),y(1,t.Body("token")),y(2,t.Body("password")),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,Application]),v("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=g([t.Controller("/forgot"),t.Extends(exports.BaseController)],exports.ForgotController),exports.GroupsController=class GroupsController extends exports.CrudController{constructor(){super(...arguments),this.model=exports.GroupModel,this.schemaCreate={name:o.Validation.string().required(),key:o.Validation.string().required(),tags:o.Validation.string().empty(""),description:o.Validation.string().empty(""),state:o.Validation.boolean().parse().required()},this.schemaUpdate={name:o.Validation.string().empty(),tags:o.Validation.string().empty(),description:o.Validation.string().empty(),state:o.Validation.boolean().parse().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudalidateUpdate(){return this.schemaUpdate}},exports.GroupsController=g([t.Controller("/groups"),t.Extends(exports.CrudController)],exports.GroupsController),exports.GroupsPermissionsController=class GroupsPermissionsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.GroupPermissionModel,this.permissions=[]}all(e,t){return h(this,void 0,void 0,function*(){const r=this.include(exports.PermissionModel,{ctx:e,required:!0});r&&(yield this.findAll({ctx:e,options:{where:{group_id:t},include:[r]},callback:e=>e.map(e=>e.permission),query:!1}))})}set(e,r,s){return h(this,void 0,void 0,function*(){const n=yield exports.GroupModel.findByPk(r,{attributes:["id"]}).catch(this.error);if(!n)return e.error(new t.NotFoundError);const d=n.id,l=[];yield o.forEachSeries(o.uniqueArray(s),t=>h(this,void 0,void 0,function*(){var r;if(!(yield exports.PermissionModel.count({where:{id:t}})))return;const[o]=null!==(r=yield exports.GroupPermissionModel.findOrCreate(Object.assign({where:{group_id:d,permission_id:t},defaults:{group_id:d,permission_id:t}},{ctx:e})).catch(this.error))&&void 0!==r?r:[];o&&l.push(t)})),yield exports.GroupPermissionModel.destroy(Object.assign({where:{group_id:d,permission_id:{[i.Op.notIn]:l}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}},g([t.Get("/:id/permissions"),M(),f("groups"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"all",null),g([t.Put("/:id/permissions"),M(),A("groups"),t.Validate(e=>({permissions:e.array(e.string())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("permissions")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"set",null),exports.GroupsPermissionsController=g([t.Controller("/groups"),t.Extends(exports.ModelController)],exports.GroupsPermissionsController),exports.LogsController=class LogsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.LogModel,this.permissions=["read"]}all(e){return h(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{order:[["created_at","DESC"]]},limited:!0})})}},g([t.Get(),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.LogsController.prototype,"all",null),exports.LogsController=g([t.Controller("/logs"),t.Extends(exports.ModelController)],exports.LogsController),exports.PermissionsController=class PermissionsController extends exports.CrudController{constructor(){super(...arguments),this.model=exports.PermissionModel,this.schemaCreate={name:o.Validation.string().required(),key:o.Validation.string().required(),tags:o.Validation.string().empty(""),description:o.Validation.string().empty(""),state:o.Validation.boolean().parse().required()},this.schemaUpdate={name:o.Validation.string().empty(),tags:o.Validation.string().empty(),description:o.Validation.string().empty(),state:o.Validation.boolean().parse().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}},exports.PermissionsController=g([t.Controller("/permissions"),t.Extends(exports.CrudController)],exports.PermissionsController),exports.RegisterController=class RegisterController extends exports.BaseController{register(e,s,n){return h(this,void 0,void 0,function*(){yield o.sleep(Env.SLEEP_REGISTRY);const{name:d,date:l,email:a,username:p,password:u,confirm:c}=s,g=p||a,y=r.sha256(u);if(yield exports.UserModel.count({where:{[i.Op.or]:[{email:a},{username:g}]}}).catch(this.error))return e.error("INVALID EMAIL OR USERNAME");if(y!=r.sha256(c))return e.error("INVALID PASSWORD");const v=yield exports.UserModel.create({name:d,email:a,username:g,password:y,avatar:"",date:l,description:"",state:!1}).catch(this.error);if(!v)return e.error(new t.InternalServerError);const h=yield exports.RegisterModel.create({token:yield this.getId(),user_id:v.id,state:!0}).catch(this.error);if(!h)return yield v.destroy().catch(this.error),e.error(new t.InternalServerError);e.success("OK"),n.emit("register.user",{ctx:e,register:h,user:v}),this.emit("register.user",{ctx:e,register:h,user:v})})}confirm(e,r,o){return h(this,void 0,void 0,function*(){const s=yield exports.RegisterModel.findOne({where:{token:r,state:!0},include:[{model:exports.UserModel,required:!0}]}).catch(this.error);if(!s)return e.error(new t.NotFoundError);s.state=!1,yield s.save().catch(this.error),s.user.state=!0,yield s.user.save().catch(this.error),e.success("OK"),o.emit("register.confirm",{ctx:e,register:s,user:s.user}),this.emit("register.confirm",{ctx:e,register:s,user:s.user})})}send(e,r,o){return h(this,void 0,void 0,function*(){const s=r,n=yield exports.RegisterModel.findOne({where:{state:!0},include:[{model:exports.UserModel,required:!0,where:{[i.Op.or]:[{email:s},{username:r}]}}]}).catch(this.error);if(!n)return e.error(new t.NotFoundError);e.success("OK"),o.emit("register.send",{ctx:e,register:n,user:n.user}),this.emit("register.send",{ctx:e,register:n,user:n.user})})}getId(){return h(this,void 0,void 0,function*(){const e=o.uuidv7();return(yield exports.RegisterModel.count({where:{token:e}}))?this.getId():e})}},g([t.Post(),t.Validate(e=>({name:e.string().required(),date:e.date().required(),email:e.string().email().required(),username:e.string().min(4).empty(),password:e.string().min(5).required(),confirm:e.string().min(5).required()})),y(0,t.Ctx()),y(1,t.Body()),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,Object,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),g([t.Post("/confirm"),t.Validate(e=>({token:e.string().required()})),y(0,t.Ctx()),y(1,t.Body("token")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),g([t.Post("/send"),t.Validate(e=>({username:e.string().min(4).required()})),y(0,t.Ctx()),y(1,t.Body("username")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=g([t.Controller("/register"),t.Extends(exports.BaseController)],exports.RegisterController),exports.SetupController=class SetupController extends exports.BaseController{setup(e){return h(this,void 0,void 0,function*(){var t;if(yield exports.UserModel.count())return e.success("OK");const r=yield exports.UserModel.create({name:"Admin",email:"admin@localhost.com",username:"admin",description:"DEFAULT",state:!0},Object.assign({},{ctx:e}));yield exports.UserPasswordModel.create({value:"admin",state:!0,user_id:r.id});const s={description:"API CORE",state:!0},i=yield exports.GroupModel.create(Object.assign({name:"Admin",key:"admin",tags:"Admin"},s),Object.assign({},{ctx:e}));yield exports.UserGroupModel.create({user_id:r.id,group_id:i.id},Object.assign({},{ctx:e})),yield exports.GroupModel.create(Object.assign({name:"User",key:"user",tags:"user"},s),Object.assign({},{ctx:e}));const n=null!==(t=yield exports.PermissionModel.findAll({where:{state:!0}}).catch(this.error))&&void 0!==t?t:[];yield o.forEachSeries(n,t=>h(this,void 0,void 0,function*(){yield exports.GroupPermissionModel.create({group_id:i.id,permission_id:t.id},Object.assign({},{ctx:e}))})),e.success("OK")})}},g([t.Get(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=g([t.Controller("/setup"),t.Extends(exports.BaseController)],exports.SetupController),exports.UsersController=class UsersController extends exports.ModelController{constructor(){super(),this.model=exports.UserModel,this.path=Env.API_HTTP_PUBLIC+"/avatar",Env.API_HTTP_PUBLIC&&u.existsSync(Env.API_HTTP_PUBLIC)&&!u.existsSync(this.path)&&u.mkdirSync(this.path)}avatar(e,r){return h(this,void 0,void 0,function*(){var o,s;const i=e.getFiles();if(i.file&&i.file.length){const{filename:n,path:d}=null!==(o=i.file[0])&&void 0!==o?o:{};if(n){const[o]=null!==(s=yield exports.UserProfileModel.findOrCreate(Object.assign({where:{user_id:r.id},defaults:{user_id:r.id}},{ctx:e})).catch(this.error))&&void 0!==s?s:[];if(!o)return u.lstatSync(d).isFile()&&u.rmSync(d),e.error(new t.InternalServerError);const i=this.path+"/"+o.data.avatar;if(u.existsSync(i)&&u.lstatSync(i).isFile()&&u.rmSync(i),o.changed("data",!0),o.data.avatar=n,yield o.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK")}}e.success("Record not Changed")})}token_new(){return h(this,void 0,void 0,function*(){var e;const t=o.uuidv7();return(null!==(e=yield this.model.count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t})}add(e){return h(this,void 0,void 0,function*(){yield this.create({ctx:e})})}all(e){return h(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}rows(e){return h(this,void 0,void 0,function*(){yield this.countAll({ctx:e})})}del(e,r,o){return h(this,void 0,void 0,function*(){if(o.id==r)return e.error(new t.NotFoundError);yield this.delete({ctx:e})})}get(e){return h(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e){return h(this,void 0,void 0,function*(){yield this.update({ctx:e})})}},g([t.Post("/avatar"),M(),t.Upload({file:{count:1,path:`${Env.API_HTTP_PUBLIC}/avatar`,types:["image/bmp","image/jpeg","image/png"],size:32}}),y(0,t.Ctx()),y(1,T()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel]),v("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),g([t.Post(),M(),C(),t.Validate(e=>({name:e.string().required(),email:e.string().email().required(),username:e.string().min(3).required(),description:e.string().empty(""),state:e.boolean().parse().empty(!0)})),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"add",null),g([t.Get(),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"all",null),g([t.Get("/count"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"rows",null),g([t.Delete("/:id"),M(),E(),y(0,t.Ctx()),y(1,t.Params("id")),y(2,T()),v("design:type",Function),v("design:paramtypes",[t.Context,String,exports.UserModel]),v("design:returntype",Promise)],exports.UsersController.prototype,"del",null),g([t.Get("/:id"),M(),f(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"get",null),g([t.Put("/:id"),M(),A(),t.Validate(e=>({name:e.string().empty(),email:e.string().email().empty(),username:e.string().min(3).empty(),description:e.string().empty(),state:e.boolean().parse().empty()})),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=g([t.Controller("/users"),t.Extends(exports.ModelController),v("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class UsersGroupsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.UserGroupModel,this.permissions=[]}all(e,r){return h(this,void 0,void 0,function*(){if(!(yield exports.UserModel.findByPk(r,{attributes:["id"]}).catch(this.error)))return e.error(new t.NotFoundError("User Not Found"));const o=this.include(exports.GroupModel,{ctx:e,required:!0});o&&(yield this.findAll({ctx:e,options:{where:{user_id:r},include:[o]},callback:e=>e.map(e=>e.group),query:!1}))})}set(e,r,s){return h(this,void 0,void 0,function*(){const n=yield exports.UserModel.findByPk(r,{attributes:["id"]}).catch(this.error);if(!n)return e.error(new t.NotFoundError("User Not Found"));const d=n.id,l=[];yield o.forEachSeries(o.uniqueArray(s),t=>h(this,void 0,void 0,function*(){var r;if(!(yield exports.GroupModel.count({where:{id:t}})))return;const[o]=null!==(r=yield exports.UserGroupModel.findOrCreate(Object.assign({where:{user_id:d,group_id:t},defaults:{user_id:d,group_id:t}},{ctx:e})).catch(this.error))&&void 0!==r?r:[];o&&l.push(t)})),yield exports.UserGroupModel.destroy(Object.assign({where:{user_id:d,group_id:{[i.Op.notIn]:l}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}},g([t.Get("/:id/groups"),M(),f("users"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),g([t.Put("/:id/groups"),M(),A("users"),t.Validate(e=>({groups:e.array(e.string())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("groups")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=g([t.Controller("/users"),t.Extends(exports.ModelController)],exports.UsersGroupsController),exports.UsersProfilesController=class UsersProfilesController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.UserProfileModel,this.permissions=[]}all(e){return h(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}get(e,r){return h(this,void 0,void 0,function*(){var o;const[s]=null!==(o=yield exports.UserProfileModel.findOrCreate(Object.assign({where:{user_id:r},defaults:{user_id:r}},{ctx:e})).catch(this.error))&&void 0!==o?o:[];if(!s)return e.error(new t.NotFoundError);e.json(s)})}set(e,r,s){return h(this,void 0,void 0,function*(){var i;const n=yield exports.UserModel.findByPk(r,{attributes:["id"]}).catch(this.error);if(!n)return e.error(new t.NotFoundError);const d=n.id,l=o.map(s,e=>String(e)),[a,p]=null!==(i=yield exports.UserProfileModel.findOrCreate(Object.assign({where:{user_id:d},defaults:{data:l,user_id:d}},{ctx:e})).catch(this.error))&&void 0!==i?i:[];a&&!p&&(a.changed("data",!0),a.data=o.merge(a.data,l),yield a.save(Object.assign({},{ctx:e})).catch(this.error)),e.success("OK")})}},g([t.Get("/profiles"),M(),f("users"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersProfilesController.prototype,"all",null),g([t.Get("/:id/profiles"),t.Get("/profiles/:id"),M(),f("users"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.UsersProfilesController.prototype,"get",null),g([t.Put("/:id/profiles"),t.Put("/profiles/:id"),M(),A("users"),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Object]),v("design:returntype",Promise)],exports.UsersProfilesController.prototype,"set",null),exports.UsersProfilesController=g([t.Controller("/users"),t.Extends(exports.ModelController)],exports.UsersProfilesController),exports.Application=Application,exports.Audit=w,exports.AuthService=AuthService,exports.CanCreate=C,exports.CanDelete=E,exports.CanRead=f,exports.CanUpdate=A,exports.Config=class Config extends Loggable{static all(e){return h(this,void 0,void 0,function*(){var t;const r=null!==(t=yield exports.ConfigModel.findAll({where:(null==e?void 0:e.length)?{key:{[i.Op.in]:e}}:{}}).catch(this.error))&&void 0!==t?t:[];return Object.fromEntries(r.map(e=>[e.key,e.value]))})}static del(e){return h(this,void 0,void 0,function*(){return((yield exports.ConfigModel.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return h(this,arguments,void 0,function*(e,t=""){const[r]=(yield exports.ConfigModel.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return r?r.value:t})}static set(e,t){return h(this,void 0,void 0,function*(){const[r,o]=(yield exports.ConfigModel.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];r&&!o&&(r.value=t,yield r.save().catch(this.error))})}},exports.Env=Env,exports.HasGroups=(...e)=>(r,s,i)=>{t.Use(r=>h(void 0,void 0,void 0,function*(){const{groups:s}=r.req;if(o.includesArray(e,null!=s?s:[]))return r.next();r.error(new t.UnauthorizedError("Access Denied"))}))(r,s,i)},exports.HasPermissions=(...e)=>(r,s,i)=>{t.Use(r=>h(void 0,void 0,void 0,function*(){const{permissions:s}=r.req;if(o.includesArray(e,null!=s?s:[]))return r.next();r.error(new t.UnauthorizedError("Access Denied"))}))(r,s,i)},exports.IsAuthenticated=M,exports.Log=Log,exports.Loggable=Loggable,exports.ModelService=ModelService,exports.ReqAuth=_,exports.ReqGroup=S,exports.ReqGroups=P,exports.ReqPermission=O,exports.ReqPermissions=U,exports.ReqUser=T,exports.SessionStore=SessionStore,exports.UserService=UserService,exports.canFactory=m,exports.sequelize=x;
|
|
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("express-session"),l=require("@andrewcaires/decorator"),a=require("jsonwebtoken"),u=require("@node-rs/argon2"),p=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 v(e,t){return function(r,o){t(r,o,e)}}function h(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function y(e,t,r,o){return new(r||(r=Promise))(function(s,i){function n(e){try{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_CROSS=e.getString("HTTP_CROSS",""),Env.HTTP_CRT=e.getFile("HTTP_CRT"),Env.HTTP_KEY=e.getFile("HTTP_KEY"),Env.MODEL_LIMIT=e.getInt("MODEL_LIMIT",10),Env.MODEL_LIMIT_MAX=e.getInt("MODEL_LIMIT_MAX",100),Env.PASSWORD_ALGORITHM=e.getInt("PASSWORD_ALGORITHM",2),Env.PASSWORD_MEMORY_COST=e.getInt("PASSWORD_MEMORY_COST",4096),Env.PASSWORD_PARALLELISM=e.getInt("PASSWORD_PARALLELISM",1),Env.PASSWORD_PEPPER=e.getString("PASSWORD_PEPPER",""),Env.PASSWORD_TIME_COST=e.getInt("PASSWORD_TIME_COST",3),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.TOKEN_TYPE=e.getString("TOKEN_TYPE","bearer"),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_HYBRID=e.getBool("API_HTTP_HYBRID",!1),Env.API_HTTP_NOTFOUND=e.getString("API_HTTP_NOTFOUND",""),Env.API_HTTP_PATH=e.getString("API_HTTP_PATH","/api"),Env.API_HTTP_REDIRECT=e.getString("API_HTTP_REDIRECT",""),Env.API_KEY_HASH=e.getString("API_KEY_HASH",""),Env.API_KEY_HEADER=e.getString("API_KEY_HEADER","x-api-key"),Env.API_SESSION_NAME=e.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=e.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=e.getString("API_SESSION_SECRET","yoursecret"),Env.API_TOKEN_COOKIE=e.getString("API_TOKEN_COOKIE","authorization"),Env.API_TOKEN_COOKIE_SET=e.getBool("API_TOKEN_COOKIE_SET",!0),Env.API_TOKEN_FORGOT=e.getMs("API_TOKEN_FORGOT","1d"),Env.API_TOKEN_HEADER=e.getString("API_TOKEN_HEADER","authorization"),Env.API_TOKEN_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});var m,C,E;exports.AuditTypes=void 0,(m=exports.AuditTypes||(exports.AuditTypes={})).CREATE="CREATE",m.DELETE="DELETE",m.UPDATE="UPDATE",exports.Loglevels=void 0,(C=exports.Loglevels||(exports.Loglevels={})).INFO="info",C.WARN="warn",C.ERROR="error",exports.UserStatus=void 0,(E=exports.UserStatus||(exports.UserStatus={})).ACTIVE="active",E.PENDING="pending",E.DISABLED="disabled",E.LOCKED="locked",E.ARCHIVED="archived";const A=e=>r=>(s,i,n)=>{t.Use(s=>y(void 0,void 0,void 0,function*(){var i;o.isUndefined(r)&&(r=o.isFunction(s.controller.name)?s.controller.name():null===(i=s.controller.constructor)||void 0===i?void 0:i.name);const{permissions:n=[]}=s.req;if(n.includes(`${r}.${e}`))return s.next();s.error(new t.UnauthorizedError("Access Denied"))}))(s,i,n)},S=A("create"),_=A("delete"),f=A("read"),M=A("update"),P=()=>(e,r,o)=>{t.Use(e=>y(void 0,void 0,void 0,function*(){yield(e=>y(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),u=(null===(r=n||a)||void 0===r?void 0:r.toString())||"";let p=e.getCookie(Env.API_TOKEN_COOKIE);p=`${Env.TOKEN_TYPE} ${p}`;const[c,g]=null!==(s=null===(o=d||p)||void 0===o?void 0:o.split(" "))&&void 0!==s?s:["",""];if(!(u||g&&c.toLowerCase()==Env.TOKEN_TYPE))return e.error(new t.UnauthorizedError("Invalid token"));const{authService:v,userService:h}=e.app,{auth:y,user:x}=null!==(i=yield(u?v.key(u.toString()):v.user(g)).catch(t=>{e.error(t)}))&&void 0!==i?i:{};if(!y||!x)return;if(!u&&y.user_agent&&y.user_agent!=l)return e.error(new t.UnauthorizedError("Invalid token"));e.req.auth=y,e.req.user=x;const{groups:m,permissions:C}=yield h.getGroupsPermissions(x.id);e.req.groups=m,e.req.permissions=C,e.next()}))(e)}))(e,r,o)},O=t.parameterFactory(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.auth}),T=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)}),I=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:[]}),w=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:[]}),b=t.parameterFactory(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.user}),R=(e,r,o)=>{var s,i,n,d,l,a,u,p,c,g;const v=o.ctx instanceof t.Context?o.ctx:null,h=null!==(d=null!==(n=null===(i=null===(s=null==v?void 0:v.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,y={type:e,model:null!==(l=null==r?void 0:r.getTableName())&&void 0!==l?l:null,source:null!==(a=Env.BASE_NAME)&&void 0!==a?a:"",state:!0,user_id:h};return v?Object.assign(Object.assign({},y),{full_url:null!==(u=v.getUrl())&&void 0!==u?u:"",ip_address:null!==(p=v.getIp())&&void 0!==p?p:"",user_agent:null!==(g=null===(c=v.req)||void 0===c?void 0:c.headers["user-agent"])&&void 0!==g?g:""}):y},D=e=>{const t=o.getConstructor(e),r=t.primaryKeyAttribute;return{model:t,record_id:r?e.getDataValue(r):null}},N={afterCreate:(e,t)=>y(void 0,void 0,void 0,function*(){const{model:o,record_id:s}=D(e);yield exports.AuditModel.create(Object.assign(Object.assign({},R(exports.AuditTypes.CREATE,o,t)),{record:s,currently:e.toJSON()})).catch(r.Log.catch)}),afterUpdate:(e,t)=>y(void 0,void 0,void 0,function*(){const{model:o,record_id:s}=D(e),i={},n={},d=e.changed();d&&d.length&&d.forEach(t=>{i[t]=e.getDataValue(t),n[t]=e.previous(t)}),yield exports.AuditModel.create(Object.assign(Object.assign({},R(exports.AuditTypes.UPDATE,o,t)),{record:s,currently:i,previously:n})).catch(r.Log.catch)}),afterDestroy:(e,t)=>y(void 0,void 0,void 0,function*(){const{model:o,record_id:s}=D(e);yield exports.AuditModel.create(Object.assign(Object.assign({},R(exports.AuditTypes.DELETE,o,t)),{record:s,currently:e.toJSON()})).catch(r.Log.catch)})},L=e=>(o.isUndefined(e)&&(e=Env.DATABASE_AUDIT),i.Hooks(e?N:{}));exports.RegisterModel=class RegisterModel extends i.Model{},g([i.Column.Id(7),h("design:type",String)],exports.RegisterModel.prototype,"id",void 0),g([i.Column.String(),h("design:type",String)],exports.RegisterModel.prototype,"secret",void 0),g([i.Column.FullDate(),h("design:type",Number)],exports.RegisterModel.prototype,"expired_at",void 0),g([i.Column.Boolean(),h("design:type",Boolean)],exports.RegisterModel.prototype,"active",void 0),g([i.Column.CreatedAt(),h("design:type",Date)],exports.RegisterModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),h("design:type",Date)],exports.RegisterModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),h("design:type",Object)],exports.RegisterModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),h("design:type",String)],exports.RegisterModel.prototype,"user_id",void 0),exports.RegisterModel=g([i.Database(x),i.ModelName("register"),i.Version("5.1.0")],exports.RegisterModel),exports.UserAuthModel=class UserAuthModel extends i.Model{},g([i.Column.Id(7),h("design:type",String)],exports.UserAuthModel.prototype,"id",void 0),g([i.Column.String(),h("design:type",String)],exports.UserAuthModel.prototype,"secret",void 0),g([i.Column.String(),h("design:type",String)],exports.UserAuthModel.prototype,"ip_address",void 0),g([i.Column.String(),h("design:type",String)],exports.UserAuthModel.prototype,"user_agent",void 0),g([i.Column.FullDate(),h("design:type",Object)],exports.UserAuthModel.prototype,"revoked_at",void 0),g([i.Column.CreatedAt(),h("design:type",Date)],exports.UserAuthModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),h("design:type",Date)],exports.UserAuthModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),h("design:type",Object)],exports.UserAuthModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),h("design:type",String)],exports.UserAuthModel.prototype,"user_id",void 0),exports.UserAuthModel=g([i.Database(x),i.ModelName("users_auth"),i.Version("5.1.0")],exports.UserAuthModel),exports.PermissionModel=class PermissionModel extends i.Model{},g([i.Column.Id(7),h("design:type",String)],exports.PermissionModel.prototype,"id",void 0),g([i.Column.String(),i.Unique(!0),h("design:type",String)],exports.PermissionModel.prototype,"name",void 0),g([i.Column.Text(),h("design:type",String)],exports.PermissionModel.prototype,"description",void 0),g([i.Column.Boolean(),h("design:type",Boolean)],exports.PermissionModel.prototype,"active",void 0),g([i.Column.CreatedAt(),h("design:type",Date)],exports.PermissionModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),h("design:type",Date)],exports.PermissionModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),h("design:type",Object)],exports.PermissionModel.prototype,"deleted_at",void 0),g([i.Association.HasMany(()=>exports.GroupPermissionModel),h("design:type",Array)],exports.PermissionModel.prototype,"groups_permissions",void 0),exports.PermissionModel=g([i.Database(x),i.ModelName("permission"),L(),i.Version("5.1.0")],exports.PermissionModel),exports.GroupPermissionModel=class GroupPermissionModel extends i.Model{},g([i.Column.Id(7),h("design:type",String)],exports.GroupPermissionModel.prototype,"id",void 0),g([i.Column.CreatedAt(),h("design:type",Date)],exports.GroupPermissionModel.prototype,"created_at",void 0),g([i.Association.BelongsTo(()=>exports.GroupModel),h("design:type",String)],exports.GroupPermissionModel.prototype,"group_id",void 0),g([i.Association.BelongsTo(()=>exports.PermissionModel),h("design:type",String)],exports.GroupPermissionModel.prototype,"permission_id",void 0),exports.GroupPermissionModel=g([i.Database(x),i.ModelName("groups_permissions"),L(),i.Version("5.1.0")],exports.GroupPermissionModel),exports.GroupModel=class GroupModel extends i.Model{},g([i.Column.Id(7),h("design:type",String)],exports.GroupModel.prototype,"id",void 0),g([i.Column.String(),i.Unique(!0),h("design:type",String)],exports.GroupModel.prototype,"name",void 0),g([i.Column.Text(),h("design:type",String)],exports.GroupModel.prototype,"description",void 0),g([i.Column.Boolean(),h("design:type",Boolean)],exports.GroupModel.prototype,"active",void 0),g([i.Column.CreatedAt(),h("design:type",Date)],exports.GroupModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),h("design:type",Date)],exports.GroupModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),h("design:type",Object)],exports.GroupModel.prototype,"deleted_at",void 0),g([i.Association.HasMany(()=>exports.UserGroupModel),h("design:type",Array)],exports.GroupModel.prototype,"users_groups",void 0),g([i.Association.HasMany(()=>exports.GroupPermissionModel),h("design:type",Array)],exports.GroupModel.prototype,"groups_Permission",void 0),exports.GroupModel=g([i.Database(x),i.ModelName("group"),L(),i.Version("5.1.0")],exports.GroupModel),exports.UserGroupModel=class UserGroupModel extends i.Model{},g([i.Column.Id(7),h("design:type",String)],exports.UserGroupModel.prototype,"id",void 0),g([i.Column.CreatedAt(),h("design:type",Date)],exports.UserGroupModel.prototype,"created_at",void 0),g([i.Association.BelongsTo(()=>exports.GroupModel),h("design:type",String)],exports.UserGroupModel.prototype,"group_id",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),h("design:type",String)],exports.UserGroupModel.prototype,"user_id",void 0),exports.UserGroupModel=g([i.Database(x),i.ModelName("users_groups"),L(),i.Version("5.1.0")],exports.UserGroupModel),exports.UserPasswordModel=class UserPasswordModel extends i.Model{},g([i.Column.Id(7),h("design:type",String)],exports.UserPasswordModel.prototype,"id",void 0),g([i.Column.String(),h("design:type",String)],exports.UserPasswordModel.prototype,"hash",void 0),g([i.Column.FullDate(),h("design:type",Object)],exports.UserPasswordModel.prototype,"revoked_at",void 0),g([i.Column.CreatedAt(),h("design:type",Date)],exports.UserPasswordModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),h("design:type",Date)],exports.UserPasswordModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),h("design:type",Object)],exports.UserPasswordModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),h("design:type",String)],exports.UserPasswordModel.prototype,"user_id",void 0),exports.UserPasswordModel=g([i.Database(x),i.ModelName("users_password"),L(),i.Version("5.1.0")],exports.UserPasswordModel),exports.UserModel=class UserModel extends i.Model{},g([i.Column.Id(7),h("design:type",String)],exports.UserModel.prototype,"id",void 0),g([i.Column.String(),h("design:type",String)],exports.UserModel.prototype,"name",void 0),g([i.Column.String(),h("design:type",String)],exports.UserModel.prototype,"username",void 0),g([i.Column.String(),h("design:type",String)],exports.UserModel.prototype,"email",void 0),g([i.Column.Text(),h("design:type",String)],exports.UserModel.prototype,"notes",void 0),g([i.Column.Enum(exports.UserStatus),i.DefaultValue(exports.UserStatus.ACTIVE),h("design:type",String)],exports.UserModel.prototype,"status",void 0),g([i.Column.Json(),i.DefaultValue(()=>({})),h("design:type",Object)],exports.UserModel.prototype,"metadata",void 0),g([i.Column.CreatedAt(),h("design:type",Date)],exports.UserModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),h("design:type",Date)],exports.UserModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),h("design:type",Object)],exports.UserModel.prototype,"deleted_at",void 0),g([i.Association.HasMany(()=>exports.AuditModel),h("design:type",Array)],exports.UserModel.prototype,"audits",void 0),g([i.Association.HasMany(()=>exports.UserAuthModel),h("design:type",Array)],exports.UserModel.prototype,"users_auths",void 0),g([i.Association.HasMany(()=>exports.RegisterModel),h("design:type",Array)],exports.UserModel.prototype,"registers",void 0),g([i.Association.HasMany(()=>exports.UserGroupModel),h("design:type",Array)],exports.UserModel.prototype,"users_groups",void 0),g([i.Association.HasMany(()=>exports.UserPasswordModel),h("design:type",Array)],exports.UserModel.prototype,"users_passwords",void 0),exports.UserModel=g([i.Database(x),i.ModelName("user"),L(),i.Version("5.1.0")],exports.UserModel),exports.AuditModel=class AuditModel extends i.Model{},g([i.Column.Id(7),h("design:type",String)],exports.AuditModel.prototype,"id",void 0),g([i.Column.Enum(exports.AuditTypes),h("design:type",String)],exports.AuditModel.prototype,"type",void 0),g([i.Column.String(),h("design:type",String)],exports.AuditModel.prototype,"model",void 0),g([i.Column.String(),h("design:type",String)],exports.AuditModel.prototype,"record",void 0),g([i.Column.Json(),h("design:type",Object)],exports.AuditModel.prototype,"currently",void 0),g([i.Column.Json(),h("design:type",Object)],exports.AuditModel.prototype,"previously",void 0),g([i.Column.Text(),h("design:type",String)],exports.AuditModel.prototype,"full_url",void 0),g([i.Column.String(),h("design:type",String)],exports.AuditModel.prototype,"ip_address",void 0),g([i.Column.String(),h("design:type",String)],exports.AuditModel.prototype,"user_agent",void 0),g([i.Column.String(),h("design:type",String)],exports.AuditModel.prototype,"source",void 0),g([i.Column.CreatedAt(),h("design:type",Date)],exports.AuditModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),h("design:type",Date)],exports.AuditModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),h("design:type",Object)],exports.AuditModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),h("design:type",String)],exports.AuditModel.prototype,"user_id",void 0),exports.AuditModel=g([i.Database(x),i.ModelName("audit"),i.Version("5.1.0")],exports.AuditModel),exports.ConfigModel=class ConfigModel extends i.Model{},g([i.Column.Id(7),h("design:type",String)],exports.ConfigModel.prototype,"id",void 0),g([i.Column.String(),h("design:type",String)],exports.ConfigModel.prototype,"key",void 0),g([i.Column.Text(),h("design:type",String)],exports.ConfigModel.prototype,"value",void 0),g([i.Column.CreatedAt(),h("design:type",Date)],exports.ConfigModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),h("design:type",Date)],exports.ConfigModel.prototype,"updated_at",void 0),exports.ConfigModel=g([i.Database(x),i.ModelName("configs"),i.Version("5.1.0")],exports.ConfigModel),exports.ForgotModel=class ForgotModel extends i.Model{},g([i.Column.Id(7),h("design:type",String)],exports.ForgotModel.prototype,"id",void 0),g([i.Column.String(),h("design:type",String)],exports.ForgotModel.prototype,"secret",void 0),g([i.Column.FullDate(),h("design:type",Number)],exports.ForgotModel.prototype,"expired_at",void 0),g([i.Column.Boolean(),h("design:type",Boolean)],exports.ForgotModel.prototype,"state",void 0),g([i.Column.CreatedAt(),h("design:type",Date)],exports.ForgotModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),h("design:type",Date)],exports.ForgotModel.prototype,"updated_at",void 0),g([i.Column.DeletedAt(),h("design:type",Object)],exports.ForgotModel.prototype,"deleted_at",void 0),g([i.Association.BelongsTo(()=>exports.UserModel),h("design:type",String)],exports.ForgotModel.prototype,"user_id",void 0),exports.ForgotModel=g([i.Database(x),i.ModelName("forgot"),i.Version("5.1.0")],exports.ForgotModel),exports.LogModel=class LogModel extends i.Model{},g([i.Column.Id(7),h("design:type",String)],exports.LogModel.prototype,"id",void 0),g([i.Column.Enum(exports.Loglevels),i.DefaultValue(exports.Loglevels.INFO),h("design:type",String)],exports.LogModel.prototype,"level",void 0),g([i.Column.Text(),h("design:type",String)],exports.LogModel.prototype,"message",void 0),g([i.Column.String(),h("design:type",String)],exports.LogModel.prototype,"source",void 0),g([i.Column.CreatedAt(),h("design:type",Date)],exports.LogModel.prototype,"created_at",void 0),exports.LogModel=g([i.Database(x),i.ModelName("log"),i.Version("5.1.0")],exports.LogModel),exports.MigrationModel=class MigrationModel extends i.Model{},g([i.Column.Id(7),h("design:type",String)],exports.MigrationModel.prototype,"id",void 0),g([i.Column.String(),h("design:type",String)],exports.MigrationModel.prototype,"model",void 0),g([i.Column.String(),h("design:type",String)],exports.MigrationModel.prototype,"version",void 0),g([i.Column.CreatedAt(),h("design:type",Date)],exports.MigrationModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),h("design:type",Date)],exports.MigrationModel.prototype,"updated_at",void 0),exports.MigrationModel=g([i.Database(x),i.ModelName("migration"),i.Version("5.1.0")],exports.MigrationModel),exports.SessionModel=class SessionModel extends i.Model{},g([i.Column.Id(7),h("design:type",String)],exports.SessionModel.prototype,"id",void 0),g([i.Column.Json(),h("design:type",Object)],exports.SessionModel.prototype,"data",void 0),g([i.Column.FullDate(),h("design:type",Date)],exports.SessionModel.prototype,"expired_at",void 0),g([i.Column.CreatedAt(),h("design:type",Date)],exports.SessionModel.prototype,"created_at",void 0),g([i.Column.UpdatedAt(),h("design:type",Date)],exports.SessionModel.prototype,"updated_at",void 0),exports.SessionModel=g([i.Database(x),i.ModelName("session"),i.Version("5.1.0")],exports.SessionModel);class Log{static error(e,t,r){return y(this,void 0,void 0,function*(){yield this.writeRaw("error",e,t,r)})}static info(e,t,r){return y(this,void 0,void 0,function*(){yield this.writeRaw("info",e,t,r)})}static warn(e,t,r){return y(this,void 0,void 0,function*(){yield this.writeRaw("warn",e,t,r)})}static writeRaw(e,t,o,s){return y(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 d.Store{constructor(){super(),this.all=e=>y(this,void 0,void 0,function*(){e=e||o.noop;const t=yield exports.SessionModel.findAll({attributes:["id","expired_at"],where:{expired_at:{[i.Op.gte]:new Date}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.id)),e()}),this.clear=e=>y(this,void 0,void 0,function*(){yield exports.SessionModel.destroy().catch(r.Log.catch),e&&e()}),this.destroy=(e,t)=>y(this,void 0,void 0,function*(){yield exports.SessionModel.destroy({where:{id:e}}).catch(r.Log.catch),t&&t()}),this.expired=()=>y(this,void 0,void 0,function*(){yield exports.SessionModel.destroy({where:{expired_at:{[i.Op.lt]:new Date}}}).catch(r.Log.catch)}),this.get=(e,t)=>y(this,void 0,void 0,function*(){t=t||o.noop;const s=yield exports.SessionModel.findOne({where:{id:e,expired_at:{[i.Op.gte]:new Date}}}).catch(e=>(t(e),null));if(s){if(s.data.cookie){if(new Date(s.data.cookie.expires).getTime()<=Date.now())return yield s.destroy().catch(r.Log.catch),void t(null)}t(null,s.data)}else t(null)}),this.length=e=>y(this,void 0,void 0,function*(){e&&e(null,(yield exports.SessionModel.count().catch(r.Log.catch))||0)}),this.set=(e,t,s)=>y(this,void 0,void 0,function*(){s=s||o.noop;const i=new Date;i.setTime(i.getTime()+Env.API_SESSION_LIFETIME);const[n,d]=(yield exports.SessionModel.findOrCreate({where:{id:e},defaults:{id:e,data:t,expired_at:i}}).catch(r.Log.catch))||[];n?(d||(n.data=t,n.expired_at=i,yield n.save().catch(r.Log.catch)),s()):s()}),setInterval(this.expired,6e4)}}exports.Service=class Service{},exports.Service=g([l.Trait(Loggable)],exports.Service),exports.AuthService=class AuthService extends exports.Service{constructor(){super(...arguments),this.userAttributes={exclude:["username","notes","deleted_at"]}}create(e){return y(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 y(this,void 0,void 0,function*(){return!(!e||e.revoked_at)&&(e.revoked_at=new Date,yield e.save(),!0)})}renew(e){return y(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,status:exports.UserStatus.ACTIVE}}).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 y(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({attributes:this.userAttributes,where:{id:o,status:exports.UserStatus.ACTIVE}}).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 y(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 y(this,void 0,void 0,function*(){if(!e)throw new t.UnauthorizedError("Invalid token");const r=yield exports.UserModel.findOne({attributes:this.userAttributes,where:{token:e,status:exports.UserStatus.ACTIVE}}).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([l.Singleton()],exports.AuthService),exports.ModelService=class ModelService extends exports.Service{constructor(e,t){var r,o;super(),this.attributes=[],this.permissions=[],this.search=[],this.model=e,(null==t?void 0:t.permissions)&&(this.permissions=t.permissions);const s=Object.keys(e.getAttributes());this.attributes=this.filterAttributes(s,null!==(r=null==t?void 0:t.attributes)&&void 0!==r?r:[]),this.search=this.filterAttributes(s,null!==(o=null==t?void 0:t.search)&&void 0!==o?o:this.attributes)}applySelect(e,t,r){if(!t)return;const s=null==e?void 0:e.getQuery(r?`${r}_select`:"select"),i=t.attributes,n=e=>i.includes(e);t.attributes=[],o.isString(s)&&s.length&&t.attributes.push(...s.split(/\s*,\s*/g).filter(n)),t.attributes.length||(t.attributes=i)}applyOrders(e,t){if(!t)return;const r=null==e?void 0:e.getQuery("asc"),s=null==e?void 0:e.getQuery("desc"),i=[],n=t.attributes,d=e=>n.includes(e);o.isString(r)&&r.length&&i.push(...r.split(/\s*,\s*/g).filter(d).map(e=>[e,"ASC"])),o.isString(s)&&s.length&&i.push(...s.split(/\s*,\s*/g).filter(d).map(e=>[e,"DESC"])),i.length&&(t.order=i)}applyPagination(e,t){if(!t)return;const r=null==e?void 0:e.getQuery("limit"),s=null==e?void 0:e.getQuery("offset");o.isUndefined(t.limit)&&(t.limit=Env.MODEL_LIMIT,o.isString(r)&&(t.limit=parseInt(r)||0),t.limit=o.clamp(t.limit,-1,Env.MODEL_LIMIT_MAX)),t.limit<0&&(t.limit=void 0),o.isString(s)&&(t.offset=parseInt(s)||0,t.offset<0&&(t.offset=void 0))}applySearch(e,t){var r;if(!t)return;const s=null==e?void 0:e.getQuery("search");s&&o.isString(s)&&(t.where=Object.assign(Object.assign({},null!==(r=t.where)&&void 0!==r?r:{}),{[i.Op.or]:this.search.map(e=>({[e]:{[i.Op.substring]:s}}))}))}applyWhere(e,r,s){var n,d;if(!r)return null;const l=null==e?void 0:e.getQuery(s?`${s}_where`:"where");if(!o.isString(l))return null;const a=r.attributes,u=i.Where.parse(a,l);return o.isUndefined(u.error)?(r.where=Object.assign(Object.assign({},null!==(n=r.where)&&void 0!==n?n:{}),null!==(d=u.value)&&void 0!==d?d:{}),null):new t.ValidationError(u.error.join(", "))}countAll(e){return y(this,void 0,void 0,function*(){var r,s;const{ctx:i,options:n={}}=e,d=o.merge({},n);d.attributes=this.getAttributes(null!==(r=null==d?void 0:d.attributes)&&void 0!==r?r:[]),this.applySearch(i,d);const l=this.applyWhere(i,d);if(l)return null==i||i.error(l),0;this.applySelect(i,d);const a=null!==(s=yield this.model.count(Object.assign(Object.assign({},d),{distinct:!!d.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error))&&void 0!==s?s:0;return null==i||i.prepare(t.StatusCodes.OK,{count:a}),a})}create(e){return y(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:u}=this.model;return null==n||n.prepare(t.StatusCodes.OK,{[u]:a.getDataValue(u)}),a})}delete(e){return y(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 u=o.merge({},d),p=yield this.model.destroy(Object.assign(Object.assign(Object.assign({},u),{where:Object.assign(Object.assign({},null!==(s=u.where)&&void 0!==s?s:{}),{[l]:a}),individualHooks:!0}),{ctx:i})).catch(this.error);return p?(null==i||i.success("OK"),p):(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 y(this,void 0,void 0,function*(){var r,s;const{ctx:i,callback:n,options:d={},query:l=!0}=e,a=o.merge({},d);if(a.attributes=this.getAttributes(null!==(r=null==a?void 0:a.attributes)&&void 0!==r?r:[]),l&&this.applySelect(i,a),this.applyOrders(i,a),this.applyPagination(i,a),(null!==(s=null==a?void 0:a.limit)&&void 0!==s?s:0)>Env.MODEL_LIMIT_MAX&&(a.limit=Env.MODEL_LIMIT_MAX),this.applySearch(i,a),l){const e=this.applyWhere(i,a);if(e)return null==i||i.error(e),{count:0,records:[]}}const[u,p]=yield Promise.all([this.model.count(Object.assign(Object.assign({},a),{distinct:!!a.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error).then(e=>null!=e?e:0),this.model.findAll(a).catch(this.error).then(e=>null!=e?e:[])]),c={count:u,records:n?yield n(p):p};return null==i||i.prepare(t.StatusCodes.OK,c),c})}findOne(e){return y(this,void 0,void 0,function*(){var r,s,i;const{callback:n,ctx:d,id:l,options:a={},query:u=!0}=e,{primaryKeyAttribute:p}=this.model,c=null!==(r=null==d?void 0:d.getParam(p))&&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:[]),u&&this.applySelect(d,g);const v=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:{}),{[p]:c})})).catch(this.error);return v?(null==d||d.prepare(t.StatusCodes.OK,n?yield n(v):v.toJSON()),v):(null==d||d.error(new t.NotFoundError),null)})}getAttributes(e){return this.filterAttributes(this.attributes,e)}include(e,t){var r;const s=o.clone(t),{ctx:i}=null!=t?t:{};s.attributes=this.filterAttributes(Object.keys(e.getAttributes()),null!==(r=s.attributes)&&void 0!==r?r:[]),this.applySearch(i,s);const n=this.applyWhere(i,s,t.name);return n?(null==i||i.error(n),null):(this.applySelect(i,s,t.name),Object.assign({model:e},s))}name(){return this.model.tableName}sync(){return y(this,void 0,void 0,function*(){if(!this.permissions.length)return;const e=this.name().toLowerCase(),t={description:"",active:!0};yield o.forEachAsync(this.permissions,r=>y(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 y(this,void 0,void 0,function*(){var r,s,i,n,d;const{ctx:l,body:a,id:u,options:p={}}=e,{primaryKeyAttribute:c}=this.model,g=null!==(r=null==l?void 0:l.getParam(c))&&void 0!==r?r:u;if(o.isUndefined(g))return null==l||l.error(new t.BadRequestError),!1;const v=o.merge({},p),[h]=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({},v),{where:Object.assign(Object.assign({},null!==(n=null==v?void 0:v.where)&&void 0!==n?n:{}),{[c]:g}),individualHooks:!0}),{ctx:l})).catch(this.error))&&void 0!==d?d:[];return h?(null==l||l.success("OK"),!0):(null==l||l.success("Record not changed"),!1)})}},exports.ModelService=g([l.Singleton(),h("design:paramtypes",[Object,Object])],exports.ModelService),exports.UserService=class UserService extends exports.Service{constructor(){super(...arguments),this.hashOptions={algorithm:Env.PASSWORD_ALGORITHM,memoryCost:Env.PASSWORD_MEMORY_COST,parallelism:Env.PASSWORD_PARALLELISM,timeCost:Env.PASSWORD_TIME_COST}}createPassword(e,t,r){return y(this,void 0,void 0,function*(){yield exports.UserPasswordModel.update({revoked_at:new Date},{where:{revoked_at:null,user_id:e}}).catch(this.error);const o=u.hashSync(t+Env.PASSWORD_PEPPER,this.hashOptions);yield exports.UserPasswordModel.create({hash:o,user_id:e},Object.assign({},{ctx:r})).catch(this.error)})}findAllPermission(e){return y(this,void 0,void 0,function*(){var t;return null!==(t=yield exports.PermissionModel.findAll({attributes:["name"],where:{active:!0},include:[{association:"groups_permissions",required:!0,include:[{association:"group",required:!0,attributes:["id","name"],where:{active:!0},include:[{association:"users_groups",required:!0,where:{user_id:e}}]}]}]}).catch(this.error))&&void 0!==t?t:[]})}getGroups(e){return y(this,void 0,void 0,function*(){var t;return(null!==(t=yield exports.GroupModel.findAll({attributes:["name"],where:{active:!0},include:[{association:"users_groups",required:!0,where:{user_id:e}}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.name)})}getGroupsPermissions(e){return y(this,void 0,void 0,function*(){const t=[],r=[];return(yield this.findAllPermission(e)).forEach(e=>{r.push(e.name),e.groups_permissions.forEach(e=>t.push(e.group.name))}),{groups:o.uniqueArray(t),permissions:o.uniqueArray(r)}})}getPermissions(e){return y(this,void 0,void 0,function*(){return(yield this.findAllPermission(e)).map(e=>e.name)})}},exports.UserService=g([l.Singleton()],exports.UserService);class Application extends t.Application{constructor(e,t){super(e,o.merge({},{cert:Env.HTTP_CRT,cross:!!Env.HTTP_CROSS&&("*"===Env.HTTP_CROSS||{origin:Env.HTTP_CROSS.split(",")}),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 y(this,void 0,void 0,function*(){yield x.sync(),yield this.migrations(x),yield o.forEachSeries(this.controllers,e=>y(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 s.WebSocketServer({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>y(this,void 0,void 0,function*(){t.url||(t.url=""),e.on("close",()=>{}),yield o.sleep(2e3)})))})}migrations(e){return y(this,void 0,void 0,function*(){const t=[];yield o.forEachSeries(Object.keys(e.models),r=>y(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=>y(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 y(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 y(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=o.upperCamelCase(e.replace(/_/g," ")," ");yield o.forEachSeries(this.permissions,r=>y(this,void 0,void 0,function*(){const s=`${e}.${r}`;yield exports.PermissionModel.findOrCreate({where:{name:s},defaults:{name:s,description:`${t} ${o.upperCamelCase(r," ")}`,active:!0}})}))})}},g([v(0,t.Ctx()),v(1,t.Headers("user-agent")),v(2,t.Session()),h("design:type",Function),h("design:paramtypes",[t.Context,String,Object]),h("design:returntype",Promise)],exports.BaseController.prototype,"session",null),exports.BaseController=g([l.Trait(Loggable)],exports.BaseController),exports.ModelController=class ModelController extends exports.BaseController{constructor(){super(...arguments),this.attributes=[],this.permissions=["create","read","update","delete"],this.search=[]}countAll(e){return y(this,void 0,void 0,function*(){return yield this.service.countAll(e)})}create(e){return y(this,void 0,void 0,function*(){return yield this.service.create(e)})}delete(e){return y(this,void 0,void 0,function*(){return yield this.service.delete(e)})}findAll(e){return y(this,void 0,void 0,function*(){return yield this.service.findAll(e)})}findOne(e){return y(this,void 0,void 0,function*(){return yield this.service.findOne(e)})}include(e,t){return this.service.include(e,t)}sync(){return y(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=o.upperCamelCase(e.replace(/_/g," ")," ");yield o.forEachSeries(this.permissions,r=>y(this,void 0,void 0,function*(){const s=`${e}.${r}`;yield exports.PermissionModel.findOrCreate({where:{name:s},defaults:{name:s,description:`${t} ${o.upperCamelCase(r," ")}`,active:!0}})})),this.service=new exports.ModelService(this.model,{attributes:this.attributes.length?this.attributes:void 0,search:this.search.length?this.search:void 0})})}update(e){return y(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 y(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"]]}})})}get(e){return y(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}},g([t.Get(),P(),f(),v(0,t.Ctx()),v(1,t.Query("type")),v(2,t.Query("table")),h("design:type",Function),h("design:paramtypes",[t.Context,String,String]),h("design:returntype",Promise)],exports.AuditsController.prototype,"all",null),g([t.Get("/:id"),P(),f(),v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("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(){super(...arguments),this.authService=new exports.AuthService}login(e,r,s,n,d,l){return y(this,void 0,void 0,function*(){var a;yield o.sleep(Env.SLEEP_AUTH);const p=yield exports.UserModel.findOne({where:{[i.Op.or]:[{email:s},{username:s}]}}).catch(this.error);if(!p)return e.error(new t.UnauthorizedError("Invalid credentials")),l.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const c=yield exports.UserPasswordModel.findOne({where:{revoked_at:null,user_id:p.id}}).catch(this.error);if(n+=Env.PASSWORD_PEPPER,!c||!(yield u.verify(c.hash,n).catch(o.noop)))return e.error(new t.UnauthorizedError("Invalid credentials")),l.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const g=yield exports.RegisterModel.findOne({where:{state:!0,user_id:p.id}}).catch(this.error);if(g)return e.error(new t.UnauthorizedError("Activation Required")),l.emit("auth.activation",{ctx:e,register:g,user:p}),void this.emit("auth.activation",{ctx:e,register:g,user:p});if(p.status!=exports.UserStatus.ACTIVE)return e.error(new t.UnauthorizedError("Invalid credentials")),l.emit("auth.failure",{ctx:e,user:p}),void this.emit("auth.failure",{ctx:e,user:p});const{auth:v,token:h}=null!==(a=yield this.authService.create(p).catch(t=>{e.error(t),l.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e})}))&&void 0!==a?a:{};v&&h&&(v.user_agent=r,v.ip_address=e.getIp(),yield v.save().catch(this.error),Env.API_TOKEN_COOKIE_SET&&e.setCookie(Env.API_TOKEN_COOKIE,h,{maxAge:d?Env.TOKEN_TTL:void 0}),e.json({token:h}),l.emit("auth.login",{ctx:e,auth:v,user:p}),this.emit("auth.login",{ctx:e,auth:v,user:p}))})}logout(e,r,o,s){return y(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 y(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 y(this,void 0,void 0,function*(){const{groups:o,permissions:s,profile:i}=e.req;if(!o||!s)return e.error(new t.InternalServerError);e.json(Object.assign(Object.assign({},r.toJSON()),{groups:o,permissions:s,profile:i}))})}},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()),h("design:type",Function),h("design:paramtypes",[t.Context,String,String,String,Boolean,Application]),h("design:returntype",Promise)],exports.AuthController.prototype,"login",null),g([t.Get("/logout"),P(),v(0,t.Ctx()),v(1,O()),v(2,b()),v(3,t.App()),h("design:type",Function),h("design:paramtypes",[t.Context,exports.UserAuthModel,exports.UserModel,Application]),h("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()),h("design:type",Function),h("design:paramtypes",[t.Context,String,String,Application]),h("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),g([t.Get(),t.Get("/me"),P(),v(0,t.Ctx()),v(1,b()),h("design:type",Function),h("design:paramtypes",[t.Context,exports.UserModel]),h("design:returntype",Promise)],exports.AuthController.prototype,"user",null),exports.AuthController=g([t.Controller("/auth"),t.Extends(exports.BaseController)],exports.AuthController),exports.CrudController=class CrudController extends exports.ModelController{constructor(){super(...arguments),this._crud={}}CrudArgumentsCountAll(e){return{ctx:e}}CrudArgumentsCreate(e){return{ctx:e}}CrudArgumentsFindAll(e){return{ctx:e}}CrudArgumentsFindOne(e){return{ctx:e}}CrudArgumentsDelete(e){return{ctx:e}}CrudArgumentsUpdate(e){return{ctx:e}}CrudValidateCreate(){return this._crud}CrudValidateUpdate(){return this._crud}add(e){return y(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return y(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}rows(e){return y(this,void 0,void 0,function*(){yield this.countAll(this.CrudArgumentsCountAll(e))})}del(e){return y(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return y(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return y(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validate(e,r){return y(this,void 0,void 0,function*(){var s,i;const n=o.Validation.object(r).parse(),{error:d,message:l,value:a}=yield n.validateAsync(null!==(i=null===(s=e.req)||void 0===s?void 0:s.body)&&void 0!==i?i:{});if(d)return e.error(new t.ValidationError(null!=l?l:d));e.req.body=a,e.next()})}validateCreate(e){return y(this,void 0,void 0,function*(){const r=this.CrudValidateCreate();if(r==this._crud)return e.error(new t.InternalServerError);yield this.validate(e,r)})}validateUpdate(e){return y(this,void 0,void 0,function*(){const r=this.CrudValidateUpdate();if(r==this._crud)return e.error(new t.InternalServerError);yield this.validate(e,r)})}},g([t.Post(),P(),S(),t.Middleware("validateCreate"),v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("design:returntype",Promise)],exports.CrudController.prototype,"add",null),g([t.Get(),P(),f(),v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("design:returntype",Promise)],exports.CrudController.prototype,"all",null),g([t.Get("/count"),P(),f(),v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("design:returntype",Promise)],exports.CrudController.prototype,"rows",null),g([t.Delete("/:id"),P(),_(),v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("design:returntype",Promise)],exports.CrudController.prototype,"del",null),g([t.Get("/:id"),P(),f(),v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("design:returntype",Promise)],exports.CrudController.prototype,"get",null),g([t.Put("/:id"),P(),M(),t.Middleware("validateUpdate"),v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("design:returntype",Promise)],exports.CrudController.prototype,"set",null),g([v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("design:returntype",Promise)],exports.CrudController.prototype,"validateCreate",null),g([v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("design:returntype",Promise)],exports.CrudController.prototype,"validateUpdate",null),exports.CrudController=g([t.Extends(exports.ModelController)],exports.CrudController),exports.FilesController=class FilesController extends exports.BaseController{constructor(){super(...arguments),this.directory=Env.API_HTTP_PUBLIC||"./",this.permissions=["delete","download","edit","list","read","rename","upload","write"]}files(e){return y(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(!p.existsSync(s)||!p.statSync(s).isDirectory())return e.error(new t.NotFoundError);let i;return i=p.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(!p.existsSync(e))return null;const t=p.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 y(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=o.upperCamelCase(e.replace(/_/g," ")," ");yield o.forEachSeries(this.permissions,r=>y(this,void 0,void 0,function*(){const s=`${e}.${r}`;yield exports.PermissionModel.findOrCreate({where:{name:s},defaults:{name:s,description:`${t} ${o.upperCamelCase(r," ")}`,active:!0}})}))})}},g([t.Get("/path"),t.Get("/path/*path"),P(),v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("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 y(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 y(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,u=yield exports.ForgotModel.create({token:l,timestamp:a,state:!0,user_id:d.id});e.success("OK"),s.emit("forgot.send",{ctx:e,forgot:u,user:d}),this.emit("forgot.send",{ctx:e,forgot:u,user:d})})}reset(e,r,o,s){return y(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 y(this,void 0,void 0,function*(){return yield exports.ForgotModel.findOne({where:{token:e,state:!0},include:[{association:"users",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")),h("design:type",Function),h("design:paramtypes",[t.Context,String]),h("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()),h("design:type",Function),h("design:paramtypes",[t.Context,String,Application]),h("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()),h("design:type",Function),h("design:paramtypes",[t.Context,String,String,Application]),h("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(""),active:o.Validation.boolean().parse().required()},this.schemaUpdate={description:o.Validation.string().empty(),active:o.Validation.boolean().parse().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){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 y(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 y(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=>y(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"),P(),f("groups"),v(0,t.Ctx()),v(1,t.Params("id")),h("design:type",Function),h("design:paramtypes",[t.Context,String]),h("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"all",null),g([t.Put("/:id/permissions"),P(),M("groups"),t.Validate(e=>({permissions:e.array(e.string())})),v(0,t.Ctx()),v(1,t.Params("id")),v(2,t.Body("permissions")),h("design:type",Function),h("design:paramtypes",[t.Context,String,Array]),h("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"set",null),exports.GroupsPermissionsController=g([t.Controller("/groups"),t.Extends(exports.ModelController)],exports.GroupsPermissionsController),exports.HealthController=class HealthController{ping(e){return y(this,void 0,void 0,function*(){e.json({status:"ok",timestamp:Date.now(),uptime:process.uptime()})})}},g([t.All("/"),v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("design:returntype",Promise)],exports.HealthController.prototype,"ping",null),exports.HealthController=g([t.Controller("/health")],exports.HealthController),exports.LogsController=class LogsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.LogModel,this.permissions=["read"]}all(e){return y(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{order:[["created_at","DESC"]]}})})}},g([t.Get(),P(),f(),v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("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(),description:o.Validation.string().empty(""),active:o.Validation.boolean().parse().required()},this.schemaUpdate={description:o.Validation.string().empty(),active:o.Validation.boolean().parse().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}},exports.PermissionsController=g([t.Controller("/permissions"),t.Extends(exports.CrudController)],exports.PermissionsController),exports.RegisterController=class RegisterController extends exports.BaseController{register(e,s,n){return y(this,void 0,void 0,function*(){yield o.sleep(Env.SLEEP_REGISTRY);const{name:d,date:l,email:a,username:u,password:p,confirm:c}=s,g=u||a,v=r.sha256(p);if(yield exports.UserModel.count({where:{[i.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 h=yield exports.UserModel.create({name:d,email:a,username:g,password:v,avatar:"",date:l,description:"",status:exports.UserStatus.PENDING}).catch(this.error);if(!h)return e.error(new t.InternalServerError);const y=yield exports.RegisterModel.create({token:yield this.getId(),user_id:h.id,state:!0}).catch(this.error);if(!y)return yield h.destroy().catch(this.error),e.error(new t.InternalServerError);e.success("OK"),n.emit("register.user",{ctx:e,register:y,user:h}),this.emit("register.user",{ctx:e,register:y,user:h})})}confirm(e,r,o){return y(this,void 0,void 0,function*(){const s=yield exports.RegisterModel.findOne({where:{token:r,state:!0},include:[{association:"users",required:!0}]}).catch(this.error);if(!s)return e.error(new t.NotFoundError);s.active=!1,yield s.save().catch(this.error),s.user.status=exports.UserStatus.ACTIVE,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 y(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 y(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()),h("design:type",Function),h("design:paramtypes",[t.Context,Object,Application]),h("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()),h("design:type",Function),h("design:paramtypes",[t.Context,String,Application]),h("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()),h("design:type",Function),h("design:paramtypes",[t.Context,String,Application]),h("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{constructor(){super(...arguments),this.userService=new exports.UserService}setup(e){return y(this,void 0,void 0,function*(){var r;if(yield exports.UserModel.count())return e.error(new t.NotFoundError("Endpoint Not Found"));const s=yield exports.UserModel.create({name:"Admin",username:"admin",email:"admin@localhost.com",notes:"",status:exports.UserStatus.ACTIVE},Object.assign({},{ctx:e})).catch(this.error);if(!s)return e.error(new t.InternalServerError);yield this.userService.createPassword(s.id,"admin",e);const i=yield exports.GroupModel.create({name:"root",description:"Root",active:!0},Object.assign({},{ctx:e}));yield exports.UserGroupModel.create({user_id:s.id,group_id:i.id},Object.assign({},{ctx:e})),yield exports.GroupModel.create({name:"admin",description:"Admin",active:!0},Object.assign({},{ctx:e})),yield exports.GroupModel.create({name:"user",description:"User",active:!0},Object.assign({},{ctx:e}));const n=null!==(r=yield exports.PermissionModel.findAll({where:{active:!0}}).catch(this.error))&&void 0!==r?r:[];yield o.forEachSeries(n,t=>y(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(),v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("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&&p.existsSync(Env.API_HTTP_PUBLIC)&&!p.existsSync(this.path)&&p.mkdirSync(this.path)}avatar(e,r){return y(this,void 0,void 0,function*(){var o;const s=e.getFiles();if(s.file&&s.file.length){const{filename:i,path:n}=null!==(o=s.file[0])&&void 0!==o?o:{};if(i){const o=yield exports.UserModel.findOne({where:{user_id:r.id}}).catch(this.error);if(!o)return p.lstatSync(n).isFile()&&p.rmSync(n),e.error(new t.InternalServerError);const s=this.path+"/"+o.metadata.avatar_url;if(p.existsSync(s)&&p.lstatSync(s).isFile()&&p.rmSync(s),o.changed("metadata",!0),o.metadata.avatar_url=i,yield o.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK")}}e.success("Record not Changed")})}token_new(){return y(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 y(this,void 0,void 0,function*(){yield this.create({ctx:e})})}all(e){return y(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}rows(e){return y(this,void 0,void 0,function*(){yield this.countAll({ctx:e})})}del(e,r,o){return y(this,void 0,void 0,function*(){if(o.id==r)return e.error(new t.NotFoundError);yield this.delete({ctx:e})})}get(e){return y(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e){return y(this,void 0,void 0,function*(){yield this.update({ctx:e})})}},g([t.Post("/avatar"),P(),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,b()),h("design:type",Function),h("design:paramtypes",[t.Context,exports.UserModel]),h("design:returntype",Promise)],exports.UsersController.prototype,"avatar",null),g([t.Post(),P(),S(),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()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("design:returntype",Promise)],exports.UsersController.prototype,"add",null),g([t.Get(),P(),f(),v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("design:returntype",Promise)],exports.UsersController.prototype,"all",null),g([t.Get("/count"),P(),f(),v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("design:returntype",Promise)],exports.UsersController.prototype,"rows",null),g([t.Delete("/:id"),P(),_(),v(0,t.Ctx()),v(1,t.Params("id")),v(2,b()),h("design:type",Function),h("design:paramtypes",[t.Context,String,exports.UserModel]),h("design:returntype",Promise)],exports.UsersController.prototype,"del",null),g([t.Get("/:id"),P(),f(),v(0,t.Ctx()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("design:returntype",Promise)],exports.UsersController.prototype,"get",null),g([t.Put("/:id"),P(),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()),h("design:type",Function),h("design:paramtypes",[t.Context]),h("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=g([t.Controller("/users"),t.Extends(exports.ModelController),h("design:paramtypes",[])],exports.UsersController),exports.UsersGroupsController=class UsersGroupsController extends exports.ModelController{constructor(){super(...arguments),this.model=exports.UserGroupModel,this.permissions=[]}all(e,r){return y(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 y(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=>y(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"),P(),f("users"),v(0,t.Ctx()),v(1,t.Params("id")),h("design:type",Function),h("design:paramtypes",[t.Context,String]),h("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),g([t.Put("/:id/groups"),P(),M("users"),t.Validate(e=>({groups:e.array(e.string())})),v(0,t.Ctx()),v(1,t.Params("id")),v(2,t.Body("groups")),h("design:type",Function),h("design:paramtypes",[t.Context,String,Array]),h("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=L,exports.CanCreate=S,exports.CanDelete=_,exports.CanRead=f,exports.CanUpdate=M,exports.Config=class Config extends Loggable{static all(e){return y(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 y(this,void 0,void 0,function*(){return((yield exports.ConfigModel.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return y(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 y(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=>y(void 0,void 0,void 0,function*(){const{groups:s=[]}=r.req;if(o.includesArray(e,s))return r.next();r.error(new t.UnauthorizedError("Access Denied"))}))(r,s,i)},exports.HasPermissions=(...e)=>(r,s,i)=>{t.Use(r=>y(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=P,exports.Log=Log,exports.Loggable=Loggable,exports.ReqAuth=O,exports.ReqGroup=T,exports.ReqGroups=I,exports.ReqPermission=w,exports.ReqPermissions=U,exports.ReqUser=b,exports.SessionStore=SessionStore,exports.canFactory=A,exports.sequelize=x;
|