From 9e3c29642778bc654ca64755128fba4e11d74143 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 16 Jul 2026 11:22:43 +0000 Subject: [PATCH] fix: clear ONLYOFFICE internal cache after save + mtime-based download URL --- .../433a0593-d3cf-414e-8763-ab5f87cbc75c.docx | Bin 40659 -> 40666 bytes renderer/carbone-templates/registry.json | 2 +- renderer/onlyoffice-service.js | 20 ++++++++++++++---- static/index.html | 4 ++-- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/renderer/carbone-templates/433a0593-d3cf-414e-8763-ab5f87cbc75c.docx b/renderer/carbone-templates/433a0593-d3cf-414e-8763-ab5f87cbc75c.docx index 93cd78a24e05d394aa28fd8fc5932cd4ced060e3..fc5a0b1db73228ef2bbcfe50cea571bb82f4e003 100644 GIT binary patch delta 2295 zcmZ8j2{crF8=o1IFkuj*L55@W7Z?7(e(@_UEbf3+pXTfmfDRj2U}iQ|+bP_tmd zSEKwjRH&pE!T;ROlyt}Cx`tnTiz`|ZYyAT!m?$|iqZ_J&zHj95iTwinIiIgFg*mr= zjR(myEi;9NLacF*BKZ{iH4(u?r${C9lKEV0vVLs!Vx;&6J-9=E9;MGq928ymRs_Uz zOd5PmmIgU!~cl(Ph?Am)(Y0H`v*L)R{3=tg^-;>nS{x`e40YsHy71a#&exqmeol zKu14f?O1!@0g=u&9wxH8*)Tqp9HHK<${WdyXer}R!H7@Wejs>DxIwYmo~S~nM1h0 zMTuSHmO$7Hts$92GPxMq@U-!XcZ4sJQX1%OS z@^|7-POXSHGC7({+82fJ%mG^F1v~Q%<)@!L5_N@BjxXOE8ZlB*FH#AgfSa!!RS;-n z61YY&tu4LnN?bng?ZuY5rb5o2j6g_e7jLK~PmH-UiCA0G@5qn^H<&B$u!}umv7Yli zy5db~rS-^45c7u8bYv!8_Y|BLiQX^8&HPm%DySy0K^SFW4Az z(-bmTmxvOkT!9Jro8QW&&OE?NO!i0?m;TMsRm&azd@|4<3D@>1yr#zE?Npg#^YU}4 zy`5$i$&q}vd~0ptE&jQyW$c`?r^H;Z^|-kzg|IH@*5ST-^=gi2TT@k!+00k3rV*|i z-{|%Ejs^Ydu~+hmnTPp|&C;wZH%%|^9 zSq~8(^zo{APjh5(M?VW~-w;yk?-oxF5{-Inp4J&r{7UytV``UOj;iX@HCClOY&9 zI;jE_+>Z}}vF$}ToSPa7>?DX1zxoVgkdaRG@exu9#XIutIqx9{)l0cP=`RD}l2_3} zNVD;cFQ_lIBccX%=`J0?D#9;(nU3joxR@per%OTjb!SR%lbX<~|NTs&gzY(x3VcQ+ z=P?Y~-cqiUf>_qp;D&O3z!LD2t-c?*y8TU_4dJ9FWM%NOI<;NKW*$WM7b)`wYI<$i zHoaUHp0VVFcf*S3Zs~beV19YIOa1ldQM=i9t~q%6tT72$v+2`#`HWQn>tXIClSH~f zUE&R%pCNzG7Z|7gyt&S7tQ76N;(yKX`B9{$7romVk)8Mal)=izoT4-}F-3wd``0qlYarpLgu_AdBvlVYMk)?Op)?&3?b6PIn3ARo z;y{}2{~ehp(v?LIG!O>_!n1z_Lm<$7n-APh$LwqFx3Kbut8?%fOWkjN@J+2`0;LY{5ioU=RrMK!~Cw z2;{o&HH%xme*TIsetrr;-gpaBD5%@}_xN`|9U?A{z5*E%jKFumTMg*R5Z_PoxV~j| uAGl@(Y6K5x_y9hd6quw~G9Pe(#sL)pY-#c!kEV%0d4OD+G%GoE&*495wg4jl delta 2221 zcmZ8j2T)Vn7EMBxAXSQi0HFqh#7?gYk1F-ii=j#HC`bt)!h-+`mrepo5dspaQ7IyV zbfpLg0TF};C@Sp@4+zS?@sEH0xM%K~wf8+|&7C=G*15C}*xL>m+}xOn`2>Vf@(pl* zcBniM$=(f>Z&E+D2L&5k5r2~b+%N!~WJl7$NmJ%60p{cK4x3IdFh&n)%n(QmP#=fD z+XpRO;`xC|Dxsy=Q5QX&aU_<|3&%$Vp>ulX3W6-B$N7}_$k{mp0qaNesE8|>e3y+x z`>G)+eZiVKfiZ>>K&RicLO4r7LS8d}Y~M zrSz(nml$sx!ivHR3I5wNRVz%lj(;QqpDR8tT&pu2BcEgUIRWcttB^lj6(}nm($_sU zy2~dYQ*+|Wjm&)xOjQzL)?4y{=wHSt_eVH1lTz=tqG={XqpRq&T~9dIbT`1EKTNa^ zeVn9R!*Wi+1!X>CE!sHroMlMQ2ijJS@nJs4PSMR%uimn}AdxK4?_11Qs~q|nFSXVv zlBLWP)@RW$wt{jx(SvA!FUacN5pnMoXNJ41ir89K3@{<0k+h4Qwe_2D1?q#sW2s_| zIjlh?g||rOc6j7kcD%}QY$-|*Zu(u>$NUQoL+zZ8aam&_TJa(9g`TQ^zn^(1lME-C zis~OM5+{_?F9f^DnlNeen!a?wqn8FLl*Lzw6uUd7J#m?8s+7g;>1p(C$9g{S!bbYI_SMHNv%j56o|Nbgu3mC(Cb_(puF~V-c&!{8SM$NYIW?P?`$KJXh$xA zf8*OCUVc?vA{g|i?e}Q5C{F$pIX#mh5pLhCe~>~}d% zcoo7`#u0U((mQV&iCIRrwwqOZ1Zz}8Q|HgWx}pB5M8i z^KU&LbR~EUgsk=};=e@am0s>=)m^!iko&zQg-esYB)hZVwuEqS*i2)pH@%hUMxKi5 zY;L|O)Fw?1+F7MX*;lz)q}qE-XpdK6+eap?d&k^!WXi`Lv>RyUWrS1~UZuZFCn1L^ zgjlOKo4O#rT1$KZ8^3``k!=e`El?hpUsrnlTkM_LXcy%wyk(ONCTYVqabC)kF7grK zF62Wyur2P-F(NB8Miv{TAAS8dA~e74%UT-;)eN)thur(bA8DZ+K`S{DxUeAe^sZjg zOGgV=p*>^N1)-umH>H$9wwW>=zjTO(nJ;$vAD0gc@ir9U;S5cbcbGa!TX0An=fZsv zEm4tI;B!774~)`v8qo*Z5 z*nR~iJA@H_=zM4HY$gcgEC&R_3x;P?-|adkFdZXO(itHMOLb+Wrw~C5h)>J=$(lhN zCbWPr6VoGMc!r2D(Dn5m6atX|g%~0pLGI?ELBU~I_n=Tu#mE5v*zDQBISHO**H<6s z2@ScXeo?8R-V_Ac@`>Su8jK&CdYoN$>)*~h)Lw86$#)7 z>C)FK{-jM{wy(#Q#z`4!<8r(oB?x>%-NR#C3~i0p7xSNRsr#}UE*F>^J&_c-Vrz+5 zW_92dw7|J-O&-`>Gl?}N-PQ*Uz85hZop=!RntGAanMsH5l^0b*XqOEu;-f=Bq zwh^3>3HP(}HC0xTa5gU~m}bvv+~obhTXFOPC$;=Tb5$;6AMseS7I^{`J% z6W&4f&0T6PFhC!)3WUfu1Fokk|He-=Zmy{yGTzJp9AO4#Ykuw5M3+*aw5pxf!1Oa z$mc-52^Nr7v4Ae=JXVlkptDlehU5)76h)9oCY^%mLQ=Vz@rj0 JE1{6F;6GqH(UbrH diff --git a/renderer/carbone-templates/registry.json b/renderer/carbone-templates/registry.json index 2c0a881..1086756 100644 --- a/renderer/carbone-templates/registry.json +++ b/renderer/carbone-templates/registry.json @@ -6,6 +6,6 @@ "originalName": "master_cv_template.docx", "path": "/root/workspace/cv-app/renderer/carbone-templates/433a0593-d3cf-414e-8763-ab5f87cbc75c.docx", "uploadedAt": "2026-07-16T09:03:29.601Z", - "updatedAt": "2026-07-16T11:17:19.354Z" + "updatedAt": "2026-07-16T11:21:01.888Z" } ] \ No newline at end of file diff --git a/renderer/onlyoffice-service.js b/renderer/onlyoffice-service.js index 1c8ed69..30d6e51 100644 --- a/renderer/onlyoffice-service.js +++ b/renderer/onlyoffice-service.js @@ -146,10 +146,11 @@ router.get('/:templateId/config', (req, res) => { const docKey = generateDocKey(templateId, fileMtime); const fileName = template.originalName || template.name + '.docx'; - // Add cache-busting timestamp to the document URL so ONLYOFFICE - // always fetches the latest version from our backend - const cacheBuster = Date.now(); - const documentUrl = `${BACKEND_PUBLIC_URL}/api/onlyoffice/${templateId}/download?cb=${cacheBuster}`; + // Add file mtime as cache-buster to the document URL so ONLYOFFICE + // always fetches the latest version from our backend. + // The mtime changes every time the file is saved, so the URL is + // different after each save, forcing ONLYOFFICE to re-download. + const documentUrl = `${BACKEND_PUBLIC_URL}/api/onlyoffice/${templateId}/download?mtime=${fileMtime}&cb=${Date.now()}`; const callbackUrl = `${BACKEND_PUBLIC_URL}/api/onlyoffice/${templateId}/callback`; const config = { @@ -316,6 +317,17 @@ router.post('/:templateId/callback', async (req, res) => { console.log(`Template "${template.name}" updated successfully (${response.data.length} bytes)`); + // Clear ONLYOFFICE's internal document cache for this template + // so the next edit session fetches the fresh file + try { + const { execSync } = require('child_process'); + execSync(`docker exec onlyoffice-server find /var/lib/onlyoffice/documentserver/App_Data/cache -name "cvtemplate_${templateId}*" -type d -exec rm -rf {} + 2>/dev/null || true`, { timeout: 5000 }); + console.log('ONLYOFFICE cache cleared for template:', templateId); + } catch (cacheErr) { + // Non-fatal — cache will expire naturally + console.log('Cache clear skipped:', cacheErr.message.substring(0, 100)); + } + // ONLYOFFICE expects a JSON response acknowledging the save return res.json({ error: 0, diff --git a/static/index.html b/static/index.html index 83c8ff3..5e32c0c 100644 --- a/static/index.html +++ b/static/index.html @@ -139,7 +139,7 @@ - - + + \ No newline at end of file