From 32edd5fb3cdb3cc3b420bcf5d16829bfbc2d43ef Mon Sep 17 00:00:00 2001
From: zhaoyingbo <zhaoyingbo@xiaomi.com>
Date: Fri, 22 Nov 2024 11:18:43 +0000
Subject: [PATCH] =?UTF-8?q?feat(base):=20=E4=BC=98=E5=8C=96=E9=A1=B9?=
 =?UTF-8?q?=E7=9B=AE=E5=9F=BA=E7=A1=80=E5=BC=80=E5=8F=91=E7=8E=AF=E5=A2=83?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .env                                   |   4 +-
 .env.prod                              |   1 -
 .gitea/workflows/cicd.yaml.template    |  64 ++++++++++++-------------
 .gitlab-ci.yml                         |  38 +++++++++++++++
 bun.lockb                              | Bin 131450 -> 137225 bytes
 db/prisma/index.ts                     |   5 ++
 db/prisma/user/index.ts                |  19 --------
 Dockerfile => docker/deploy/Dockerfile |   0
 eslint.config.js                       |  59 +++++++++++++----------
 index.ts                               |   6 +++
 package.json                           |   9 ++--
 routes/event/index.ts                  |   7 +++
 12 files changed, 130 insertions(+), 82 deletions(-)
 delete mode 100644 .env.prod
 create mode 100644 .gitlab-ci.yml
 create mode 100644 db/prisma/index.ts
 delete mode 100644 db/prisma/user/index.ts
 rename Dockerfile => docker/deploy/Dockerfile (100%)
 create mode 100644 routes/event/index.ts

diff --git a/.env b/.env
index 85b3b8d..8f327ff 100644
--- a/.env
+++ b/.env
@@ -4,6 +4,8 @@
 # Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
 # See the documentation for all the connection string options: https://pris.ly/d/connection-strings
 
+# prod envrionment needs to be set to production
 NODE_ENV=dev
 
-DATABASE_URL="mysql://root:rootpassword@localhost:3306/testdb"
\ No newline at end of file
+
+# DATABASE_URL="mysql://root:rootpassword@localhost:3306/testdb"
\ No newline at end of file
diff --git a/.env.prod b/.env.prod
deleted file mode 100644
index 995fca4..0000000
--- a/.env.prod
+++ /dev/null
@@ -1 +0,0 @@
-NODE_ENV=production
\ No newline at end of file
diff --git a/.gitea/workflows/cicd.yaml.template b/.gitea/workflows/cicd.yaml.template
index 216ee74..badab36 100644
--- a/.gitea/workflows/cicd.yaml.template
+++ b/.gitea/workflows/cicd.yaml.template
@@ -1,5 +1,8 @@
-name: CI Monitor CI/CD
-on: [push]
+name: Egg Gitlab CR CI/CD
+on:
+  push:
+    branches:
+      - master
 
 jobs:
   build-image:
@@ -7,43 +10,29 @@ jobs:
     container: catthehacker/ubuntu:act-latest
     steps:
       - name: Check out repository code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
       - name: Set up QEMU
-        uses: docker/setup-qemu-action@v2
+        uses: docker/setup-qemu-action@v3
       - name: Set up Docker Buildx
-        uses: docker/setup-buildx-action@v2
+        uses: docker/setup-buildx-action@v3
       - name: Login to Docker Hub
-        uses: docker/login-action@v2
+        uses: docker/login-action@v3
         with:
-          registry: git.yingbo.im:333
-          username: ${{ secrets.DOCKER_USERNAME }}
-          password: ${{ secrets.DOCKER_PASSWORD }}
+          registry: micr.cloud.mioffice.cn
+          username: ${{ secrets.MI_DOCKER_USERNAME }}
+          password: ${{ secrets.MI_DOCKER_PASSWORD }}
       - name: Build and push
-        uses: docker/build-push-action@v4
+        uses: docker/build-push-action@v6
         with:
+          file: ./docker/deploy/Dockerfile
           push: true
-          tags: git.yingbo.im:333/zhaoyingbo/ci_monitor:${{ github.sha }}
+          tags: ${{ env.DOCKER_IMAGE }}:${{ github.sha }}
 
-  deploy:
-    needs: build-image
+  refresh-image:
     runs-on: ubuntu-latest
     container: catthehacker/ubuntu:act-latest
     steps:
-      # 检出代码
-      - name: Check out repository code
-        uses: actions/checkout@v3
-      # 使用scp命令将docker-compose.yml文件上传到服务器
-      - name: Upload docker-compose.yml to server
-        uses: appleboy/scp-action@master
-        with:
-          host: ${{ secrets.SERVER_HOST }}
-          username: ${{ secrets.SERVER_USERNAME }}
-          key: ${{ secrets.SERVER_KEY }}
-          port: ${{ secrets.SERVER_PORT }}
-          source: docker-compose.yml
-          target: /home/${{ secrets.SERVER_USERNAME }}/docker/ci_monitor
-      # 登录服务器,执行docker-compose命令
-      - name: Login to the server and execute docker-compose command
+      - name: Login to the server and refresh the image
         uses: appleboy/ssh-action@master
         with:
           host: ${{ secrets.SERVER_HOST }}
@@ -51,7 +40,18 @@ jobs:
           key: ${{ secrets.SERVER_KEY }}
           port: ${{ secrets.SERVER_PORT }}
           script: |
-            docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} git.yingbo.im:333
-            cd /home/${{ secrets.SERVER_USERNAME }}/docker/ci_monitor
-            sed -i "s/sha/${{ github.sha }}/g" docker-compose.yml
-            docker compose up -d --force-recreate --no-deps ci_monitor
+            docker pull ${{ env.DOCKER_IMAGE }}:${{ github.sha }}
+            docker push ${{ env.DOCKER_IMAGE }}:${{ github.sha }}
+            docker rmi $(docker images | grep "${{ env.DOCKER_IMAGE }}" | grep -v "${{ github.sha }}" | awk '{print $3}')
+
+  fast-deploy:
+    runs-on: ubuntu-latest
+    container: cr.d.xiaomi.net/bigdata-fe/matrix-cli
+    steps:
+      - name: Set matrix-cli config
+        run: matrix-cli config set --access-key ${{ secrets.MATRIX_AK }} --secret-key ${{ secrets.MATRIX_SK }}
+      - name: Use matrix-cli to deploy
+        run: matrix-cli deploy --project 462609  --deploy-space egg-gitlab-cr-prev --reason "${{ github.event.head_commit.message }}" --deploy-percentage 1 --tag ${{ github.sha }}
+
+env:
+  DOCKER_IMAGE: micr.cloud.mioffice.cn/egg/replace_me
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..a80ee06
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,38 @@
+variables:
+  REGISTRY: micr.cloud.mioffice.cn
+  IMAGE_NAME: micr.cloud.mioffice.cn/egg/replace_me
+  MATRIX_PROJECT: 462609
+  MATRIX_SPACE: egg-gitlab-cr-prev
+  MATRIX_AK: CAKBCYGR0BI2BGMVUF8
+
+stages:
+  - build
+  - deploy
+
+default:
+  tags:
+    - fe-bj
+
+build:
+  stage: build
+  only:
+    - master
+  image: docker:latest
+  services:
+    - docker:dind
+  script:
+    - cp $ENV .env
+    - docker login -u $MATRIX_AK -p $MATRIX_SK $REGISTRY
+    - docker build -t $IMAGE_NAME:$CI_COMMIT_SHA -f ./docker/deploy/Dockerfile .
+    - docker push $IMAGE_NAME:$CI_COMMIT_SHA
+    - docker logout $REGISTRY
+    - docker rmi $IMAGE_NAME:$CI_COMMIT_SHA
+
+deploy:
+  stage: deploy
+  only:
+    - master
+  image: cr.d.xiaomi.net/bigdata-fe/matrix-cli
+  script:
+    - matrix-cli config set --access-key $MATRIX_AK --secret-key $MATRIX_SK
+    - matrix-cli deploy --project $MATRIX_PROJECT --deploy-space $MATRIX_SPACE --reason "$CI_COMMIT_MESSAGE" --deploy-percentage 1 --tag $CI_COMMIT_SHA
diff --git a/bun.lockb b/bun.lockb
index 08d5c0e8bf49558cc732acd919c592c91943893c..810110674bed8146be646c7c639ad1fd15ed9188 100755
GIT binary patch
delta 26799
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

delta 23219
zcmeHvd3a6Nzy4l_Lv|zxB8eO_7!wi+8HE$`kaI$`h@plI2O*OTnzYDKL&a3F%A%A~
zT52wBsJUn*#-M7R=bB5=R^9irhtgi(-g|%l{hp`$@t$|RYyPbDS!?gJbF9L(4!^$V
zFeA{f#iHep1Ej{I;-)wiW!*Rbad`8}gyy$>mRU9guDo+@^w?XHL87aBQM^~wv{<GH
z^}|t;?76uq$)uu@K)M;&8QdSGYJ$6ioxmN7*12`5hs4SdH8qyC%x|ZpXXj+3OXrP}
z<bw2L;7Z`7;40w#71VOuG*09$%*}5DQeBanmaTSYuq|n50)ie6l2i@x(~(ZCmGJJ!
zJs(PjO32PnPeQKI(A3uO+*Df@v@Ja$G1ZnVZQ@1Dt>7G*r*4PfgX)+FrXKl&$;>hc
zGE>)opax1eBC`j03Yc^rxH>p3Bh8kcBT0{tkIG*GR|UU4G$m;$!YSFdJR7(nBGF5O
z-GloXyb63_2Nib(Q*$zyx|NxbGc;hhE&n+zApH<b&0W{{@70FZPzSO%#*6AXi+t3L
zjC5O0N}5edOG!&f3K*PjOG>e256hMgV(QTI0{ad%U|$cWf}d%eoRMQo9|;@O{@OFM
zY&kh8wycc2)D*IFGzI}}+J}SDXZxFAcW^5(s<1ZzyMbN6G>3m6kqo^9M&IlwF&34i
z0?D4Akd}(D)X}6`n3<BClV!6>EuqN*ZNTh_SqVutIKsZ#YP?Gwb>hZ?Y1&g$vU9SU
zNs`%1HKZAsM(#(A+j^_zCTSc9u2FytbrGPUJ%EhV;1VCT=X1dn-$;x10#ieO&nJA<
za?9(g9nz;tANq`XYWx)BqYkn9YP~g4pN%Ta8k|i2Dm912q~Rz@<mUgAZ|HNZJHFna
zKG(^%#M~jMrz(F?(XC(;Lf%w+wmN}Pjn!`deO!XI_|hh-1E<<XrlY8|1Db|smBz(j
z>TR;kmKl(eE%~AxEoBcd#edOM)lGtwas~D}2*Bm+&dA^dzTq!P7z+C-FvX{22MkHg
zNR(z{5~-m>h_3|Rt?}TL^yGltOvxogjjy0_W<Y92QbG=TkqRfzk;a6o=^IcE&TF@X
zQGM_<EGIa$Bt1t2RXjK~AtwhL!ct_Up4+l>b5c^XC0q80Tw7MYv^zrWh%Fn=kF`4!
z`N)OejZ`g6NXp2fp_zzyGN@LR8lMGCOG6)jW&7f3<tup{ZK;|%G$A_xtq;*%tc(|x
z_bS+8R?960*FyP3)I$agPRPy~fp)TNx!Ea$^QEn=)qdP)qqh4-TebfupecV>t^FV{
z7Khyx>`C>tmn68Dy%Mw|_%}Z_|MCt>eFgSm*#XLGOvoCNnUIxj`xpsin5C1-W-#p$
zuANmwX}S_HV3$x4mbra5m>SdvYArfVt}r!5<*{HIc(X;VPavJj4YNv;7tK&00<?*A
z1Y_0MPsFMj(Oad**|xNiw3k=xrdF7rkV?y5`n%6j#}e};DLXYGn>ODxTh<U8-0FCo
zT29|v{<5d^M1#7oC8uO5&RF!OT3{avQqL=+W8UDmQ7Lf>3Xz4~!PN2SUg`)1fU7}=
z^yFVSG$=UTTax@C$M#X}!R8u}nU#?Vm(NHXCP@bnPt}wnA8n4C`(pKj;YEsP=3_>%
z^+|4Tsp$@2^4Q<|srBi5oW6C{Mc=5qw(O*Y)P&>$TT*IDZVD>U_pton2xU>{q@?H5
zcC!f;k?W+Tq+<<b=QJLuHjtf}nv#QoOS5H=$x^b`k(x+%MSguv?jNMu{ra_8@ZT5b
za;?Ei*!ifZPZCw%KLy4HZ$AX4_}FB1=68Z=WR`#_-IkS=kriOe({I~cOHUfC=I;xp
z5sd)*79h|b87N{{N)8Q#v;hs!qR@Ri6n;V@;0vZjUQN>&5Xz3#qb{C=VagsNxnkNV
zpT1~mkp|>urOZb@@`SmXfoq22E=xVHm#SLm0;Ym5kU%cdCQY?07)%}T(bz>}rtt#g
zr+Pdx)Q-;wJ3-$7R{_riW1ZN?WvYhe49&{O9Wqq<Egi|UDkq_Wn&9{Qt?yfDq=84c
z<nbL<8?E2rQk6MOA18%etX29QKU~e-;TtE{=W&mwnbx0ho@C%ptF<mT=-Ro>l1IaC
zEUa&D(s+U`(Y4FfUd}V?UB172bmsgY_aA*I)*i1l%IBe%;nINackgEQ*?!kJ|J<EM
z(@zX4sGa`e*qx8%8h*BE2OoV_ZN6dV;2FWuOX`mr=ThsZwB7T1U+=zeM~xE|zS(u%
ztJTjt)|FNb9lBuR=61`TSN<$}_ny=HX5Hi6s{1(X?i2LHaq8C}tk10OUXJzUg*Btu
z6kbv@+Hj3=M>jLe=3U&P<*Nos8UQmT?&22C+VK*%Xtt2c?$L&O<#>#{8BvAq(ag?E
z5Ot+Icl0o`j=YOUwDG=Cl4AG)w<u!^JcgS20rx1D$K_hlhEo-IOf9pqPDM#-&tu)9
zSQ;;>70p&~*)!U3xgwA8G_%IM&@-Bi<|X)C&Sg`y;j{yfF`1b+FEmB7w|I#uTAl|N
zj6mlY?_MX|a8%|owarZCg|(xpr?sQyTufnmWH9ien&E60?@}k)_!x0vJho00+9;_L
zEf1;mN+t3_D6CL>IbK#P+;FQBpX_C3ZFz}TG%Mn=ceL>kyreHbfZ~3<&^uZl?kq{T
z51|ibp5gN6P&8bOySRtTb#Nob-eWgX|K!<FW~FNC?Xk+d)W^(xx$GOw;&~T*9_EF<
z(Q-$)E%l(hQYcST<!JonFQ8heY3SXRs(f-?Gx||dH=4c6<$BTb3ivb?Hd1zDC{{#Q
zGF2XjP+P<sc=y`j@*b$xN;O4LMywxfurQg*^n+@x49`4XQa@Tg361^HUXg}S?twit
zPOYa_xN!+7%4>XtP_ojJ4I9}Yr8cs84-}0~1&)>&<An{Q<!~$;nl+^_EQ8C9qUAG)
zYlS#vCS?yi>XMRZ669V`QA%2oXSlJ56rW~_V*7a)zi63Zd!W=xWSPP0&K*0L4IABg
zOb4^E2)Dy7JhnrW@f1QGl#mym1-dJtOoU>U&{l-HDIq6pViqM7k5DHiv;d)Y6f*qm
z$tQO*8@ii#DQK*TJ9?Yt119*B(%B+YxS?EaKDo15j>fLq8<7THRySN0P$5v|lrj7P
zipHd(GNoR1Bng`wW{l=yG8C1os7(GPC@SZ`yEh4!EneyzsyU}YsdGr<d|6W{=Nm3t
zz4aDoOlEp>M{BeL;%MeD!f_D}KKKR-;mFGxhs*t;s6(ooZiXUvQ2o!vS9RJ7%2afN
zQl}FY%Zs4M8)c=lr?oV60cmb^)mqd#)1Y3qPz*(@5^2c!8x$=Iv<DSgPaREl07gTp
zIg60C6N*e$(u_{^X;+D@9c75A&r7?SjS~<NMB9w~6++Z8jCaFu`5qLl2?u3_eHvg*
zC}}iq8BlGZ)NZbWq6VO_*d9QUpQ;1l*HAS<t;GhVwm`Kkgd!KHpbW$hP=A&)I5*;@
z?cflNR5x`}tb7NGx}-E@SlNijykVBlA@Y4hs#&u9B<T$(3@&E0Lt}L(krcI1Q_8B6
zpJ__*3&WdDxMO3p;ZzeI)7UJx4p6PdN^%c3Ob_6th`fQwzNi{o7Iu-gfjp*(S^g+c
zl6oK#IbqRVsAM$@9OR9rs#hxGY1q`1#{`(=upqrlm>c5^s6-xHD@uNd&;S%I&t0&1
z<ANn=hEfsD;035eD0LyU#Sl=F<!M<MKY{AYo!z43UlDo>@i5jq!lAh;Ft(`fODHO$
z&X);`gEDGcrKZ$bI0i*-tmgC&Rm+uAhQAO>YXF_P3N;uxvC3e1PfR2Y4muSQ!NPcH
zuvvBpSM#IW$e#>FeZVaOYkMOUjT992e-kF2(v%yHoT(|sv2)1>p{QonyBbAG(wk6@
zN}c1O@Fb&Iav!R<lGDXI+%UWaj|nl$Ti|aruBrpp#hyo5U^-m&U8r=uxZ!3Lj|nx)
zkyvpth(uqo3dTXjDOpHegrbR1_ltJeY+o+<xllAZO4Y{4P=ok1EVG_w?ig;C4`Z>C
zW0ohE!p%!9s%~_7P}C2_-Q;Uf??5RVy<t#m9ur|U9B$1gN0?=wHtIm(M(G)D$Zf+N
zBhAJ~h#bIUeWT<AEK1e?T(GI`Y0FC^%?96g+_8mO9@|cmvQaHY6}#J`c6>4-$F!Fu
zJhEv6e+P>Cs4kx94(iBZ^5H^TplGPoJ8D=*wI47RUOXA97a1#GK!`>gWiY<+om8bd
z+E-A6kfwA%uG3jx9H>Da3Dpy6mC2b5`#ST<t;}+>E|QdqNDNuyaKqLv+|g_{_{DI?
zH_e7wF+2uzJ%&#P#aMVLXt{+u_Ana@t&%i?JNJk({)$kN66zl-N$)D5D+pn<uwc4&
z{nNAj!sV}^$avhbP2qCYZff_`RWTHb{8Ke#i<TzSBp7SJJ(3mU^AIB6RPL$rc_{p&
zp{NsXY}y^QE4%DigvbRkklx|)Nho#QltqTi&CvnsgF56B5Tvw<yv#qMJj7dkTEi$g
z3T=?vsmtmkD9xj>3?D*~6Dq!A?20~TD@O0sLvj{|net;7YaDJYg-YVFJ)*f&d`rX9
zUOXn=Y?R~iU5kpzBN2)~W=Ca>uZ9|;RPOR-xa^8r)Seeb;En**4{6nvHEZl6Nu!{!
zPVl@l4N7@7l8+-q^(kxFSQ*7bl&7Dz2(>`G`W!O~if*%NU1y<eY8e=4MI%_XYMP;>
zA201|Ha3FEF|-F7vk>aY4@5@E8xg{~u)8XcXV0Kob7xbO9NAwVJ=(TDfWpGmHn9Ux
z)IAJ8ZXQNBax*2ZsAq%&1ocq8!H$3mg2KI{Gj8ZmR1C`(JKISpEPl0z#ufvS#$zL*
z<Sc}+Iy4{J2o<6#G<6#adpz!8c$SoFW0j~4)6(b$g_Wa?#%w5TwOT(;LSf0%mXDmC
z392#b-rYx2>Ru(FsE?{YAA+J<RDU*NOEW`ZQ$g$Pp#JQ?Tr){c!@iEaxCa#ZG|J)r
zwgd{9X%u229Fo<H>QhZTR7)j^M)C+0ZK-IW1vY!kCKXfnzA;eLF{EKRd<{ii!BFBJ
z`^d&ilgx73V6`%}f6Jk0CX~J#E)V9Dlg)A$_$5W6PL!KIgge^I@^(bhdQ|<W!_YsU
zQZVrops?ql78h)82cWS0sZJWl6g{m7DhVo3&56+|f})K|t@9dGQz+bAum&0pQ)|KE
zL!Bd`XslG9{tilYE&4w22Nbp;trpAhS4VsYRP>)|5!iD({HaDmwbPYx2UHvGJhY`l
znmWGNDB*zfp;Xi8DfP;qiYB*7x}HWV=TFrgY75lMhC?#cy<2f6<1#392|q!I+!!N`
z{i9VTriRC2T}?%ZW&rz2-EhNqnLH-dEdP#3%)REVgGS(ch2DF^@)6uItwn){q`ZE^
z=U=%Tv`LBmD>KB^*5Y4fim#)^6B__;pb~&5J&EeWG%6P{X)L({B?1A7D!{5!u2;DN
zVlZ>c^?zZiFH$S_I;IY^)Y_-DqFlt(bF2a7A|~Bh<F;U`xE(;(t4#6jl~|Rj9A-)~
z0v0WvnDSXQZ6*6D0^Ue(rs&3^Xl(V$^-oOYdIMB0LCO7Bru0ND{&h?vP#+6kX%MSg
zxrnJC)~<3X%v)u+6_kgD$14{x<$`l77cptLuyVbQ9gs3oOaFgh)l;aTBVgAmdL7fi
zzo(@WQ^&?>JYM4oV7iFO!={kHMNH+V0W>}{04iUkdrA=mU9U0~;7aUYnPz?tKo!jc
zDBs5bRk%Rog<y(b1kgoH>5EC=A}0MQ56-L`OjErQpzBqp9IKSrzcF8x>Bi4wR#irC
zjh2I$N~{HZfg=E2#1wy&1TJD4oRcJQ5mR4J1C;L!K-WJp<vUC3oC=<&+_?TXOa(7c
zW?UDPPn9YDB0%+B*5ZjN{))y|HNFO>>l)1-Ww;Jd!J7c-TL4}E#FXzRC6~%Hn|C!$
zOzHPDO-%Ja04V+;K-WVWe~S2-6fR=Q_!yx0UjVv@Nk7r}DVP@C@0xxNrt5V~^}PV7
zy!xRs#TOV5O9|za)PH8Ou!5HFRVMGNqQw(au&SnssiA6`CZ=F@RTt=izc3YW)d~=k
zb^}wCyT%?Qa1oO;dVwjQj}}i%TZ<o<qWraZVhT1^7~|hWOCY9TfX0DfsyKuq|Hia}
zBN0yxMrrw5YTQa=v&Qt>2)bTnD%S?_&NTmBwG716<6fG6m8rpgT0AiY-_kTORX9M4
zAE@aBO(%lsdX*`EGU5v;&4!PP;8cyXDH7M~n0#QQmi{`X^n9cfkJ9qJ%4En`EgoE;
zWE`(WypAbp0zRn1Nm{;FnW75uK|ERGDI{<a(_LYfre9@RJ#$$l^*+1+8Ormsxo*mM
ze5z$9re;6W^#6v*V^(VUU&oZRN=qlEiC6=s?yP4Le{-Y@e`}-zLAkRQYiXOcGOseV
zwNs1#-!R#-TdQv`n2MHY<%y{;`!o$E-&7+gZoih{pvIKup+OJpObwYx;Chv*p4v+6
zUzy_R;gBw3>WDYBkLmfRr$nSGPm78ruRa`7JZT!C|I5Q6m81OBp-9#K*FP<ig)ITP
zUS;YzJsi?SOuDtkZNXG=JAkfNnc~|ku`eGI3pyf#){8|;Af}8~O%s!j1!xcMrRjfq
zI7AkS(y3f;fXXERbiK+*@AyAHCE8GkDjH0saS@XqLIRh<|2`!C`;Z7<`1c|4CyWB^
z8~;8e{`-*l??d9h4~f_caQ%P&kXTbOf}R@b#{cI-;`(Rr-LA#^@3OFNeEF_;7RTA{
zc-Ecw!RH%%9X{XW@}79sgD2p#C*Oq6Ufkuoc>H)I<-2&^d65&}|DBcf;U3?|^QTaw
zzPGY|yaa05Vkh2Yua))Ze%s=C?@yihc&LHAY;QbwSmMlEZMX12;91~}OPqK}iIpYs
zu_f_*=u#(s1<J;QOXIowXHNXXQY#z6FGB5wYQN9QQh3q6c%JvU6MqCXoVVE@&l@ds
z;!E~h@ynhEP$!^z9I)cI9*Yjd^GVB{c=>}?HiCCQ7|$cVaN--FvN<~x&u>5_AF{Gs
zz7A^63MXFUu$8^d6Ar_|l}>y&R6chpgN0BzWmf#|Whd0KRZhI#5i5Q$G~x&>T<ye<
zK^1VHqp)xd>^*8_V|f|WMyQZuRyK~0JqG*MqMtjhYyv+C<-X2|xBS7%-sgosz`k|P
zyu)z|_x=(iw7|miz_Y-I!FRxo)+2qPh1<a&gHM1TgM&6W^Vm-;d=hvm_yYJjIN~d3
z-gA+K&j7Ci-vApITX^fQoq2!o9Pn4*`(Wo!ExdEFGq-_10dECA1-mY>@VJf6JPo`I
zyl07J<|b!ed#Q!@2Iqp;f)9Z4yE9(zGb>xfM|=jep^ia)%6&eE*_$yWpIg~dUIyj9
z#hHgLv+zvtH1J;VRj~I~7>++h=7DE{4}<T38*PK(U%+ti$KVs-$KastFnk3J2QLL*
z06zyu?114bVK{gd_y*Xx3Wo25;ovzt;R36yteCUanC5Tc0;{cT6JH1Q^jjFc21f64
z;;Cz_d>MH68Y|n%UDn34Z9D~^+xbp>?%*El;@M6<0-xXV5`6CBK3~SO-8>(kdwAKG
zu=IOO{(39>o{wFR35L1?Rl<Wez=8L|xi?tZK7J9ZQ3;&;D=Ry|i@t&bLp_2z#M^ug
z2QG!vd~IcA`~g(NJ~(%=l^x}ais8Ue<u_W{54`(EIPiX02K6Inn_$@iShmT^PV#k7
zPod@?x3bgx=5aXiK__ng(aO&9xj({z4>|GQq0aLzC*Z(`o%qTVR(6p;gW3pHZ;O>(
z<|DRXCd*LE4lBFLZ|;D7M^Fpg`8qE_+Fqz8TdnLS?|u^Y9YtSGTG>zh;&#|~3?6{A
zJG^Ww?1P%R&C2falh`08{Q%oh=L618!M@{g!&8_&@K*2*u<L2e-j8rY@Eovl7u*)S
z2fFhK_~RM4EjSna6np?2cM|<Riy1uW%txQK%sl1He>e-bJ%vu5vl?DV{GD^XxWj2D
ze&(DNKNa&k4_l$8p0~1c{3O)SGgzJ%tjx#@FTmEb@Wu-kR*^?ugso>W4i~NX_1{gX
zymRoxOBPm%&%Fd&&%+O)oOzeauoY_6WecmqpFvH!03W<!VJ>|671(+aOYf?MRp))K
zVlJV!Lb-DJ8s_p6?7e1TZhR9|=gYA2x`lc0l<SyFr~^=*+~Wr3@(L`xVPUm-2~_W^
z&OG3zg?aJ(o0!XM&ipKt5BIwT`=F-Xvaq`RB-GIBSZ_aBSbbjj6YRSI`=A=~$lI_F
z>f_rM{Mhd%RNhV4cgMmS^SO6m-!0e&6~MdPg?&(~?pjz={tRl;Pq6Qvg$48F_h8>`
z*mvK;n)5#QVIS01s8B9HfPHsh-vbK^=bNB9--Ue-Ei96!JcNBv2cV+3$Ir0u9_;(s
z!dmeXsNVNs-y;i)=J}6c-vihO)rR{$hJ8@e9$WBh%#%<<AHu$0EUW`B`~~*?4Evxu
z@yI8z59;G57S@H|gvxsa`<_~uh0lEo`yRtSs94_R8SH~v^^9(l&!8s#0{ebVVqMnn
z{B>VB=b)<U&vsjYoz|~=QIT<b&GNDy-G2S57nPJK(OPB>a!YshSHk$?se98|_t|*L
z?MPp|@E*l}(Nk1&WGxKaO~qXuS+#P=5JwqAvNNkkfmw%{gVE-Px01!(9a)ufJg#O9
zr3U@~G9<Pru3Vn=G8h}-%|zv5m-1{l6LB)DA?7<UC*!iNT2W!3VurT;ihr%b{F$Ng
zz~Tlj%-3KXhZh2ssN5l?*GA>%%EHeDGe`wyW)u%_Wk0ueJgogkvmV_=+$X4ha&P8W
z@W%`Fq6ZFN?RmqA1TNC_s)bO6B5>8y;^-?Ez2T&*fmV**whhtZ8ftO$rX@v-Yox_h
zKwJkkuHer%$@Hq!Q_HBoO{Vv@^k);g8f%5=)yg+YjQWz9iqPB0Jb=Rbi)Ks?{VGGb
z=%q8IkzsKF8PpUJ73po5Glc$<C``*(8F5pn1g>x`jz&O#=Nh5K!GokUEg!wPrl1Qz
zBSHqX(Bi5gT!|8KMQL%>5l*JJVPsKDEwTo}%K^IdZ!@k4zpupL?HBUV(9;9rBrUFu
zR@M!=P>XAeII<GHtGtjR%iC-D=>1|nfUW|X2mGV|{UWVKfGqE*#d#u3FOSLcPGG8#
zUOWaNOjj2zj$S^_1*oGI#8EQ6aQsM%vubf((6a!#$QMyxf#eM_8z76iX&HSGo&u0X
zacV~8PiIrLxHq)8y3q6%n>yM9jDLz{G(FVOo?z;9eP97VSG<<50m2{9{QDx%TZ?Rn
zu>Rt)j~3SmarA1O8tbdY`5{d6O~cqvi}OdAUQSXSZ)tIj5iUfS>gcb<H9@!yK-T~l
zEz;f{0bIZL5(oRUi3PN@1_QL5h61#Nh5^F?s)!n;d8c`92hiNoRMOPZRCNYudSU>Y
zl3D<*u9^U?s4s!_zy{ze;A@~5*a&Q*X`v;y1=tE~1GWP@fStg%z%F1num|`a*b9^Z
zrNBO5KX3pz1RMs+fVY8s;2q#yU=%PK7z5BkNCz^2Oj08d$O5u~93U6KRw#7?x&v<l
zJ%FA7E#D3Rc{VvR`2$}2OB;Z%fGNOKU>Yz3C<0~z9|E+b#{l#<ibNn4NF$LBWB{4K
z2p|ifKL*jC%E(d4F(0BK+N@|-lz~cs6Hpl_2RujmAHXx<SKv3`XW$W#2qXdbfcwBt
zz-{0f(BUFJE&=C(lfWt93~&ti0XP910X_wm084?-fn@;gA720~#Df9&Z?}^Xv;#wd
z6kr%I9Owmj13mz)fqDQf6j~VM!{oE%=l(!Ppc7yMzJ*=80QwusMqm@L3|J0)0jvP#
z0`md<X{bQ?!_<2a<A59>7Z?Z(0vZFfJJW6)1T+Jh166@404-?-yg=}G;1}RAFc`QF
z+yE{EXMuA7{aKy^9|E(0_sEqZ5oiHK0nLFBAOZ*kngT(91=x*-_5fRet-v;5JFo*-
z3w#Nz1Qq}bflq)%!23V~U<RrI2H*+my9r!D`_gn^F|Ys_2ebrQ0l`2CGM55-flq-Y
zz*1l_a24s}foNb6&;}R@<N@^Oi8$a8@_hg#0p36ZpgNF@wADbtSbX#b`T%`_w}1h_
zKwuD17oeSgJV1YYYy!}>WJCN)U=A=B_z0K{OaZ0>Lx50V9r8{9CIWQ-q|J94;%5N!
zXuZzYL=ku<K#3m!laP@%QMySkgr)*!pb$C=Xov7*a9eOA+O}~G9YFh|Z|G%&D<J9*
zFfB6j4O(2}8|MI8FNMG);C+Awpj&ZTG8@MV;t?k2?+Nq(XeW6Cpk0MVbRsYTppkzU
zcn3%XXyEz*G>9~qG>H8HeIOGM&If3A(t$L9W+4fnMMndQ1z4c0L~>vn!Bl`&BTefF
zAOoN@s({j{5NQf$0<?;=fE*wj$OUL$eGeE5*a31EN+TB=1B?bn0R_M~dM>GnK%pob
z%BmOaL$DMm0lo#c0viFU<7?n6U_G!FSOcsARst)4&wx*Wg+Lgv0HDdntSjC^lT4m7
z3!nu_6HneV8JG&dAqte$N?t*;PX%bLkf)F)o(+%-3gBaa8dwZ00zL(n084?-fiHk%
zz;b|m|4U#UK%J-X27uxT#lU77l1&JF18e~r0c6=uU<a@b*beLgb^*JAy})<C_rQLD
zMu{w>k)tq;(s3XRI0767DE$yn1{?#90zUvJ(Z1rRXTYZc;<Lab-~w<FI1f<8<j)s?
zlN#&sH=$`%t^-$qO8~8ptH3qj20$bDGw=Yo4N&KP0t#;7gDj%CzYkF49pEm|AGik$
z0;qw9zy*LB{t=)~{t7$+^v?W(Fjf8`pm*jR!qoW_z%$?}pcz=8SV$Qu16fOzk+oz6
z#nFhAXX+h50+$2mjzF8N5tyjuq1!P%G5Y|t|4|v*j4J}PozdNdZp(Cwb_D2l?Z66D
zk93Bh`!?Nn$U`a9W{pXEKvRXTKn;K@rsn`RfF7yn@v1gp0_ZWT4&VjQh8zyG1cCvo
zgF0LvTo0&QfDc+CzThB$=8Y_-3{3&ufoNB!FKTqZ^aC0J4FP|E?w<hwZQRrtH4+Mh
z0CX>H2GGV#@w7RwK>f78(!N_j8*n$E6F~Pb%G3sE4Mc02;yMByfc8K;pe;c0U4hPk
z1?U3kBNBr!J>y#enl{Qy(@abwFlPWI;JeJmX(B9@H4up(v1%eKm5p^UPy#OTTPhpp
zIW#wWcs`Wd-K40fyI+6izy?GH1_#2&PKxzuEY@&E5~g(KZX%Cz#0I!$LXVsE8`N?z
zumQn=%>skyCL!XGBb27x899blIKT1s%*D%;9Fc*|)H$q-l>1}HbzApFXbUAJBrq7W
zBtA}O%~>;1md-p_wD^fsN8y#hJUsPtSgu-|O<w%f&5H&Wgr1?0)L*=rfv#x{i*GVm
zEl>S$l)77wA24lL_AA;z@2K_Z;$8-7oi7&VG7r%*lZCLQVnim|+aO%Bn1`vv2$w|n
zY%P--7F2%jMGXZ7=AofuMzJH4xf{+K#i>lzOf6TVVi;AcrHR%fSS_|q^c#UL>!-df
zZhpM$!llo`6+_W$+~LFrltDk>g&+N?+_s%BRv8$^ng&tw5W7aOSglJ2z4G>1sC<(c
zn8n7jGI0^THJqy?e$Qg=p87d1Wxc;R+~v{2t6E#AD?~KSMqB#-B>yFS_IouPKdXxj
zL4nPwGyWnen>F_|Vop3@ck|=%-|wFBfvbV}qa$?XiFK%fO%eM*CjD%i(bnUOGgdd>
zqqL+<-+ANg95$F$6+?2^JWr3R$`@RF{E8tB%lci8C*y(xn>WW=618(-TthKD_s^LK
z(@*<o^x)jRY`6Qxs1`#(gQ1@Z6E`Mx%b9iSS0W`GDX8e7i@2K$<MmTy_Bq^a5Yx4E
zKXTA)qpU1^MxyJkB8tdY^c;zXL&c{=y~Tr(uv<S7X4Te#cSd(uxKy!6nT7Qt`fcVB
zx}&CQ$hQgionpoZ%|-@z5{;a8%8b3q>BvOetu|jMMU{3BifJfn(odZU`*yqObj4ra
zqcI3oCisrKFipZj($9?vYhNXCVnyD&Jh`>v*Df9+4mrXaU{c&LFO3TF!}+B~H(ut@
z&!Q<Px28$+iQiU#newKGSU|Pwr`NQJ8W)<i%(wi@9HTwNkxB63s=`=^#nap*dK9u|
zhL$EViMXRlY$;^cF#U9zo`Y_`_;p6YFUrU&UZbB=qyLw7q=c&r(xr|tPiF3MW9uld
zTkQT#JOBQ)UyX-K4rO%o6Jd4?x;gJcgGzrW<EFR}9U3FUSouZK!a+F~nbICcI|xTR
zh^eU6q#sxF!GNp<PdX(;B1ah7#auV@5<8G1Og|y#^TIo}1__NiAqU2s=1V`?rp>_U
zPUTn3yQig~?2lez&{UMI>#Z*S+sS=<o^83KJ#qxoG6|9bkx~Oa>#=5GS(B<4ZcvKq
zV{N^~TT{@pNytHaVqZ4@bjK$PGm(Ql812sW5i^h@Y>AILl`AuXH>BQ8T7VoOY90FF
zIV}c%k<A+p7={$`ar8|1igQ%^Yx+*(jT~D027QF)q7~Y}x;FiGu}A5y8cIJDf7Prs
z=so_=IhXi|)ff-cf3|vgU2$nDJOyiT|1@lh8TCXEF{>|Propl1i_z1V$Lp4LggPky
zxU8wle_YltP`Rgms?^fi3vL^|2epBvG}9OpU(tLzixqn(vRZNai9nlr*xy}Kb=lLZ
z%-l-Nw%bp6cV^Gt(sRXXLzM^0d?<G@{m7S#lTPQX>sm_pw-9X2n9JY%#DF}^rGCmx
zO=F+hU2BgkF)-ZRsA)+*kET`E%>3FDzHN!J@B;FoAb+tEWlj1CHjhr#bzQXla<r18
z8SQ9^{^CL&vl_0uh`@Z-%%q>SGkwvQJ)e(0)Klq)V&O!8F)AP9J=0&jHHNv1)%mQe
zVX43PgCaNh3-@<0IlKLZmH3dqu!BwdSwuCaoVwI={~p@w&@XEEhQBySIrP(u(w{{>
zjUD!er_!Kuhx2GGOz)!e`awvpRo88P=Y#Y)$PpX}H^xI(V-bfO<X&choca+=Jx^Y2
zT+Pe!4sz1QiJX(X#RAH?s)^Y6F8Wv8MBFC5qlu_6iZu(<4`<5T^f=tuqRR@DqzxU<
zA^P!5>q`n|wjHvvzS6ql+$ftq3KR36bLdAl>8E!nWrG95;RHcqzy$PIJIu*mGHq04
zH^UEk>b)Pcj#Hb&ee}#!Aw*qVy}Iw~noxDa_ozd=O}T^!^Jq-nm{2iwG;FbiiO---
z`f*HYesvPR_%N}Xfzgmtox3AM<uRyJKX7Tzhpl%X+t?dx2yWb*o+{MI^>^&tLV4GQ
zBbdYtOtwisx@mZ;4=0T{dWL!ts*Wt`+)Z`9W@%%CrLjNSQdBEo%{=uJ;1WmFYt_0^
zl?c>9V~mdZi-84Ly85|M9(#-AvlG_RBw**K4EhO9<D-vx#vI;DJ1iAN<y*{RbpZxp
zYisd4IP63l_3t@Tl0RIx<y6Ue1EY+gF#ZNooUlv1U(s(t?5AITjymZ1AQG<!+KMrD
z3}9k=F~<()faC4AvyTiPcMwCzs+t_pu)Kr#8ahlrwrPb=@5R4Pcu`NON$HJ#_|5I7
ziDw5^cL+g>w%@vT7Iof39T?z<_n5!q;x5XIO#9dvad<igSU=L~(|vRD7Y;j;Vqjw;
zaOVyVl8_^A7D}2eqRt24%2siv2pnh?(}_D;MJmM)vkL#2c$D4v0ju?ABAUBPiF#%|
zQ;!)egzTI?9xHkA43sz#D?UL7=}FzSqB6A=yNTHoF|)7nVr||uFE;Fp6DMY1ppM50
zry@4k^xr2znJ)O3y4|=Mu>oMKSUCZO@C0xHZ2G4=zX+TNBeeUxNT0#nyx<l3VN$El
zY`*Q2-K5sb(bmj0sRv=<fB2o5IBHH|^K=6X55(O7-f+oJ+@<-@M$;71Q~7zdy{LHC
zt`y(kNiTDD?<uOzd^x^`l%8S$#@XQ8Sj;5W2kzWV7Giqs2CwW@0lh>Z$3*KVS}hp4
zB_QR9F$<jz$3#cqk?-{rD^_#Nl|IW_Z$yh%=Pc$!OrY*3rM-pyLu^a>8ChwYEEjL&
z9G|H)q<kaMPtCfzZ`6l964sqTinf{#^brR?#A@2ySD0qOHm%OE_wi<|8rDwxM^(OB
zQL=puN(4tL50?6|Ourl%RCjuz)bM4>@_u3g{MMu&g?0Y%GB3HZ`!_FhXgw9TX0i7S
zcvMKAjc)5laJ3q8IC<3j!)S3eqjefA>4$W!Nm=p3{_5LmQi{5^-QE&gP*%GScrb5q
zpQ?Jz(+};0n121(uAWD4*Lx?UY9CakJ^g66k}&-Qu;;04ZKiMgQ^*mbZg{WV=#*Mv
z!c@8qwe?n?%WC^xth+<@-Gs8*mR)n8*nu1d&2s#eS3DAIL)dFJ`Ea#0{Q$5|qpB}T
z9B`3#E$xY8{~&R0j=KFfnTuBKiOL&%`~K&5Ll;Hf%0W(Tj^-zdL6k#3qDz|g%dXGc
z{&wPJ4t*w8&Ska2^rOPI7tHznVw=7Lku6dkHvKTMK?h!>dDrdR@nvV8B#PguiT`{z
zuaqQ$K0<flQe!^C<ovxAdPs_(TaeT~S$!n`D6Z^b--ELq(MmH61{ORv<ozGPEn|~s
z&jayf5dscff&#VSol%n)pK0dvY^PFy9)F~rNO3{RJEy&>?oSHHM+*58ZtD}pym|P(
zq#S344A<h`DHq#wE`15az=z_l(08ynJP-X$8mvxcc46l~HY}|-N~uDb?*BaC`V!R7
zJnMB~>ycY!c;ZuU2e3px6>Y`OPZkILaBr`cf-Z*+6{+*#B9=~K;(QpXPtB3}SmSuy
zx{FAYen{HMNe%um_nRcY?3C*;(eh(Vgnl?#y|w+ezp?e&ValPd*agEyCgq@m)M#uL
zOn;VN8nlDHX=yoh?|d;_Y(vg4{e-n2Tea+0^MLu=mpSz_*jhObym0N5vC+#Ey$+pO
znrOX%>Pl1Z&!s<3tvILoyW3EL9uqJmK3dABnKiy2`Tmq<FH?fk#B`K3wLuQ*@wl;l
zS~t1#6SWqizERLy`7K?Xp`7}eZuhF56vy)H)QYxhW@d=03o*R&Glc&_xZ{lsk+%@{
z<NQo@n#W~|l}I=J=RFc_U0C?a#L${?bePWIxp>(+oqm1M8ZRE{QqO$NlOFkYU+uhU
zq+xv(bsG&Y+uY);XNygHpy`WKO8XBcP4z3c;P2`B*|4!y+~ytWvek9GyV}WiVaa#u
z^=}tH9lAQopZ?MAcdlRZ#6{5b%{{l`*B+j;nrv$z4u8UeYPIdEKKYD~2;I-}D*y3R
z>+B^-^j*YWRHE}s1F~}xhS-veix#uqZl8C!%F4UqfZME$w1k|bp*RROC4EQ$&MF)!
z#;#?aV)#vVT0Gy+g2j*vc&!q&o>dopZZQvea7t=wKvqKf5OHxmGl^-pn2%_Ak)0G5
zR<i2FCAU}y=18?=1|+0sr>K?r-DW<HBm=T+Lu`3!r0q7lT}g?|&dE=;Wfyn9!^T$-
zw=Uxer(_dz6Sse6xoQ`jPqT`m>0{QZxc@ioI1{b5;C<MWA6aCvc`I8~wfNQnHo#e&
z`;rA0uX)T?GBM-~y4&;$a~1_>@Wg|UdSdTs<|QsY#yh|nzaioDY33x_pT*mXT~FBc
zN;%m937IJYxj4>LTzt%0h{osGl;X{on2Cu&&oB)4&ao}x@>5n{R?aP?^D@PvuaU9s
zGuBOXyu{uR-bYw@vF1ERufqW(RKCFai0v2fO7QW17AZV0Vx*|kV%~06%ZMkxz-HpX
zer7J7`HXE>`s^ky{LU&+PpdmoPqK$(C1eh@rHQiNSd?gR6$ZRrhMI$(uxiC0|He{H
F{{?lN`$Yf%

diff --git a/db/prisma/index.ts b/db/prisma/index.ts
new file mode 100644
index 0000000..fdc7831
--- /dev/null
+++ b/db/prisma/index.ts
@@ -0,0 +1,5 @@
+import { PrismaClient } from "@prisma/client"
+
+const prisma = new PrismaClient()
+
+export default prisma
diff --git a/db/prisma/user/index.ts b/db/prisma/user/index.ts
deleted file mode 100644
index 3b76fe4..0000000
--- a/db/prisma/user/index.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { PrismaClient } from "@prisma/client"
-
-const prisma = new PrismaClient()
-
-const main = async () => {
-  const user = await prisma.user.create({
-    data: {
-      name: "Alice",
-      email: "alice@example.com",
-    },
-  })
-  console.log(user)
-  const users = await prisma.user.findMany()
-  console.log(users)
-}
-
-main().then(() => {
-  prisma.$disconnect()
-})
diff --git a/Dockerfile b/docker/deploy/Dockerfile
similarity index 100%
rename from Dockerfile
rename to docker/deploy/Dockerfile
diff --git a/eslint.config.js b/eslint.config.js
index 88e3a2b..7540c69 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -1,26 +1,35 @@
-export default {
-  languageOptions: {
-    ecmaVersion: 2021,
-    sourceType: "module",
-  },
-  ignores: ["*.js", "*.cjs", "*.mjs", "/src/Backup/*"],
-  plugins: ["@typescript-eslint", "simple-import-sort"],
-  extends: [
-    "eslint:recommended",
-    "plugin:@typescript-eslint/recommended",
-    "prettier",
-  ],
-  rules: {
-    "@typescript-eslint/no-explicit-any": "off",
-    "simple-import-sort/imports": "error",
-    "simple-import-sort/exports": "error",
-  },
-  overrides: [
-    {
-      files: ["**/*.ts", "**/*.tsx"],
-      languageOptions: {
-        parser: "@typescript-eslint/parser",
-      },
+import pluginJs from "@eslint/js"
+import simpleImportSort from "eslint-plugin-simple-import-sort"
+import unusedImports from "eslint-plugin-unused-imports"
+import globals from "globals"
+import tseslint from "typescript-eslint"
+
+export default [
+  { files: ["**/*.{js,mjs,cjs,ts}"] },
+  { languageOptions: { globals: globals.browser } },
+  pluginJs.configs.recommended,
+  ...tseslint.configs.recommended,
+  {
+    plugins: {
+      "simple-import-sort": simpleImportSort,
+      "unused-imports": unusedImports,
     },
-  ],
-}
+    rules: {
+      "@typescript-eslint/no-explicit-any": "off",
+      "@typescript-eslint/no-namespace": "off",
+      "simple-import-sort/imports": "error",
+      "simple-import-sort/exports": "error",
+      "no-unused-vars": "off", // Turn off base rule
+      "unused-imports/no-unused-imports": "error", // Enable plugin rule
+      "unused-imports/no-unused-vars": [
+        "warn",
+        {
+          vars: "all",
+          varsIgnorePattern: "^_",
+          args: "after-used",
+          argsIgnorePattern: "^_",
+        },
+      ],
+    },
+  },
+]
diff --git a/index.ts b/index.ts
index e900d7d..83f7f75 100644
--- a/index.ts
+++ b/index.ts
@@ -25,3 +25,9 @@ Bun.serve({
   },
   port: 3000,
 })
+
+// // 关闭数据库连接
+// process.on("SIGINT", async () => {
+//   await prisma.$disconnect()
+//   process.exit(0)
+// })
diff --git a/package.json b/package.json
index 9681fc1..a22832f 100644
--- a/package.json
+++ b/package.json
@@ -3,8 +3,8 @@
   "module": "index.ts",
   "type": "module",
   "scripts": {
-    "start": "dotenvx run -f .env.prod -- bun run index.ts",
-    "dev": "dotenvx run -f .env -- bun run index.ts --watch",
+    "start": "bun run index.ts",
+    "dev": "bun run index.ts --watch",
     "lint": "oxlint --fix .",
     "prepare": "husky",
     "prettier": "prettier --write .",
@@ -13,7 +13,6 @@
   "lint-staged": {
     "*.{js,jsx,ts,tsx}": [
       "oxlint --fix",
-      "eslint --fix",
       "prettier --write"
     ]
   },
@@ -28,10 +27,12 @@
     "bun-types": "latest",
     "eslint": "^9.2.0",
     "eslint-plugin-simple-import-sort": "^12.1.0",
+    "eslint-plugin-unused-imports": "^4.1.4",
     "husky": "^9.1.6",
     "lint-staged": "^15.2.10",
     "oxlint": "^0.11.1",
-    "prettier": "^3.3.3"
+    "prettier": "^3.3.3",
+    "typescript-eslint": "^8.15.0"
   },
   "peerDependencies": {
     "typescript": "^5.0.0"
diff --git a/routes/event/index.ts b/routes/event/index.ts
new file mode 100644
index 0000000..078d6f7
--- /dev/null
+++ b/routes/event/index.ts
@@ -0,0 +1,7 @@
+const templateFunc = () => {}
+
+const template = {
+  templateFunc,
+}
+
+export default template