create-entity-app-server 0.1.15 → 0.2.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/bin/create.js +2 -2
- package/dist-create/template/.env +2 -2
- package/dist-create/template/.env.example +2 -2
- 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 +12 -14
- package/dist-create/template/docs/getting-started.md +5 -3
- package/dist-create/template/docs/scripts-guide.md +51 -22
- package/dist-create/template/scripts/run.sh +229 -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(_0x20b8b1,_0x9bcc2){var _0x98b45d=_0x435e,_0x497a72=_0x20b8b1();while(!![]){try{var _0x70b3f3=parseInt(_0x98b45d(0xe3))/0x1+-parseInt(_0x98b45d(0xe9))/0x2*(parseInt(_0x98b45d(0xea))/0x3)+parseInt(_0x98b45d(0xe7))/0x4+-parseInt(_0x98b45d(0xe5))/0x5*(parseInt(_0x98b45d(0xe8))/0x6)+-parseInt(_0x98b45d(0xe4))/0x7+parseInt(_0x98b45d(0xe6))/0x8+parseInt(_0x98b45d(0xeb))/0x9;if(_0x70b3f3===_0x9bcc2)break;else _0x497a72['push'](_0x497a72['shift']());}catch(_0x319cff){_0x497a72['push'](_0x497a72['shift']());}}}(_0x4f7a,0xea07c));function _0x435e(_0x4668f3,_0x9312a0){_0x4668f3=_0x4668f3-0xe3;var _0x4f7a4b=_0x4f7a();var _0x435eae=_0x4f7a4b[_0x4668f3];if(_0x435e['COKrYM']===undefined){var _0x61ee57=function(_0x4a4090){var _0x2f815a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x5afaca='',_0x39a48b='';for(var _0x188471=0x0,_0x3a0740,_0x144f8d,_0x165b2d=0x0;_0x144f8d=_0x4a4090['charAt'](_0x165b2d++);~_0x144f8d&&(_0x3a0740=_0x188471%0x4?_0x3a0740*0x40+_0x144f8d:_0x144f8d,_0x188471++%0x4)?_0x5afaca+=String['fromCharCode'](0xff&_0x3a0740>>(-0x2*_0x188471&0x6)):0x0){_0x144f8d=_0x2f815a['indexOf'](_0x144f8d);}for(var _0x4e5ab1=0x0,_0x202bb3=_0x5afaca['length'];_0x4e5ab1<_0x202bb3;_0x4e5ab1++){_0x39a48b+='%'+('00'+_0x5afaca['charCodeAt'](_0x4e5ab1)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x39a48b);};_0x435e['zgFKKv']=_0x61ee57,_0x435e['IXcOmU']={},_0x435e['COKrYM']=!![];}var _0x3e1089=_0x4f7a4b[0x0],_0x37e433=_0x4668f3+_0x3e1089,_0x14734e=_0x435e['IXcOmU'][_0x37e433];return!_0x14734e?(_0x435eae=_0x435e['zgFKKv'](_0x435eae),_0x435e['IXcOmU'][_0x37e433]=_0x435eae):_0x435eae=_0x14734e,_0x435eae;}function _0x4f7a(){var _0x2040d4=['otG2ndyWmgTJC0PQsq','mty2mZa2oeTsyNnRva','mtjVEfjdv0W','mtmZmtaYtKT5wwPs','ndjprM1lqKm','mtC2ndyWodrQyw1Qrvi','ndaWmJyYCfL3wwzf','nZeZmdmXmMjwB2Doua','mJC1mJe1nvf0DgDYqq'];_0x4f7a=function(){return _0x2040d4;};return _0x4f7a();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';
|
|
1
|
+
'use strict';function _0x39f5(_0x54d33a,_0x34cef6){_0x54d33a=_0x54d33a-0xd9;var _0x2e8032=_0x2e80();var _0x39f5bc=_0x2e8032[_0x54d33a];if(_0x39f5['aqSitj']===undefined){var _0x12c6e9=function(_0x1df15a){var _0x53f8fc='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x12ee89='',_0x2f8604='';for(var _0x46965f=0x0,_0x398d1c,_0x3f2b86,_0x429826=0x0;_0x3f2b86=_0x1df15a['charAt'](_0x429826++);~_0x3f2b86&&(_0x398d1c=_0x46965f%0x4?_0x398d1c*0x40+_0x3f2b86:_0x3f2b86,_0x46965f++%0x4)?_0x12ee89+=String['fromCharCode'](0xff&_0x398d1c>>(-0x2*_0x46965f&0x6)):0x0){_0x3f2b86=_0x53f8fc['indexOf'](_0x3f2b86);}for(var _0xc1e3c3=0x0,_0xd361da=_0x12ee89['length'];_0xc1e3c3<_0xd361da;_0xc1e3c3++){_0x2f8604+='%'+('00'+_0x12ee89['charCodeAt'](_0xc1e3c3)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2f8604);};_0x39f5['hFEvFT']=_0x12c6e9,_0x39f5['hvZdWk']={},_0x39f5['aqSitj']=!![];}var _0x4c4051=_0x2e8032[0x0],_0x466f4f=_0x54d33a+_0x4c4051,_0x450550=_0x39f5['hvZdWk'][_0x466f4f];return!_0x450550?(_0x39f5bc=_0x39f5['hFEvFT'](_0x39f5bc),_0x39f5['hvZdWk'][_0x466f4f]=_0x39f5bc):_0x39f5bc=_0x450550,_0x39f5bc;}(function(_0x2db981,_0xe3f89c){var _0x4039ea=_0x39f5,_0x4df43e=_0x2db981();while(!![]){try{var _0x193d96=-parseInt(_0x4039ea(0xd9))/0x1+parseInt(_0x4039ea(0xde))/0x2+parseInt(_0x4039ea(0xdb))/0x3+parseInt(_0x4039ea(0xdf))/0x4+parseInt(_0x4039ea(0xdd))/0x5+-parseInt(_0x4039ea(0xdc))/0x6+-parseInt(_0x4039ea(0xda))/0x7*(parseInt(_0x4039ea(0xe0))/0x8);if(_0x193d96===_0xe3f89c)break;else _0x4df43e['push'](_0x4df43e['shift']());}catch(_0x3c4b25){_0x4df43e['push'](_0x4df43e['shift']());}}}(_0x2e80,0x4403e));export*from'./config.ts';function _0x2e80(){var _0x89730a=['mZu0mdu2vgDIAKjz','mtKYofDpAwPhqW','mtreBuX5DLC','mZq1nZCXrLn5D3Le','mJq5nda3ngPwqNvhsa','mteWndy4mgrzqu5kyq','ntm1mtK4y1PtruvH','nZiZnJC2A1HmzNPo'];_0x2e80=function(){return _0x89730a;};return _0x2e80();}export*from'./parsed.ts';export*from'./driver.ts';export*from'./template.ts';export*from'./store.ts';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';(function(
|
|
1
|
+
'use strict';(function(_0x422a5b,_0xd7f40e){var _0x156827=_0x7716,_0x589d72=_0x422a5b();while(!![]){try{var _0x442bfb=parseInt(_0x156827(0x1df))/0x1+-parseInt(_0x156827(0x1da))/0x2+parseInt(_0x156827(0x1dd))/0x3+-parseInt(_0x156827(0x1d9))/0x4+parseInt(_0x156827(0x1de))/0x5+parseInt(_0x156827(0x1db))/0x6*(parseInt(_0x156827(0x1dc))/0x7)+parseInt(_0x156827(0x1d8))/0x8;if(_0x442bfb===_0xd7f40e)break;else _0x589d72['push'](_0x589d72['shift']());}catch(_0xb05455){_0x589d72['push'](_0x589d72['shift']());}}}(_0x1f27,0x64070));function _0x1f27(){var _0x3c4c74=['mtm1nteXmNPAqM5JsW','mJr6BMrpr0W','mJa0mJGXuu90z2rM','otaWmZG3sMTgD211','mtq0odm0nurAy1bxCq','nteWmdKXrLLhC05U','mZiYndq1nLjRBhjTwq','mJeYoty0mfPssMDuqW'];_0x1f27=function(){return _0x3c4c74;};return _0x1f27();}function _0x7716(_0xc4bf4a,_0x20e422){_0xc4bf4a=_0xc4bf4a-0x1d8;var _0x1f273d=_0x1f27();var _0x77163d=_0x1f273d[_0xc4bf4a];if(_0x7716['KPLdgj']===undefined){var _0x36af3a=function(_0x19040e){var _0x5947e2='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x20d315='',_0x4d5e5c='';for(var _0x843a83=0x0,_0x4126d9,_0x10b5af,_0x408b0b=0x0;_0x10b5af=_0x19040e['charAt'](_0x408b0b++);~_0x10b5af&&(_0x4126d9=_0x843a83%0x4?_0x4126d9*0x40+_0x10b5af:_0x10b5af,_0x843a83++%0x4)?_0x20d315+=String['fromCharCode'](0xff&_0x4126d9>>(-0x2*_0x843a83&0x6)):0x0){_0x10b5af=_0x5947e2['indexOf'](_0x10b5af);}for(var _0x367b0c=0x0,_0x80e40b=_0x20d315['length'];_0x367b0c<_0x80e40b;_0x367b0c++){_0x4d5e5c+='%'+('00'+_0x20d315['charCodeAt'](_0x367b0c)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4d5e5c);};_0x7716['hghHfX']=_0x36af3a,_0x7716['SnDacF']={},_0x7716['KPLdgj']=!![];}var _0xf1473d=_0x1f273d[0x0],_0x3e3bd3=_0xc4bf4a+_0xf1473d,_0x29c839=_0x7716['SnDacF'][_0x3e3bd3];return!_0x29c839?(_0x77163d=_0x7716['hghHfX'](_0x77163d),_0x7716['SnDacF'][_0x3e3bd3]=_0x77163d):_0x77163d=_0x29c839,_0x77163d;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';function
|
|
1
|
+
'use strict';(function(_0x51b8bc,_0x18eabf){var _0x646bf8=_0x46be,_0x1a700e=_0x51b8bc();while(!![]){try{var _0x2a6c50=parseInt(_0x646bf8(0x131))/0x1+parseInt(_0x646bf8(0x12f))/0x2*(-parseInt(_0x646bf8(0x135))/0x3)+parseInt(_0x646bf8(0x134))/0x4*(-parseInt(_0x646bf8(0x133))/0x5)+parseInt(_0x646bf8(0x138))/0x6*(parseInt(_0x646bf8(0x12e))/0x7)+parseInt(_0x646bf8(0x132))/0x8*(parseInt(_0x646bf8(0x130))/0x9)+parseInt(_0x646bf8(0x139))/0xa*(-parseInt(_0x646bf8(0x137))/0xb)+parseInt(_0x646bf8(0x12d))/0xc*(parseInt(_0x646bf8(0x136))/0xd);if(_0x2a6c50===_0x18eabf)break;else _0x1a700e['push'](_0x1a700e['shift']());}catch(_0x35aeac){_0x1a700e['push'](_0x1a700e['shift']());}}}(_0x5c78,0xb491f));function _0x46be(_0x176027,_0x39611c){_0x176027=_0x176027-0x12d;var _0x5c78e0=_0x5c78();var _0x46befa=_0x5c78e0[_0x176027];if(_0x46be['tIAjHf']===undefined){var _0x48a80a=function(_0x5743bc){var _0x53b002='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x43c75d='',_0x3d5d1b='';for(var _0x9f4716=0x0,_0x45292d,_0x466c97,_0x404fa6=0x0;_0x466c97=_0x5743bc['charAt'](_0x404fa6++);~_0x466c97&&(_0x45292d=_0x9f4716%0x4?_0x45292d*0x40+_0x466c97:_0x466c97,_0x9f4716++%0x4)?_0x43c75d+=String['fromCharCode'](0xff&_0x45292d>>(-0x2*_0x9f4716&0x6)):0x0){_0x466c97=_0x53b002['indexOf'](_0x466c97);}for(var _0x654c3c=0x0,_0x1c398a=_0x43c75d['length'];_0x654c3c<_0x1c398a;_0x654c3c++){_0x3d5d1b+='%'+('00'+_0x43c75d['charCodeAt'](_0x654c3c)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3d5d1b);};_0x46be['wIYDzp']=_0x48a80a,_0x46be['wwebqc']={},_0x46be['tIAjHf']=!![];}var _0x4b2ade=_0x5c78e0[0x0],_0x507830=_0x176027+_0x4b2ade,_0x262a3e=_0x46be['wwebqc'][_0x507830];return!_0x262a3e?(_0x46befa=_0x46be['wIYDzp'](_0x46befa),_0x46be['wwebqc'][_0x507830]=_0x46befa):_0x46befa=_0x262a3e,_0x46befa;}function _0x5c78(){var _0x152c9e=['nZy2mdLRBKrwvfG','mtqXmtqXntvdzvDswgm','nNf5BKLKrW','mtbZteTfqM4','ntG5mM1ZwM5dBW','ndKZnZu5n21jD2PQqG','mJm0mtm1ogXhr0z1uW','owPtEvHbBq','ndi0mJCXufnUwgXQ','ndeYntCXmKLgzMjQqG','mty4mtC3nwzHs1reqq','mtzOBhnZtfO','m1n1A1rMwG'];_0x5c78=function(){return _0x152c9e;};return _0x5c78();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';
|
|
1
|
+
'use strict';function _0x5e4b(_0x2f2ed9,_0x45c5d1){_0x2f2ed9=_0x2f2ed9-0x12d;var _0x2c0937=_0x2c09();var _0x5e4b4e=_0x2c0937[_0x2f2ed9];if(_0x5e4b['ndtiuc']===undefined){var _0x368bff=function(_0x135528){var _0x129c61='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x4f51a6='',_0x17119c='';for(var _0x4f365b=0x0,_0x1489ed,_0x5bba0d,_0x1b51ed=0x0;_0x5bba0d=_0x135528['charAt'](_0x1b51ed++);~_0x5bba0d&&(_0x1489ed=_0x4f365b%0x4?_0x1489ed*0x40+_0x5bba0d:_0x5bba0d,_0x4f365b++%0x4)?_0x4f51a6+=String['fromCharCode'](0xff&_0x1489ed>>(-0x2*_0x4f365b&0x6)):0x0){_0x5bba0d=_0x129c61['indexOf'](_0x5bba0d);}for(var _0x34e6e1=0x0,_0x29dbfb=_0x4f51a6['length'];_0x34e6e1<_0x29dbfb;_0x34e6e1++){_0x17119c+='%'+('00'+_0x4f51a6['charCodeAt'](_0x34e6e1)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x17119c);};_0x5e4b['CSflmT']=_0x368bff,_0x5e4b['WrfTjd']={},_0x5e4b['ndtiuc']=!![];}var _0x1f65cd=_0x2c0937[0x0],_0x4e5a42=_0x2f2ed9+_0x1f65cd,_0x52d970=_0x5e4b['WrfTjd'][_0x4e5a42];return!_0x52d970?(_0x5e4b4e=_0x5e4b['CSflmT'](_0x5e4b4e),_0x5e4b['WrfTjd'][_0x4e5a42]=_0x5e4b4e):_0x5e4b4e=_0x52d970,_0x5e4b4e;}(function(_0xdb81b9,_0x46dfc0){var _0x34e737=_0x5e4b,_0x9f2356=_0xdb81b9();while(!![]){try{var _0x51f06b=-parseInt(_0x34e737(0x135))/0x1+parseInt(_0x34e737(0x130))/0x2+-parseInt(_0x34e737(0x12f))/0x3*(parseInt(_0x34e737(0x131))/0x4)+parseInt(_0x34e737(0x12d))/0x5+parseInt(_0x34e737(0x136))/0x6*(-parseInt(_0x34e737(0x134))/0x7)+-parseInt(_0x34e737(0x132))/0x8*(-parseInt(_0x34e737(0x12e))/0x9)+-parseInt(_0x34e737(0x133))/0xa*(-parseInt(_0x34e737(0x137))/0xb);if(_0x51f06b===_0x46dfc0)break;else _0x9f2356['push'](_0x9f2356['shift']());}catch(_0x419acc){_0x9f2356['push'](_0x9f2356['shift']());}}}(_0x2c09,0xcf295));function _0x2c09(){var _0x5b691e=['mZe4wMDXEunU','mtfVvfjPCwO','nZGZnZqXmgLVEKHswq','nJniB2rnuve','mJG5ota2ohbfs3zqBW','mJi0nda5nKDcB1bpwG','nhfXCe9PzW','mJeYmdCYrNztv2z6','ntqXmdG3mg15ueHqEq','otu3ntnpt3zpuNG','odC2mZa0y1Lbr1rg'];_0x2c09=function(){return _0x5b691e;};return _0x2c09();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';(function(
|
|
1
|
+
'use strict';(function(_0xa5a457,_0x556a0b){const _0x57debf=_0x36e4,_0x68cdf9=_0xa5a457();while(!![]){try{const _0x3e0db8=-parseInt(_0x57debf(0xe7))/0x1*(-parseInt(_0x57debf(0xe1))/0x2)+parseInt(_0x57debf(0xe9))/0x3+-parseInt(_0x57debf(0xe8))/0x4*(-parseInt(_0x57debf(0xe2))/0x5)+-parseInt(_0x57debf(0xe0))/0x6*(parseInt(_0x57debf(0xe3))/0x7)+parseInt(_0x57debf(0xde))/0x8+-parseInt(_0x57debf(0xe5))/0x9+parseInt(_0x57debf(0xe6))/0xa*(-parseInt(_0x57debf(0xe4))/0xb);if(_0x3e0db8===_0x556a0b)break;else _0x68cdf9['push'](_0x68cdf9['shift']());}catch(_0x58b7b6){_0x68cdf9['push'](_0x68cdf9['shift']());}}}(_0x25e6,0x31893));import{execFile as _0x3e59d4}from'node:child_process';function _0x36e4(_0xd6df93,_0x100a57){_0xd6df93=_0xd6df93-0xde;const _0x25e6cb=_0x25e6();let _0x36e496=_0x25e6cb[_0xd6df93];if(_0x36e4['dBPubm']===undefined){var _0x36fe5a=function(_0xd2a07a){const _0x252462='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xf99bfe='',_0x792a34='';for(let _0xeefc25=0x0,_0x5e8b9b,_0x47a673,_0x2a316a=0x0;_0x47a673=_0xd2a07a['charAt'](_0x2a316a++);~_0x47a673&&(_0x5e8b9b=_0xeefc25%0x4?_0x5e8b9b*0x40+_0x47a673:_0x47a673,_0xeefc25++%0x4)?_0xf99bfe+=String['fromCharCode'](0xff&_0x5e8b9b>>(-0x2*_0xeefc25&0x6)):0x0){_0x47a673=_0x252462['indexOf'](_0x47a673);}for(let _0x11a645=0x0,_0x44818b=_0xf99bfe['length'];_0x11a645<_0x44818b;_0x11a645++){_0x792a34+='%'+('00'+_0xf99bfe['charCodeAt'](_0x11a645)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x792a34);};_0x36e4['lYBzVM']=_0x36fe5a,_0x36e4['iVmFfh']={},_0x36e4['dBPubm']=!![];}const _0x45d5d1=_0x25e6cb[0x0],_0x4e92f1=_0xd6df93+_0x45d5d1,_0x3f7777=_0x36e4['iVmFfh'][_0x4e92f1];return!_0x3f7777?(_0x36e496=_0x36e4['lYBzVM'](_0x36e496),_0x36e4['iVmFfh'][_0x4e92f1]=_0x36e496):_0x36e496=_0x3f7777,_0x36e496;}import{promisify as _0xbff0e7}from'node:util';function _0x25e6(){const _0x2d281d=['ntC4nZq1uvD1vfP4','D2HPy2G','mte3ntu4ngfIAxreta','vfPRt1m','odrgCMzzD2S','mLL3wuTZEG','mtbczgD4zhu','mtaYndfQCwrlv2G','mtqZAg51zuL3','mJmXmtiYn3DyEuL6vW','nduXndbOsxzgB1y','mtaZnJG3C0fhwgDd','mtKWnJmYuvbXrgXN'];_0x25e6=function(){return _0x2d281d;};return _0x25e6();}const t=_0xbff0e7(_0x3e59d4);export async function which(_0xb3a747){const _0x359875=_0x36e4,_0x351ff7={'TZkOS':function(_0x5d1d95,_0x461f07,_0x5d1dcd){return _0x5d1d95(_0x461f07,_0x5d1dcd);}};try{return await _0x351ff7[_0x359875(0xdf)](t,_0x359875(0xea),[_0xb3a747]),!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";
|
|
@@ -47,9 +47,9 @@ NODE_ENV=production
|
|
|
47
47
|
|
|
48
48
|
ENTITY_SERVER_URL=http://127.0.0.1:47200
|
|
49
49
|
ENTITY_API_KEY=your-api-key
|
|
50
|
-
ENTITY_HMAC_SECRET=
|
|
50
|
+
ENTITY_HMAC_SECRET=change-this-to-32-char-or-longer-hmac-secret
|
|
51
51
|
|
|
52
|
-
JWT_SECRET=
|
|
52
|
+
JWT_SECRET=change-this-to-same-32-char-or-longer-jwt-secret
|
|
53
53
|
|
|
54
54
|
# ── DB 직접 접속 (database.json 환경변수 치환용) ──
|
|
55
55
|
DB_HOST_DEVELOPMENT=127.0.0.1
|
|
@@ -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 |
|
|
76
|
-
| `JWT_SECRET` | ✅ | **Entity Server와 반드시 동일한
|
|
77
|
-
| `DB_*` | - | `database.json`에서 `${변수명}` 형태로 참조할 때만 필요
|
|
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
|
+
| `JWT_SECRET` | ✅ | **Entity Server와 반드시 동일한 값**, 32자 이상 — Entity Server `configs/auth/jwt.json`의 `${JWT_SECRET}` |
|
|
77
|
+
| `DB_*` | - | `database.json`에서 `${변수명}` 형태로 참조할 때만 필요 |
|
|
78
78
|
|
|
79
79
|
### Entity Server 키 맞추기
|
|
80
80
|
|
|
@@ -101,11 +101,9 @@ Entity Server configs/auth/jwt.json
|
|
|
101
101
|
|
|
102
102
|
### .env.example
|
|
103
103
|
|
|
104
|
-
`.env.example
|
|
104
|
+
프로젝트 생성 시 `.env`가 `.env.example`과 함께 생성됩니다. 기본값은 예시 값이므로 바로 수정해서 사용하세요.
|
|
105
105
|
|
|
106
|
-
|
|
107
|
-
cp .env.example .env
|
|
108
|
-
```
|
|
106
|
+
필요하면 `.env.example`을 기준으로 `.env`를 다시 만들 수 있습니다.
|
|
109
107
|
|
|
110
108
|
---
|
|
111
109
|
|
|
@@ -24,16 +24,18 @@ my-gateway/
|
|
|
24
24
|
|
|
25
25
|
## 2. 환경변수 설정
|
|
26
26
|
|
|
27
|
-
`.env` 파일을 열어 필수 값을 입력합니다:
|
|
27
|
+
생성 직후 `.env` 파일도 함께 만들어집니다. 그 파일을 열어 필수 값을 입력합니다:
|
|
28
28
|
|
|
29
29
|
```env
|
|
30
30
|
ENTITY_SERVER_URL=https://your-entity-server.com
|
|
31
31
|
ENTITY_API_KEY=your-api-key
|
|
32
|
-
ENTITY_HMAC_SECRET=
|
|
33
|
-
JWT_SECRET=
|
|
32
|
+
ENTITY_HMAC_SECRET=change-this-to-32-char-or-longer-hmac-secret
|
|
33
|
+
JWT_SECRET=change-this-to-same-32-char-or-longer-jwt-secret
|
|
34
34
|
NODE_ENV=production
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
+
`ENTITY_HMAC_SECRET`와 `JWT_SECRET`은 둘 다 32자 이상이어야 합니다.
|
|
38
|
+
|
|
37
39
|
포트·호스트·로그 설정은 `configs/server.json`에서 합니다. → [설정 파일 가이드](configs.md)
|
|
38
40
|
|
|
39
41
|
---
|
|
@@ -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/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
|
|
|
@@ -285,8 +315,7 @@ Gateway 전용 엔티티 테이블을 **드롭 후 재생성**합니다.
|
|
|
285
315
|
npm install
|
|
286
316
|
|
|
287
317
|
# 2. 환경변수 설정
|
|
288
|
-
|
|
289
|
-
# .env에서 ENTITY_SERVER_URL, ENTITY_API_KEY 등 설정
|
|
318
|
+
# 생성된 .env에서 ENTITY_SERVER_URL, ENTITY_API_KEY 등 설정
|
|
290
319
|
|
|
291
320
|
# 3. Gateway 전용 엔티티 테이블 생성
|
|
292
321
|
./scripts/entity.sh --apply
|
|
@@ -352,11 +381,11 @@ cp .env.example .env
|
|
|
352
381
|
|
|
353
382
|
`.env` 파일에 아래 변수가 설정되어 있어야 합니다:
|
|
354
383
|
|
|
355
|
-
| 변수 | 설명
|
|
356
|
-
| -------------------- |
|
|
357
|
-
| `ENTITY_SERVER_URL` | 엔티티서버 주소
|
|
358
|
-
| `ENTITY_API_KEY` | 엔티티서버 API 키
|
|
359
|
-
| `ENTITY_HMAC_SECRET` | HMAC-SHA256 서명용 시크릿 |
|
|
384
|
+
| 변수 | 설명 |
|
|
385
|
+
| -------------------- | ------------------------------------- |
|
|
386
|
+
| `ENTITY_SERVER_URL` | 엔티티서버 주소 |
|
|
387
|
+
| `ENTITY_API_KEY` | 엔티티서버 API 키 |
|
|
388
|
+
| `ENTITY_HMAC_SECRET` | HMAC-SHA256 서명용 시크릿 (32자 이상) |
|
|
360
389
|
|
|
361
390
|
### 인증 방식
|
|
362
391
|
|