@andrewcaires/api 4.5.1 → 5.0.0

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.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/api v4.5.1
2
+ * @andrewcaires/api v5.0.0
3
3
  * Simple api for small applications using express, jsonwebtoken, sequelize and websocket
4
4
  * (c) 2026 Andrew Caires
5
5
  * @license: MIT
6
6
  */
7
- import{EventEmitter as e,isObject as t,noop as i,uuidv7 as r,loop as n,forEachSeries as o,isFunction as s,sleep as d,upperCamelCase as a,Validation as u,isArray as l,isString as p,isUndefined as c,clamp as g,isNumber as y,denied as v,isDef as h,uniqueID as E}from"@andrewcaires/utils.js";import{parameterFactory as A,Application as _,Ctx as m,Headers as O,Query as S,App as f,Context as I,Argument as P,Session as R,Upload as T,Extends as D,Status as N,Post as C,Middleware as b,Get as w,Delete as B,Put as x,Controller as F,Body as k,Params as U,Files as j}from"@andrewcaires/express";import{Env as L,LogColor as K,Log as M,Hash as H,sha256 as q}from"@andrewcaires/node";import{config as Y}from"dotenv";import{Sequelize as V,Column as $,BelongsTo as G,Database as W,ModelName as z,Version as J,Model as Z,HasMany as X,Hooks as Q,DefaultScope as ee,Scopes as te,Unique as ie,Op as re,Where as ne}from"@andrewcaires/sequelize";import oe from"jsonwebtoken";import{readFileSync as se,existsSync as de,statSync as ae,readdirSync as ue,mkdirSync as le,lstatSync as pe,rmSync as ce}from"fs";import{WebSocketServer as ge}from"ws";import{Store as ye}from"express-session";import{join as ve}from"path";class Controller extends e{}function he(e,t,i,r){var n,o=arguments.length,s=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,r);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(s=(o<3?n(s):o>3?n(t,i,s):n(t,i))||s);return o>3&&s&&Object.defineProperty(t,i,s),s}function Ee(e,t){return function(i,r){t(i,r,e)}}function Ae(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function _e(e,t,i,r){return new(i||(i=Promise))(function(n,o){function s(e){try{a(r.next(e))}catch(e){o(e)}}function d(e){try{a(r.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(s,d)}a((r=r.apply(e,t||[])).next())})}Controller.ATTRIBUTES=Symbol("ATTRIBUTES"),Controller.PERMISSIONS=Symbol("PERMISSIONS"),"function"==typeof SuppressedError&&SuppressedError,Y({quiet:!0});class Env extends L{}Env.API_BASE_NAME=Env.getString("API_BASE_NAME",""),Env.API_BODYPARSER_STRICT=Env.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=Env.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=Env.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=Env.getString("API_BODYPARSER_TYPE","json"),Env.API_CONSOLE_ERROR=Env.getBool("API_CONSOLE_ERROR",!1),Env.API_DATABASE_URL=Env.getString("API_DATABASE_URL",""),Env.API_DATABASE_LOG=Env.getBool("API_DATABASE_LOG",!1),Env.API_DATABASE_AUDIT=Env.getBool("API_DATABASE_AUDIT",!0),Env.API_DATABASE_PREFIX=Env.getString("API_DATABASE_PREFIX",""),Env.API_DATABASE_TIMEZONE=Env.getString("API_DATABASE_TIMEZONE","+00:00"),Env.API_HTTP_CRT=Env.getString("API_HTTP_CRT",""),Env.API_HTTP_KEY=Env.getString("API_HTTP_KEY",""),Env.API_HTTP_PORT=Env.getInt("API_HTTP_PORT",3e3),Env.API_HTTP_PUBLIC=Env.getString("API_HTTP_PUBLIC",""),Env.API_HTTP_CROSS=Env.getBool("API_HTTP_CROSS",!1),Env.API_HTTP_HYBRID=Env.getBool("API_HTTP_HYBRID",!1),Env.API_HTTP_NOTFOUND=Env.getString("API_HTTP_NOTFOUND",""),Env.API_HTTP_PATH=Env.getString("API_HTTP_PATH","/api"),Env.API_HTTP_REDIRECT=Env.getString("API_HTTP_REDIRECT",""),Env.API_KEY_HASH=Env.getString("API_KEY_HASH",""),Env.API_KEY_HEADER=Env.getString("API_KEY_HEADER","x-api-key"),Env.API_MODEL_LIMIT=Env.getInt("API_MODEL_LIMIT",10),Env.API_MODEL_LIMIT_MAX=Env.getInt("API_MODEL_LIMIT_MAX",500),Env.API_SLEEP_AUTH=Env.getMs("API_SLEEP_AUTH","2s"),Env.API_SLEEP_FORGOT=Env.getMs("API_SLEEP_FORGOT","5s"),Env.API_SLEEP_REGISTRY=Env.getMs("API_SLEEP_REGISTRY","5s"),Env.API_SESSION_NAME=Env.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=Env.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=Env.getString("API_SESSION_SECRET","yoursecret"),Env.API_TOKEN_CRT=Env.getString("API_TOKEN_CRT",""),Env.API_TOKEN_KEY=Env.getString("API_TOKEN_KEY",""),Env.API_TOKEN_FORGOT=Env.getMs("API_TOKEN_LIFETIME","1d"),Env.API_TOKEN_HEADER=Env.getString("API_TOKEN_HEADER","authorization"),Env.API_TOKEN_HEADER_KEY=Env.getString("API_TOKEN_HEADER","bearer"),Env.API_TOKEN_LIFETIME=Env.getMs("API_TOKEN_LIFETIME","1d"),Env.API_TOKEN_RENEW=Env.getMs("API_TOKEN_RENEW","1d"),Env.API_UPLOAD_COUNT=Env.getInt("API_UPLOAD_COUNT",1),Env.API_UPLOAD_FIELD=Env.getString("API_UPLOAD_FIELD","upload"),Env.API_UPLOAD_SIZE=Env.getInt("API_UPLOAD_SIZE",2),Env.API_UPLOAD_TEMP=Env.getString("API_UPLOAD_TEMP","./temp"),Env.API_USER_HISTORY=Env.getBool("API_USER_HISTORY",!0),Env.API_WEBSOCKET_START=Env.getBool("API_WEBSOCKET_START",!1);const me=e=>{var t,i,r,n,o,s,d,a,u;return{audit_client:null!==(t=e.getIp())&&void 0!==t?t:"0.0.0.0",audit_href:(null===(i=null==e?void 0:e.req)||void 0===i?void 0:i.protocol)+"://"+(null===(r=null==e?void 0:e.req)||void 0===r?void 0:r.get("host"))+(null===(n=null==e?void 0:e.req)||void 0===n?void 0:n.originalUrl),audit_user_agent:null!==(s=null===(o=e.req)||void 0===o?void 0:o.headers["user-agent"])&&void 0!==s?s:"",audit_user_id:null!==(u=null===(a=null===(d=null==e?void 0:e.req)||void 0===d?void 0:d.user)||void 0===a?void 0:a.id)&&void 0!==u?u:null}},Oe=A(({ctx:e})=>me(e)),Se=A(({ctx:e})=>e.req.auth),fe=A(({ctx:e})=>e.req.user),Ie=new V(Env.API_DATABASE_URL,{logging:Env.API_DATABASE_LOG,prefix:Env.API_DATABASE_PREFIX,timezone:Env.API_DATABASE_TIMEZONE}),Pe=(e,t,i)=>{var r,n,o,s,d;return{type:e,model:null!==(r=null==t?void 0:t.getTableName())&&void 0!==r?r:null,client:null!==(n=null==i?void 0:i.audit_client)&&void 0!==n?n:null,href:null!==(o=null==i?void 0:i.audit_href)&&void 0!==o?o:null,user_agent:null!==(s=null==i?void 0:i.audit_user_agent)&&void 0!==s?s:null,user_id:null!==(d=null==i?void 0:i.audit_user_id)&&void 0!==d?d:null,state:!0}},Re={afterCreate:(e,r)=>_e(void 0,void 0,void 0,function*(){var n;if(!Env.API_DATABASE_AUDIT)return;const o=t(e)?e.constructor:null,s=null!==(n=null==o?void 0:o.primaryKeyAttribute)&&void 0!==n?n:null;yield Be.create(Object.assign(Object.assign({},Pe("CREATE",o,r)),{record:s?e.getDataValue(s):null,data:e.toJSON()})).catch(i)}),afterUpdate:(e,r)=>_e(void 0,void 0,void 0,function*(){var n;if(!Env.API_DATABASE_AUDIT)return;const o=t(e)?e.constructor:null,s=null!==(n=null==o?void 0:o.primaryKeyAttribute)&&void 0!==n?n:null,d={},a=e.changed();a&&a.forEach(t=>d[t]=e.getDataValue(t)),yield Be.create(Object.assign(Object.assign({},Pe("UPDATE",o,r)),{record:s?e.getDataValue(s):null,data:d,previously:e.previous()})).catch(i)}),afterDestroy:(e,r)=>_e(void 0,void 0,void 0,function*(){var n;if(!Env.API_DATABASE_AUDIT)return;const o=t(e)?e.constructor:null,s=null!==(n=null==o?void 0:o.primaryKeyAttribute)&&void 0!==n?n:null;yield Be.create(Object.assign(Object.assign({},Pe("DELETE",o,r)),{record:s?e.getDataValue(s):null,data:e.toJSON()})).catch(i)})};let Te=class Auth extends Z{};he([$.Id(),Ae("design:type",Number)],Te.prototype,"id",void 0),he([$.String(),Ae("design:type",String)],Te.prototype,"secret",void 0),he([$.FullDate(),Ae("design:type",Object)],Te.prototype,"logout",void 0),he([$.String(),Ae("design:type",String)],Te.prototype,"user_agent",void 0),he([$.CreatedAt,Ae("design:type",Date)],Te.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],Te.prototype,"updated_at",void 0),he([$.DeletedAt,Ae("design:type",Object)],Te.prototype,"deleted_at",void 0),he([G(()=>we),Ae("design:type",Number)],Te.prototype,"user_id",void 0),Te=he([W(Ie),z("auth"),J("4.2.0")],Te);let De=class Register extends Z{};he([$.Id(),Ae("design:type",Number)],De.prototype,"id",void 0),he([$.String(),Ae("design:type",String)],De.prototype,"token",void 0),he([$.Boolean(),Ae("design:type",Boolean)],De.prototype,"state",void 0),he([$.CreatedAt,Ae("design:type",Date)],De.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],De.prototype,"updated_at",void 0),he([$.DeletedAt,Ae("design:type",Object)],De.prototype,"deleted_at",void 0),he([G(()=>we),Ae("design:type",Number)],De.prototype,"user_id",void 0),De=he([W(Ie),z("register"),J("4.2.0")],De);let Ne=class Group extends Z{};he([$.Id(),Ae("design:type",Number)],Ne.prototype,"id",void 0),he([$.String(),Ae("design:type",String)],Ne.prototype,"name",void 0),he([$.Text(),Ae("design:type",String)],Ne.prototype,"description",void 0),he([$.Boolean(),Ae("design:type",Boolean)],Ne.prototype,"state",void 0),he([$.CreatedAt,Ae("design:type",Date)],Ne.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],Ne.prototype,"updated_at",void 0),he([$.DeletedAt,Ae("design:type",Object)],Ne.prototype,"deleted_at",void 0),he([X(()=>Ce,"group_id"),Ae("design:type",Array)],Ne.prototype,"groups_routes",void 0),he([X(()=>Ce,"group_id"),Ae("design:type",Array)],Ne.prototype,"users_groups",void 0),Ne=he([W(Ie),z("group"),Q(Re),J("4.2.0")],Ne);let Ce=class UserGroup extends Z{};he([$.CreatedAt,Ae("design:type",Date)],Ce.prototype,"created_at",void 0),he([G(()=>Ne),Ae("design:type",Number)],Ce.prototype,"group_id",void 0),he([G(()=>we),Ae("design:type",Number)],Ce.prototype,"user_id",void 0),Ce=he([W(Ie),z("users_groups"),Q(Re),J("4.2.0")],Ce);let be=class UserHistory extends Z{};he([$.String(),Ae("design:type",String)],be.prototype,"password",void 0),he([$.CreatedAt,Ae("design:type",Date)],be.prototype,"created_at",void 0),he([G(()=>we),Ae("design:type",Number)],be.prototype,"user_id",void 0),be=he([W(Ie),z("users_histories"),J("4.2.0")],be);let we=class User extends Z{};he([$.Id(),Ae("design:type",Number)],we.prototype,"id",void 0),he([$.String(),Ae("design:type",String)],we.prototype,"name",void 0),he([$.String(),Ae("design:type",String)],we.prototype,"email",void 0),he([$.String(),Ae("design:type",String)],we.prototype,"username",void 0),he([$.String(),Ae("design:type",String)],we.prototype,"password",void 0),he([$.String(),Ae("design:type",String)],we.prototype,"salt",void 0),he([$.String(),Ae("design:type",String)],we.prototype,"token",void 0),he([$.String(),Ae("design:type",String)],we.prototype,"avatar",void 0),he([$.DateOnly(),Ae("design:type",String)],we.prototype,"date",void 0),he([$.Text(),Ae("design:type",String)],we.prototype,"description",void 0),he([$.Boolean(),Ae("design:type",Boolean)],we.prototype,"state",void 0),he([$.CreatedAt,Ae("design:type",Date)],we.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],we.prototype,"updated_at",void 0),he([$.DeletedAt,Ae("design:type",Object)],we.prototype,"deleted_at",void 0),he([X(()=>Be,"user_id"),Ae("design:type",Array)],we.prototype,"audits",void 0),he([X(()=>Te,"user_id"),Ae("design:type",Array)],we.prototype,"auths",void 0),he([X(()=>De,"user_id"),Ae("design:type",Array)],we.prototype,"registers",void 0),he([X(()=>Ce,"user_id"),Ae("design:type",Array)],we.prototype,"users_groups",void 0),he([X(()=>be,"user_id"),Ae("design:type",Array)],we.prototype,"users_histories",void 0),we=he([W(Ie),z("user"),ee({attributes:{exclude:["password","salt","token"]}}),te({password:{attributes:{exclude:["token"]}},token:{attributes:{exclude:["password","salt"]}}}),Q(Re),J("4.2.0")],we);let Be=class Audit extends Z{};he([$.Id(),Ae("design:type",Number)],Be.prototype,"id",void 0),he([$.Enum("CREATE","DELETE","UPDATE"),Ae("design:type",String)],Be.prototype,"type",void 0),he([$.String(),Ae("design:type",String)],Be.prototype,"model",void 0),he([$.String(),Ae("design:type",String)],Be.prototype,"record",void 0),he([$.Json(),Ae("design:type",Object)],Be.prototype,"data",void 0),he([$.Json(),Ae("design:type",Object)],Be.prototype,"previously",void 0),he([$.String(),Ae("design:type",String)],Be.prototype,"client",void 0),he([$.Text(),Ae("design:type",String)],Be.prototype,"href",void 0),he([$.String(),Ae("design:type",String)],Be.prototype,"user_agent",void 0),he([$.Boolean(),Ae("design:type",Boolean)],Be.prototype,"state",void 0),he([$.CreatedAt,Ae("design:type",Date)],Be.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],Be.prototype,"updated_at",void 0),he([$.DeletedAt,Ae("design:type",Object)],Be.prototype,"deleted_at",void 0),he([G(()=>we),Ae("design:type",Number)],Be.prototype,"user_id",void 0),Be=he([W(Ie),z("audit"),J("4.2.0")],Be);let xe=class Config extends Z{static all(){return _e(this,void 0,void 0,function*(){const e=yield this.findAll().catch(this.error),t={};return e&&e.forEach(e=>t[e.key]=e.value),t})}static del(e,t){return _e(this,void 0,void 0,function*(){var i;const r=null!==(i=null==t?void 0:t.id)&&void 0!==i?i:null;return((yield this.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:r})).catch(this.error))||0)>0})}static get(e){return _e(this,arguments,void 0,function*(e,t=""){const[i]=(yield this.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return i?i.value:t})}static set(e,t,i){return _e(this,void 0,void 0,function*(){var r;const n=null!==(r=null==i?void 0:i.id)&&void 0!==r?r:null,[o]=(yield this.findOrCreate(Object.assign({where:{key:e}},{user_id:n})).catch(this.error))||[];o&&(o.value=t,yield o.save().catch(this.error))})}};he([$.String(),Ae("design:type",String)],xe.prototype,"key",void 0),he([$.String(),Ae("design:type",String)],xe.prototype,"value",void 0),he([$.CreatedAt,Ae("design:type",Date)],xe.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],xe.prototype,"updated_at",void 0),xe=he([W(Ie),z("configs"),J("4.2.0")],xe);let Fe=class Forgot extends Z{};he([$.Id(),Ae("design:type",Number)],Fe.prototype,"id",void 0),he([$.String(),Ae("design:type",String)],Fe.prototype,"token",void 0),he([$.BigInt(),Ae("design:type",Number)],Fe.prototype,"timestamp",void 0),he([$.Boolean(),Ae("design:type",Boolean)],Fe.prototype,"state",void 0),he([$.CreatedAt,Ae("design:type",Date)],Fe.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],Fe.prototype,"updated_at",void 0),he([$.DeletedAt,Ae("design:type",Object)],Fe.prototype,"deleted_at",void 0),he([G(()=>we),Ae("design:type",Number)],Fe.prototype,"user_id",void 0),Fe=he([W(Ie),z("forgot"),J("4.2.0")],Fe);let ke=class Permission extends Z{};he([$.Id(),Ae("design:type",Number)],ke.prototype,"id",void 0),he([$.String(),Ae("design:type",String)],ke.prototype,"name",void 0),he([$.String(),ie(!0),Ae("design:type",String)],ke.prototype,"route",void 0),he([$.String(),Ae("design:type",String)],ke.prototype,"tag",void 0),he([$.Text(),Ae("design:type",String)],ke.prototype,"description",void 0),he([$.Boolean(),Ae("design:type",Boolean)],ke.prototype,"state",void 0),he([$.CreatedAt,Ae("design:type",Date)],ke.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],ke.prototype,"updated_at",void 0),he([$.DeletedAt,Ae("design:type",Object)],ke.prototype,"deleted_at",void 0),he([X(()=>Ue,"permission_id"),Ae("design:type",Array)],ke.prototype,"groups_permissions",void 0),ke=he([W(Ie),z("permission"),Q(Re),J("4.3.1")],ke);let Ue=class GroupPermission extends Z{};he([$.CreatedAt,Ae("design:type",Date)],Ue.prototype,"created_at",void 0),he([G(()=>Ne),Ae("design:type",Number)],Ue.prototype,"group_id",void 0),he([G(()=>ke),Ae("design:type",Number)],Ue.prototype,"permission_id",void 0),Ue=he([W(Ie),z("groups_permissions"),Q(Re),J("4.2.0")],Ue);let je=class Log extends Z{static write(e,t,i){return _e(this,void 0,void 0,function*(){yield this.writeRaw(K.White,"",e,t,i)})}static error(e,t,i){return _e(this,void 0,void 0,function*(){yield this.writeRaw(K.Red,"error",e,t,i)})}static info(e,t,i){return _e(this,void 0,void 0,function*(){yield this.writeRaw(K.Cyan,"info",e,t,i)})}static success(e,t,i){return _e(this,void 0,void 0,function*(){yield this.writeRaw(K.Green,"success",e,t,i)})}static warning(e,t,i){return _e(this,void 0,void 0,function*(){yield this.writeRaw(K.Yellow,"warning",e,t,i)})}static writeRaw(e,t,i,r,n){return _e(this,void 0,void 0,function*(){n&&M.console(e,t,i),Ie&&(yield this.create({type:t,source:r,message:i}).catch(this.error))})}};he([$.Id(),Ae("design:type",Number)],je.prototype,"id",void 0),he([$.String(),Ae("design:type",String)],je.prototype,"type",void 0),he([$.String(),Ae("design:type",String)],je.prototype,"source",void 0),he([$.Text(),Ae("design:type",String)],je.prototype,"message",void 0),he([$.CreatedAt,Ae("design:type",Date)],je.prototype,"created_at",void 0),je=he([W(Ie),z("log"),J("4.2.0")],je);let Le=class Migration extends Z{};he([$.String(),Ae("design:type",String)],Le.prototype,"model",void 0),he([$.String(),Ae("design:type",String)],Le.prototype,"version",void 0),he([$.CreatedAt,Ae("design:type",Date)],Le.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],Le.prototype,"updated_at",void 0),Le=he([W(Ie),z("migration"),J("4.2.0")],Le);let Ke=class Session extends Z{};he([$.String(),Ae("design:type",String)],Ke.prototype,"session",void 0),he([$.Text(),Ae("design:type",String)],Ke.prototype,"json",void 0),he([$.BigInt(),Ae("design:type",Number)],Ke.prototype,"expired",void 0),he([$.CreatedAt,Ae("design:type",Date)],Ke.prototype,"created_at",void 0),he([$.UpdatedAt,Ae("design:type",Date)],Ke.prototype,"updated_at",void 0),Ke=he([W(Ie),z("session"),J("4.2.0")],Ke);class AuthBase{static error(e){let t="token";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),je.error(e.message,t,Env.API_CONSOLE_ERROR)}}class AuthKey extends AuthBase{static user(e,t){return _e(this,void 0,void 0,function*(){if(!e)return{error:"INVALID TOKEN"};const i=t.hash.encrypt(e),r=yield we.findOne({where:{token:i,state:!0}}).catch(this.error);if(r){const t=e.replace(/(-[\w]{4})/g,"-****"),[i]=(yield Te.findOrCreate({where:{secret:t,user_id:r.id},defaults:{secret:t,user_id:r.id}}).catch(this.error))||[];if(i)return i.logout&&(i.logout=null,yield i.save().catch(this.error)),{auth:i,user:r}}return{error:"ACCESS DENIED"}})}}const Me=e=>de(e)?se(e):void 0,He={http:Me(Env.API_HTTP_CRT),token:Me(Env.API_TOKEN_CRT)},qe={http:Me(Env.API_HTTP_KEY),token:Me(Env.API_TOKEN_KEY)};class AuthToken extends AuthBase{static options(){return{algorithm:"RS256",expiresIn:`${Env.API_TOKEN_LIFETIME}ms`}}static create(e){return _e(this,void 0,void 0,function*(){if(!qe.token)return{error:"KEY NOT FOUND"};const{id:t}=e,i=r(),n=yield Te.create({secret:i,user_id:t}).catch(this.error);if(!n)return{error:"INTERNAL SERVER ERROR"};return{auth:n,token:oe.sign({id:t,secret:i},qe.token,this.options())}})}static destroy(e){return _e(this,void 0,void 0,function*(){return!(!e||e.logout)&&(e.logout=new Date,yield e.save(),!0)})}static renew(e){return _e(this,void 0,void 0,function*(){if(!qe.token)return{error:"KEY NOT FOUND"};const{error:t,decode:i}=this.verify(e,Env.API_TOKEN_RENEW/1e3);if(t)return{error:t};if(i){const{id:e,secret:t}=i;if(e&&t){const i=yield we.findOne({where:{id:e,state:!0}}).catch(this.error);if(i){const n=yield Te.findOne({where:{secret:t,user_id:i.id}}).catch(this.error);if(n&&!n.logout){n.secret=r(),yield n.save().catch(this.error);return{auth:n,token:oe.sign({id:e,secret:n.secret},qe.token,this.options())}}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}})}static user(e){return _e(this,void 0,void 0,function*(){const{error:t,decode:i}=this.verify(e);if(t)return{error:t};if(i){const{id:e,secret:t}=i;if(e&&t){const i=yield we.findOne({where:{id:e,state:!0}}).catch(this.error);if(i){const e=yield Te.findOne({where:{secret:t,user_id:i.id}}).catch(this.error);if(e&&!e.logout)return{auth:e,user:i}}return{error:"ACCESS DENIED"}}}return{error:"INVALID TOKEN"}})}static verify(e,t){if(!He.token)return{error:"CERT NOT FOUND"};if(!e||e.split(".").length<3)return{error:"INVALID TOKEN"};try{return{decode:oe.verify(e,He.token,{clockTolerance:t})}}catch(e){return{error:"INVALID TOKEN"}}}}class Store extends ye{constructor(){super(),this.all=e=>_e(this,void 0,void 0,function*(){e=e||i;const t=yield Ke.findAll({attributes:["session"],where:{expired:{[re.gte]:Date.now()}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.session)),e()}),this.clear=e=>_e(this,void 0,void 0,function*(){yield Ke.destroy().catch(i),e&&e()}),this.destroy=(e,t)=>_e(this,void 0,void 0,function*(){yield Ke.destroy({where:{session:e}}).catch(i),t&&t()}),this.expired=()=>_e(this,void 0,void 0,function*(){yield Ke.destroy({where:{expired:{[re.lt]:Date.now()}}}).catch(i)}),this.get=(e,t)=>_e(this,void 0,void 0,function*(){t=t||i;const r=yield Ke.findOne({where:{session:e,expired:{[re.gte]:Date.now()}}}).catch(e=>(t(e),null));if(r){const e=JSON.parse(r.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield r.destroy().catch(i),void t(null)}return void t(null,e)}t(null)}),this.length=e=>_e(this,void 0,void 0,function*(){e&&e(null,(yield Ke.count().catch(i))||0)}),this.set=(e,t,r)=>_e(this,void 0,void 0,function*(){r=r||i;const n=Date.now()+Env.API_SESSION_LIFETIME,o=JSON.stringify(t),[s,d]=(yield Ke.findOrCreate({where:{session:e},defaults:{session:e,json:o,expired:n}}).catch(i))||[];s&&(d||(s.json=o,s.expired=n,yield s.save().catch(i))),r()}),this.loop=n(this.expired,3e4),this.loop.start()}}class Application extends _{constructor(e){super(e,{cert:He.http,cross:Env.API_HTTP_CROSS,hybrid:Env.API_HTTP_HYBRID,json:{strict:Env.API_BODYPARSER_STRICT,inflate:Env.API_BODYPARSER_INFLATE,limit:Env.API_BODYPARSER_LIMIT,type:Env.API_BODYPARSER_TYPE},key:qe.http,notfound:Env.API_HTTP_NOTFOUND,path:Env.API_HTTP_PATH,port:Env.API_HTTP_PORT,public:Env.API_HTTP_PUBLIC,redirect:Env.API_HTTP_REDIRECT,session:{store:new Store,name:Env.API_SESSION_NAME,secret:Env.API_SESSION_SECRET,cookie:{maxAge:Env.API_SESSION_LIFETIME},genid:r}}),this.hash=new H(Env.API_KEY_HASH)}error(e,t){Env.API_BASE_NAME&&(t=t?`${Env.API_BASE_NAME}.${t}`:Env.API_BASE_NAME),je.error(e.message,t,Env.API_CONSOLE_ERROR)}log(e,t){Env.API_BASE_NAME&&(t=t?`${Env.API_BASE_NAME}.${t}`:Env.API_BASE_NAME),je.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return _e(this,void 0,void 0,function*(){yield Ie.sync(),yield this.migrations(Ie),yield o(this.controllers,e=>_e(this,void 0,void 0,function*(){s(e.sync)&&(yield e.sync(this))})),yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new ge({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>_e(this,void 0,void 0,function*(){t.url||(t.url="");const i=t.url.length<=1?"":t.url.replace(/\//g,".");let r;e.on("message",n=>_e(this,void 0,void 0,function*(){if(r)try{const o=JSON.parse(n);this.emit("ws.message"+i,{data:o,message:n,req:t,user:r,ws:e})}catch(o){this.emit("ws.message"+i,{erro:o,message:n,req:t,user:r,ws:e})}else{const{user:o}=yield AuthToken.user(n.toString());o&&(r=o,this.emit("ws.connection"+i,{req:t,user:r,ws:e}))}r||e.close()})),e.on("close",()=>{r&&this.emit("ws.close"+i,{user:r,ws:e})}),yield d(2e3),r||e.close()})))})}migrations(e){return _e(this,void 0,void 0,function*(){const t=[];yield o(Object.keys(e.models),i=>_e(this,void 0,void 0,function*(){var r;const n=e.models[i],o=n.version();if(!o)return;const[s,d]=null!==(r=yield Le.findOrCreate({where:{model:n.tableName},defaults:{model:n.tableName,version:""}}).catch(this.error))&&void 0!==r?r:[];s&&(d||s.version!=o)&&(s.version=o,yield s.save().catch(this.error),t.push(n))})),yield o(t,e=>_e(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}var Ye,Ve,$e;class ControllerBase extends Controller{constructor(){super(...arguments),this[Ye]=[]}auth(e,t,i,r,n,o){return _e(this,void 0,void 0,function*(){var s;t=null!=t?t:r;const[d,a]=null!==(s=null==i?void 0:i.split(" "))&&void 0!==s?s:["",""];if(!(t||a&&d.toLowerCase()==Env.API_TOKEN_HEADER_KEY))return e.error("INVALID TOKEN");const{auth:u,error:l,user:p}=yield t?AuthKey.user(t,o):AuthToken.user(a);return l?e.error(l):u&&p?!t&&u.user_agent&&u.user_agent!=n?e.error("INVALID TOKEN"):(e.req.auth=u,e.req.user=p,void e.next()):e.error("INTERNAL SERVER ERROR")})}canCreate(e,t,i){return _e(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".create",i)})}canDelete(e,t,i){return _e(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".delete",i)})}canRead(e,t,i){return _e(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".read",i)})}canUpdate(e,t,i){return _e(this,void 0,void 0,function*(){yield this.permission(e,(t||this.name())+".update",i)})}error(e){let t="controller_base";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),je.error(e.message,t,Env.API_CONSOLE_ERROR)}name(){var e,t;return(null!==(t=null===(e=this.constructor)||void 0===e?void 0:e.name)&&void 0!==t?t:"api").replace(/(([a-z])([A-Z]))/g,"$2_$3")}permission(e,t,i){return _e(this,void 0,void 0,function*(){if(i){if((yield this.permissions(i,{route:t})).length>0)return e.next()}e.unauthorized("ACCESS DENIED")})}permissions(e,t){return _e(this,void 0,void 0,function*(){var i;return null!==(i=yield ke.findAll({where:Object.assign(Object.assign({},null!=t?t:{}),{state:!0}),include:[{model:Ue,required:!0,include:[{model:Ne,required:!0,where:{state:!0},include:[{model:Ce,required:!0,where:{user_id:e.id}}]}]}]}).catch(this.error))&&void 0!==i?i:[]})}session(e,t,r){return _e(this,void 0,void 0,function*(){r.auth&&r.user&&(r.user_agent?r.user_agent!=t&&r.regenerate(i):(r.user_agent=t,r.save(i))),e.next()})}sync(){return _e(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield o(this[Controller.PERMISSIONS],i=>_e(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=a(e.replace(/_/g," ")," ");yield ke.findOrCreate({where:{route:r},defaults:Object.assign({name:`${n} ${a(i," ")}`,route:r,tag:n},t)})}))})}upload(e,t){t.path||(t.path=Env.API_UPLOAD_TEMP),t.size||(t.size=Env.API_UPLOAD_SIZE),t.field||(t.field=Env.API_UPLOAD_FIELD),T.middleware(e,t)}validation(e,t){return _e(this,void 0,void 0,function*(){const{error:i,value:r}=yield u.object(t).parse().validateAsync(e.req.body);if(i)return e.validation(i);e.req.body=r,e.next()})}}Ye=Controller.PERMISSIONS,he([Ee(0,m()),Ee(1,O(Env.API_KEY_HEADER)),Ee(2,O(Env.API_TOKEN_HEADER)),Ee(3,S(Env.API_KEY_HEADER)),Ee(4,O("user-agent")),Ee(5,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String,String,String,Application]),Ae("design:returntype",Promise)],ControllerBase.prototype,"auth",null),he([Ee(0,m()),Ee(1,P()),Ee(2,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,we]),Ae("design:returntype",Promise)],ControllerBase.prototype,"canCreate",null),he([Ee(0,m()),Ee(1,P()),Ee(2,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,we]),Ae("design:returntype",Promise)],ControllerBase.prototype,"canDelete",null),he([Ee(0,m()),Ee(1,P()),Ee(2,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,we]),Ae("design:returntype",Promise)],ControllerBase.prototype,"canRead",null),he([Ee(0,m()),Ee(1,P()),Ee(2,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,we]),Ae("design:returntype",Promise)],ControllerBase.prototype,"canUpdate",null),he([Ee(0,m()),Ee(1,P()),Ee(2,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,we]),Ae("design:returntype",Promise)],ControllerBase.prototype,"permission",null),he([Ee(0,m()),Ee(1,O("user-agent")),Ee(2,R()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Object]),Ae("design:returntype",Promise)],ControllerBase.prototype,"session",null),he([Ee(0,m()),Ee(1,P()),Ae("design:type",Function),Ae("design:paramtypes",[I,Object]),Ae("design:returntype",void 0)],ControllerBase.prototype,"upload",null),he([Ee(0,m()),Ee(1,P()),Ae("design:type",Function),Ae("design:paramtypes",[I,Object]),Ae("design:returntype",Promise)],ControllerBase.prototype,"validation",null);let Ge=class ControllerModel extends ControllerBase{constructor(){super(...arguments),this[Ve]=[],this[$e]=["create","read","update","delete"]}attributes(e){if(0==this[ControllerBase.ATTRIBUTES].length&&(this[ControllerBase.ATTRIBUTES]=Object.keys(this.model().getAttributes())),l(e))return e.length?e.map(e=>p(e)&&-1!=this[ControllerBase.ATTRIBUTES].indexOf(e)?e:void 0).filter(p):this[ControllerBase.ATTRIBUTES];const{exclude:t,include:i}=e,r=c(i)?this[ControllerBase.ATTRIBUTES]:i.map(e=>p(e)&&-1!=this[ControllerBase.ATTRIBUTES].indexOf(e)?e:void 0).filter(p),n=null!=t?t:[];return n.length?r.filter(e=>-1==n.indexOf(e)?e:void 0).filter(p):r}create(e){return _e(this,arguments,void 0,function*({ctx:e,options:t,body:i}){const r=yield this.model().create(Object.assign(Object.assign({},e.req.body),i||{}),Object.assign(Object.assign({},t||{}),me(e))).catch(this.error);if(r){const t=this.key();return e.prepare(N.OK,{[t]:r.getDataValue(t)}),r}e.error("INTERNAL SERVER ERROR")})}delete(e){return _e(this,arguments,void 0,function*({ctx:e,options:t}){const i=this.key(),{[i]:r}=e.req.params;if(!r)return e.error("INTERNAL SERVER ERROR"),0;const n=yield this.model().destroy(Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[i]:r}),individualHooks:!0}),me(e))).catch(this.error);return n?(e.success("OK"),n):(e.notFound("RECORD NOT FOUND"),0)})}error(e){let t="controller_model";Env.API_BASE_NAME&&(t=`${Env.API_BASE_NAME}.${t}`),(null==e?void 0:e.sql)?je.error((null==e?void 0:e.message)+"\n"+(null==e?void 0:e.sql),t,Env.API_CONSOLE_ERROR):super.error(e)}findAll(e){return _e(this,arguments,void 0,function*({ctx:e,options:t,callback:i,scope:r,advanced:n,attributes:o,limited:s}){var d,a,u;const l=this.scope(r),v=Object.assign({},t||{}),{fields:h,limit:E,offset:A,asc:_,desc:m,search:O,where:S}=e.req.query;if(c(v.limit)){let e=Env.API_MODEL_LIMIT;p(E)&&(e=parseInt(E)||0),e=g(e,-1,Env.API_MODEL_LIMIT_MAX),v.limit=e>0?e:s?Env.API_MODEL_LIMIT:void 0}if(y(v.limit)&&(v.limit=v.limit>0?v.limit:void 0),p(A)){const e=parseInt(A)||0;v.offset=e>0?e:void 0}o=null!=o?o:this.attributes(null!==(d=null==v?void 0:v.attributes)&&void 0!==d?d:[]);const f=e=>o.indexOf(e)>=0,I=[];p(h)&&I.push(...h.split(";").filter(f)),I.length&&(v.attributes=I);const P=[];if(p(_)&&_.length&&P.push(..._.split(";").filter(f).map(e=>[e,"ASC"])),p(m)&&m.length&&P.push(...m.split(";").filter(f).map(e=>[e,"DESC"])),P.length&&(v.order=P),v.where=Object.assign({},v.where||{}),p(S)&&(null==n||n)){const t=ne.parse(o,S);if(!c(t.error))return e.validation(t.error.join(", ")),{count:0,records:[]};v.where=Object.assign(Object.assign({},v.where),null!==(a=t.value)&&void 0!==a?a:{})}else{const e=[];o.forEach(t=>{p(O)&&O.length&&e.push({[t]:{[re.like]:`%${O}%`}})}),e.length&&(v.where=Object.assign(Object.assign({},v.where),{[re.or]:[...e]}))}const R=l.count(Object.assign(Object.assign({},v),{distinct:!!v.include,col:this[ControllerBase.ATTRIBUTES].length?this[ControllerBase.ATTRIBUTES][0]:void 0})).catch(this.error),T=l.findAll(v).catch(this.error);yield Promise.allSettled([R,T]);const D=null!==(u=yield R)&&void 0!==u?u:0;let C=yield T;const b={count:D};return C?(C=i?yield i(C):C,(y(null==t?void 0:t.limit)||0==D)&&(b.count=C.length),e.prepare(N.OK,Object.assign(Object.assign({},b),{records:C})),Object.assign(Object.assign({},b),{records:C})):(e.error("INTERNAL SERVER ERROR"),Object.assign(Object.assign({},b),{records:[]}))})}findOne(e){return _e(this,arguments,void 0,function*({ctx:e,options:t,callback:i,scope:r}){const n=this.key(),{[n]:o}=e.req.params,s=yield this.scope(r).findOne(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[n]:o})})).catch(this.error);return s?(e.prepare(N.OK,i?yield i(s):s.toJSON()),s):null===s?e.notFound("RECORD NOT FOUND"):void e.error("INTERNAL SERVER ERROR")})}sync(){return _e(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield o(this[ControllerBase.PERMISSIONS],i=>_e(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=a(e.replace(/_/g," ")," ");yield ke.findOrCreate({where:{route:r},defaults:Object.assign({name:`${n} ${a(i," ")}`,route:r,tag:n},t)})}))})}update(e){return _e(this,arguments,void 0,function*({ctx:e,options:t,body:i}){var r;const n=this.key(),{[n]:o}=e.req.params,[s]=null!==(r=yield this.model().update(Object.assign(Object.assign({},e.req.body),i||{}),Object.assign(Object.assign(Object.assign({},t||{}),{where:Object.assign(Object.assign({},(t||{}).where),{[n]:o}),individualHooks:!0}),me(e))).catch(this.error))&&void 0!==r?r:[];return s?(e.success("OK"),!0):(e.success("RECORD NOT CHANGED"),!1)})}key(){return this.model().primaryKeyAttribute}name(){return this.model().tableName}scope(e){return e?this.model().scope(e):this.model()}};Ve=ControllerBase.ATTRIBUTES,$e=ControllerBase.PERMISSIONS,Ge=he([D(ControllerBase)],Ge);let We=class ControllerCrud extends Ge{constructor(){super(...arguments),this._crud={}}CrudArgumentsCreate(e){return{ctx:e}}CrudArgumentsFindAll(e){return{ctx:e}}CrudArgumentsFindOne(e){return{ctx:e}}CrudArgumentsDelete(e){return{ctx:e}}CrudArgumentsUpdate(e){return{ctx:e}}CrudValidationCreate(){return this._crud}CrudValidationUpdate(){return this._crud}add(e){return _e(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return _e(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}del(e){return _e(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return _e(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return _e(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validationCreate(e){return _e(this,void 0,void 0,function*(){const t=this.CrudValidationCreate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)})}validationUpdate(e){return _e(this,void 0,void 0,function*(){const t=this.CrudValidationUpdate();if(t==this._crud)return e.error("INTERNAL SERVER ERROR");yield this.validation(e,t)})}};he([C(),b("auth"),b("canCreate"),b("validationCreate"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],We.prototype,"add",null),he([w(),b("auth"),b("canRead"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],We.prototype,"all",null),he([B("/:id"),b("auth"),b("canDelete"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],We.prototype,"del",null),he([w("/:id"),b("auth"),b("canRead"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],We.prototype,"get",null),he([x("/:id"),b("auth"),b("canUpdate"),b("validationUpdate"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],We.prototype,"set",null),he([Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],We.prototype,"validationCreate",null),he([Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],We.prototype,"validationUpdate",null),We=he([D(Ge)],We);let ze=class AuditsController extends Ge{model(){return Be}all(e,t,i){return _e(this,void 0,void 0,function*(){const r={};t&&(r.type=t),i&&(r.table=i),yield this.findAll({ctx:e,options:{attributes:{exclude:["data","previously"]},where:r,order:[["created_at","DESC"]]},limited:!0})})}get(e){return _e(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}};he([w(),b("auth"),b("canRead"),Ee(0,m()),Ee(1,S("type")),Ee(2,S("table")),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String]),Ae("design:returntype",Promise)],ze.prototype,"all",null),he([w("/:id"),b("auth"),b("canRead"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],ze.prototype,"get",null),ze=he([F("/audits"),D(Ge)],ze);let Je=class AuthController extends ControllerBase{login(e,t,i,r,n){return _e(this,void 0,void 0,function*(){var o;yield d(Env.API_SLEEP_AUTH);const s=yield we.scope("password").findOne({where:{[re.or]:[{email:i},{username:i}]}}).catch(this.error);if(r+=null!==(o=null==s?void 0:s.salt)&&void 0!==o?o:"",!s||s.password!=q(r))return e.notFound("INVALID USERNAME OR PASSWORD"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const a=yield De.findOne({where:{state:!0,user_id:s.id}}).catch(this.error);if(a)return e.error("ACTIVATION REQUIRED"),n.emit("auth.activation",{ctx:e,register:a,user:s}),void this.emit("auth.activation",{ctx:e,register:a,user:s});if(!s.state)return e.notFound("INVALID USERNAME OR PASSWORD"),n.emit("auth.failure",{ctx:e,user:s}),void this.emit("auth.failure",{ctx:e,user:s});const{auth:u,error:l,token:p}=yield AuthToken.create(s);return l?(e.error(l),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e})):u&&p?(u.user_agent=t,yield u.save().catch(this.error),e.json({token:p}),n.emit("auth.login",{auth:u,ctx:e,user:s}),void this.emit("auth.login",{auth:u,ctx:e,user:s})):(e.error("INTERNAL SERVER ERROR"),n.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e}))})}logout(e,t,i,r){return _e(this,void 0,void 0,function*(){if(yield AuthToken.destroy(t))return e.success("OK"),r.emit("auth.logout",{auth:t,ctx:e,user:i}),void this.emit("auth.logout",{auth:t,ctx:e,user:i});e.unauthorized("ACCESS DENIED")})}renew(e,t,i,r){return _e(this,void 0,void 0,function*(){const{auth:n,error:o,token:s}=yield AuthToken.renew(i);return o?e.error(o):n?(n.user_agent=t,yield n.save().catch(this.error),e.json({token:s}),r.emit("auth.renew",{auth:n,ctx:e}),void this.emit("auth.renew",{auth:n,ctx:e})):e.error("INTERNAL SERVER ERROR")})}user(e,t){return _e(this,void 0,void 0,function*(){const i=yield this.permissions(t);if(!i)return e.error("INTERNAL SERVER ERROR");e.json(Object.assign(Object.assign({},v(["username","date","description","state","created_at","updated_at","deleted_at"],t.toJSON())),{permissions:i.map(e=>e.route)}))})}};var Ze;he([C("/login"),b("validation",{username:u.string().min(3).required(),password:u.string().min(5).required()}),Ee(0,m()),Ee(1,O("user-agent")),Ee(2,k("username")),Ee(3,k("password")),Ee(4,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String,String,Application]),Ae("design:returntype",Promise)],Je.prototype,"login",null),he([w("/logout"),b("auth"),Ee(0,m()),Ee(1,Se()),Ee(2,fe()),Ee(3,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,Te,we,Application]),Ae("design:returntype",Promise)],Je.prototype,"logout",null),he([C("/renew"),b("validation",{token:u.string().required()}),Ee(0,m()),Ee(1,O("user-agent")),Ee(2,k("token")),Ee(3,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String,Application]),Ae("design:returntype",Promise)],Je.prototype,"renew",null),he([w(),b("auth"),Ee(0,m()),Ee(1,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,we]),Ae("design:returntype",Promise)],Je.prototype,"user",null),Je=he([F("/auth"),D(ControllerBase)],Je);let Xe=class FilesController extends ControllerBase{constructor(){super(...arguments),this[Ze]=["delete","download","edit","list","read","rename","upload","write"]}directory(){return Env.API_HTTP_PUBLIC||"./"}files(e){return _e(this,void 0,void 0,function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const i=ve(this.directory(),t);if(!de(i)||!ae(i).isDirectory())return e.notFound("RECORD NOT FOUND");let r=[];return r=ue(i),r=r.map(e=>this.info(ve(i,e))),r=r.filter(h),Object.assign(Object.assign({},this.info(i)),{files:r})})}access(e,t,i){return _e(this,void 0,void 0,function*(){yield this.permission(e,this.name()+"."+t,i)})}info(e){if(!de(e))return null;const t=ae(e),i=e.split("/").pop();e=e.replace(this.directory(),"/").replace(/^\/\//,"/");const r=t.isDirectory();return{name:i,path:e.replace(/^\/\//,"/"),size:t.size,extension:r?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:r,symlink:t.isSymbolicLink()}}name(){return"files"}sync(){return _e(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=a(e.replace(/_/g," ")," "),i={description:"",state:!0};yield o(this[ControllerBase.PERMISSIONS],r=>_e(this,void 0,void 0,function*(){const n=`${e}.${r}`;yield ke.findOrCreate({where:{route:n},defaults:Object.assign({name:`${t} ${a(r," ")}`,route:n,tag:t},i)})}))})}};Ze=ControllerBase.PERMISSIONS,he([w("/path"),w("/path/*path"),b("auth"),b("access","list"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],Xe.prototype,"files",null),he([Ee(0,m()),Ee(1,P()),Ee(2,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,we]),Ae("design:returntype",Promise)],Xe.prototype,"access",null),Xe=he([F("/files"),D(ControllerBase)],Xe);let Qe=class ForgotController extends ControllerBase{check(e,t){return _e(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i||!i.user)return e.notFound("RECORD NOT FOUND");i.token=E(),yield i.save(),e.json({token:i.token})})}forgot(e,t,i){return _e(this,void 0,void 0,function*(){yield d(Env.API_SLEEP_FORGOT);const r=t,n=yield we.findOne({where:{[re.or]:[{email:r},{username:t}]}}).catch(this.error);if(!n)return e.notFound("RECORD NOT FOUND");const o=E(),s=Date.now()+6e4*Env.API_TOKEN_FORGOT,a=yield Fe.create({token:o,timestamp:s,state:!0,user_id:n.id});e.success("OK"),i.emit("forgot.send",{ctx:e,forgot:a,user:n}),this.emit("forgot.send",{ctx:e,forgot:a,user:n})})}reset(e,t,i,r){return _e(this,void 0,void 0,function*(){const n=yield this.find(t);if(!n)return e.notFound("RECORD NOT FOUND");n.state=!1,yield n.save().catch(this.error),n.user.password=q(i),yield n.user.save().catch(this.error),e.success("OK"),r.emit("forgot.reset",{ctx:e,user:n.user}),this.emit("forgot.reset",{ctx:e,user:n.user})})}find(e){return _e(this,void 0,void 0,function*(){return yield Fe.findOne({where:{token:e,state:!0},include:[{model:we,required:!0}]}).catch(this.error)})}};he([w("/check"),b("validation",{token:u.string().required()}),Ee(0,m()),Ee(1,k("token")),Ae("design:type",Function),Ae("design:paramtypes",[I,String]),Ae("design:returntype",Promise)],Qe.prototype,"check",null),he([C(),b("validation",{username:u.string().min(4).required()}),Ee(0,m()),Ee(1,k("username")),Ee(2,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Application]),Ae("design:returntype",Promise)],Qe.prototype,"forgot",null),he([C("/reset"),b("validation",{token:u.string().required(),password:u.string().min(5).required()}),Ee(0,m()),Ee(1,k("token")),Ee(2,k("password")),Ee(3,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String,Application]),Ae("design:returntype",Promise)],Qe.prototype,"reset",null),Qe=he([F("/forgot"),D(ControllerBase)],Qe);let et=class GroupsController extends We{constructor(){super(...arguments),this.schemaCreate={name:u.string().required(),description:u.string().empty(""),state:u.boolean().parse().required()},this.schemaUpdate={name:u.string().empty(),description:u.string().empty(),state:u.boolean().parse().empty()}}model(){return Ne}CrudArgumentsFindAll(e){return{ctx:e}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}};et=he([F("/groups"),D(We)],et);let tt=class GroupsPermissionsController extends Ge{model(){return Ue}all(e,t){return _e(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{group_id:t},include:[{model:ke,required:!0}]},callback:e=>e.map(e=>e.permission)})})}me(e,t){return _e(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(e,t,i,r){return _e(this,void 0,void 0,function*(){const n=yield Ne.findByPk(t,{attributes:["id"]}).catch(this.error);if(!n)return e.notFound("RECORD NOT FOUND");const o=n.id;if(yield Ue.destroy(Object.assign({where:{group_id:o},individualHooks:!0},r)),i){let e=0;yield d(1e3);for(let t=0;t<i.length;t++)e=yield ke.count({where:{id:i[t]}}),e&&(yield Ue.create({group_id:o,permission_id:i[t]},Object.assign({},r)))}e.success("OK")})}};var it;he([w("/:id/permissions"),b("auth"),b("canRead","groups"),Ee(0,m()),Ee(1,U("id")),Ae("design:type",Function),Ae("design:paramtypes",[I,String]),Ae("design:returntype",Promise)],tt.prototype,"all",null),he([w("/permissions"),b("auth"),b("canRead","users"),Ee(0,m()),Ee(1,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,we]),Ae("design:returntype",Promise)],tt.prototype,"me",null),he([x("/:id/permissions"),b("auth"),b("canUpdate","groups"),b("validation",{permissions:u.array(u.number().parse())}),Ee(0,m()),Ee(1,U("id")),Ee(2,k("permissions")),Ee(3,Oe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Array,Object]),Ae("design:returntype",Promise)],tt.prototype,"set",null),tt=he([F("/groups"),D(Ge)],tt);let rt=class LogsController extends Ge{constructor(){super(...arguments),this[it]=["read"]}model(){return je}all(e,t,i){return _e(this,void 0,void 0,function*(){const r={};t&&(r.type=t),i&&(r.source=i),yield this.findAll({ctx:e,options:{where:r,order:[["created_at","DESC"]]},limited:!0})})}};it=Ge.PERMISSIONS,he([w(),b("auth"),b("canRead"),Ee(0,m()),Ee(1,S("type")),Ee(2,S("source")),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String]),Ae("design:returntype",Promise)],rt.prototype,"all",null),rt=he([F("/logs"),D(Ge)],rt);let nt=class PermissionsController extends We{constructor(){super(...arguments),this.schemaCreate={name:u.string().required(),route:u.string().required(),tag:u.string().required(),description:u.string().empty(""),state:u.boolean().parse().required()},this.schemaUpdate={name:u.string().empty(),route:u.string().empty(),tag:u.string().empty(),description:u.string().empty(),state:u.boolean().parse().empty()}}model(){return ke}CrudArgumentsFindAll(e){return{ctx:e}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}};nt=he([F("/permissions"),D(We)],nt);let ot=class RegisterController extends ControllerBase{register(e,t,i){return _e(this,void 0,void 0,function*(){yield d(Env.API_SLEEP_REGISTRY);const{name:r,date:n,email:o,username:s,password:a,confirm:u}=t,l=s||o,p=q(a);if(yield we.count({where:{[re.or]:[{email:o},{username:l}]}}).catch(this.error))return e.validation("INVALID EMAIL OR USERNAME");if(p!=q(u))return e.error("INVALID PASSWORD");const c=yield we.create({name:r,email:o,username:l,password:p,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!c)return e.error("INTERNAL SERVER ERROR");const g=yield De.create({token:yield this.getId(),user_id:c.id,state:!0}).catch(this.error);if(!g)return yield c.destroy().catch(this.error),e.error("INTERNAL SERVER ERROR");e.success("OK"),i.emit("register.user",{ctx:e,register:g,user:c}),this.emit("register.user",{ctx:e,register:g,user:c})})}confirm(e,t,i){return _e(this,void 0,void 0,function*(){const r=yield De.findOne({where:{token:t,state:!0},include:[{model:we,required:!0}]}).catch(this.error);if(!r)return e.notFound("RECORD NOT FOUND");r.state=!1,yield r.save().catch(this.error),r.user.state=!0,yield r.user.save().catch(this.error),e.success("OK"),i.emit("register.confirm",{ctx:e,register:r,user:r.user}),this.emit("register.confirm",{ctx:e,register:r,user:r.user})})}send(e,t,i){return _e(this,void 0,void 0,function*(){const r=t,n=yield De.findOne({where:{state:!0},include:[{model:we,required:!0,where:{[re.or]:[{email:r},{username:t}]}}]}).catch(this.error);if(!n)return e.notFound("RECORD NOT FOUND");e.success("OK"),i.emit("register.send",{ctx:e,register:n,user:n.user}),this.emit("register.send",{ctx:e,register:n,user:n.user})})}getId(){return _e(this,void 0,void 0,function*(){const e=r();return(yield De.count({where:{token:e}}))?this.getId():e})}};he([C(),b("validation",{name:u.string().required(),date:u.date().required(),email:u.string().email().required(),username:u.string().min(4).empty(),password:u.string().min(5).required(),confirm:u.string().min(5).required()}),Ee(0,m()),Ee(1,k()),Ee(2,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,Object,Application]),Ae("design:returntype",Promise)],ot.prototype,"register",null),he([C("/confirm"),b("validation",{token:u.string().required()}),Ee(0,m()),Ee(1,k("token")),Ee(2,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Application]),Ae("design:returntype",Promise)],ot.prototype,"confirm",null),he([C("/send"),b("validation",{username:u.string().min(4).required()}),Ee(0,m()),Ee(1,k("username")),Ee(2,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Application]),Ae("design:returntype",Promise)],ot.prototype,"send",null),ot=he([F("/register"),D(ControllerBase)],ot);let st=class SetupController extends ControllerBase{setup(e,t){return _e(this,void 0,void 0,function*(){var i;if(yield we.count())return e.success("OK");const r=E(),n=yield we.create({name:"Admin",email:"admin@localhost",username:"admin",password:q("admin"+r),salt:r,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0},Object.assign({},t)),s=yield Ne.create(Object.assign({name:"Admin"},{description:"API CORE",state:!0}),Object.assign({},t));yield Ce.create({user_id:n.id,group_id:s.id},Object.assign({},t));const d=null!==(i=yield ke.findAll({where:{state:!0}}).catch(this.error))&&void 0!==i?i:[];yield o(d,e=>_e(this,void 0,void 0,function*(){yield Ue.create({group_id:s.id,permission_id:e.id},Object.assign({},t))})),e.success("OK")})}};he([w(),Ee(0,m()),Ee(1,Oe()),Ae("design:type",Function),Ae("design:paramtypes",[I,Object]),Ae("design:returntype",Promise)],st.prototype,"setup",null),st=he([F("/setup"),D(ControllerBase)],st);let dt=class UsersController extends Ge{model(){return we}constructor(){super(),this.path=Env.API_HTTP_PUBLIC+"/avatar",Env.API_HTTP_PUBLIC&&de(Env.API_HTTP_PUBLIC)&&!de(this.path)&&le(this.path)}avatar(e,t,i,r){return _e(this,void 0,void 0,function*(){if(t.length){const n=t[0].filename||"";if(n){const t=this.path+"/"+i.avatar;if(de(t)&&pe(t).isFile()&&ce(t),i.avatar=n,yield i.save(Object.assign({},r)).catch(this.error))return e.success("OK")}}e.success("RECORD NOT CHANGED")})}avatar_del(e,t,i){return _e(this,void 0,void 0,function*(){const r=this.path+"/"+t.avatar;t.avatar="",(yield t.save(Object.assign({},i)).catch(this.error))&&de(r)&&ce(r),e.success("OK")})}password(e,t,i,r,n){return _e(this,void 0,void 0,function*(){var o;if(Env.API_USER_HISTORY){if(yield be.count({where:{password:q(i+r.id)}}).catch(this.error))return e.error("PASSWORD PREVIOUSLY REGISTERED")}const s=yield this.scope("password").findOne({where:{id:r.id,state:!0}}).catch(this.error);return t+=null!==(o=null==s?void 0:s.salt)&&void 0!==o?o:"",s&&s.password==q(t)?(s.salt=E(),s.password=q(i+s.salt),(yield s.save(Object.assign({},n)).catch(this.error))?e.success("OK"):void e.success("RECORD NOT CHANGED")):e.error("INVALID PASSWORD")})}token(e,t,i){return _e(this,void 0,void 0,function*(){const r=yield this.model().findOne({attributes:["token"],where:{id:t.id}}).catch(this.error);if(r)return e.json({token:i.hash.decrypt(r.token)});e.notFound("RECORD NOT FOUND")})}token_del(e,t,i){return _e(this,void 0,void 0,function*(){const r=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(r)return r.token="",yield r.save(Object.assign({},i)).catch(this.error),e.success("OK");e.notFound("RECORD NOT FOUND")})}token_get(e,t,i){return _e(this,void 0,void 0,function*(){const r=yield this.scope("token").findOne({where:{id:t}}).catch(this.error);if(r)return e.json({token:i.hash.decrypt(r.token)});e.notFound("RECORD NOT FOUND")})}token_renew(e,t,i,r){return _e(this,void 0,void 0,function*(){const n=yield this.model().findOne({attributes:["id","token"],where:{id:t}}).catch(this.error);if(n){const t=yield this.token_new();return n.token=r.hash.encrypt(t),yield n.save(Object.assign({},i)).catch(this.error),e.json({token:t})}e.notFound("RECORD NOT FOUND")})}token_new(){return _e(this,void 0,void 0,function*(){var e;const t=r();return(null!==(e=yield this.model().count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t})}add(e,t){return _e(this,void 0,void 0,function*(){const i=E(),r=yield this.create({ctx:e,body:{password:q(t+i),salt:i}});Env.API_USER_HISTORY&&r&&(yield be.create({password:q(t+r.id),user_id:r.id}))})}all(e){return _e(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["password","salt","token"]}}})})}del(e,t,i){return _e(this,void 0,void 0,function*(){if(i.id.toString()==t)return e.notFound("RECORD NOT FOUND");yield this.delete({ctx:e})})}get(e){return _e(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e,t,i){return _e(this,void 0,void 0,function*(){if(Env.API_USER_HISTORY&&i){const r=q(i+t);if(yield be.count({where:{password:r}}).catch(this.error))return e.error("PASSWORD PREVIOUSLY REGISTERED");yield be.create({password:r,user_id:t}).catch(this.error)}const r=i?E():"";yield this.update({ctx:e,body:i?{password:q(i+r),salt:r}:{}})})}};he([C("/avatar"),b("auth"),b("upload",e=>({count:1,field:"file",path:e.controller.path,types:["image/bmp","image/jpeg","image/png"],size:32})),Ee(0,m()),Ee(1,j()),Ee(2,fe()),Ee(3,Oe()),Ae("design:type",Function),Ae("design:paramtypes",[I,Array,we,Object]),Ae("design:returntype",Promise)],dt.prototype,"avatar",null),he([B("/avatar"),b("auth"),Ee(0,m()),Ee(1,fe()),Ee(2,Oe()),Ae("design:type",Function),Ae("design:paramtypes",[I,we,Object]),Ae("design:returntype",Promise)],dt.prototype,"avatar_del",null),he([C("/password"),b("auth"),b("validation",{oldPassword:u.string().min(5).required(),newPassword:u.string().min(5).required(),confirmPassword:u.string().equal(u.ref("newPassword"))}),Ee(0,m()),Ee(1,k("oldPassword")),Ee(2,k("newPassword")),Ee(3,fe()),Ee(4,Oe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String,we,Object]),Ae("design:returntype",Promise)],dt.prototype,"password",null),he([w("/token"),b("auth"),Ee(0,m()),Ee(1,fe()),Ee(2,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,we,Application]),Ae("design:returntype",Promise)],dt.prototype,"token",null),he([B("/token/:id"),b("auth"),b("canDelete"),Ee(0,m()),Ee(1,U("id")),Ee(2,Oe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Object]),Ae("design:returntype",Promise)],dt.prototype,"token_del",null),he([w("/token/:id"),b("auth"),b("canCreate"),Ee(0,m()),Ee(1,U("id")),Ee(2,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Application]),Ae("design:returntype",Promise)],dt.prototype,"token_get",null),he([w("/token/renew/:id"),b("auth"),b("canUpdate"),Ee(0,m()),Ee(1,U("id")),Ee(2,Oe()),Ee(3,f()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Object,Application]),Ae("design:returntype",Promise)],dt.prototype,"token_renew",null),he([C(),b("auth"),b("canCreate"),b("validation",{name:u.string().required(),email:u.string().email().required(),username:u.string().min(4).required(),password:u.string().min(5).required(),description:u.string().empty(""),state:u.boolean().parse().required()}),Ee(0,m()),Ee(1,k("password")),Ae("design:type",Function),Ae("design:paramtypes",[I,String]),Ae("design:returntype",Promise)],dt.prototype,"add",null),he([w(),b("auth"),b("canRead"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],dt.prototype,"all",null),he([B("/:id"),b("auth"),b("canDelete"),Ee(0,m()),Ee(1,U("id")),Ee(2,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,we]),Ae("design:returntype",Promise)],dt.prototype,"del",null),he([w("/:id"),b("auth"),b("canRead"),Ee(0,m()),Ae("design:type",Function),Ae("design:paramtypes",[I]),Ae("design:returntype",Promise)],dt.prototype,"get",null),he([x("/:id"),b("auth"),b("canUpdate"),b("validation",{name:u.string().empty(),email:u.string().email().empty(),username:u.string().min(4).empty(),password:u.string().min(5).empty().filter(""),description:u.string().empty(),state:u.boolean().parse().empty()}),Ee(0,m()),Ee(1,U("id")),Ee(2,k("password")),Ae("design:type",Function),Ae("design:paramtypes",[I,String,String]),Ae("design:returntype",Promise)],dt.prototype,"set",null),dt=he([F("/users"),D(Ge),Ae("design:paramtypes",[])],dt);let at=class UsersGroupsController extends Ge{model(){return Ce}all(e,t){return _e(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{user_id:t},include:[{model:Ne,required:!0}]},callback:e=>e.map(e=>e.group)})})}me(e,t){return _e(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(e,t,i,r){return _e(this,void 0,void 0,function*(){const n=yield we.findByPk(t,{attributes:["id"]}).catch(this.error);if(!n)return e.notFound("RECORD NOT FOUND");if(yield Ce.destroy(Object.assign({where:{user_id:n.id},individualHooks:!0},r)),i){let e=0;yield d(1e3);for(let t=0;t<i.length;t++)e=yield Ne.count({where:{id:i[t]}}),e&&(yield Ce.create({user_id:n.id,group_id:i[t]},Object.assign({},r)))}e.success("OK")})}};he([w("/:id/groups"),b("auth"),b("canRead","users"),Ee(0,m()),Ee(1,U("id")),Ae("design:type",Function),Ae("design:paramtypes",[I,String]),Ae("design:returntype",Promise)],at.prototype,"all",null),he([w("/groups"),b("auth"),b("canRead","users"),Ee(0,m()),Ee(1,fe()),Ae("design:type",Function),Ae("design:paramtypes",[I,we]),Ae("design:returntype",Promise)],at.prototype,"me",null),he([x("/:id/groups"),b("auth"),b("canUpdate","users"),b("validation",{groups:u.array(u.number().parse())}),Ee(0,m()),Ee(1,U("id")),Ee(2,k("groups")),Ee(3,Oe()),Ae("design:type",Function),Ae("design:paramtypes",[I,String,Array,Object]),Ae("design:returntype",Promise)],at.prototype,"set",null),at=he([F("/users"),D(Ge)],at);export{Application,Be as Audit,ze as AuditsController,Te as Auth,AuthBase,Je as AuthController,AuthKey,AuthToken,xe as Config,Controller,ControllerBase,We as ControllerCrud,Ge as ControllerModel,Env,Xe as FilesController,Fe as Forgot,Qe as ForgotController,Ne as Group,Ue as GroupPermission,et as GroupsController,tt as GroupsPermissionsController,je as Log,rt as LogsController,Le as Migration,ke as Permission,nt as PermissionsController,De as Register,ot as RegisterController,Oe as ReqAudit,Se as ReqAuth,fe as ReqUser,Ke as Session,st as SetupController,Store,we as User,Ce as UserGroup,be as UserHistory,dt as UsersController,at as UsersGroupsController,me as audit,He as crt,Ie as database,Re as hooks,qe as key};
7
+ import{Use as e,UnauthorizedError as t,parameterFactory as i,Context as r,NotFoundError as n,InternalServerError as o,Status as s,ValidationError as d,Application as a,Ctx as l,Headers as u,Session as p,Extends as c,Get as g,Query as v,Controller as y,Post as h,Validate as m,Body as _,App as E,Middleware as f,Delete as A,Put as S,Params as O,Upload as I}from"@andrewcaires/express";import{Env as T,Log as P,LogColor as w,Hash as b,sha256 as x}from"@andrewcaires/node";import{isUndefined as D,isFunction as C,includesArray as R,getConstructor as k,noop as j,loop as N,uuidv7 as B,merge as K,isArray as U,isString as M,clamp as L,isNumber as F,forEachSeries as H,sleep as q,EventEmitter as Y,upperCamelCase as $,denied as G,isDef as V,uniqueID as W,Validation as z}from"@andrewcaires/utils.js";import{WebSocketServer as J}from"ws";import{Sequelize as X,Hooks as Z,Column as Q,Association as ee,Database as te,ModelName as ie,Version as re,Model as ne,Unique as oe,HasMany as se,Value as de,DefaultValue as ae,Op as le,Where as ue}from"@andrewcaires/sequelize";import{config as pe}from"dotenv";import{hashSync as ce,compareSync as ge}from"bcrypt";import{Store as ve}from"express-session";import{Trait as ye,Singleton as he,Inject as me}from"@andrewcaires/decorator";import _e from"jsonwebtoken";import{existsSync as Ee,statSync as fe,readdirSync as Ae,mkdirSync as Se,lstatSync as Oe,rmSync as Ie}from"fs";import{join as Te}from"path";function Pe(e,t,i,r){var n,o=arguments.length,s=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,i,r);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(s=(o<3?n(s):o>3?n(t,i,s):n(t,i))||s);return o>3&&s&&Object.defineProperty(t,i,s),s}function we(e,t){return function(i,r){t(i,r,e)}}function be(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function xe(e,t,i,r){return new(i||(i=Promise))(function(n,o){function s(e){try{a(r.next(e))}catch(e){o(e)}}function d(e){try{a(r.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(s,d)}a((r=r.apply(e,t||[])).next())})}var De;"function"==typeof SuppressedError&&SuppressedError,pe({quiet:!0});class Env extends T{}De=Env,Env.BASE_NAME=De.getString("BASE_NAME",""),Env.CONSOLE_ERROR=De.getBool("CONSOLE_ERROR",!1),Env.DATABASE_URI=De.getString("DATABASE_URI",""),Env.DATABASE_LOG=De.getBool("DATABASE_LOG",!1),Env.DATABASE_AUDIT=De.getBool("DATABASE_AUDIT",!0),Env.DATABASE_PREFIX=De.getString("DATABASE_PREFIX",""),Env.DATABASE_TIMEZONE=De.getString("DATABASE_TIMEZONE","+00:00"),Env.HTTP_CRT=De.getFile("HTTP_CRT"),Env.HTTP_KEY=De.getFile("HTTP_KEY"),Env.TOKEN_CRT=De.getFile("TOKEN_CRT"),Env.TOKEN_KEY=De.getFile("TOKEN_KEY"),Env.API_BODYPARSER_STRICT=De.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=De.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=De.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=De.getString("API_BODYPARSER_TYPE","json"),Env.API_HTTP_PORT=De.getInt("API_HTTP_PORT",3e3),Env.API_HTTP_PUBLIC=De.getString("API_HTTP_PUBLIC",""),Env.API_HTTP_CROSS=De.getBool("API_HTTP_CROSS",!1),Env.API_HTTP_HYBRID=De.getBool("API_HTTP_HYBRID",!1),Env.API_HTTP_NOTFOUND=De.getString("API_HTTP_NOTFOUND",""),Env.API_HTTP_PATH=De.getString("API_HTTP_PATH","/api"),Env.API_HTTP_REDIRECT=De.getString("API_HTTP_REDIRECT",""),Env.API_KEY_HASH=De.getString("API_KEY_HASH",""),Env.API_KEY_HEADER=De.getString("API_KEY_HEADER","x-api-key"),Env.API_MODEL_LIMIT=De.getInt("API_MODEL_LIMIT",10),Env.API_MODEL_LIMIT_MAX=De.getInt("API_MODEL_LIMIT_MAX",500),Env.API_SLEEP_AUTH=De.getMs("API_SLEEP_AUTH","2s"),Env.API_SLEEP_FORGOT=De.getMs("API_SLEEP_FORGOT","5s"),Env.API_SLEEP_REGISTRY=De.getMs("API_SLEEP_REGISTRY","5s"),Env.API_SESSION_NAME=De.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=De.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=De.getString("API_SESSION_SECRET","yoursecret"),Env.API_TOKEN_COOKIE=De.getString("API_TOKEN_COOKIE","authorization"),Env.API_TOKEN_COOKIE_SET=De.getBool("API_TOKEN_COOKIE_SET",!0),Env.API_TOKEN_FORGOT=De.getMs("API_TOKEN_FORGOT","1d"),Env.API_TOKEN_HEADER=De.getString("API_TOKEN_HEADER","authorization"),Env.API_TOKEN_HEADER_KEY=De.getString("API_TOKEN_HEADER","bearer"),Env.API_TOKEN_LIFETIME=De.getMs("API_TOKEN_LIFETIME","1d"),Env.API_TOKEN_RENEW=De.getMs("API_TOKEN_RENEW","1d"),Env.API_USER_HISTORY=De.getBool("API_USER_HISTORY",!0),Env.API_WEBSOCKET_START=De.getBool("API_WEBSOCKET_START",!1);const Ce=new X({uri:Env.DATABASE_URI,logging:Env.DATABASE_LOG,prefix:Env.DATABASE_PREFIX,timezone:Env.DATABASE_TIMEZONE}),Re=i=>r=>(n,o,s)=>{e(e=>xe(void 0,void 0,void 0,function*(){var n;let o=null!=r?r:"";D(r)&&(o=C(e.controller.name)?e.controller.name():null===(n=e.controller.constructor)||void 0===n?void 0:n.name);const{permissions:s}=e.req;if((null!=s?s:[]).includes(`${o}.${i}`))return e.next();e.error(new t("Access Denied"))}))(n,o,s)},ke=Re("create"),je=Re("delete"),Ne=Re("read"),Be=Re("update"),Ke=(...i)=>(r,n,o)=>{e(e=>xe(void 0,void 0,void 0,function*(){const{groups:r}=e.req;if(R(i,null!=r?r:[]))return e.next();e.error(new t("Access Denied"))}))(r,n,o)},Ue=(...i)=>(r,n,o)=>{e(e=>xe(void 0,void 0,void 0,function*(){const{permissions:r}=e.req;if(R(i,null!=r?r:[]))return e.next();e.error(new t("Access Denied"))}))(r,n,o)},Me=()=>(i,r,n)=>{e(e=>xe(void 0,void 0,void 0,function*(){yield(e=>xe(void 0,void 0,void 0,function*(){var i,r,n,o;if(e.req.auth&&e.req.user)return e.next();const{[Env.API_KEY_HEADER]:s,[Env.API_TOKEN_HEADER]:d,"user-agent":a}=e.getHeaders(),l=e.getQuery(Env.API_KEY_HEADER),u=(null===(i=s||l)||void 0===i?void 0:i.toString())||"";let p=e.getCookie(Env.API_TOKEN_COOKIE);p=`${Env.API_TOKEN_HEADER_KEY} ${p}`;const[c,g]=null!==(n=null===(r=d||p)||void 0===r?void 0:r.split(" "))&&void 0!==n?n:["",""];if(!(u||g&&c.toLowerCase()==Env.API_TOKEN_HEADER_KEY))return e.error(new t("Invalid token"));const{authService:v,userService:y}=e.app,{auth:h,user:m}=null!==(o=yield(u?v.key(u.toString()):v.user(g)).catch(t=>{e.error(t)}))&&void 0!==o?o:{};if(h&&m){if(!u&&h.user_agent&&h.user_agent!=a)return e.error(new t("Invalid token"));e.req.auth=h,e.req.user=m,e.req.groups=yield y.getGroups(m.id),e.req.permissions=yield y.getPermissions(m.id),e.req.profile=yield y.getProfile(m.id),e.next()}}))(e)}))(i,r,n)},Le=i(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.auth}),Fe=i(({ctx:e,key:t})=>{var i,r;return(null!==(r=null===(i=e.req)||void 0===i?void 0:i.groups)&&void 0!==r?r:[]).includes(t)}),He=i(({ctx:e})=>{var t,i;return null!==(i=null===(t=e.req)||void 0===t?void 0:t.groups)&&void 0!==i?i:[]}),qe=i(({ctx:e,key:t})=>{var i,r;return(null!==(r=null===(i=e.req)||void 0===i?void 0:i.permissions)&&void 0!==r?r:[]).includes(t)}),Ye=i(({ctx:e})=>{var t,i;return null!==(i=null===(t=e.req)||void 0===t?void 0:t.permissions)&&void 0!==i?i:[]}),$e=i(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.user}),Ge=(e,t,i)=>{var n,o,s,d,a,l,u,p,c;const g=i.ctx instanceof r?i.ctx:null,v=null!==(d=null!==(s=null===(o=null===(n=null==g?void 0:g.req)||void 0===n?void 0:n.user)||void 0===o?void 0:o.id)&&void 0!==s?s:i.user_id)&&void 0!==d?d:null,y={type:e,model:null!==(a=null==t?void 0:t.getTableName())&&void 0!==a?a:null,state:!0,user_id:v};return g?Object.assign(Object.assign({},y),{full_url:null!==(l=null==g?void 0:g.getUrl())&&void 0!==l?l:"",ip_address:null!==(u=null==g?void 0:g.getIp())&&void 0!==u?u:"",user_agent:null!==(c=null===(p=null==g?void 0:g.req)||void 0===p?void 0:p.headers["user-agent"])&&void 0!==c?c:""}):y},Ve={afterCreate:(e,t)=>xe(void 0,void 0,void 0,function*(){const i=k(e),{primaryKeyAttribute:r}=null!=i?i:{};yield rt.create(Object.assign(Object.assign({},Ge("CREATE",i,t)),{record:r?e.getDataValue(r):null,data:e.toJSON()})).catch(P.catch)}),afterUpdate:(e,t)=>xe(void 0,void 0,void 0,function*(){const i=k(e),{primaryKeyAttribute:r}=null!=i?i:{},n={},o=e.changed();o&&o.forEach(t=>n[t]=e.getDataValue(t)),yield rt.create(Object.assign(Object.assign({},Ge("UPDATE",i,t)),{record:r?e.getDataValue(r):null,data:n,previously:e.previous()})).catch(P.catch)}),afterDestroy:(e,t)=>xe(void 0,void 0,void 0,function*(){const i=k(e),{primaryKeyAttribute:r}=null!=i?i:{};yield rt.create(Object.assign(Object.assign({},Ge("DELETE",i,t)),{record:r?e.getDataValue(r):null,data:e.toJSON()})).catch(P.catch)})},We=e=>(D(e)&&(e=Env.DATABASE_AUDIT),Z(e?Ve:{}));let ze=class RegisterModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],ze.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],ze.prototype,"secret",void 0),Pe([Q.FullDate(),be("design:type",Number)],ze.prototype,"expired_at",void 0),Pe([Q.Boolean(),be("design:type",Boolean)],ze.prototype,"state",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],ze.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],ze.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],ze.prototype,"deleted_at",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],ze.prototype,"user_id",void 0),ze=Pe([te(Ce),ie("register"),re("5.0.0")],ze);let Je=class UserAuthModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],Je.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],Je.prototype,"secret",void 0),Pe([Q.String(),be("design:type",String)],Je.prototype,"ip_address",void 0),Pe([Q.String(),be("design:type",String)],Je.prototype,"user_agent",void 0),Pe([Q.FullDate(),be("design:type",Object)],Je.prototype,"revoked_at",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],Je.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],Je.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],Je.prototype,"deleted_at",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],Je.prototype,"user_id",void 0),Je=Pe([te(Ce),ie("users_auth"),re("5.0.0")],Je);let Xe=class PermissionModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],Xe.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],Xe.prototype,"name",void 0),Pe([Q.String(),oe(!0),be("design:type",String)],Xe.prototype,"key",void 0),Pe([Q.String(),be("design:type",String)],Xe.prototype,"tag",void 0),Pe([Q.Text(),be("design:type",String)],Xe.prototype,"description",void 0),Pe([Q.Boolean(),be("design:type",Boolean)],Xe.prototype,"state",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],Xe.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],Xe.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],Xe.prototype,"deleted_at",void 0),Pe([se(()=>Ze,"permission_id"),be("design:type",Array)],Xe.prototype,"groups_permissions",void 0),Xe=Pe([te(Ce),ie("permission"),We(),re("5.0.0")],Xe);let Ze=class GroupPermissionModel extends ne{};Pe([Q.CreatedAt(),be("design:type",Date)],Ze.prototype,"created_at",void 0),Pe([ee.BelongsTo(()=>Qe),be("design:type",String)],Ze.prototype,"group_id",void 0),Pe([ee.BelongsTo(()=>Xe),be("design:type",String)],Ze.prototype,"permission_id",void 0),Ze=Pe([te(Ce),ie("groups_permissions"),We(),re("5.0.0")],Ze);let Qe=class GroupModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],Qe.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],Qe.prototype,"name",void 0),Pe([Q.String(),be("design:type",String)],Qe.prototype,"key",void 0),Pe([Q.Text(),be("design:type",String)],Qe.prototype,"description",void 0),Pe([Q.Boolean(),be("design:type",Boolean)],Qe.prototype,"state",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],Qe.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],Qe.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],Qe.prototype,"deleted_at",void 0),Pe([ee.HasMany(()=>et,"group_id"),be("design:type",Array)],Qe.prototype,"users_groups",void 0),Pe([ee.HasMany(()=>Ze,"group_id"),be("design:type",Array)],Qe.prototype,"groups_Permission",void 0),Qe=Pe([te(Ce),ie("group"),We(),re("5.0.0")],Qe);let et=class UserGroupModel extends ne{};Pe([Q.CreatedAt(),be("design:type",Date)],et.prototype,"created_at",void 0),Pe([ee.BelongsTo(()=>Qe),be("design:type",String)],et.prototype,"group_id",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],et.prototype,"user_id",void 0),et=Pe([te(Ce),ie("users_groups"),We(),re("5.0.0")],et);let tt=class UserPasswordModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],tt.prototype,"id",void 0),Pe([Q.String(),de(e=>ce(e.value,12)),be("design:type",String)],tt.prototype,"value",void 0),Pe([Q.Boolean(),be("design:type",Boolean)],tt.prototype,"state",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],tt.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],tt.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],tt.prototype,"deleted_at",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],tt.prototype,"user_id",void 0),tt=Pe([te(Ce),ie("users_password"),We(),re("5.0.0")],tt);let it=class UserModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],it.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],it.prototype,"name",void 0),Pe([Q.String(),be("design:type",String)],it.prototype,"email",void 0),Pe([Q.String(),be("design:type",String)],it.prototype,"username",void 0),Pe([Q.Text(),be("design:type",String)],it.prototype,"description",void 0),Pe([Q.Boolean(),be("design:type",Boolean)],it.prototype,"state",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],it.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],it.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],it.prototype,"deleted_at",void 0),Pe([ee.HasMany(()=>rt,"user_id"),be("design:type",Array)],it.prototype,"audits",void 0),Pe([ee.HasMany(()=>Je,"user_id"),be("design:type",Array)],it.prototype,"users_auths",void 0),Pe([ee.HasMany(()=>ze,"user_id"),be("design:type",Array)],it.prototype,"registers",void 0),Pe([ee.HasMany(()=>et,"user_id"),be("design:type",Array)],it.prototype,"users_groups",void 0),Pe([ee.HasMany(()=>tt,"user_id"),be("design:type",Array)],it.prototype,"users_passwords",void 0),it=Pe([te(Ce),ie("user"),We(),re("5.0.0")],it);let rt=class AuditModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],rt.prototype,"id",void 0),Pe([Q.Enum("CREATE","DELETE","UPDATE"),be("design:type",String)],rt.prototype,"type",void 0),Pe([Q.String(),be("design:type",String)],rt.prototype,"model",void 0),Pe([Q.String(),be("design:type",String)],rt.prototype,"record",void 0),Pe([Q.Json(),be("design:type",Object)],rt.prototype,"data",void 0),Pe([Q.Json(),be("design:type",Object)],rt.prototype,"previously",void 0),Pe([Q.Text(),be("design:type",String)],rt.prototype,"full_url",void 0),Pe([Q.String(),be("design:type",String)],rt.prototype,"ip_address",void 0),Pe([Q.String(),be("design:type",String)],rt.prototype,"user_agent",void 0),Pe([Q.Boolean(),be("design:type",Boolean)],rt.prototype,"state",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],rt.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],rt.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],rt.prototype,"deleted_at",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],rt.prototype,"user_id",void 0),rt=Pe([te(Ce),ie("audit"),re("5.0.0")],rt);let nt=class ConfigModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],nt.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],nt.prototype,"key",void 0),Pe([Q.String(),be("design:type",String)],nt.prototype,"value",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],nt.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],nt.prototype,"updated_at",void 0),nt=Pe([te(Ce),ie("configs"),re("5.0.0")],nt);let ot=class ForgotModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],ot.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],ot.prototype,"secret",void 0),Pe([Q.FullDate(),be("design:type",Number)],ot.prototype,"expired_at",void 0),Pe([Q.Boolean(),be("design:type",Boolean)],ot.prototype,"state",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],ot.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],ot.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],ot.prototype,"deleted_at",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],ot.prototype,"user_id",void 0),ot=Pe([te(Ce),ie("forgot"),re("5.0.0")],ot);let st=class LogModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],st.prototype,"id",void 0),Pe([Q.Enum("info","warn","error"),ae("info"),be("design:type",String)],st.prototype,"level",void 0),Pe([Q.Text(),be("design:type",String)],st.prototype,"message",void 0),Pe([Q.String(),be("design:type",String)],st.prototype,"source",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],st.prototype,"created_at",void 0),st=Pe([te(Ce),ie("log"),re("5.0.0")],st);let dt=class MigrationModel extends ne{};Pe([Q.String(),be("design:type",String)],dt.prototype,"model",void 0),Pe([Q.String(),be("design:type",String)],dt.prototype,"version",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],dt.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],dt.prototype,"updated_at",void 0),dt=Pe([te(Ce),ie("migration"),re("5.0.0")],dt);let at=class SessionModel extends ne{};Pe([Q.String(),be("design:type",String)],at.prototype,"session",void 0),Pe([Q.Text(),be("design:type",String)],at.prototype,"json",void 0),Pe([Q.BigInt(),be("design:type",Number)],at.prototype,"expired",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],at.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],at.prototype,"updated_at",void 0),at=Pe([te(Ce),ie("session"),re("5.0.0")],at);let lt=class UserMetadataModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],lt.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],lt.prototype,"key",void 0),Pe([Q.Text("medium"),be("design:type",String)],lt.prototype,"value",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],lt.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],lt.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],lt.prototype,"deleted_at",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],lt.prototype,"user_id",void 0),lt=Pe([te(Ce),ie("users_metadata"),We(),re("5.0.0")],lt);let ut=class UserProfileModel extends ne{};Pe([Q.UUID(7),be("design:type",String)],ut.prototype,"id",void 0),Pe([Q.String(),be("design:type",String)],ut.prototype,"key",void 0),Pe([Q.Text("medium"),be("design:type",String)],ut.prototype,"value",void 0),Pe([Q.CreatedAt(),be("design:type",Date)],ut.prototype,"created_at",void 0),Pe([Q.UpdatedAt(),be("design:type",Date)],ut.prototype,"updated_at",void 0),Pe([Q.DeletedAt(),be("design:type",Object)],ut.prototype,"deleted_at",void 0),Pe([ee.BelongsTo(()=>it),be("design:type",String)],ut.prototype,"user_id",void 0),ut=Pe([te(Ce),ie("users_profile"),We(),re("5.0.0")],ut);class Log{static error(e,t,i){return xe(this,void 0,void 0,function*(){yield this.writeRaw("error",e,t,i)})}static info(e,t,i){return xe(this,void 0,void 0,function*(){yield this.writeRaw("info",e,t,i)})}static warn(e,t,i){return xe(this,void 0,void 0,function*(){yield this.writeRaw("warn",e,t,i)})}static writeRaw(e,t,i,r){return xe(this,void 0,void 0,function*(){var n;r&&P.console(null!==(n=this.colors[e])&&void 0!==n?n:w.White,e,t),Ce&&(yield st.create({level:e,message:t,source:null!=i?i:""}).catch(P.catch))})}}Log.colors={error:w.Red,info:w.Cyan,warn:w.Yellow};class Loggable{get log(){return e=>Loggable.logInfo(this,e)}static get log(){return e=>this.logInfo(this,e)}get error(){return e=>Loggable.logError(this,e)}static get error(){return e=>this.logError(this,e)}static logError(e,t){var i,r;Log.error(null!==(r=null!==(i=null==t?void 0:t.message)&&void 0!==i?i:t)&&void 0!==r?r:"",this.source(e),Env.CONSOLE_ERROR)}static logInfo(e,t){Log.info(null!=t?t:"",this.source(e),Env.CONSOLE_ERROR)}static source(e){var t,i,r;const n=null!==(r=null!==(i=null===(t=null==e?void 0:e.constructor)||void 0===t?void 0:t.name)&&void 0!==i?i:null==e?void 0:e.name)&&void 0!==r?r:"null";return Env.BASE_NAME?`${Env.BASE_NAME}.${n}`:n}}class Config extends Loggable{static all(){return xe(this,void 0,void 0,function*(){const e=yield nt.findAll().catch(this.error),t={};return e&&e.forEach(e=>t[e.key]=e.value),t})}static del(e,t){return xe(this,void 0,void 0,function*(){var i;const r=null!==(i=null==t?void 0:t.id)&&void 0!==i?i:null;return((yield nt.destroy(Object.assign({where:{key:e},individualHooks:!0},{user_id:r})).catch(this.error))||0)>0})}static get(e){return xe(this,arguments,void 0,function*(e,t=""){const[i]=(yield nt.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return i?i.value:t})}static set(e,t,i){return xe(this,void 0,void 0,function*(){var r;const n=null!==(r=null==i?void 0:i.id)&&void 0!==r?r:null,[o]=(yield nt.findOrCreate(Object.assign({where:{key:e}},{user_id:n})).catch(this.error))||[];o&&(o.value=t,yield o.save().catch(this.error))})}}class SessionStore extends ve{constructor(){super(),this.all=e=>xe(this,void 0,void 0,function*(){e=e||j;const t=yield at.findAll({attributes:["session"],where:{expired:{[le.gte]:Date.now()}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.session)),e()}),this.clear=e=>xe(this,void 0,void 0,function*(){yield at.destroy().catch(j),e&&e()}),this.destroy=(e,t)=>xe(this,void 0,void 0,function*(){yield at.destroy({where:{session:e}}).catch(j),t&&t()}),this.expired=()=>xe(this,void 0,void 0,function*(){yield at.destroy({where:{expired:{[le.lt]:Date.now()}}}).catch(j)}),this.get=(e,t)=>xe(this,void 0,void 0,function*(){t=t||j;const i=yield at.findOne({where:{session:e,expired:{[le.gte]:Date.now()}}}).catch(e=>(t(e),null));if(i){const e=JSON.parse(i.json);if(e.cookie){if(new Date(e.cookie.expires).getTime()<=Date.now())return yield i.destroy().catch(j),void t(null)}return void t(null,e)}t(null)}),this.length=e=>xe(this,void 0,void 0,function*(){e&&e(null,(yield at.count().catch(j))||0)}),this.set=(e,t,i)=>xe(this,void 0,void 0,function*(){i=i||j;const r=Date.now()+Env.API_SESSION_LIFETIME,n=JSON.stringify(t),[o,s]=(yield at.findOrCreate({where:{session:e},defaults:{session:e,json:n,expired:r}}).catch(j))||[];o&&(s||(o.json=n,o.expired=r,yield o.save().catch(j))),i()}),this.loop=N(this.expired,3e4),this.loop.start()}}let pt=class Service{};pt=Pe([ye(Loggable)],pt);let ct=class AuthService extends pt{create(e){return xe(this,void 0,void 0,function*(){if(!Env.TOKEN_KEY)throw new n("TOKEN_KEY not found");const{id:t}=e,i=B(),r=yield Je.create({secret:i,user_id:t}).catch(this.error);if(!r)throw new o;return{auth:r,token:_e.sign({id:t,secret:i},Env.TOKEN_KEY,this.options())}})}destroy(e){return xe(this,void 0,void 0,function*(){return!(!e||e.revoked_at)&&(e.revoked_at=new Date,yield e.save(),!0)})}renew(e){return xe(this,void 0,void 0,function*(){if(!Env.TOKEN_KEY)throw new n("TOKEN_KEY not found");const{decode:i}=yield this.verify(e,Env.API_TOKEN_RENEW/1e3);if(!i)throw new t("Invalid token");const{id:r,secret:o}=i;if(r&&o){const e=yield it.findOne({where:{id:r,state:!0}}).catch(this.error);if(e){const t=yield Je.findOne({where:{secret:o,user_id:e.id}}).catch(this.error);if(t&&!t.revoked_at){t.secret=B(),yield t.save().catch(this.error);return{auth:t,token:_e.sign({id:r,secret:t.secret},Env.TOKEN_KEY,this.options())}}}}throw new t("Invalid token")})}user(e){return xe(this,void 0,void 0,function*(){const{decode:i}=yield this.verify(e);if(!i)throw new t("Invalid token");const{id:r,secret:n}=i;if(r&&n){const e=yield it.findOne({where:{id:r,state:!0}}).catch(this.error);if(e){const t=yield Je.findOne({where:{secret:n,user_id:e.id}}).catch(this.error);if(t&&!t.revoked_at)return{auth:t,user:e}}}throw new t("Invalid token")})}options(){return{algorithm:"RS256",expiresIn:`${Env.API_TOKEN_LIFETIME}ms`}}verify(e,i){return xe(this,void 0,void 0,function*(){if(!Env.TOKEN_CRT)throw new n("TOKEN_CRT not found");if(!e||e.split(".").length<3)throw new t("Invalid token");try{return{decode:_e.verify(e,Env.TOKEN_CRT,{clockTolerance:i})}}catch(e){throw new t("Invalid token")}})}key(e){return xe(this,void 0,void 0,function*(){if(!e)throw new t("Invalid token");const i=yield it.findOne({where:{token:e,state:!0}}).catch(this.error);if(i){const t=e.replace(/(-[\w]{4})/g,"-****"),[r]=(yield Je.findOrCreate({where:{secret:t,user_id:i.id},defaults:{secret:t,user_id:i.id}}).catch(this.error))||[];if(r)return r.revoked_at&&(r.revoked_at=null,yield r.save().catch(this.error)),{auth:r,user:i}}throw new t("Invalid token")})}};ct=Pe([he()],ct);class ModelService extends pt{constructor(e,t){super(),this.attributes=[],this.filter=[],this.model=e,t&&(this.filter=t)}create(e){return xe(this,arguments,void 0,function*({ctx:e,options:t,body:i}){var r,n;const d=Object.assign({},t||{}),a=yield this.model.create(Object.assign({},K({},null!==(n=null===(r=null==e?void 0:e.req)||void 0===r?void 0:r.body)&&void 0!==n?n:{},null!=i?i:{})),Object.assign(Object.assign({},d),{ctx:e})).catch(this.error);if(a){const{primaryKeyAttribute:t}=this.model;return null==e||e.prepare(s.OK,{[t]:a.getDataValue(t)}),a}return null==e||e.error(new o),null})}delete(e){return xe(this,arguments,void 0,function*({ctx:e,options:t,id:i}){var r,s,d;const a=Object.assign({},t||{}),{primaryKeyAttribute:l}=this.model,{[l]:u}=null!==(s=null===(r=null==e?void 0:e.req)||void 0===r?void 0:r.params)&&void 0!==s?s:{[l]:null!=i?i:0};if(!u)return null==e||e.error(new o),0;const p=yield this.model.destroy(Object.assign(Object.assign(Object.assign({},a),{where:Object.assign(Object.assign({},null!==(d=a.where)&&void 0!==d?d:{}),{[l]:u}),individualHooks:!0}),{ctx:e})).catch(this.error);return p?(null==e||e.success("OK"),p):(null==e||e.error(new n),0)})}filterAttributes(e,t){if(U(t))return t.length?t.map(t=>M(t)&&-1!=e.indexOf(t)?t:void 0).filter(M):e;const{exclude:i,include:r}=t,n=D(r)?e:r.map(t=>M(t)&&-1!=e.indexOf(t)?t:void 0).filter(M),o=null!=i?i:[];return o.length?n.filter(e=>-1==o.indexOf(e)):n}findAll(e){return xe(this,arguments,void 0,function*({ctx:e,options:t,callback:i,advanced:r,limited:n}){var a,l,u,p,c,g,v;const y=Object.assign({},t||{}),{attributes:h,limit:m,offset:_,asc:E,desc:f,search:A,where:S}=null!==(l=null===(a=null==e?void 0:e.req)||void 0===a?void 0:a.query)&&void 0!==l?l:{};if(D(y.limit)){let e=Env.API_MODEL_LIMIT;M(m)&&(e=parseInt(m)||0),e=L(e,-1,Env.API_MODEL_LIMIT_MAX),y.limit=e>0?e:n?Env.API_MODEL_LIMIT:void 0}if(F(y.limit)&&(y.limit=y.limit>0?y.limit:void 0),M(_)){const e=parseInt(_)||0;y.offset=e>0?e:void 0}const O=this.getAttributes(null!==(u=null==y?void 0:y.attributes)&&void 0!==u?u:[]),I=e=>O.indexOf(e)>=0;y.attributes=[],M(h)&&h.length&&y.attributes.push(...h.split(";").filter(I)),y.attributes.length||(y.attributes=O);const T=[];if(M(E)&&E.length&&T.push(...E.split(";").filter(I).map(e=>[e,"ASC"])),M(f)&&f.length&&T.push(...f.split(";").filter(I).map(e=>[e,"DESC"])),T.length&&(y.order=T),y.where=Object.assign({},y.where||{}),M(S)&&(null==r||r)){const t=ue.parse(O,S);if(!D(t.error))return null==e||e.error(new d(t.error.join(", "))),{count:0,records:[]};y.where=Object.assign(Object.assign({},y.where),null!==(p=t.value)&&void 0!==p?p:{})}else{const e=[];O.forEach(t=>{M(A)&&A.length&&e.push({[t]:{[le.like]:`%${A}%`}})}),e.length&&(y.where=Object.assign(Object.assign({},y.where),{[le.or]:[...e]}))}const P=this.model.count(Object.assign(Object.assign({},y),{distinct:!!y.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error),w=this.model.findAll(y).catch(this.error);yield Promise.allSettled([P,w]);const b=null!==(c=yield P)&&void 0!==c?c:0;let x=null!==(g=yield w)&&void 0!==g?g:[];const C={count:b};return x?(x=i?yield i(x):x,(F(null==t?void 0:t.limit)||0==b)&&(C.count=null!==(v=null==x?void 0:x.length)&&void 0!==v?v:0),null==e||e.prepare(s.OK,Object.assign(Object.assign({},C),{records:x})),Object.assign(Object.assign({},C),{records:x})):(null==e||e.error(new o),Object.assign(Object.assign({},C),{records:[]}))})}findOne(e){return xe(this,arguments,void 0,function*({ctx:e,options:t,callback:i}){var r,d,a,l,u;const p=Object.assign({},t||{}),{primaryKeyAttribute:c}=this.model,{[c]:g}=null!==(r=null==e?void 0:e.req.params)&&void 0!==r?r:{},v=this.getAttributes(null!==(d=null==p?void 0:p.attributes)&&void 0!==d?d:[]),y=e=>v.indexOf(e)>=0,{attributes:h}=null!==(l=null===(a=null==e?void 0:e.req)||void 0===a?void 0:a.query)&&void 0!==l?l:{};M(h)&&(p.attributes=h.split(";").filter(y));const m=yield this.model.findOne(Object.assign(Object.assign({},p),{where:Object.assign(Object.assign({},null!==(u=null==p?void 0:p.where)&&void 0!==u?u:{}),{[c]:g})})).catch(this.error);return m?(null==e||e.prepare(s.OK,i?yield i(m):m.toJSON()),m):m?(null==e||e.error(new o),null):(null==e||e.error(new n),null)})}getAttributes(e){return 0==this.attributes.length&&(this.attributes=this.filterAttributes(Object.keys(this.model.getAttributes()),this.filter)),this.filterAttributes(this.attributes,e)}update(e){return xe(this,arguments,void 0,function*({ctx:e,options:t,body:i,id:r}){var n,o,s,d,a,l;const u=Object.assign({},t||{}),{primaryKeyAttribute:p}=this.model,{[p]:c}=null!==(o=null===(n=null==e?void 0:e.req)||void 0===n?void 0:n.params)&&void 0!==o?o:{[p]:null!=r?r:0},[g]=null!==(l=yield this.model.update(Object.assign({},K({},null!==(d=null===(s=null==e?void 0:e.req)||void 0===s?void 0:s.body)&&void 0!==d?d:{},null!=i?i:{})),Object.assign(Object.assign(Object.assign({},u),{where:Object.assign(Object.assign({},null!==(a=null==u?void 0:u.where)&&void 0!==a?a:{}),{[p]:c}),individualHooks:!0}),{ctx:e})).catch(this.error))&&void 0!==l?l:[];return g?(null==e||e.success("OK"),!0):(null==e||e.success("Record not changed"),!1)})}name(){return this.model.tableName}}let gt=class UserService extends pt{getMetadata(e){return xe(this,void 0,void 0,function*(){var t;return Object.fromEntries((null!==(t=yield lt.findAll({where:{user_id:e}}).catch(this.error))&&void 0!==t?t:[]).map(e=>[e.key,e.value]))})}getProfile(e){return xe(this,void 0,void 0,function*(){var t;return Object.fromEntries((null!==(t=yield ut.findAll({where:{user_id:e}}).catch(this.error))&&void 0!==t?t:[]).map(e=>[e.key,e.value]))})}getGroups(e){return xe(this,void 0,void 0,function*(){var t;return(null!==(t=yield Qe.findAll({attributes:["key"],where:{state:!0},include:[{model:et,required:!0,where:{user_id:e}}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}getPermissions(e){return xe(this,void 0,void 0,function*(){var t;return(null!==(t=yield Xe.findAll({attributes:["key"],where:{state:!0},include:[{model:Ze,required:!0,include:[{model:Qe,required:!0,attributes:["id"],where:{state:!0},include:[{model:et,required:!0,where:{user_id:e}}]}]}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}};gt=Pe([he()],gt);class Application extends a{constructor(e,t){super(e,K({},{cert:Env.HTTP_CRT,cross:Env.API_HTTP_CROSS,hybrid:Env.API_HTTP_HYBRID,json:{strict:Env.API_BODYPARSER_STRICT,inflate:Env.API_BODYPARSER_INFLATE,limit:Env.API_BODYPARSER_LIMIT,type:Env.API_BODYPARSER_TYPE},key:Env.HTTP_KEY,notfound:Env.API_HTTP_NOTFOUND,path:Env.API_HTTP_PATH,port:Env.API_HTTP_PORT,public:Env.API_HTTP_PUBLIC,redirect:Env.API_HTTP_REDIRECT,session:{store:new SessionStore,name:Env.API_SESSION_NAME,secret:Env.API_SESSION_SECRET,cookie:{maxAge:Env.API_SESSION_LIFETIME},genid:B}},null!=t?t:{})),this.hash=new b(Env.API_KEY_HASH)}error(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.error(e.message,t,Env.CONSOLE_ERROR)}log(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return xe(this,void 0,void 0,function*(){yield Ce.sync(),yield this.migrations(Ce),yield H(this.controllers,e=>xe(this,void 0,void 0,function*(){C(e.sync)&&(yield e.sync(this))})),this.authService=new ct,this.userService=new gt,yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new J({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>xe(this,void 0,void 0,function*(){t.url||(t.url=""),!(t.url.length<=1)&&t.url.replace(/\//g,"."),e.on("close",()=>{}),yield q(2e3),e.close()})))})}migrations(e){return xe(this,void 0,void 0,function*(){const t=[];yield H(Object.keys(e.models),i=>xe(this,void 0,void 0,function*(){var r;const n=e.models[i],o=n.version();if(!o)return;const[s,d]=null!==(r=yield dt.findOrCreate({where:{model:n.tableName},defaults:{model:n.tableName,version:""}}).catch(this.error))&&void 0!==r?r:[];s&&(d||s.version!=o)&&(s.version=o,yield s.save().catch(this.error),t.push(n))})),yield H(t,e=>xe(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}let vt=class BaseController extends Y{constructor(){super(...arguments),this.permissions=[]}name(){var e,t;return(null!==(t=null===(e=this.constructor)||void 0===e?void 0:e.name)&&void 0!==t?t:"api").replace(/(([a-z])([A-Z]))/g,"$2_$3")}session(e,t,i){return xe(this,void 0,void 0,function*(){i.auth&&i.user&&(i.user_agent?i.user_agent!=t&&i.regenerate(j):(i.user_agent=t,i.save(j))),e.next()})}sync(){return xe(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield H(this.permissions,i=>xe(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=$(e.replace(/_/g," ")," ");yield Xe.findOrCreate({where:{key:r},defaults:Object.assign({name:`${n} ${$(i," ")}`,key:r,tag:n},t)})}))})}};Pe([we(0,l()),we(1,u("user-agent")),we(2,p()),be("design:type",Function),be("design:paramtypes",[r,String,Object]),be("design:returntype",Promise)],vt.prototype,"session",null),vt=Pe([ye(Loggable)],vt);let yt=class ModelController extends vt{constructor(){super(...arguments),this.attributes=[],this.permissions=["create","read","update","delete"]}create(e){return xe(this,void 0,void 0,function*(){return yield this.service.create(e)})}delete(e){return xe(this,void 0,void 0,function*(){return yield this.service.delete(e)})}findAll(e){return xe(this,void 0,void 0,function*(){return yield this.service.findAll(e)})}findOne(e){return xe(this,void 0,void 0,function*(){return yield this.service.findOne(e)})}sync(){return xe(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t={description:"",state:!0};yield H(this.permissions,i=>xe(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=$(e.replace(/_/g," ")," ");yield Xe.findOrCreate({where:{key:r},defaults:Object.assign({name:`${n} ${$(i," ")}`,key:r,tag:n},t)})})),this.service=new ModelService(this.model)})}update(e){return xe(this,void 0,void 0,function*(){return yield this.service.update(e)})}name(){return this.model.tableName}};yt=Pe([c(vt)],yt);let ht=class AuditsController extends yt{constructor(){super(...arguments),this.model=rt}all(e,t,i){return xe(this,void 0,void 0,function*(){const r={};t&&(r.type=t),i&&(r.table=i),yield this.findAll({ctx:e,options:{attributes:{exclude:["data","previously"]},where:r,order:[["created_at","DESC"]]},limited:!0})})}get(e){return xe(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}};Pe([g(),Me(),Ne(),we(0,l()),we(1,v("type")),we(2,v("table")),be("design:type",Function),be("design:paramtypes",[r,String,String]),be("design:returntype",Promise)],ht.prototype,"all",null),Pe([g("/:id"),Me(),Ne(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],ht.prototype,"get",null),ht=Pe([y("/audits"),c(yt)],ht);let mt=class AuthController extends vt{constructor(e){super(),this.authService=e}login(e,i,r,n,o,s){return xe(this,void 0,void 0,function*(){var d;yield q(Env.API_SLEEP_AUTH);const a=yield it.findOne({where:{[le.or]:[{email:r},{username:r}]}}).catch(this.error);if(!a)return e.error(new t("Invalid credentials")),s.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const l=yield tt.findOne({where:{user_id:a.id,state:!0}}).catch(this.error);if(!l||!ge(n,l.value))return e.error(new t("Invalid credentials")),s.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const u=yield ze.findOne({where:{state:!0,user_id:a.id}}).catch(this.error);if(u)return e.error("ACTIVATION REQUIRED"),s.emit("auth.activation",{ctx:e,register:u,user:a}),void this.emit("auth.activation",{ctx:e,register:u,user:a});if(!a.state)return e.error(new t("Invalid credentials")),s.emit("auth.failure",{ctx:e,user:a}),void this.emit("auth.failure",{ctx:e,user:a});const{auth:p,token:c}=null!==(d=yield this.authService.create(a).catch(t=>{e.error(t),s.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e})}))&&void 0!==d?d:{};p&&c&&(p.user_agent=i,p.ip_address=e.getIp(),yield p.save().catch(this.error),Env.API_TOKEN_COOKIE_SET&&e.cookie(Env.API_TOKEN_COOKIE,c,{maxAge:o?Env.API_TOKEN_LIFETIME:void 0}),e.json({token:c}),s.emit("auth.login",{ctx:e,auth:p,user:a}),this.emit("auth.login",{ctx:e,auth:p,user:a}))})}logout(e,i,r,n){return xe(this,void 0,void 0,function*(){if(yield this.authService.destroy(i))return e.success("OK"),n.emit("auth.logout",{auth:i,ctx:e,user:r}),void this.emit("auth.logout",{auth:i,ctx:e,user:r});e.error(new t("Access Denied"))})}renew(e,t,i,r){return xe(this,void 0,void 0,function*(){var n;const{auth:o,token:s}=null!==(n=yield this.authService.renew(i).catch(t=>{e.error(t)}))&&void 0!==n?n:{};o&&s&&(o.user_agent=t,yield o.save().catch(this.error),e.json({token:s}),r.emit("auth.renew",{auth:o,ctx:e}),this.emit("auth.renew",{auth:o,ctx:e}))})}user(e,t){return xe(this,void 0,void 0,function*(){const{groups:i,permissions:r,profile:n}=e.req;if(!i||!r)return e.error(new o);e.json(Object.assign(Object.assign({},G(["username","description"],t.toJSON())),{groups:i,permissions:r,profile:n}))})}};Pe([h("/login"),m(e=>({username:e.string().min(3).required(),password:e.string().min(5).required(),remember:e.boolean().parse().empty(!1)})),we(0,l()),we(1,u("user-agent")),we(2,_("username")),we(3,_("password")),we(4,_("remember")),we(5,E()),be("design:type",Function),be("design:paramtypes",[r,String,String,String,Boolean,Application]),be("design:returntype",Promise)],mt.prototype,"login",null),Pe([g("/logout"),Me(),we(0,l()),we(1,Le()),we(2,$e()),we(3,E()),be("design:type",Function),be("design:paramtypes",[r,Je,it,Application]),be("design:returntype",Promise)],mt.prototype,"logout",null),Pe([h("/renew"),m(e=>({token:e.string().required()})),we(0,l()),we(1,u("user-agent")),we(2,_("token")),we(3,E()),be("design:type",Function),be("design:paramtypes",[r,String,String,Application]),be("design:returntype",Promise)],mt.prototype,"renew",null),Pe([g(),Me(),we(0,l()),we(1,$e()),be("design:type",Function),be("design:paramtypes",[r,it]),be("design:returntype",Promise)],mt.prototype,"user",null),mt=Pe([y("/auth"),c(vt),we(0,me(ct)),be("design:paramtypes",[ct])],mt);let _t=class CrudController extends yt{constructor(){super(...arguments),this._crud={}}CrudArgumentsCreate(e){return{ctx:e}}CrudArgumentsFindAll(e){return{ctx:e}}CrudArgumentsFindOne(e){return{ctx:e}}CrudArgumentsDelete(e){return{ctx:e}}CrudArgumentsUpdate(e){return{ctx:e}}CrudValidationCreate(){return this._crud}CrudValidationUpdate(){return this._crud}add(e){return xe(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return xe(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}del(e){return xe(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return xe(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return xe(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validationCreate(e){return xe(this,void 0,void 0,function*(){if(this.CrudValidationCreate()==this._crud)return e.error(new o)})}validationUpdate(e){return xe(this,void 0,void 0,function*(){if(this.CrudValidationUpdate()==this._crud)return e.error(new o)})}};Pe([h(),Me(),ke(),f("validationCreate"),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],_t.prototype,"add",null),Pe([g(),Me(),Ne(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],_t.prototype,"all",null),Pe([A("/:id"),Me(),je(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],_t.prototype,"del",null),Pe([g("/:id"),Me(),Ne(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],_t.prototype,"get",null),Pe([S("/:id"),Me(),Be(),f("validationUpdate"),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],_t.prototype,"set",null),Pe([we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],_t.prototype,"validationCreate",null),Pe([we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],_t.prototype,"validationUpdate",null),_t=Pe([c(yt)],_t);let Et=class FilesController extends vt{constructor(){super(...arguments),this.directory=Env.API_HTTP_PUBLIC||"./",this.permissions=["delete","download","edit","list","read","rename","upload","write"]}files(e){return xe(this,void 0,void 0,function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const i=Te(this.directory,t);if(!Ee(i)||!fe(i).isDirectory())return e.error(new n);let r=[];return r=Ae(i),r=r.map(e=>this.info(Te(i,e))),r=r.filter(V),Object.assign(Object.assign({},this.info(i)),{files:r})})}info(e){if(!Ee(e))return null;const t=fe(e),i=e.split("/").pop();e=e.replace(this.directory,"/").replace(/^\/\//,"/");const r=t.isDirectory();return{name:i,path:e.replace(/^\/\//,"/"),size:t.size,extension:r?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:r,symlink:t.isSymbolicLink()}}name(){return"files"}sync(){return xe(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=$(e.replace(/_/g," ")," "),i={description:"",state:!0};yield H(this.permissions,r=>xe(this,void 0,void 0,function*(){const n=`${e}.${r}`;yield Xe.findOrCreate({where:{key:n},defaults:Object.assign({name:`${t} ${$(r," ")}`,key:n,tag:t},i)})}))})}};Pe([g("/path"),g("/path/*path"),Me(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],Et.prototype,"files",null),Et=Pe([y("/files"),c(vt)],Et);let ft=class ForgotController extends vt{check(e,t){return xe(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i||!i.user)return e.error(new n);i.secret=W(),yield i.save(),e.json({token:i.secret})})}forgot(e,t,i){return xe(this,void 0,void 0,function*(){yield q(Env.API_SLEEP_FORGOT);const r=t,o=yield it.findOne({where:{[le.or]:[{email:r},{username:t}]}}).catch(this.error);if(!o)return e.error(new n);const s=W(),d=Date.now()+6e4*Env.API_TOKEN_FORGOT,a=yield ot.create({token:s,timestamp:d,state:!0,user_id:o.id});e.success("OK"),i.emit("forgot.send",{ctx:e,forgot:a,user:o}),this.emit("forgot.send",{ctx:e,forgot:a,user:o})})}reset(e,t,i,r){return xe(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i)return e.error(new n);i.state=!1,yield i.save().catch(this.error),yield i.user.save().catch(this.error),e.success("OK"),r.emit("forgot.reset",{ctx:e,user:i.user}),this.emit("forgot.reset",{ctx:e,user:i.user})})}find(e){return xe(this,void 0,void 0,function*(){return yield ot.findOne({where:{token:e,state:!0},include:[{model:it,required:!0}]}).catch(this.error)})}};Pe([g("/check"),m(e=>({token:e.string().required()})),we(0,l()),we(1,_("token")),be("design:type",Function),be("design:paramtypes",[r,String]),be("design:returntype",Promise)],ft.prototype,"check",null),Pe([h(),m(e=>({username:e.string().min(4).required()})),we(0,l()),we(1,_("username")),we(2,E()),be("design:type",Function),be("design:paramtypes",[r,String,Application]),be("design:returntype",Promise)],ft.prototype,"forgot",null),Pe([h("/reset"),m(e=>({token:e.string().required(),password:e.string().min(5).required()})),we(0,l()),we(1,_("token")),we(2,_("password")),we(3,E()),be("design:type",Function),be("design:paramtypes",[r,String,String,Application]),be("design:returntype",Promise)],ft.prototype,"reset",null),ft=Pe([y("/forgot"),c(vt)],ft);let At=class GroupsController extends _t{constructor(){super(...arguments),this.model=Qe,this.schemaCreate={name:z.string().required(),description:z.string().empty(""),state:z.boolean().parse().required()},this.schemaUpdate={name:z.string().empty(),description:z.string().empty(),state:z.boolean().parse().empty()}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}};At=Pe([y("/groups"),c(_t)],At);let St=class GroupsPermissionsController extends yt{constructor(){super(...arguments),this.model=Ze}all(e,t){return xe(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{group_id:t},include:[{model:Xe,required:!0}]},callback:e=>e.map(e=>e.permission)})})}me(e,t){return xe(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(e,t,i){return xe(this,void 0,void 0,function*(){const r=yield Qe.findByPk(t,{attributes:["id"]}).catch(this.error);if(!r)return e.error(new n);const o=r.id,s=[];yield H(i,t=>xe(this,void 0,void 0,function*(){var i;if(!(yield Xe.count({where:{id:t}})))return;const[r]=null!==(i=yield Ze.findOrCreate(Object.assign({where:{group_id:o,permission_id:t},defaults:{group_id:o,permission_id:t}},{ctx:e})).catch(this.error))&&void 0!==i?i:[];r&&s.push(t)})),yield Ze.destroy(Object.assign({where:{group_id:o,permission_id:{[le.notIn]:s}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}};Pe([g("/:id/permissions"),Me(),Ne("groups"),we(0,l()),we(1,O("id")),be("design:type",Function),be("design:paramtypes",[r,String]),be("design:returntype",Promise)],St.prototype,"all",null),Pe([g("/permissions"),Me(),Ne("users"),we(0,l()),we(1,$e()),be("design:type",Function),be("design:paramtypes",[r,it]),be("design:returntype",Promise)],St.prototype,"me",null),Pe([S("/:id/permissions"),Me(),Be("groups"),m(e=>({permissions:e.array(e.string())})),we(0,l()),we(1,O("id")),we(2,_("permissions")),be("design:type",Function),be("design:paramtypes",[r,String,Array]),be("design:returntype",Promise)],St.prototype,"set",null),St=Pe([y("/groups"),c(yt)],St);let Ot=class LogsController extends yt{constructor(){super(...arguments),this.model=st,this.permissions=["read"]}all(e){return xe(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{order:[["created_at","DESC"]]},limited:!0})})}};Pe([g(),Me(),Ne(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],Ot.prototype,"all",null),Ot=Pe([y("/logs"),c(yt)],Ot);let It=class PermissionsController extends _t{constructor(){super(...arguments),this.model=Xe,this.schemaCreate={name:z.string().required(),key:z.string().required(),tag:z.string().required(),description:z.string().empty(""),state:z.boolean().parse().required()},this.schemaUpdate={name:z.string().empty(),key:z.string().empty(),tag:z.string().empty(),description:z.string().empty(),state:z.boolean().parse().empty()}}CrudValidationCreate(){return this.schemaCreate}CrudValidationUpdate(){return this.schemaUpdate}};It=Pe([y("/permissions"),c(_t)],It);let Tt=class RegisterController extends vt{register(e,t,i){return xe(this,void 0,void 0,function*(){yield q(Env.API_SLEEP_REGISTRY);const{name:r,date:n,email:s,username:d,password:a,confirm:l}=t,u=d||s,p=x(a);if(yield it.count({where:{[le.or]:[{email:s},{username:u}]}}).catch(this.error))return e.error("INVALID EMAIL OR USERNAME");if(p!=x(l))return e.error("INVALID PASSWORD");const c=yield it.create({name:r,email:s,username:u,password:p,avatar:"",date:n,description:"",state:!1}).catch(this.error);if(!c)return e.error(new o);const g=yield ze.create({token:yield this.getId(),user_id:c.id,state:!0}).catch(this.error);if(!g)return yield c.destroy().catch(this.error),e.error(new o);e.success("OK"),i.emit("register.user",{ctx:e,register:g,user:c}),this.emit("register.user",{ctx:e,register:g,user:c})})}confirm(e,t,i){return xe(this,void 0,void 0,function*(){const r=yield ze.findOne({where:{token:t,state:!0},include:[{model:it,required:!0}]}).catch(this.error);if(!r)return e.error(new n);r.state=!1,yield r.save().catch(this.error),r.user.state=!0,yield r.user.save().catch(this.error),e.success("OK"),i.emit("register.confirm",{ctx:e,register:r,user:r.user}),this.emit("register.confirm",{ctx:e,register:r,user:r.user})})}send(e,t,i){return xe(this,void 0,void 0,function*(){const r=t,o=yield ze.findOne({where:{state:!0},include:[{model:it,required:!0,where:{[le.or]:[{email:r},{username:t}]}}]}).catch(this.error);if(!o)return e.error(new n);e.success("OK"),i.emit("register.send",{ctx:e,register:o,user:o.user}),this.emit("register.send",{ctx:e,register:o,user:o.user})})}getId(){return xe(this,void 0,void 0,function*(){const e=B();return(yield ze.count({where:{token:e}}))?this.getId():e})}};Pe([h(),m(e=>({name:e.string().required(),date:e.date().required(),email:e.string().email().required(),username:e.string().min(4).empty(),password:e.string().min(5).required(),confirm:e.string().min(5).required()})),we(0,l()),we(1,_()),we(2,E()),be("design:type",Function),be("design:paramtypes",[r,Object,Application]),be("design:returntype",Promise)],Tt.prototype,"register",null),Pe([h("/confirm"),m(e=>({token:e.string().required()})),we(0,l()),we(1,_("token")),we(2,E()),be("design:type",Function),be("design:paramtypes",[r,String,Application]),be("design:returntype",Promise)],Tt.prototype,"confirm",null),Pe([h("/send"),m(e=>({username:e.string().min(4).required()})),we(0,l()),we(1,_("username")),we(2,E()),be("design:type",Function),be("design:paramtypes",[r,String,Application]),be("design:returntype",Promise)],Tt.prototype,"send",null),Tt=Pe([y("/register"),c(vt)],Tt);let Pt=class SetupController extends vt{setup(e){return xe(this,void 0,void 0,function*(){var t;if(yield it.count())return e.success("OK");const i=W(),r=yield it.create({name:"Admin",email:"admin@localhost",username:"admin",password:x("admin"+i),salt:i,token:"",avatar:"",date:new Date,description:"DEFAULT",state:!0},Object.assign({},{ctx:e}));yield tt.create({value:"admin",state:!0,user_id:r.id});const n=yield Qe.create(Object.assign({name:"Admin"},{description:"API CORE",state:!0}),Object.assign({},{ctx:e}));yield et.create({user_id:r.id,group_id:n.id},Object.assign({},{ctx:e}));const o=null!==(t=yield Xe.findAll({where:{state:!0}}).catch(this.error))&&void 0!==t?t:[];yield H(o,t=>xe(this,void 0,void 0,function*(){yield Ze.create({group_id:n.id,permission_id:t.id},Object.assign({},{ctx:e}))})),e.success("OK")})}};Pe([g(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],Pt.prototype,"setup",null),Pt=Pe([y("/setup"),c(vt)],Pt);let wt=class UsersController extends yt{constructor(){super(),this.model=it,this.path=Env.API_HTTP_PUBLIC+"/avatar",Env.API_HTTP_PUBLIC&&Ee(Env.API_HTTP_PUBLIC)&&!Ee(this.path)&&Se(this.path)}avatar(e,t){return xe(this,void 0,void 0,function*(){var i,r;const n=e.getFiles();if(n.file&&n.file.length){const{filename:s,path:d}=null!==(i=n.file[0])&&void 0!==i?i:{};if(s){const[i]=null!==(r=yield ut.findOrCreate(Object.assign({where:{key:"avatar",user_id:t.id},defaults:{key:"avatar",user_id:t.id}},{ctx:e})).catch(this.error))&&void 0!==r?r:[];if(!i)return Oe(d).isFile()&&Ie(d),e.error(new o);const n=this.path+"/"+i.value;if(Ee(n)&&Oe(n).isFile()&&Ie(n),i.value=s,yield i.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK")}}e.success("Record not Changed")})}token_new(){return xe(this,void 0,void 0,function*(){var e;const t=B();return(null!==(e=yield this.model.count({where:{token:t}}).catch(this.error))&&void 0!==e?e:0)?this.token_new():t})}add(e){return xe(this,void 0,void 0,function*(){yield this.create({ctx:e})})}all(e){return xe(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}del(e,t,i){return xe(this,void 0,void 0,function*(){if(i.id.toString()==t)return e.error(new n);yield this.delete({ctx:e})})}get(e){return xe(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e){return xe(this,void 0,void 0,function*(){yield this.update({ctx:e})})}};Pe([h("/avatar"),Me(),I({file:{count:1,path:`${Env.API_HTTP_PUBLIC}/avatar`,types:["image/bmp","image/jpeg","image/png"],size:32}}),we(0,l()),we(1,$e()),be("design:type",Function),be("design:paramtypes",[r,it]),be("design:returntype",Promise)],wt.prototype,"avatar",null),Pe([h(),Me(),ke(),m(e=>({name:e.string().required(),email:e.string().email().required(),username:e.string().min(3).required(),description:e.string().empty(""),state:e.boolean().parse().empty(!0)})),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],wt.prototype,"add",null),Pe([g(),Me(),Ne(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],wt.prototype,"all",null),Pe([A("/:id"),Me(),je(),we(0,l()),we(1,O("id")),we(2,$e()),be("design:type",Function),be("design:paramtypes",[r,String,it]),be("design:returntype",Promise)],wt.prototype,"del",null),Pe([g("/:id"),Me(),Ne(),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],wt.prototype,"get",null),Pe([S("/:id"),Me(),Be(),m(e=>({name:e.string().empty(),email:e.string().email().empty(),username:e.string().min(3).empty(),description:e.string().empty(),state:e.boolean().parse().empty()})),we(0,l()),be("design:type",Function),be("design:paramtypes",[r]),be("design:returntype",Promise)],wt.prototype,"set",null),wt=Pe([y("/users"),c(yt),be("design:paramtypes",[])],wt);let bt=class UsersGroupsController extends yt{constructor(){super(...arguments),this.model=et}all(e,t){return xe(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{where:{user_id:t},include:[{model:Qe,required:!0}]},callback:e=>e.map(e=>e.group)})})}me(e,t){return xe(this,void 0,void 0,function*(){yield this.all(e,t.id.toString())})}set(e,t,i){return xe(this,void 0,void 0,function*(){const r=yield it.findByPk(t,{attributes:["id"]}).catch(this.error);if(!r)return e.error(new n);const o=r.id,s=[];yield H(i,t=>xe(this,void 0,void 0,function*(){var i;if(!(yield Qe.count({where:{id:t}})))return;const[r]=null!==(i=yield et.findOrCreate(Object.assign({where:{user_id:o,group_id:t},defaults:{user_id:o,group_id:t}},{ctx:e})).catch(this.error))&&void 0!==i?i:[];r&&s.push(t)})),yield et.destroy(Object.assign({where:{user_id:o,group_id:{[le.notIn]:s}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}};Pe([g("/:id/groups"),Me(),Ne("users"),we(0,l()),we(1,O("id")),be("design:type",Function),be("design:paramtypes",[r,String]),be("design:returntype",Promise)],bt.prototype,"all",null),Pe([g("/groups"),Me(),Ne("users"),we(0,l()),we(1,$e()),be("design:type",Function),be("design:paramtypes",[r,it]),be("design:returntype",Promise)],bt.prototype,"me",null),Pe([S("/:id/groups"),Me(),Be("users"),m(e=>({groups:e.array(e.string())})),we(0,l()),we(1,O("id")),we(2,_("groups")),be("design:type",Function),be("design:paramtypes",[r,String,Array]),be("design:returntype",Promise)],bt.prototype,"set",null),bt=Pe([y("/users"),c(yt)],bt);export{Application,We as Audit,rt as AuditModel,ht as AuditsController,mt as AuthController,ct as AuthService,vt as BaseController,ke as CanCreate,je as CanDelete,Ne as CanRead,Be as CanUpdate,Config,nt as ConfigModel,_t as CrudController,Env,Et as FilesController,ft as ForgotController,ot as ForgotModel,Qe as GroupModel,Ze as GroupPermissionModel,At as GroupsController,St as GroupsPermissionsController,Ke as HasGroups,Ue as HasPermissions,Me as IsAuthenticated,Log,st as LogModel,Loggable,Ot as LogsController,dt as MigrationModel,yt as ModelController,ModelService,Xe as PermissionModel,It as PermissionsController,Tt as RegisterController,ze as RegisterModel,Le as ReqAuth,Fe as ReqGroup,He as ReqGroups,qe as ReqPermission,Ye as ReqPermissions,$e as ReqUser,pt as Service,at as SessionModel,SessionStore,Pt as SetupController,Je as UserAuthModel,et as UserGroupModel,lt as UserMetadataModel,it as UserModel,tt as UserPasswordModel,ut as UserProfileModel,gt as UserService,wt as UsersController,bt as UsersGroupsController,Re as canFactory,Ce as sequelize};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrewcaires/api",
3
- "version": "4.5.1",
3
+ "version": "5.0.0",
4
4
  "description": "Simple api for small applications using express, jsonwebtoken, sequelize and websocket",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs.js",
@@ -46,13 +46,15 @@
46
46
  },
47
47
  "homepage": "https://github.com/andrewcaires/npm/tree/main/api#readme",
48
48
  "dependencies": {
49
- "@andrewcaires/express": "^1.2.7",
50
- "@andrewcaires/node": "^1.2.9",
51
- "@andrewcaires/sequelize": "^2.0.2",
52
- "@andrewcaires/utils.js": "^0.4.20",
53
- "cors": "^2.8.5",
49
+ "@andrewcaires/decorator": "^1.1.1",
50
+ "@andrewcaires/express": "^2.0.4",
51
+ "@andrewcaires/node": "^1.2.10",
52
+ "@andrewcaires/sequelize": "^3.0.0",
53
+ "@andrewcaires/utils.js": "^0.4.26",
54
+ "bcrypt": "^6.0.0",
55
+ "cors": "^2.8.6",
54
56
  "dotenv": "^17.2.3",
55
- "express-session": "^1.18.2",
57
+ "express-session": "^1.19.0",
56
58
  "jsonwebtoken": "^9.0.3",
57
59
  "tsx": "^4.21.0",
58
60
  "ws": "^8.19.0"
@@ -61,16 +63,17 @@
61
63
  "@rollup/plugin-commonjs": "^29.0.0",
62
64
  "@rollup/plugin-terser": "^0.4.4",
63
65
  "@rollup/plugin-typescript": "^12.3.0",
66
+ "@types/bcrypt": "^6.0.0",
64
67
  "@types/cors": "^2.8.19",
65
68
  "@types/express-session": "^1.18.2",
66
69
  "@types/jsonwebtoken": "^9.0.10",
67
- "@types/node": "^25.0.8",
70
+ "@types/node": "^25.0.10",
68
71
  "@types/ws": "^8.18.1",
69
72
  "eslint": "^9.39.2",
70
73
  "mariadb": "^3.4.5",
71
- "rollup": "^4.55.1",
74
+ "rollup": "^4.56.0",
72
75
  "rollup-plugin-dts": "^6.3.0",
73
76
  "tslib": "^2.8.1",
74
- "typescript-eslint": "^8.53.0"
77
+ "typescript-eslint": "^8.53.1"
75
78
  }
76
79
  }