create-entity-app-server 0.1.16 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-create/template/.gateway-version +1 -1
- package/dist-create/template/app/plugins/ocr/cache.ts +1 -1
- package/dist-create/template/app/plugins/ocr/config.ts +1 -1
- package/dist-create/template/app/plugins/ocr/direction.ts +1 -1
- package/dist-create/template/app/plugins/ocr/dispatch.ts +1 -1
- package/dist-create/template/app/plugins/ocr/entity-adapter.ts +1 -1
- package/dist-create/template/app/plugins/ocr/errors.ts +1 -1
- package/dist-create/template/app/plugins/ocr/handlers.ts +1 -1
- package/dist-create/template/app/plugins/ocr/index.ts +1 -1
- package/dist-create/template/app/plugins/ocr/llm-parser.ts +1 -1
- package/dist-create/template/app/plugins/ocr/parsing-pipeline.ts +1 -1
- package/dist-create/template/app/plugins/ocr/pdf-converter.ts +1 -1
- package/dist-create/template/app/plugins/ocr/preprocessor.ts +1 -1
- package/dist-create/template/app/plugins/ocr/providers/aws.ts +1 -1
- package/dist-create/template/app/plugins/ocr/providers/azure.ts +1 -1
- package/dist-create/template/app/plugins/ocr/providers/google.ts +1 -1
- package/dist-create/template/app/plugins/ocr/providers/index.ts +1 -1
- package/dist-create/template/app/plugins/ocr/providers/naver.ts +1 -1
- package/dist-create/template/app/plugins/ocr/providers/tesseract.ts +1 -1
- package/dist-create/template/app/plugins/ocr/providers/upstage.ts +1 -1
- package/dist-create/template/app/plugins/ocr/quota.ts +1 -1
- package/dist-create/template/app/plugins/ocr/refiner.ts +1 -1
- package/dist-create/template/app/plugins/ocr/routes.ts +1 -1
- package/dist-create/template/app/plugins/ocr/service.ts +1 -1
- package/dist-create/template/app/plugins/ocr/template-loader.ts +1 -1
- package/dist-create/template/app/plugins/ocr/template-matcher.ts +1 -1
- package/dist-create/template/app/plugins/ocr/types/config.ts +1 -1
- package/dist-create/template/app/plugins/ocr/types/driver.ts +1 -1
- package/dist-create/template/app/plugins/ocr/types/index.ts +1 -1
- package/dist-create/template/app/plugins/ocr/types/parsed.ts +1 -1
- package/dist-create/template/app/plugins/ocr/types/store.ts +1 -1
- package/dist-create/template/app/plugins/ocr/types/template.ts +1 -1
- package/dist-create/template/app/plugins/ocr/utils.ts +1 -1
- package/dist-create/template/app/plugins/smtp/config.ts +41 -1
- package/dist-create/template/app/plugins/smtp/handlers.ts +52 -1
- package/dist-create/template/app/plugins/smtp/index.ts +33 -1
- package/dist-create/template/app/plugins/smtp/routes.ts +19 -1
- package/dist-create/template/app/plugins/smtp/types/config.ts +8 -1
- package/dist-create/template/app/plugins/smtp/types/index.ts +1 -1
- package/dist-create/template/docs/configs.md +7 -7
- package/dist-create/template/docs/scripts-guide.md +49 -19
- package/dist-create/template/scripts/build.sh +222 -0
- package/dist-create/template/scripts/run.sh +25 -6
- package/dist-create/template/scripts/service-install.sh +174 -0
- package/dist-create/template/scripts/service-remove.sh +102 -0
- package/dist-create/template/scripts/update-server.sh +25 -20
- package/dist-create/template/system-api.js +1 -1
- package/dist-create/template/system.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';function
|
|
1
|
+
'use strict';(function(_0x4fb4f1,_0x42f70a){var _0x55d262=_0x5821,_0x5ce359=_0x4fb4f1();while(!![]){try{var _0x14f92a=parseInt(_0x55d262(0xba))/0x1*(-parseInt(_0x55d262(0xb4))/0x2)+parseInt(_0x55d262(0xb3))/0x3+-parseInt(_0x55d262(0xb8))/0x4+parseInt(_0x55d262(0xb6))/0x5+parseInt(_0x55d262(0xbb))/0x6*(-parseInt(_0x55d262(0xb5))/0x7)+parseInt(_0x55d262(0xb9))/0x8*(parseInt(_0x55d262(0xb2))/0x9)+-parseInt(_0x55d262(0xb7))/0xa;if(_0x14f92a===_0x42f70a)break;else _0x5ce359['push'](_0x5ce359['shift']());}catch(_0x3a2dc0){_0x5ce359['push'](_0x5ce359['shift']());}}}(_0x9971,0x692ce));function _0x5821(_0x85b53a,_0x52271e){_0x85b53a=_0x85b53a-0xb2;var _0x9971f=_0x9971();var _0x58211e=_0x9971f[_0x85b53a];if(_0x5821['oySoMb']===undefined){var _0x2e9062=function(_0x43f00e){var _0x179803='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x230f06='',_0x2124ae='';for(var _0x5634b9=0x0,_0x1eae41,_0x5ad6b2,_0x2382ba=0x0;_0x5ad6b2=_0x43f00e['charAt'](_0x2382ba++);~_0x5ad6b2&&(_0x1eae41=_0x5634b9%0x4?_0x1eae41*0x40+_0x5ad6b2:_0x5ad6b2,_0x5634b9++%0x4)?_0x230f06+=String['fromCharCode'](0xff&_0x1eae41>>(-0x2*_0x5634b9&0x6)):0x0){_0x5ad6b2=_0x179803['indexOf'](_0x5ad6b2);}for(var _0x3838f3=0x0,_0x493172=_0x230f06['length'];_0x3838f3<_0x493172;_0x3838f3++){_0x2124ae+='%'+('00'+_0x230f06['charCodeAt'](_0x3838f3)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2124ae);};_0x5821['piMcao']=_0x2e9062,_0x5821['QDqxND']={},_0x5821['oySoMb']=!![];}var _0x2b85a3=_0x9971f[0x0],_0x182250=_0x85b53a+_0x2b85a3,_0x5e30c9=_0x5821['QDqxND'][_0x182250];return!_0x5e30c9?(_0x58211e=_0x5821['piMcao'](_0x58211e),_0x5821['QDqxND'][_0x182250]=_0x58211e):_0x58211e=_0x5e30c9,_0x58211e;}function _0x9971(){var _0x5b09e7=['nda4oty3mhjKs3rpAa','mtiYotm3nMriDfHlyW','nJrTzgTgCKC','n25OBKHsBq','nK9rteDVta','mtCZndKZCKn0Dvnj','mJa4odeYm2T2B0PVDa','nZuWotHgteDSswq','mtu0mdq0muLgBKzdrG','mZG5odC5mefAyu5NDW'];_0x9971=function(){return _0x5b09e7;};return _0x9971();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';(function(
|
|
1
|
+
'use strict';(function(_0x559947,_0x1c801f){var _0x207f50=_0x2bdf,_0x1ed4f4=_0x559947();while(!![]){try{var _0x4ef844=-parseInt(_0x207f50(0x1ee))/0x1+parseInt(_0x207f50(0x1ec))/0x2*(parseInt(_0x207f50(0x1f1))/0x3)+-parseInt(_0x207f50(0x1ea))/0x4*(parseInt(_0x207f50(0x1ef))/0x5)+parseInt(_0x207f50(0x1ed))/0x6*(parseInt(_0x207f50(0x1f4))/0x7)+-parseInt(_0x207f50(0x1f2))/0x8+-parseInt(_0x207f50(0x1eb))/0x9*(-parseInt(_0x207f50(0x1f0))/0xa)+parseInt(_0x207f50(0x1f3))/0xb;if(_0x4ef844===_0x1c801f)break;else _0x1ed4f4['push'](_0x1ed4f4['shift']());}catch(_0x1418a4){_0x1ed4f4['push'](_0x1ed4f4['shift']());}}}(_0x3379,0xe738b));export*from'./config.ts';export*from'./parsed.ts';function _0x2bdf(_0x194bb0,_0x1e9742){_0x194bb0=_0x194bb0-0x1ea;var _0x33790c=_0x3379();var _0x2bdf82=_0x33790c[_0x194bb0];if(_0x2bdf['bMqWHO']===undefined){var _0x5aa455=function(_0x6db3f7){var _0x503ac4='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x59c2bb='',_0x10777f='';for(var _0x567b59=0x0,_0xe3e56f,_0x4f93b0,_0x21c96e=0x0;_0x4f93b0=_0x6db3f7['charAt'](_0x21c96e++);~_0x4f93b0&&(_0xe3e56f=_0x567b59%0x4?_0xe3e56f*0x40+_0x4f93b0:_0x4f93b0,_0x567b59++%0x4)?_0x59c2bb+=String['fromCharCode'](0xff&_0xe3e56f>>(-0x2*_0x567b59&0x6)):0x0){_0x4f93b0=_0x503ac4['indexOf'](_0x4f93b0);}for(var _0x33175e=0x0,_0x2b5bff=_0x59c2bb['length'];_0x33175e<_0x2b5bff;_0x33175e++){_0x10777f+='%'+('00'+_0x59c2bb['charCodeAt'](_0x33175e)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x10777f);};_0x2bdf['uMrgMm']=_0x5aa455,_0x2bdf['bCpsBg']={},_0x2bdf['bMqWHO']=!![];}var _0xadfb8=_0x33790c[0x0],_0x58fbf5=_0x194bb0+_0xadfb8,_0x2a95ab=_0x2bdf['bCpsBg'][_0x58fbf5];return!_0x2a95ab?(_0x2bdf82=_0x2bdf['uMrgMm'](_0x2bdf82),_0x2bdf['bCpsBg'][_0x58fbf5]=_0x2bdf82):_0x2bdf82=_0x2a95ab,_0x2bdf82;}function _0x3379(){var _0x3833b2=['nKLABwLpAq','mtq0oduYmZjhrNHfu3G','mJyYmtK0ntD4qMHTD2W','mtmYmtzethDvugm','mJy1nZm3mLLAvej4vq','nJqWmZvpA3HsEK8','mtu0mte2ngjjsw1Yqq','ndaYnLzQv3nSsW','mti0mdm2mxvSrKPvsG','mtbRB0n4tgG','mtKWwuPOvgTw'];_0x3379=function(){return _0x3833b2;};return _0x3379();}export*from'./driver.ts';export*from'./template.ts';export*from'./store.ts';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';(function(
|
|
1
|
+
'use strict';(function(_0xc7d1fe,_0x3071df){var _0x4107d0=_0x22c1,_0x1f1135=_0xc7d1fe();while(!![]){try{var _0xe13e4=-parseInt(_0x4107d0(0xeb))/0x1+parseInt(_0x4107d0(0xed))/0x2*(parseInt(_0x4107d0(0xea))/0x3)+-parseInt(_0x4107d0(0xec))/0x4+-parseInt(_0x4107d0(0xe5))/0x5+parseInt(_0x4107d0(0xe8))/0x6*(-parseInt(_0x4107d0(0xe3))/0x7)+-parseInt(_0x4107d0(0xe7))/0x8*(-parseInt(_0x4107d0(0xe9))/0x9)+parseInt(_0x4107d0(0xe4))/0xa*(parseInt(_0x4107d0(0xe6))/0xb);if(_0xe13e4===_0x3071df)break;else _0x1f1135['push'](_0x1f1135['shift']());}catch(_0x1b523b){_0x1f1135['push'](_0x1f1135['shift']());}}}(_0x2e8e,0x9ca06));function _0x22c1(_0xbabe6a,_0x21df13){_0xbabe6a=_0xbabe6a-0xe3;var _0x2e8e37=_0x2e8e();var _0x22c1d5=_0x2e8e37[_0xbabe6a];if(_0x22c1['GphXng']===undefined){var _0x3b15ac=function(_0x325a76){var _0x19846d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x39633a='',_0x277cda='';for(var _0x3f72c9=0x0,_0x198754,_0x10556e,_0xd8945d=0x0;_0x10556e=_0x325a76['charAt'](_0xd8945d++);~_0x10556e&&(_0x198754=_0x3f72c9%0x4?_0x198754*0x40+_0x10556e:_0x10556e,_0x3f72c9++%0x4)?_0x39633a+=String['fromCharCode'](0xff&_0x198754>>(-0x2*_0x3f72c9&0x6)):0x0){_0x10556e=_0x19846d['indexOf'](_0x10556e);}for(var _0x317ce2=0x0,_0x84979a=_0x39633a['length'];_0x317ce2<_0x84979a;_0x317ce2++){_0x277cda+='%'+('00'+_0x39633a['charCodeAt'](_0x317ce2)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x277cda);};_0x22c1['jbABzC']=_0x3b15ac,_0x22c1['QtMOeA']={},_0x22c1['GphXng']=!![];}var _0xcc1533=_0x2e8e37[0x0],_0x2fce78=_0xbabe6a+_0xcc1533,_0x5c194b=_0x22c1['QtMOeA'][_0x2fce78];return!_0x5c194b?(_0x22c1d5=_0x22c1['jbABzC'](_0x22c1d5),_0x22c1['QtMOeA'][_0x2fce78]=_0x22c1d5):_0x22c1d5=_0x5c194b,_0x22c1d5;}function _0x2e8e(){var _0x5bd4d1=['mti3mJm0mKTxCuDVuq','mJiWnJKXAxfLA3jO','mJm4ntm2oe9rA0LbqW','mKjKC1bbrq','nJqZmZq4m2zoq29Vrq','odG2nZqWwLrfzxne','ndiXodKZmfH1sLPmyq','mZqXDxfizKXr','mtzUtvzUqwq','nMvhug5OrG','mJe3odK5CejQAvfP'];_0x2e8e=function(){return _0x5bd4d1;};return _0x2e8e();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';
|
|
1
|
+
'use strict';function _0x61d4(_0x40b8a4,_0x206f54){_0x40b8a4=_0x40b8a4-0x144;var _0x3ecf55=_0x3ecf();var _0x61d4c5=_0x3ecf55[_0x40b8a4];if(_0x61d4['apVhfR']===undefined){var _0x398121=function(_0x404ed4){var _0x15325d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x18f3b9='',_0x508e3e='';for(var _0x3b6452=0x0,_0x4b9f93,_0x106153,_0x4cd848=0x0;_0x106153=_0x404ed4['charAt'](_0x4cd848++);~_0x106153&&(_0x4b9f93=_0x3b6452%0x4?_0x4b9f93*0x40+_0x106153:_0x106153,_0x3b6452++%0x4)?_0x18f3b9+=String['fromCharCode'](0xff&_0x4b9f93>>(-0x2*_0x3b6452&0x6)):0x0){_0x106153=_0x15325d['indexOf'](_0x106153);}for(var _0x352dfd=0x0,_0x17c812=_0x18f3b9['length'];_0x352dfd<_0x17c812;_0x352dfd++){_0x508e3e+='%'+('00'+_0x18f3b9['charCodeAt'](_0x352dfd)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x508e3e);};_0x61d4['oJjjnq']=_0x398121,_0x61d4['jrdPfQ']={},_0x61d4['apVhfR']=!![];}var _0x5f01aa=_0x3ecf55[0x0],_0x430ff2=_0x40b8a4+_0x5f01aa,_0x12e990=_0x61d4['jrdPfQ'][_0x430ff2];return!_0x12e990?(_0x61d4c5=_0x61d4['oJjjnq'](_0x61d4c5),_0x61d4['jrdPfQ'][_0x430ff2]=_0x61d4c5):_0x61d4c5=_0x12e990,_0x61d4c5;}function _0x3ecf(){var _0x3d7e06=['nJq2mMXet0fvDq','ndyYndi1CvnYrM1L','mtfNswzosgu','mJG2m1HWDNfOta','mZy5mtK1m2PlCwvxqW','mZyYody4v1HSBunO','mZzKAhLKEwe','ofrZz3H2ua','nJi0mtKXme1HtfnAqG','mJm1mJnMBfv0txG','ndjws2vLr2m','mJe4mZuWEuL0rMfK'];_0x3ecf=function(){return _0x3d7e06;};return _0x3ecf();}(function(_0x46b6b1,_0x2a859d){var _0x312841=_0x61d4,_0x23e26c=_0x46b6b1();while(!![]){try{var _0x32caca=parseInt(_0x312841(0x148))/0x1+-parseInt(_0x312841(0x145))/0x2*(-parseInt(_0x312841(0x144))/0x3)+parseInt(_0x312841(0x14d))/0x4*(parseInt(_0x312841(0x146))/0x5)+-parseInt(_0x312841(0x147))/0x6*(parseInt(_0x312841(0x14a))/0x7)+-parseInt(_0x312841(0x14e))/0x8*(-parseInt(_0x312841(0x14b))/0x9)+-parseInt(_0x312841(0x14f))/0xa+-parseInt(_0x312841(0x149))/0xb*(parseInt(_0x312841(0x14c))/0xc);if(_0x32caca===_0x2a859d)break;else _0x23e26c['push'](_0x23e26c['shift']());}catch(_0x4030c4){_0x23e26c['push'](_0x23e26c['shift']());}}}(_0x3ecf,0x51e32));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';function
|
|
1
|
+
'use strict';function _0x1e94(_0x527cb4,_0x2b2012){_0x527cb4=_0x527cb4-0x170;var _0x116197=_0x1161();var _0x1e94df=_0x116197[_0x527cb4];if(_0x1e94['bamWqT']===undefined){var _0x2c493b=function(_0xf2e0c2){var _0x2d2f44='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x505fe7='',_0x235631='';for(var _0x2ef18e=0x0,_0x2702ae,_0x57bc33,_0x26b503=0x0;_0x57bc33=_0xf2e0c2['charAt'](_0x26b503++);~_0x57bc33&&(_0x2702ae=_0x2ef18e%0x4?_0x2702ae*0x40+_0x57bc33:_0x57bc33,_0x2ef18e++%0x4)?_0x505fe7+=String['fromCharCode'](0xff&_0x2702ae>>(-0x2*_0x2ef18e&0x6)):0x0){_0x57bc33=_0x2d2f44['indexOf'](_0x57bc33);}for(var _0x57b0f1=0x0,_0x45cce0=_0x505fe7['length'];_0x57b0f1<_0x45cce0;_0x57b0f1++){_0x235631+='%'+('00'+_0x505fe7['charCodeAt'](_0x57b0f1)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x235631);};_0x1e94['tvsGyK']=_0x2c493b,_0x1e94['Zbjosn']={},_0x1e94['bamWqT']=!![];}var _0x454f61=_0x116197[0x0],_0xa25d0f=_0x527cb4+_0x454f61,_0x1ebe04=_0x1e94['Zbjosn'][_0xa25d0f];return!_0x1ebe04?(_0x1e94df=_0x1e94['tvsGyK'](_0x1e94df),_0x1e94['Zbjosn'][_0xa25d0f]=_0x1e94df):_0x1e94df=_0x1ebe04,_0x1e94df;}(function(_0x4ee732,_0x31806e){var _0x55b327=_0x1e94,_0x9fdf97=_0x4ee732();while(!![]){try{var _0x4c522b=-parseInt(_0x55b327(0x174))/0x1*(parseInt(_0x55b327(0x178))/0x2)+parseInt(_0x55b327(0x17b))/0x3*(-parseInt(_0x55b327(0x176))/0x4)+parseInt(_0x55b327(0x175))/0x5*(-parseInt(_0x55b327(0x170))/0x6)+-parseInt(_0x55b327(0x173))/0x7+parseInt(_0x55b327(0x177))/0x8*(-parseInt(_0x55b327(0x172))/0x9)+-parseInt(_0x55b327(0x171))/0xa*(-parseInt(_0x55b327(0x17a))/0xb)+parseInt(_0x55b327(0x179))/0xc;if(_0x4c522b===_0x31806e)break;else _0x9fdf97['push'](_0x9fdf97['shift']());}catch(_0x174611){_0x9fdf97['push'](_0x9fdf97['shift']());}}}(_0x1161,0xd1980));function _0x1161(){var _0x4a2f17=['nJG4otyZCMjmBw5U','ndm1vxrWCNbu','mtG3nta0ohHmCMPesG','mJmWEeTwCfrH','owr6yMDMuq','mta2mZKWodnpuhjAr3q','mtfYt0jvwuK','nw9tDfrSuq','nZqWvNrhz01V','mtmWnde3mZzIq1jiwey','oda4nZrMrufbC1q','ndaYmJu5ntz6BvHZCNi'];_0x1161=function(){return _0x4a2f17;};return _0x1161();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';function
|
|
1
|
+
'use strict';function _0xbe23(_0x3edc4c,_0x4ae80c){_0x3edc4c=_0x3edc4c-0xe9;const _0x34c23c=_0x34c2();let _0xbe23de=_0x34c23c[_0x3edc4c];if(_0xbe23['dNSqep']===undefined){var _0x45cc4a=function(_0x2483a4){const _0x2454c4='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xb2cb5f='',_0x149ae8='';for(let _0x52f7de=0x0,_0x10a242,_0x5b76aa,_0x1401df=0x0;_0x5b76aa=_0x2483a4['charAt'](_0x1401df++);~_0x5b76aa&&(_0x10a242=_0x52f7de%0x4?_0x10a242*0x40+_0x5b76aa:_0x5b76aa,_0x52f7de++%0x4)?_0xb2cb5f+=String['fromCharCode'](0xff&_0x10a242>>(-0x2*_0x52f7de&0x6)):0x0){_0x5b76aa=_0x2454c4['indexOf'](_0x5b76aa);}for(let _0x3ea32a=0x0,_0x52562a=_0xb2cb5f['length'];_0x3ea32a<_0x52562a;_0x3ea32a++){_0x149ae8+='%'+('00'+_0xb2cb5f['charCodeAt'](_0x3ea32a)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x149ae8);};_0xbe23['NWrplj']=_0x45cc4a,_0xbe23['JDIcYT']={},_0xbe23['dNSqep']=!![];}const _0xeb3a49=_0x34c23c[0x0],_0x4248c9=_0x3edc4c+_0xeb3a49,_0x4dbe7a=_0xbe23['JDIcYT'][_0x4248c9];return!_0x4dbe7a?(_0xbe23de=_0xbe23['NWrplj'](_0xbe23de),_0xbe23['JDIcYT'][_0x4248c9]=_0xbe23de):_0xbe23de=_0x4dbe7a,_0xbe23de;}(function(_0x42d7ec,_0x3e58c5){const _0x493d62=_0xbe23,_0x2159a5=_0x42d7ec();while(!![]){try{const _0x39d87f=-parseInt(_0x493d62(0xef))/0x1*(parseInt(_0x493d62(0xf2))/0x2)+parseInt(_0x493d62(0xee))/0x3*(-parseInt(_0x493d62(0xec))/0x4)+parseInt(_0x493d62(0xf0))/0x5+-parseInt(_0x493d62(0xf4))/0x6*(parseInt(_0x493d62(0xf6))/0x7)+parseInt(_0x493d62(0xe9))/0x8+parseInt(_0x493d62(0xf3))/0x9*(-parseInt(_0x493d62(0xf1))/0xa)+parseInt(_0x493d62(0xf5))/0xb*(parseInt(_0x493d62(0xeb))/0xc);if(_0x39d87f===_0x3e58c5)break;else _0x2159a5['push'](_0x2159a5['shift']());}catch(_0x4ed93c){_0x2159a5['push'](_0x2159a5['shift']());}}}(_0x34c2,0xbfdab));import{execFile as _0x18e252}from'node:child_process';function _0x34c2(){const _0x30ae72=['ndKWoty0mejNruresW','mZbezhHLCui','mZm0q1Htr2rM','mta4ndC0m2TwtMXOEa','mJC1mtzLrvvUqKO','mtfYy3zUqvG','nZu2r1nOwhvH','odiZnJCYB0Hzruff','D2HPy2G','mZy3ndm3otzNwxrstfy','mZaWmJK5nKPut0X0za','sevLALu','nMvIChvWva','nJaWnhfgy29orq'];_0x34c2=function(){return _0x30ae72;};return _0x34c2();}import{promisify as _0x155539}from'node:util';const t=_0x155539(_0x18e252);export async function which(_0x293bdb){const _0x1478b0=_0xbe23,_0x114c50={'HEejU':function(_0x525641,_0x455977,_0x2a35db){return _0x525641(_0x455977,_0x2a35db);},'RPZyn':_0x1478b0(0xea)};try{return await _0x114c50[_0x1478b0(0xed)](t,_0x114c50['RPZyn'],[_0x293bdb]),!0x0;}catch{return!0x1;}}
|
|
@@ -1 +1,41 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* SMTP 플러그인 설정 로더
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { readFileSync } from "node:fs";
|
|
6
|
+
import { dirname, join } from "node:path";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { logger } from "@gateway/api";
|
|
9
|
+
import type { SmtpPluginConfig } from "./types/index.ts";
|
|
10
|
+
|
|
11
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const CONFIG_PATH = join(__dirname, "config.json");
|
|
13
|
+
|
|
14
|
+
/** SMTP 플러그인 설정을 로드한다 */
|
|
15
|
+
export function loadSmtpConfig(): SmtpPluginConfig | null {
|
|
16
|
+
try {
|
|
17
|
+
let raw = readFileSync(CONFIG_PATH, "utf-8");
|
|
18
|
+
|
|
19
|
+
// 환경변수 치환: ${VAR} → process.env.VAR
|
|
20
|
+
raw = raw.replace(
|
|
21
|
+
/\$\{([^}]+)\}/g,
|
|
22
|
+
(_match, name) => process.env[name] ?? "",
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
const cfg: SmtpPluginConfig = JSON.parse(raw);
|
|
26
|
+
|
|
27
|
+
if (cfg.enabled === false) {
|
|
28
|
+
logger.info("SMTP plugin routes disabled in config");
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return cfg;
|
|
33
|
+
} catch (err: unknown) {
|
|
34
|
+
if ((err as NodeJS.ErrnoException).code === "ENOENT") {
|
|
35
|
+
// config.json 없으면 기본값으로 활성화
|
|
36
|
+
return { enabled: true };
|
|
37
|
+
}
|
|
38
|
+
logger.error({ err }, "Failed to load SMTP config");
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -1 +1,52 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* SMTP API 핸들러
|
|
3
|
+
*
|
|
4
|
+
* 앱 서버가 직접 처리하는 이유:
|
|
5
|
+
* - 로컬 템플릿(templates/*.html) 렌더링 후 body_html을 완성하여 Go 서버로 전달
|
|
6
|
+
* - 프록시 패스스루로는 앱 서버 로컬 파일에 접근 불가
|
|
7
|
+
*
|
|
8
|
+
* 라우트에 없는 /api/v1/smtp/* 경로는 proxy/register.ts가 Go 서버로 패스스루한다.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { FastifyRequest, FastifyReply } from "fastify";
|
|
12
|
+
import { ok, fail, sendEmail, entityServer } from "@gateway/api";
|
|
13
|
+
import type { SendEmailParams } from "@gateway/api";
|
|
14
|
+
|
|
15
|
+
// ─── 핸들러 ──────────────────────────────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* POST /api/v1/smtp/send
|
|
19
|
+
*
|
|
20
|
+
* templateName이 지정되면 로컬 templates/ 에서 렌더링 후 Go 서버에 전달.
|
|
21
|
+
* templateName 없이 body_html/body_text만 지정하면 그대로 전달.
|
|
22
|
+
*/
|
|
23
|
+
export async function handleSend(request: FastifyRequest, reply: FastifyReply) {
|
|
24
|
+
const params = (request.body ?? {}) as SendEmailParams;
|
|
25
|
+
|
|
26
|
+
if (!params.to || params.to.length === 0) {
|
|
27
|
+
return reply.status(400).send(fail("to is required"));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const seq = await sendEmail(params);
|
|
31
|
+
return ok({ seq });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* GET /api/v1/smtp/status/:seq
|
|
36
|
+
*
|
|
37
|
+
* Go 서버에 발송 상태를 조회한다.
|
|
38
|
+
*/
|
|
39
|
+
export async function handleStatus(
|
|
40
|
+
request: FastifyRequest,
|
|
41
|
+
reply: FastifyReply,
|
|
42
|
+
) {
|
|
43
|
+
const { seq } = request.params as { seq: string };
|
|
44
|
+
const seqNum = Number(seq);
|
|
45
|
+
|
|
46
|
+
if (!seqNum || seqNum <= 0) {
|
|
47
|
+
return reply.status(400).send(fail("Invalid seq"));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const result = await entityServer.smtpStatus(seqNum);
|
|
51
|
+
return ok(result);
|
|
52
|
+
}
|
|
@@ -1 +1,33 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* SMTP 플러그인
|
|
3
|
+
*
|
|
4
|
+
* 앱 서버 내 모든 이메일 발송에 사용할 공유 레이아웃을 등록한다.
|
|
5
|
+
* 알파벳 순 플러그인 로드 중 초기화되며, 이후의 모든 renderTemplate 호출에서
|
|
6
|
+
* plugins/smtp/templates/layout.html 을 공통 래퍼로 사용한다.
|
|
7
|
+
*
|
|
8
|
+
* HTTP 라우트는 routes.ts 에서 등록하며, proxy/register.ts 의 패스스루보다
|
|
9
|
+
* 먼저 처리된다 (system/routes/loader.ts → system/proxy/register.ts 순서).
|
|
10
|
+
*
|
|
11
|
+
* - POST /api/v1/smtp/send → 로컬 템플릿 렌더링 후 Go 서버로 발송
|
|
12
|
+
* - GET /api/v1/smtp/status/:seq → Go 서버에 발송 상태 조회
|
|
13
|
+
*
|
|
14
|
+
* routes.ts에 없는 /api/v1/smtp/* 경로는 Go 서버로 패스스루된다.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import fp from "fastify-plugin";
|
|
18
|
+
import type { FastifyInstance } from "fastify";
|
|
19
|
+
import { dirname, join } from "node:path";
|
|
20
|
+
import { fileURLToPath } from "node:url";
|
|
21
|
+
import { setSharedLayout } from "@gateway/api";
|
|
22
|
+
import { logger } from "@gateway/api";
|
|
23
|
+
|
|
24
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
25
|
+
|
|
26
|
+
export default fp(
|
|
27
|
+
async (_app: FastifyInstance) => {
|
|
28
|
+
const layoutPath = join(__dirname, "templates", "layout.html");
|
|
29
|
+
setSharedLayout(layoutPath);
|
|
30
|
+
logger.debug({ layout: layoutPath }, "Email shared layout registered");
|
|
31
|
+
},
|
|
32
|
+
{ name: "smtp" },
|
|
33
|
+
);
|
|
@@ -1 +1,19 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* SMTP 라우트 테이블
|
|
3
|
+
* 등록 경로: /api/v1/smtp/*
|
|
4
|
+
*
|
|
5
|
+
* 여기서 처리되지 않는 /api/v1/smtp/* 경로는
|
|
6
|
+
* system/proxy/register.ts 에 의해 Go 서버로 패스스루된다.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { FastifyInstance } from "fastify";
|
|
10
|
+
import * as h from "./handlers.ts";
|
|
11
|
+
|
|
12
|
+
/** SMTP 라우트를 등록한다 */
|
|
13
|
+
export default async function smtpRoutes(app: FastifyInstance) {
|
|
14
|
+
// POST /api/v1/smtp/send — 로컬 템플릿 렌더링 후 Go 서버로 발송
|
|
15
|
+
app.post("/send", h.handleSend);
|
|
16
|
+
|
|
17
|
+
// GET /api/v1/smtp/status/:seq — 발송 상태 조회
|
|
18
|
+
app.get("/status/:seq", h.handleStatus);
|
|
19
|
+
}
|
|
@@ -1 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
/** plugins/smtp/config.json 스키마 */
|
|
2
|
+
export interface SmtpPluginConfig {
|
|
3
|
+
enabled: boolean; // 라우트 활성화 여부 (false면 routes.ts 등록 안 됨)
|
|
4
|
+
|
|
5
|
+
deploy?: boolean; // 빌드 시 dist에서 제외 여부
|
|
6
|
+
|
|
7
|
+
minify?: boolean; // 빌드 시 난독화 여부
|
|
8
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export * from "./config.ts";
|
|
@@ -67,14 +67,14 @@ DB_PASSWORD_DEVELOPMENT=password
|
|
|
67
67
|
|
|
68
68
|
### 항목 설명
|
|
69
69
|
|
|
70
|
-
| 항목 | 필수 | 설명
|
|
71
|
-
| -------------------- | :--: |
|
|
72
|
-
| `NODE_ENV` | ✅ | `development` \| `production` \| `test`
|
|
73
|
-
| `ENTITY_SERVER_URL` | ✅ | Entity Server 주소 — Entity Server의 `server.json` `port`(기본: 47200)와 일치
|
|
74
|
-
| `ENTITY_API_KEY` | ✅ | Entity Server 관리자 화면에서 발급한 API Key
|
|
75
|
-
| `ENTITY_HMAC_SECRET` | ✅ | API Key 발급 시 함께 제공되는 HMAC Secret, 32자 이상
|
|
70
|
+
| 항목 | 필수 | 설명 |
|
|
71
|
+
| -------------------- | :--: | --------------------------------------------------------------------------------------------------------- |
|
|
72
|
+
| `NODE_ENV` | ✅ | `development` \| `production` \| `test` |
|
|
73
|
+
| `ENTITY_SERVER_URL` | ✅ | Entity Server 주소 — Entity Server의 `server.json` `port`(기본: 47200)와 일치 |
|
|
74
|
+
| `ENTITY_API_KEY` | ✅ | Entity Server 관리자 화면에서 발급한 API Key |
|
|
75
|
+
| `ENTITY_HMAC_SECRET` | ✅ | API Key 발급 시 함께 제공되는 HMAC Secret, 32자 이상 |
|
|
76
76
|
| `JWT_SECRET` | ✅ | **Entity Server와 반드시 동일한 값**, 32자 이상 — Entity Server `configs/auth/jwt.json`의 `${JWT_SECRET}` |
|
|
77
|
-
| `DB_*` | - | `database.json`에서 `${변수명}` 형태로 참조할 때만 필요
|
|
77
|
+
| `DB_*` | - | `database.json`에서 `${변수명}` 형태로 참조할 때만 필요 |
|
|
78
78
|
|
|
79
79
|
### Entity Server 키 맞추기
|
|
80
80
|
|
|
@@ -6,16 +6,18 @@
|
|
|
6
6
|
|
|
7
7
|
## 목차
|
|
8
8
|
|
|
9
|
-
| 스크립트
|
|
10
|
-
|
|
|
11
|
-
| [run.sh](#1-runsh)
|
|
12
|
-
| [build.sh](#2-buildsh)
|
|
13
|
-
| [push.sh](#3-pushsh)
|
|
14
|
-
| [release.sh](#4-releasesh)
|
|
15
|
-
| [update-server.sh](#5-update-serversh)
|
|
16
|
-
| [
|
|
17
|
-
| [
|
|
18
|
-
| [
|
|
9
|
+
| 스크립트 | 용도 |
|
|
10
|
+
| ------------------------------------------ | ------------------------------------- |
|
|
11
|
+
| [run.sh](#1-runsh) | 서버 실행 (개발/프로덕션) |
|
|
12
|
+
| [build.sh](#2-buildsh) | TypeScript 빌드 + dist/ 패키징 |
|
|
13
|
+
| [push.sh](#3-pushsh) | 버전 관리 + Git push |
|
|
14
|
+
| [release.sh](#4-releasesh) | 빌드 + 버전업 + push (원스텝) |
|
|
15
|
+
| [update-server.sh](#5-update-serversh) | 최신 gateway 코어 업데이트 |
|
|
16
|
+
| [service-install.sh](#6-service-installsh) | systemd 서비스 등록 |
|
|
17
|
+
| [service-remove.sh](#7-service-removesh) | systemd 서비스 제거 |
|
|
18
|
+
| [entity.sh](#8-entitysh) | Gateway 전용 엔티티 테이블 생성 |
|
|
19
|
+
| [reset-all.sh](#9-reset-allsh) | Gateway 전용 엔티티 테이블 초기화 |
|
|
20
|
+
| [gen-table-type.sh](#10-gen-table-typesh) | 엔티티 → Kysely 테이블 타입 자동 생성 |
|
|
19
21
|
|
|
20
22
|
---
|
|
21
23
|
|
|
@@ -166,7 +168,7 @@ GitHub PR 기반으로 `현재 브랜치 -> main -> release` 승격을 진행합
|
|
|
166
168
|
생성된 Gateway 프로젝트의 코어 파일을 최신 npm 패키지 버전으로 업데이트합니다.
|
|
167
169
|
|
|
168
170
|
```bash
|
|
169
|
-
./scripts/update-server.sh
|
|
171
|
+
./scripts/update-server.sh # 도움말 + 현재 코어 버전 + 최신 버전 확인
|
|
170
172
|
./scripts/update-server.sh latest # 최신 버전으로 업데이트
|
|
171
173
|
./scripts/update-server.sh 0.0.8 # 특정 버전으로 업데이트
|
|
172
174
|
```
|
|
@@ -179,7 +181,7 @@ GitHub PR 기반으로 `현재 브랜치 -> main -> release` 승격을 진행합
|
|
|
179
181
|
|
|
180
182
|
- `system.js`
|
|
181
183
|
- `system-api.js`
|
|
182
|
-
- `scripts/run.sh`, `scripts/entity.sh`, `scripts/reset-all.sh`, `scripts/update-server.sh`
|
|
184
|
+
- `scripts/build.sh`, `scripts/run.sh`, `scripts/entity.sh`, `scripts/reset-all.sh`, `scripts/update-server.sh`, `scripts/service-install.sh`, `scripts/service-remove.sh`
|
|
183
185
|
- `docs/`
|
|
184
186
|
- `tsconfig.json`
|
|
185
187
|
- `.env.example`
|
|
@@ -197,7 +199,35 @@ GitHub PR 기반으로 `현재 브랜치 -> main -> release` 승격을 진행합
|
|
|
197
199
|
|
|
198
200
|
---
|
|
199
201
|
|
|
200
|
-
## 6)
|
|
202
|
+
## 6) service-install.sh
|
|
203
|
+
|
|
204
|
+
Gateway 프로젝트를 systemd 서비스로 등록합니다.
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
sudo ./scripts/service-install.sh
|
|
208
|
+
sudo ./scripts/service-install.sh --no-start
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
- 서비스명은 `configs/server.json`의 `namespace`를 기준으로 자동 계산됩니다.
|
|
212
|
+
- 기본값이 `entity-app-server`면 서비스명도 그대로 `entity-app-server`입니다.
|
|
213
|
+
- 실제 실행은 `./scripts/run.sh start`를 사용합니다.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 7) service-remove.sh
|
|
218
|
+
|
|
219
|
+
등록된 systemd 서비스를 중지하고 제거합니다.
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
sudo ./scripts/service-remove.sh
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
- 등록된 서비스가 없으면 안내만 출력하고 종료합니다.
|
|
226
|
+
- 다시 등록할 때는 `sudo ./scripts/service-install.sh`를 사용합니다.
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## 8) entity.sh
|
|
201
231
|
|
|
202
232
|
`entities/` 폴더의 JSON 스키마를 entity-server에 등록(테이블 생성)합니다.
|
|
203
233
|
|
|
@@ -236,7 +266,7 @@ GitHub PR 기반으로 `현재 브랜치 -> main -> release` 승격을 진행합
|
|
|
236
266
|
|
|
237
267
|
---
|
|
238
268
|
|
|
239
|
-
##
|
|
269
|
+
## 9) reset-all.sh
|
|
240
270
|
|
|
241
271
|
Gateway 전용 엔티티 테이블을 **드롭 후 재생성**합니다.
|
|
242
272
|
|
|
@@ -266,7 +296,7 @@ Gateway 전용 엔티티 테이블을 **드롭 후 재생성**합니다.
|
|
|
266
296
|
|
|
267
297
|
---
|
|
268
298
|
|
|
269
|
-
##
|
|
299
|
+
## 10) gen-table-type.sh
|
|
270
300
|
|
|
271
301
|
엔티티 JSON을 기준으로 Kysely 타입 정의를 생성합니다.
|
|
272
302
|
|
|
@@ -351,10 +381,10 @@ npm install
|
|
|
351
381
|
|
|
352
382
|
`.env` 파일에 아래 변수가 설정되어 있어야 합니다:
|
|
353
383
|
|
|
354
|
-
| 변수 | 설명
|
|
355
|
-
| -------------------- |
|
|
356
|
-
| `ENTITY_SERVER_URL` | 엔티티서버 주소
|
|
357
|
-
| `ENTITY_API_KEY` | 엔티티서버 API 키
|
|
384
|
+
| 변수 | 설명 |
|
|
385
|
+
| -------------------- | ------------------------------------- |
|
|
386
|
+
| `ENTITY_SERVER_URL` | 엔티티서버 주소 |
|
|
387
|
+
| `ENTITY_API_KEY` | 엔티티서버 API 키 |
|
|
358
388
|
| `ENTITY_HMAC_SECRET` | HMAC-SHA256 서명용 시크릿 (32자 이상) |
|
|
359
389
|
|
|
360
390
|
### 인증 방식
|