From 45eea8a484b9b4f7a765064b5e211243840dfe41 Mon Sep 17 00:00:00 2001 From: Kyattsukuro Date: Thu, 21 Aug 2025 10:53:50 +0200 Subject: [PATCH] containerisation and source restructure --- .vscode/launch.json | 3 +- .../__pycache__/auth.cpython-312.pyc | Bin 7699 -> 0 bytes .../__pycache__/messages.cpython-312.pyc | Bin 2507 -> 0 bytes data/data.sqlite | Bin 0 -> 16384 bytes data/db.sqlite | Bin 16384 -> 16384 bytes docker/Dockerfile | 58 ++++++++++++++++++ docker/default.sqlite | Bin 0 -> 16384 bytes docker/entrypoint.sh | 15 +++++ docker/nginx.conf | 46 ++++++++++++++ frontend/package-lock.json | 14 ++--- frontend/package.json | 4 +- frontend/src/components/HelloWorld.vue | 5 -- .../components/__tests__/HelloWorld.spec.ts | 6 -- frontend/src/composable/message.ts | 13 +++- frontend/src/views/Chat.vue | 3 +- frontend/tsconfig.app.json | 1 + frontend/tsconfig.node.json | 4 +- frontend/vite.config.ts | 2 +- frontend/vitest.config.ts | 14 ----- simple_chat_api/__init__.py | 1 + simple_chat_api/__main__.py | 4 ++ {backend_py => simple_chat_api}/config.py | 0 {backend_py => simple_chat_api}/db_handler.py | 7 ++- .../endpoints/auth.py | 6 +- .../endpoints/messages.py | 6 +- {backend_py => simple_chat_api}/main.py | 12 ++-- simple_chat_api/requirements.txt | 11 ++++ {backend_py => simple_chat_api}/utils.py | 0 28 files changed, 178 insertions(+), 57 deletions(-) delete mode 100644 backend_py/endpoints/__pycache__/auth.cpython-312.pyc delete mode 100644 backend_py/endpoints/__pycache__/messages.cpython-312.pyc create mode 100644 data/data.sqlite create mode 100644 docker/Dockerfile create mode 100644 docker/default.sqlite create mode 100644 docker/entrypoint.sh create mode 100644 docker/nginx.conf delete mode 100644 frontend/src/components/HelloWorld.vue delete mode 100644 frontend/src/components/__tests__/HelloWorld.spec.ts delete mode 100644 frontend/vitest.config.ts create mode 100644 simple_chat_api/__init__.py create mode 100644 simple_chat_api/__main__.py rename {backend_py => simple_chat_api}/config.py (100%) rename {backend_py => simple_chat_api}/db_handler.py (91%) rename {backend_py => simple_chat_api}/endpoints/auth.py (97%) rename {backend_py => simple_chat_api}/endpoints/messages.py (87%) rename {backend_py => simple_chat_api}/main.py (68%) create mode 100644 simple_chat_api/requirements.txt rename {backend_py => simple_chat_api}/utils.py (100%) diff --git a/.vscode/launch.json b/.vscode/launch.json index f19048b..54e899c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -15,7 +15,8 @@ "name": "Python Debugger: Main", "type": "debugpy", "request": "launch", - "program": "${cwd}/backend_py/main.py", + "cwd": "${workspaceFolder}", + "module": "simple_chat_api", "console": "integratedTerminal", "justMyCode": true }, diff --git a/backend_py/endpoints/__pycache__/auth.cpython-312.pyc b/backend_py/endpoints/__pycache__/auth.cpython-312.pyc deleted file mode 100644 index 25ac622038a20422a3a72edf7ded44fe9068a822..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7699 zcmbVRYit|WmA>;LhcA&bB~z01psj~R+cDQKS&khivLnZKw{jafajm3fXwFC?&4+eo z6j=)8YEc1^Q14pCCNLNAVwJ)_6gZ1`fd%RX`lE4Mz`*_?O&5{}3bKps{>VQ%a*H$z zEcTpB&J3l>Np~;6bMM^8xvz81{m$XPc|1-6>B8aLqyO$BZDezf%Y2ss+WC<=Zx)Gx#X36Bh1IOci3{Bv}Kla8&h93rr{Z5 zwyvKCc2jT6BL%GSM%_^3Gx#)o1D{5^+ooCG;9}%MP0!%AZT(Kxt*UvGRc)ITLTz8* zQGLYd!h{kXQ$w6?JCV_}q^#Q&`LD)hRntX9R>v}FRSq$_^X!H5k-`3xulApZFZXCv z9gV~?X-&SO4TM<52D}uwMiOFmK^jkusk)HNL?snEZ&l=|6uB%qM48d2fwu(l~9&sNy2Qj3KDatGHRO1GAc7k97Mx$G$nYWWaU{#!!^<*u_KJc zNqn67Sh!Q^JI!hiqdg%SB`Y`XV4BOa371uGlq8$xG0S#ib%s1XV~qGsW2S&zmb(lR zt-$`WtmJ5f8p(-tkhBx6BI|@CYK)n!ys8zfz{WJpb`Ygun%DeBi{#4kACP}wjg>Rx zBG`m!{whCN$tRcza)rA{CYX?WK(}S0-(>a#T8i^jE|(FAXIWcveIkM zq~DGv;}T_Gt`f$Scv=eyRAO~O!-;i!nY*OBVlXzXMd$>KtfIjTV*2`Ecr=re!zz$W zS`MFt#e`#{Q7wEa8Uq$mWNb1F*;od+t6@Bwy>2HTbpjiZ^ZxZ@|wiE z=HlLgf@>iE{Wl-F-dynqR=ism#^!5Yj}>+v%e!9q zlCUtn=vnaOqPf9*&Gtv)j#aP!ze@ttf33E{+HdylJyApM+w4ed+D|&T`}=B6^4za@ z0m`~ZktgLC-h3pbj_BTKGMSl(MAMn{WGXYR#!Tr2R;amD>pP(EE_s)Mw~5i9Tu#I6 z95aV61Uu`VX0z-d32_5DJG|a>pd#bJt{nvOKKm{_aGGga=7}NLbLE)qL$i<|aq z5Hwq9v-ls?-eK@+BBF>1gvn3_7xv1DHOF*m|w$O)1*{SeZwpzET8fc5E;GDW!x`Y-z4VMP0BccYP^oHy@A5}(F-FA6`=At3fN&^g2 zLP&Na=?0>r0Y`^n|9OCF1mlxKHY;etQy%j94%W2J~9EFA**dqW0CMvN` zA#l6l4+OH(R^krk`8LXb-Rq0&@V6EOf(o=j3&}7;b+D{1+yFhSbsS738~_gQGtW{& z>#d$Q5*FX?!%4SDGYl9sq%% z&Vv9{=eaBarD7^d#a5JxAJB!Ul!~X7y)aM-0}1guuVj)kML^15U^S`~yfRcp4qydZ zr7AtCyet)&Qc&Qgj#9Q8RivuY5+X~)Dmt68=DfY(CR0Z)h(K^?k(ParF8A@1#YK1laIWeb-f z0sp;ogNSr(DOnrMNHG{}CKIGSfC=GQFdGu4T$xoQfj7M&nSzb5)s#Shx+Vm*23Szn zkWGZVn?g`imEbYjya#9U;Hp-=#hT41CF+fml~+AEe3n;&8rl|`5-8>yQkKi|iKY#e z@M%C|cqr|f+h~uNr=Zmub&?>7)fx%>nvFIqhgw7<8#cJD)%0$p8S-Eise_k)i ziEvzU-QuPNt=-^~z?W%5$_g63do)Szk3Dx#VIWOcIS2_9*$qjm$=W0*I9L^}Is79^eRI|~7Zx90BU`7cV96(2@9efG49KQ>;1*{6njp1+il zCczYgzp1#8?KUJWNKn2k%dDW;QP5^8sB*fk?7rwc`n5Wb8&F=tRunh|rC7JgY0Cp~ zs-}MesOlWH^HNlcDu=NDDI~aK-37i&*-cJs$_}V8@ex2I`fAf!O3-+#t#H-=asbdD zn?JVfYA(2%i>}t0mrJZoIK1kuTR4C7jT>()28#8eqIcIE4{-iw?~UHvsiMDqPBgyG z7X3Tt#HUW;_Ak5I3a++gS9ihHz0^>2?Vox1vCI2jb~&)C5ZJZUd-wd$FaGnzM}Zet znp&=j*St8#NWSfbeEspF_r<*UVo4t5S#+4zFL%!F>IpqPORv*z>iD7rS_@Um(8`n)ufZ>V5oU(vp~KDx&v}h+c$^pfEth!O%b!C;TmWvhY>6ttZEUmq}qCg zYy(tPzV-nePR3(VbdACZHIt^grMq8Cqt^&t^OP(pgTOsx+kn@p{OWERc0ng~5@0pO z84Q&>6=a80q>73*k~iR|9tQ$a#x;pZFNBME&!%<0Ehxg2JrP+|Oj3i<&;~L?itE?3a zs-tQx=JTwX&m)*@SM@bRTn4QgO&tLEra8&|EgU==PEJ$Se4s6!Xrv($!(HVDD|uBU zre*+aqnMT_sIR8Gv1FKC-GN^e1}Sd=`%}t`K+C3h2unXg5lrqFg%`2PAacpZwh%m3O?Rd#`R77#26bjuDS@KLKj6Xtnw;0AOtHr zo6gsx$?-~*hEp{K954DrypBCyLedFDMKM5cvTQ0ZVLcKV+dc#`L!R1*d&k2a-zmEO za^~d~h>48e7|p%2)c zJ-=`-_ns;Ao_Wym;A-LQkBYsKd{llU4p-Trcz*k_eEkbW@A15N{Hs-0JqAd+t2&I_ zQWy7q@OHkwtLWYNTX83ilysLPC3pL3Pq5@Z>p0QF-FF2~?Bnk5X0W_Z06NtemgJC!($A}5MB;bD^*S#BR)B;h5_mfs(q@n|Yw9h?KWhQS zhzVt@;+8ayYG@9POPbM0D*vn`dR%=mReI*6?|6|2?(ef1JP^zq|%8-!W7OCtVW{ZZxjf1#9G3e zN?&(D>|SbnBp#^}q5rpxA;9^Yo<5#@$~*dcxlcX8z60E+&oNj&AOM}Rhe4eBlF4

Ioauy!BFv*hRhE4I_j>O1OkI+Id_4svoZtEG@G5fp78KV H5A}Zm_|!uu diff --git a/backend_py/endpoints/__pycache__/messages.cpython-312.pyc b/backend_py/endpoints/__pycache__/messages.cpython-312.pyc deleted file mode 100644 index 0a68292524ba7e43a0550c8e5d93e91a071472d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2507 zcma)7O>7fK6rS1H^?&S;1VRF)4j~DP5Jrfq5CIaU6j~`zDNu+-wKAT;vE%iovun~I zM@j`!sTvg|4!Ba)x>7GydZ1jI-k>L{9-0uOB%`1r^?lGPxxJ1%>~S0BIxQ`E@U<&8Zc52!;@9`M3{P5g!$XRre4-~L8ZPc zYGNG=XS-@gc`;Kz4W#jp!AWJ+2S~vh5)CmQZEz97SJaxfHYb|@6EX5X5F7smv1N3f z-tW=_&^xbPVU&7>T|5URXKo$!!cC#IbiM0(`^kHuoo_r(V-lf`Wq ztUQY!u_%kD29r+wd@?n}^3)g}jl(o-W%7<4uO(pD@Tgb^Da#~tnM=&5x_K*r%8IhT zgkc;l1{(|~gDfiEA)MuLY`RMMa?)IldfuM@~&XWAj zG9sZJ6-2Zh&z2O4_iUMf+ui_2`eNtd9f6-a4tF)(-Kc?jw@Z$fyzv9vvdlw5{orK( zDIlQ7WX_;Pg(_(&RJoX{Rve%pq`}Xn+HFu?rW(aiOG+(yk`8u+5~m(()HSM7Era`! zQ|mJ*>yyy0N;deaEv+J!q>>~nqO8p78kww8dyF`;BwQ(y^h=b|Jtu@WW#t`~cXZ5~ zVat>2Kscc>&Mkhaqc3CInS46dQ{B`P%j9F#DvX`C=&0`F@?>0Igz(tFxq{7Q>4*?L zZ$MO@r5uZkNRmz?a>L}L}b3Pb-L}qbmZW)@8Dv1 z{akqKOnB>Dc+X6D&#k>v%~J!vY`NF+N84|0v*G^nV~fGfrF3avHrO+*_ACQ1)XA}< zr(VgpJd&I73Mi0qxyzMoJ)<=bLRon&YlLEoY9%ju!9#xJ)Ef)5gKEK#DKBA%*MNYT zUH7_AGNO)69GOp7ilm0xk2;Z4=hrr9OzrByQh-Cd5mIPN{1eZTN4(pO!w!BN1CJimu z`abWQ3q@x_(NenX%!YQ3A6@WeAKX_2+#-pmh(cT3%^ zF5dyuqJSxQ6?Gy-Y9du`uz?U&l|qOC7tCUogj}Kl3^;fJ+iblh z*S<&l06q2@daQbDk3II-9y@kIm8fcOm0IZ=VLp!y{~7&!nn6@61t(E{Y;cAs9{_(NTxxU0i8<~tQ!e?u`9<~=FUKmY_l00ck)1V8`; zKmY_l00cnbcLJA>gUjsZCVjQ#;+C!&s^j3E>MUv~t%#|bh-#^$f`}GZ(N1Jl>maFE z6SJa%ilrJV)(eFvD6(o>mVp{6C7nwtUcYUbu4=lsFO415zTI~|>|DxN$vW{pSaN z8QDuAWA6r**yk)wX=X>AIU}8{?9cJowfz3MKjwMVFF^wBt?#Kda)j4kQOsLLV;-%4 zAg9nk00ck)1V8`;KmY_l00ck)1VG?#3gp7!jmz+ZvEJS0Tia27`&39iHMsaBT60Hc zOgIqaS~opb(n|fbkeuvwXZ_v#WTWDrs+dn+y3#nu%|c&Ia-9iBnHV z-B<^o&58xt&RQH-7LPKeNj$z^GL?p`OeJYj8@-5CE4gHnzfKDJNdwKeN$MXo^1Pjh zT4lMHof`FOXPR%Qt*Jaa<)X26!W6~Hs4=c}8n69YZs3 zvZQw1j!*Z8QU;&mY$H>S&l?S{#W_;*;W)AFJor~s-4E6&e5#_H$U*{-N6G@w|Om-Eo^6xXc?juI5J)v85r)GJE9kG3uY0R2o0U@8T8(NUoy~7&^UM#q=&iOIEW@@9eiV!!kXn8gw#e^A8-?u#|<-_TDC#JLQl5Qv59LQ zmuew-L}oxn$wLYy+Z|9TQ-qlq$(q(6aAhe~yIU?mVWe;sg^!9_rw{8guo2Zm%0s;Z zYK`FWAlRD`wPc}g8=M&saUzJAqJ>pOnBDX+GDsuSoTeZ>kD*6C&qmy5O~O)R0wN{3 zk0KsqJS?i}*&t$Z=OF8K?r{b_(r*>3p$y_2EFKZ3f#}X?ZCD)sd%OcDGj#YTle2AK ZlVz!b;}CCfDG9u7vXR /etc/ssh/sshd_config && \ + echo "ListenAddress 0.0.0.0" >> /etc/ssh/sshd_config && \ + echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config && \ + echo "PermitEmptyPasswords no" >> /etc/ssh/sshd_config && \ + echo "Subsystem sftp /usr/lib/ssh/sftp-server" >> /etc/ssh/sshd_config + +RUN ssh-keygen -A && \ + # echo "sshd: ALL" > /etc/hosts.deny && \ + echo "sshd: ALL" > /etc/hosts.allow + +# Run entrypoint for dev +CMD ["bash", "/entrypoint.sh"] + +# Production stage +FROM base AS production +# Run entrypoint +CMD ["bash", "/entrypoint.sh"] diff --git a/docker/default.sqlite b/docker/default.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..d2f45abed3e140cb1bc390b9e41780e7b3623a5d GIT binary patch literal 16384 zcmeI3&u<$=6vx+ge#g!tLA69q&}$QkM2ZYa2@VIOn8t}iOn$gd+T=hq-W}Tm`zyP% zP1>GP4wX3dzyVIZM1ea;4oC>N^?&H0x1JCO%8fVctdj`QLr+C|YpvHaZ{GL4_nEzn zclPF1RY(p^FL0QI>)IPyDy1y~Xqr~Uvj@-QNaK%-?NnlT$+f5z9xUec7g}cIdrjZc zpWuZKB0vO)01+SpM1Tko0U|&IhyW2F0{=ze_}xsuF+QGpa8h2dyjdHzq z-JaWAYu(!T!2L3)Y!_xL&N7PyhOnHp{#?`l(x0o(D^y1=M1Tko0U|&IhyW2F0z`la z5CI}U1c<=vLtr?QPo4b*ksinxgYo)bJ^$CUuBJcLf66`0{gV4OcR%-eZZUT?m(D)R z{+vC@KFqo!Z@)feP$oox2oM1xKm>>Y5g-CYfC&6Q2pD>wme-A*7I%5T?74Ue(mwq? zlOI8Y(KS@KZF^_N-(HO7lvh6Snmt>@v`>G%KaoY#MAsDi!7VSat@A=^EO7CUd>;^_-qWgI3@2Ori&UQUJg?TP8aQPuDvAZ3a$4ftq_29@WU70#=QcrXqotD13o$1%| z4~M(3a#L~{1;8xfi_jEq3pnm1pMj8D=m1M_COLp-_=xN#WyQ;0zOYFek550EUtUSW=R> z`<;UbBFw2%t8gLUe!$xt_s9oWICk9e?8wJ(9Mi!{0befQU<%t#2w_1HG^3WlSL9ul z5cn*>MidmFd}MN8as(C%WZ;=5<0g(XBVSkyRk17={J;|yzF>e96)6mAMz+sX-QYEw z!W0ZFjt}>h)$weV22+6W{RN!RPW6#fxOP6ZBNJ(y_?O=Mk50aMCxwGXyR+Z9kGdjX GfA - - diff --git a/frontend/src/components/__tests__/HelloWorld.spec.ts b/frontend/src/components/__tests__/HelloWorld.spec.ts deleted file mode 100644 index ed3bb12..0000000 --- a/frontend/src/components/__tests__/HelloWorld.spec.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { describe, it, expect } from 'vitest' - -import { mount } from '@vue/test-utils' -import HelloWorld from '../HelloWorld.vue' - -describe('HelloWorld', () => {}) diff --git a/frontend/src/composable/message.ts b/frontend/src/composable/message.ts index b859dac..c76e514 100644 --- a/frontend/src/composable/message.ts +++ b/frontend/src/composable/message.ts @@ -25,6 +25,15 @@ export const messageHandler = (room: string = 'general') => { }, }).then(async (response) => { let data = await getJsonOrError(response) + let latest_new_msg = Math.max(...Object.keys(data).map(Number), -Infinity) + if (latest_new_msg === -Infinity) { + throw new Error('Invalid server response') + } + if (messages.value[latest_new_msg]) { + // If the latest message is already in the cache, return the cached messages + return messages.value + } + messages.value = { ...messages.value, ...(data as Record) } return messages.value }) @@ -49,7 +58,7 @@ export const messageHandler = (room: string = 'general') => { sendMessage, messages, lastMsg: () => { - const highestKey = Math.max(...Object.keys(messages).map(Number)) + const highestKey: number = Math.max(...Object.keys(messages.value).map(Number), -Infinity) if (highestKey === -Infinity) { return undefined } @@ -59,7 +68,7 @@ export const messageHandler = (room: string = 'general') => { const keys = Object.keys(messages.value).map(Number) const index = keys.indexOf(Number(id)) if (index > 0) { - console.log('Previous message found:', messages.value[keys[index - 1]]) + //console.log('Previous message found:', messages.value[keys[index - 1]]) return messages.value[keys[index - 1]] } return undefined diff --git a/frontend/src/views/Chat.vue b/frontend/src/views/Chat.vue index e9abeb4..7e9e4ce 100644 --- a/frontend/src/views/Chat.vue +++ b/frontend/src/views/Chat.vue @@ -42,7 +42,6 @@ onMounted(() => { document.addEventListener('keypress', handleKeyPress) msg.requestMessages() msgTimer.value = setInterval(() => { - console.log('Polling for messages...') msg.requestMessages(msg.lastMsg()?.timestamp) }, 3000) // 3s }) @@ -57,7 +56,7 @@ onBeforeUnmount(() => {