From dec68aff39e41961670c8ad56b81fa830e2fa3d1 Mon Sep 17 00:00:00 2001 From: fabio Date: Wed, 18 Feb 2026 21:10:23 +0100 Subject: [PATCH] first commit --- .gitignore | 1 + LICENSE | 9 + README.md | 37 ++ ...ing_Migrazione_WinDev_HFSQL_PostgreSQL.pdf | 99 ++++++ .../Brochure_Corso_PostgreSQL.pdf | 74 ++++ .../Brochure_Corso_PostgreSQL.pdf | 74 ++++ .../Corso_PostgreSQL_Aziendale.pdf | 74 ++++ go.mod | 19 + go.sum | 27 ++ info.md | 11 + main.go | 334 ++++++++++++++++++ server_windows.exe | Bin 0 -> 12085248 bytes static/.gitkeep | 1 + static/assets/AddressModal-33esE-yw.js | 1 + static/assets/AddressModal-B9qIzCZw.css | 1 + static/assets/ChildrenStep-BBVX4YNf.css | 1 + static/assets/ChildrenStep-DIWgJte8.js | 1 + static/assets/ErrorNotFound-DTeMlvH6.js | 1 + static/assets/IndexPage-BG9UvoN4.css | 1 + static/assets/IndexPage-CTPnu3LT.js | 2 + ...ylUAMQXC89YmC2DPNWuYjalmUiAw-BepdiOnY.woff | Bin 0 -> 25552 bytes ...ylUAMQXC89YmC2DPNWuZtalmUiAw-4ZhHFPot.woff | Bin 0 -> 25260 bytes ...ylUAMQXC89YmC2DPNWuaabVmUiAw-CNa4tw4G.woff | Bin 0 -> 25368 bytes ...ylUAMQXC89YmC2DPNWub2bVmUiAw-CHKg1YId.woff | Bin 0 -> 25396 bytes ...ylUAMQXC89YmC2DPNWubEbFmUiAw-yBxCyPWP.woff | Bin 0 -> 24924 bytes ...ylUAMQXC89YmC2DPNWubEbVmUiAw-3fZ6d7DD.woff | Bin 0 -> 25192 bytes static/assets/LocalStorage-Bg7wwOV9.js | 1 + static/assets/MainLayout-CM_GOb4R.js | 1 + static/assets/MaritalStep-3A02lP7t.css | 1 + static/assets/MaritalStep-BZz2uhjH.js | 1 + static/assets/QBtn-Bl8V3g1s.js | 1 + static/assets/QFile-DVWif_Vn.js | 1 + static/assets/QList-CPm2VhlR.js | 1 + static/assets/QSeparator-D1JYPgu2.js | 1 + static/assets/TaxpayerStep-CCM9SKxW.css | 1 + static/assets/TaxpayerStep-De3KELaV.js | 1 + static/assets/WelcomeStep-95IM2IEv.css | 1 + static/assets/WelcomeStep-Bmtt6Knz.js | 1 + static/assets/children-Dx8AhorD.js | 1 + ...flUhRq6tzZclQEJ-Vdg-IuiaDsNa-Dr0goTwe.woff | Bin 0 -> 164912 bytes ...tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ-D-x-0Q06.woff2 | Bin 0 -> 128616 bytes static/assets/i18n-m2bQY332.js | 1 + static/assets/index-BFHpqQMc.js | 2 + static/assets/index-BQveqNql.css | 1 + static/assets/taxstore-B0e8PHMB.js | 1 + static/assets/use-router-link-niyq3CDa.js | 1 + static/assets/vue-i18n.runtime-CGMLV8bE.js | 3 + .../dist/spa/assets/AddressInput-87dDVmDx.js | 1 + .../dist/spa/assets/AddressInput-DTjVpzGz.css | 1 + .../dist/spa/assets/ChildrenStep-CyFMlGKq.css | 1 + .../dist/spa/assets/ChildrenStep-bpUch1TG.js | 1 + .../spa/assets/CommentAttachment-Cd2tEdil.js | 1 + .../spa/assets/CommentAttachment-M56Dxc2A.css | 1 + .../dist/spa/assets/ErrorNotFound-CesTk-hq.js | 1 + static/dist/spa/assets/IndexPage-B-pkHUHg.js | 2 + static/dist/spa/assets/IndexPage-CYr0HuN7.css | 1 + ...ylUAMQXC89YmC2DPNWuYjalmUiAw-BepdiOnY.woff | Bin 0 -> 25552 bytes ...ylUAMQXC89YmC2DPNWuZtalmUiAw-4ZhHFPot.woff | Bin 0 -> 25260 bytes ...ylUAMQXC89YmC2DPNWuaabVmUiAw-CNa4tw4G.woff | Bin 0 -> 25368 bytes ...ylUAMQXC89YmC2DPNWub2bVmUiAw-CHKg1YId.woff | Bin 0 -> 25396 bytes ...ylUAMQXC89YmC2DPNWubEbFmUiAw-yBxCyPWP.woff | Bin 0 -> 24924 bytes ...ylUAMQXC89YmC2DPNWubEbVmUiAw-3fZ6d7DD.woff | Bin 0 -> 25192 bytes static/dist/spa/assets/MainLayout-CElAwhLV.js | 1 + .../dist/spa/assets/MaritalStep-B1YvSTl7.js | 1 + .../dist/spa/assets/MaritalStep-DL6z_e8a.css | 1 + static/dist/spa/assets/QList-D7mleCtN.js | 1 + .../dist/spa/assets/TaxpayerStep-B6ffPYtU.js | 1 + .../dist/spa/assets/TaxpayerStep-CWAfROv3.css | 1 + .../dist/spa/assets/WelcomeStep-4mnlgiMd.js | 1 + .../dist/spa/assets/WelcomeStep-BTfvnfIz.css | 1 + static/dist/spa/assets/children-Cq9nPSB7.js | 1 + ...flUhRq6tzZclQEJ-Vdg-IuiaDsNa-Dr0goTwe.woff | Bin 0 -> 164912 bytes ...tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ-D-x-0Q06.woff2 | Bin 0 -> 128616 bytes static/dist/spa/assets/i18n-RMseQcCa.js | 1 + static/dist/spa/assets/index-BQveqNql.css | 1 + static/dist/spa/assets/index-BmjEiQ1N.js | 2 + static/dist/spa/assets/taxstore-_HmhNaxB.js | 1 + .../spa/assets/vue-i18n.runtime-BJiJhJjW.js | 3 + static/dist/spa/favicon.ico | Bin 0 -> 64483 bytes static/dist/spa/icons/favicon-128x128.png | Bin 0 -> 12324 bytes static/dist/spa/icons/favicon-16x16.png | Bin 0 -> 859 bytes static/dist/spa/icons/favicon-32x32.png | Bin 0 -> 2039 bytes static/dist/spa/icons/favicon-96x96.png | Bin 0 -> 9643 bytes static/dist/spa/index.html | 3 + static/favicon.ico | Bin 0 -> 64483 bytes static/icons/favicon-128x128.png | Bin 0 -> 12324 bytes static/icons/favicon-16x16.png | Bin 0 -> 859 bytes static/icons/favicon-32x32.png | Bin 0 -> 2039 bytes static/icons/favicon-96x96.png | Bin 0 -> 9643 bytes static/index.html | 3 + testServer | Bin 0 -> 11898480 bytes 91 files changed, 823 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 docs/00000000-0000-0000-0000-000000000000/income/accountingDocuments/Brainstorming_Migrazione_WinDev_HFSQL_PostgreSQL.pdf create mode 100644 docs/00000000-0000-0000-0000-000000000000/income/avsCertificate/Brochure_Corso_PostgreSQL.pdf create mode 100644 docs/00000000-0000-0000-0000-000000000000/income/salaryCertificate/Brochure_Corso_PostgreSQL.pdf create mode 100644 docs/00000000-0000-0000-0000-000000000000/income/unemploymentCertificate/Corso_PostgreSQL_Aziendale.pdf create mode 100644 go.mod create mode 100644 go.sum create mode 100644 info.md create mode 100644 main.go create mode 100755 server_windows.exe create mode 100644 static/.gitkeep create mode 100644 static/assets/AddressModal-33esE-yw.js create mode 100644 static/assets/AddressModal-B9qIzCZw.css create mode 100644 static/assets/ChildrenStep-BBVX4YNf.css create mode 100644 static/assets/ChildrenStep-DIWgJte8.js create mode 100644 static/assets/ErrorNotFound-DTeMlvH6.js create mode 100644 static/assets/IndexPage-BG9UvoN4.css create mode 100644 static/assets/IndexPage-CTPnu3LT.js create mode 100644 static/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuYjalmUiAw-BepdiOnY.woff create mode 100644 static/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuZtalmUiAw-4ZhHFPot.woff create mode 100644 static/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabVmUiAw-CNa4tw4G.woff create mode 100644 static/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWub2bVmUiAw-CHKg1YId.woff create mode 100644 static/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbFmUiAw-yBxCyPWP.woff create mode 100644 static/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmUiAw-3fZ6d7DD.woff create mode 100644 static/assets/LocalStorage-Bg7wwOV9.js create mode 100644 static/assets/MainLayout-CM_GOb4R.js create mode 100644 static/assets/MaritalStep-3A02lP7t.css create mode 100644 static/assets/MaritalStep-BZz2uhjH.js create mode 100644 static/assets/QBtn-Bl8V3g1s.js create mode 100644 static/assets/QFile-DVWif_Vn.js create mode 100644 static/assets/QList-CPm2VhlR.js create mode 100644 static/assets/QSeparator-D1JYPgu2.js create mode 100644 static/assets/TaxpayerStep-CCM9SKxW.css create mode 100644 static/assets/TaxpayerStep-De3KELaV.js create mode 100644 static/assets/WelcomeStep-95IM2IEv.css create mode 100644 static/assets/WelcomeStep-Bmtt6Knz.js create mode 100644 static/assets/children-Dx8AhorD.js create mode 100644 static/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNa-Dr0goTwe.woff create mode 100644 static/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ-D-x-0Q06.woff2 create mode 100644 static/assets/i18n-m2bQY332.js create mode 100644 static/assets/index-BFHpqQMc.js create mode 100644 static/assets/index-BQveqNql.css create mode 100644 static/assets/taxstore-B0e8PHMB.js create mode 100644 static/assets/use-router-link-niyq3CDa.js create mode 100644 static/assets/vue-i18n.runtime-CGMLV8bE.js create mode 100644 static/dist/spa/assets/AddressInput-87dDVmDx.js create mode 100644 static/dist/spa/assets/AddressInput-DTjVpzGz.css create mode 100644 static/dist/spa/assets/ChildrenStep-CyFMlGKq.css create mode 100644 static/dist/spa/assets/ChildrenStep-bpUch1TG.js create mode 100644 static/dist/spa/assets/CommentAttachment-Cd2tEdil.js create mode 100644 static/dist/spa/assets/CommentAttachment-M56Dxc2A.css create mode 100644 static/dist/spa/assets/ErrorNotFound-CesTk-hq.js create mode 100644 static/dist/spa/assets/IndexPage-B-pkHUHg.js create mode 100644 static/dist/spa/assets/IndexPage-CYr0HuN7.css create mode 100644 static/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuYjalmUiAw-BepdiOnY.woff create mode 100644 static/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuZtalmUiAw-4ZhHFPot.woff create mode 100644 static/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWuaabVmUiAw-CNa4tw4G.woff create mode 100644 static/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWub2bVmUiAw-CHKg1YId.woff create mode 100644 static/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbFmUiAw-yBxCyPWP.woff create mode 100644 static/dist/spa/assets/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmUiAw-3fZ6d7DD.woff create mode 100644 static/dist/spa/assets/MainLayout-CElAwhLV.js create mode 100644 static/dist/spa/assets/MaritalStep-B1YvSTl7.js create mode 100644 static/dist/spa/assets/MaritalStep-DL6z_e8a.css create mode 100644 static/dist/spa/assets/QList-D7mleCtN.js create mode 100644 static/dist/spa/assets/TaxpayerStep-B6ffPYtU.js create mode 100644 static/dist/spa/assets/TaxpayerStep-CWAfROv3.css create mode 100644 static/dist/spa/assets/WelcomeStep-4mnlgiMd.js create mode 100644 static/dist/spa/assets/WelcomeStep-BTfvnfIz.css create mode 100644 static/dist/spa/assets/children-Cq9nPSB7.js create mode 100644 static/dist/spa/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNa-Dr0goTwe.woff create mode 100644 static/dist/spa/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ-D-x-0Q06.woff2 create mode 100644 static/dist/spa/assets/i18n-RMseQcCa.js create mode 100644 static/dist/spa/assets/index-BQveqNql.css create mode 100644 static/dist/spa/assets/index-BmjEiQ1N.js create mode 100644 static/dist/spa/assets/taxstore-_HmhNaxB.js create mode 100644 static/dist/spa/assets/vue-i18n.runtime-BJiJhJjW.js create mode 100644 static/dist/spa/favicon.ico create mode 100644 static/dist/spa/icons/favicon-128x128.png create mode 100644 static/dist/spa/icons/favicon-16x16.png create mode 100644 static/dist/spa/icons/favicon-32x32.png create mode 100644 static/dist/spa/icons/favicon-96x96.png create mode 100644 static/dist/spa/index.html create mode 100644 static/favicon.ico create mode 100644 static/icons/favicon-128x128.png create mode 100644 static/icons/favicon-16x16.png create mode 100644 static/icons/favicon-32x32.png create mode 100644 static/icons/favicon-96x96.png create mode 100644 static/index.html create mode 100755 testServer diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a48538 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_store \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6d6dd60 --- /dev/null +++ b/LICENSE @@ -0,0 +1,9 @@ +Copyright (C) 2000 Carsten Haitzler and various contributors (see AUTHORS) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies of the Software and its Copyright notices. In addition publicly documented acknowledgment must be given that this software has been used if no source code of this software is made available publicly. This includes acknowledgments in either Copyright notices, Manuals, Publicity and Marketing documents or any documentation provided with any product containing this software. This License does not apply to any software that links to the libraries provided by this software (statically or dynamically), but only to the software provided. + +Please see the COPYING.PLAIN for a plain-english explanation of this notice and it's intent. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b8851e0 --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +# Server build & embed helpers + +Short instructions to build and embed the SPA into the Go server binary. + +- Build for host (mac/linux): + +```sh +make build-embed +``` + +- Build Windows executable (cross-compile) from mac/linux (requires Go installed): + +```sh +# run PowerShell script (requires pwsh) +make windows + +# or do it manually from the repository root: +cd server +cp -R ../app/dist/spa/. server/static/ +GOOS=windows GOARCH=amd64 go build -o server/server_windows.exe main.go +``` + +After building, run the binary (host OS): + +```sh +PORT=8080 ./server/server.bin +``` + +- Build mac binaries (darwin amd64 + arm64): + +```sh +make mac +# or manually: +cd server +GOOS=darwin GOARCH=amd64 go build -o server/server_darwin_amd64 main.go +GOOS=darwin GOARCH=arm64 go build -o server/server_darwin_arm64 main.go +``` diff --git a/docs/00000000-0000-0000-0000-000000000000/income/accountingDocuments/Brainstorming_Migrazione_WinDev_HFSQL_PostgreSQL.pdf b/docs/00000000-0000-0000-0000-000000000000/income/accountingDocuments/Brainstorming_Migrazione_WinDev_HFSQL_PostgreSQL.pdf new file mode 100644 index 0000000..0861a91 --- /dev/null +++ b/docs/00000000-0000-0000-0000-000000000000/income/accountingDocuments/Brainstorming_Migrazione_WinDev_HFSQL_PostgreSQL.pdf @@ -0,0 +1,99 @@ +%PDF-1.4 +%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R /F2 3 0 R /F3 4 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Symbol /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font +>> +endobj +5 0 obj +<< +/Contents 10 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +6 0 obj +<< +/Contents 11 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +7 0 obj +<< +/PageMode /UseNone /Pages 9 0 R /Type /Catalog +>> +endobj +8 0 obj +<< +/Author (\(anonymous\)) /CreationDate (D:20251229164830+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20251229164830+00'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False +>> +endobj +9 0 obj +<< +/Count 2 /Kids [ 5 0 R 6 0 R ] /Type /Pages +>> +endobj +10 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2025 +>> +stream +GatU3gN)"=&:O:SoHWlEJL%CI_\bJ\iZ!tOD3\JJdQf-0Bp@#$c2-b8k9;(#V51Ccfb-*se#0*>?Z;^"+'8IQ@XtKgoPRoQ4kOSe*B4/R/7GeDqgR[2aaj]Wak3"TVA%IpNP=6\]/.rZbN$/IfYmV;YHQ:Ce4Cn2RJPqMmVbGUgpaj(:ArNL4Rl,5"@ZTJYW7JVbn<),N1[Zp"2Eh`%D+\ufZiCO2RKa+:[$"8'!\o),.X?X;?e!T4.8\E'N2bG6pi)-&Fa4+7A_(N\`>K-/0Gk*_UuE]5oudBLQi-j'ndkNSf+kF#Ef8t$[CXV],nK"dY"m3#*\CA)U;-e&+Qah:7DAPL5&=@iHN=_A7M,YM8BgR^D4W/]U$B0e\C4T\K6cE%]_KB.`/9lu=qs/++VtD"joJ1C1`52tL_PUoRdE[T$TA3e3;%"=X7(jT]OU4e^X,m[Bp<65h\j-J.0J`56u+uB'o+gZYbjtaee/Mbp_6$$1@SC,f)]23#<_NhZPQBf1Q-ltq9KtAU@Hb;?bbok82U0r-Yd3Pe+d&Pqb,$DpoG]=p:3^j)kV\(DH0NVhX":oPse?+m;%O*Ls&ZqVKo6m8.Q7]CHa3F>iaSD#]'Io8Qg?+/,PB";k_S(B3f_AZkU&bKcs*n5QmOhhj#U]K"KYL^/>smA8(O4Q4CRbAuY77@kQ58Q5-+InCiite,RBgDQN+AS5KcZm>MkeWYc_r1h8uedh5WPTTCn&.gXt[M!Gt1[mVDkaX#G;7UV@E8F]rHee79"EifOkjL(=NpZ2LY9J&9c[3jWk._qtTj+@fl8Kh)=_T!bO:TljW(NG-ZXhB,8ZDh"/?PcO)O?g:&7*[^lf*[$X,jrq[[nON1hPRt8k]k6aL"G5I(,l&R4793j>jBQD7Atn)Q,<>dXM'7qY*rBi93@*MJ^h=hpR/b-'n)B0FWLG$lKA63nQC[4bT7bkVT2gPDK;7p.10"K#,'tq]?q>NO2?_iFjl39S5eq(1FQiQ"mhUG)K65u?8>DPR,5Qti"-t.G)_I,kc:H49A"??SOYQ;u]J9*e3.<'E6kA&T(a*V+mKB)6mYU";2TZgt\QiQ-[0ec'`-7V#M2(`$>cL`4O#q`SbpWm.NZ[L(l:C]Ir5Dan;lmN0r;eYX4@'t_LP>YUnQmfT;=p-"6dTi>`B">ZJc+D1Ob`a\$n5@)SnMb/e1[T&3pLp^i)-;!?V.gBQ*L3,5b@)JREH,c4h,@&0RU*nAEj\+\endstream +endobj +11 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 849 +>> +stream +Gat=)9lJc?%)(h*nR@o6+0%FWt@`e#Q.%%qC>tck.kqGGYWsWW'-@ml!k`Ks2#ir;A(,tY`6$n"?Db2kX)CO_\.keZ.`j&h`KSYjJ!srK-W`7ZoLPH``O6(Ke?=4i?Uk5)sIj2bOQF.otams6dZIL$C!QJ#[E9unVTi)/H[fj)Wg&-=JukIVDk^EP0uV"%O5h2th#j:KT,aTu<[u(Y@1U2,FSp7F`^V+Dgl]m"MO+aG9:Ab@W/>1`\I=puE;1&(j[g.^[9"4kTDuZ8%)f;$Ee2F*7sM8S3b?KE(:s8+b,P/6,.g_Cq)(\D?Ii\V`ab@(1ur-D,Bs:V:FNY1WNI<`k[)(s;TeWJ.aYjf.?n;`cm#Th'.H2gE]LIhoo'1%Oh?.TVS))lkP2kspI!c&Fs2k>endstream +endobj +xref +0 12 +0000000000 65535 f +0000000073 00000 n +0000000124 00000 n +0000000231 00000 n +0000000308 00000 n +0000000420 00000 n +0000000624 00000 n +0000000828 00000 n +0000000896 00000 n +0000001179 00000 n +0000001244 00000 n +0000003361 00000 n +trailer +<< +/ID +[<408ac9e8feadd6a710d7f45edbbb5b30><408ac9e8feadd6a710d7f45edbbb5b30>] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 8 0 R +/Root 7 0 R +/Size 12 +>> +startxref +4301 +%%EOF diff --git a/docs/00000000-0000-0000-0000-000000000000/income/avsCertificate/Brochure_Corso_PostgreSQL.pdf b/docs/00000000-0000-0000-0000-000000000000/income/avsCertificate/Brochure_Corso_PostgreSQL.pdf new file mode 100644 index 0000000..7c227cc --- /dev/null +++ b/docs/00000000-0000-0000-0000-000000000000/income/avsCertificate/Brochure_Corso_PostgreSQL.pdf @@ -0,0 +1,74 @@ +%PDF-1.4 +%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R /F2 3 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/Contents 8 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 7 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +5 0 obj +<< +/PageMode /UseNone /Pages 7 0 R /Type /Catalog +>> +endobj +6 0 obj +<< +/Author (\(anonymous\)) /CreationDate (D:20251209171836+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20251209171836+00'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False +>> +endobj +7 0 obj +<< +/Count 1 /Kids [ 4 0 R ] /Type /Pages +>> +endobj +8 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 619 +>> +stream +Gau1+9lHLd&;KZQ'm"IHa(>(d\$TkG8?(T**.:u-QqR[qA/BXOf6>%+EYK2?P-ko-B(sjQba/S(m.jgr-e?pu6oR,_lje"sKI@IW7T(2>[FeIef$0-L2ukr6--^We+nqb]=]='d#bAlt:N#2uOMgM"ZSKZ0mbi%7*ICAta]V`-D;M(%*,IoB.[4n[ius+ct0)d/kDNZ?5Jni,9%;Ip->Y"QoJ6X(PLo9+1SH!f1i!1k_K`^?tp[0F6<1*]*15bg;VFAA?MlGqjg[>e4u+pj,W-)'8bj,(UdE'9Fj906H-&Y'O$Sbd>6Ijo$WEFM\"$$B#?-'k6S"BMinm"ugZ7&RK^FitYaMuKX1/P#*(e+QFt\=(rJNb0XE:[PLohRqS38uT99Qc"7S;H_],O/Oc.%g-aC63~>endstream +endobj +xref +0 9 +0000000000 65535 f +0000000073 00000 n +0000000114 00000 n +0000000221 00000 n +0000000333 00000 n +0000000536 00000 n +0000000604 00000 n +0000000887 00000 n +0000000946 00000 n +trailer +<< +/ID +[] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 6 0 R +/Root 5 0 R +/Size 9 +>> +startxref +1655 +%%EOF diff --git a/docs/00000000-0000-0000-0000-000000000000/income/salaryCertificate/Brochure_Corso_PostgreSQL.pdf b/docs/00000000-0000-0000-0000-000000000000/income/salaryCertificate/Brochure_Corso_PostgreSQL.pdf new file mode 100644 index 0000000..7c227cc --- /dev/null +++ b/docs/00000000-0000-0000-0000-000000000000/income/salaryCertificate/Brochure_Corso_PostgreSQL.pdf @@ -0,0 +1,74 @@ +%PDF-1.4 +%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R /F2 3 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/Contents 8 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 7 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +5 0 obj +<< +/PageMode /UseNone /Pages 7 0 R /Type /Catalog +>> +endobj +6 0 obj +<< +/Author (\(anonymous\)) /CreationDate (D:20251209171836+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20251209171836+00'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False +>> +endobj +7 0 obj +<< +/Count 1 /Kids [ 4 0 R ] /Type /Pages +>> +endobj +8 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 619 +>> +stream +Gau1+9lHLd&;KZQ'm"IHa(>(d\$TkG8?(T**.:u-QqR[qA/BXOf6>%+EYK2?P-ko-B(sjQba/S(m.jgr-e?pu6oR,_lje"sKI@IW7T(2>[FeIef$0-L2ukr6--^We+nqb]=]='d#bAlt:N#2uOMgM"ZSKZ0mbi%7*ICAta]V`-D;M(%*,IoB.[4n[ius+ct0)d/kDNZ?5Jni,9%;Ip->Y"QoJ6X(PLo9+1SH!f1i!1k_K`^?tp[0F6<1*]*15bg;VFAA?MlGqjg[>e4u+pj,W-)'8bj,(UdE'9Fj906H-&Y'O$Sbd>6Ijo$WEFM\"$$B#?-'k6S"BMinm"ugZ7&RK^FitYaMuKX1/P#*(e+QFt\=(rJNb0XE:[PLohRqS38uT99Qc"7S;H_],O/Oc.%g-aC63~>endstream +endobj +xref +0 9 +0000000000 65535 f +0000000073 00000 n +0000000114 00000 n +0000000221 00000 n +0000000333 00000 n +0000000536 00000 n +0000000604 00000 n +0000000887 00000 n +0000000946 00000 n +trailer +<< +/ID +[] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 6 0 R +/Root 5 0 R +/Size 9 +>> +startxref +1655 +%%EOF diff --git a/docs/00000000-0000-0000-0000-000000000000/income/unemploymentCertificate/Corso_PostgreSQL_Aziendale.pdf b/docs/00000000-0000-0000-0000-000000000000/income/unemploymentCertificate/Corso_PostgreSQL_Aziendale.pdf new file mode 100644 index 0000000..0436c23 --- /dev/null +++ b/docs/00000000-0000-0000-0000-000000000000/income/unemploymentCertificate/Corso_PostgreSQL_Aziendale.pdf @@ -0,0 +1,74 @@ +%PDF-1.4 +%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R /F2 3 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/Contents 8 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 7 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +5 0 obj +<< +/PageMode /UseNone /Pages 7 0 R /Type /Catalog +>> +endobj +6 0 obj +<< +/Author (\(anonymous\)) /CreationDate (D:20251209171836+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20251209171836+00'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False +>> +endobj +7 0 obj +<< +/Count 1 /Kids [ 4 0 R ] /Type /Pages +>> +endobj +8 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 886 +>> +stream +Gau1-bAQ&g&4Q?mMHMu/lABm<]-^70"DJp]MJg)#-/)`WOUagVW5$%kb#XoSc*^_$/)G>@YdQ1MrQ)&2_a0WJ6Gb*ed`ddN:3!tmT"_"YFLb>#g[gdg7c.%V#(hPk#5O8-@]g`]t_Itbc7+.-4Wg`FLPO$T4`WYO(VXSK23)(o(%Gf83#/",!no,kB$OoZAaVFWG_Hofrduk$^!==+0Hnm%2V*:!^CPfdHSF')XElK9C9A9j:-=_Y<6Yin.o38Ggqs->VJlTL3WgW_6MaX9oOY$0V8AW$iEh79(6Ba8",-q3JE^mGJkJ&SoCq3G47:iW0".)TA8Yqg,dQY/`):L?Womq)0c8'.^OO8[GL$(N_T.,q;#)h`jr;Q-^'J@hW;u"@$/q5d[1QBSY`CV_14JoaCl3$#*(4OQ8>-[I\ijl3pV+n&BNIgf_Kk#FfXZd:LC%9J_p7pK7JjM;nQjpUjRURp`0W+Hol9h&RdrfqjPM!%]D`.dFRc1,(=!V'-XX1&.hXZ,#cTa*kBHNnDfUh3Y4kSLTBFPQ\laOOJHP":?P7fMVCUBca6i[i]8mZp&b]VDU_S'VN#$NWMr&4=UG8=d<^6-fAI?Ib`%_]endstream +endobj +xref +0 9 +0000000000 65535 f +0000000073 00000 n +0000000114 00000 n +0000000221 00000 n +0000000333 00000 n +0000000536 00000 n +0000000604 00000 n +0000000887 00000 n +0000000946 00000 n +trailer +<< +/ID +[<8691e2956541560fed096e42ad1ac7e8><8691e2956541560fed096e42ad1ac7e8>] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 6 0 R +/Root 5 0 R +/Size 9 +>> +startxref +1922 +%%EOF diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..cabde3c --- /dev/null +++ b/go.mod @@ -0,0 +1,19 @@ +module testServer + +go 1.25.4 + +require github.com/gofiber/fiber/v2 v2.52.5 + +require ( + github.com/andybalholm/brotli v1.0.5 // indirect + github.com/google/uuid v1.5.0 // indirect + github.com/klauspost/compress v1.17.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.51.0 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + golang.org/x/sys v0.15.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..fab6978 --- /dev/null +++ b/go.sum @@ -0,0 +1,27 @@ +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo= +github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= +github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/info.md b/info.md new file mode 100644 index 0000000..d5b014c --- /dev/null +++ b/info.md @@ -0,0 +1,11 @@ +# 1) build frontend +cd app +pnpm run build + +# 2) copia la SPA nella cartella server/static +cd .. +rm -rf server/static/* && cp -R app/dist/spa/. server/static/ + +# 3) cross-compile per Windows (amd64) +cd server +GOOS=windows GOARCH=amd64 go build -o server_windows.exe main.go \ No newline at end of file diff --git a/main.go b/main.go new file mode 100644 index 0000000..198f413 --- /dev/null +++ b/main.go @@ -0,0 +1,334 @@ +package main + +import ( + "fmt" + "log" + "os" + "path/filepath" + "regexp" + "strings" + + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/cors" + "github.com/gofiber/fiber/v2/middleware/logger" + "github.com/gofiber/fiber/v2/middleware/recover" +) + +var safePathTokenRe = regexp.MustCompile(`[^a-zA-Z0-9._-]+`) + +func safePathToken(s string) string { + s = strings.TrimSpace(s) + s = strings.ReplaceAll(s, string(filepath.Separator), "_") + // In case the client sent URL-like separators. + s = strings.ReplaceAll(s, "/", "_") + s = strings.ReplaceAll(s, "\\", "_") + s = safePathTokenRe.ReplaceAllString(s, "_") + s = strings.Trim(s, "._-") + if s == "" || s == "." { + return "" + } + if len(s) > 128 { + s = s[:128] + } + return s +} + +func safeFilename(name string) string { + name = strings.TrimSpace(name) + name = filepath.Base(name) + if name == "" || name == "." || name == ".." { + return "" + } + // Disallow any remaining separators just in case. + name = strings.ReplaceAll(name, string(filepath.Separator), "_") + name = strings.ReplaceAll(name, "/", "_") + name = strings.ReplaceAll(name, "\\", "_") + if name == "" || name == "." || name == ".." { + return "" + } + if len(name) > 255 { + name = name[:255] + } + return name +} + +func main() { + port := os.Getenv("PORT") + if port == "" { + port = "8082" + } + + app := fiber.New(fiber.Config{ + DisableStartupMessage: true, + }) + + app.Use(recover.New()) + app.Use(logger.New()) + app.Use(cors.New(cors.Config{ + AllowOrigins: "*", + AllowHeaders: "Origin, Content-Type, Accept, Authorization", + AllowMethods: "GET,POST,PUT,PATCH,DELETE,OPTIONS", + })) + + // Ensure preflight requests are handled. + app.Options("/*", func(c *fiber.Ctx) error { + return c.SendStatus(fiber.StatusNoContent) + }) + + app.Get("/health", func(c *fiber.Ctx) error { + return c.Status(fiber.StatusOK).SendString("ok") + }) + + // Serve built SPA from disk (no embedding). + // Expected layout: + // server/static/index.html + // server/static/assets/... + app.Static("/", "./static") + + app.Post("/upload", func(c *fiber.Ctx) error { + form, err := c.MultipartForm() + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, "invalid multipart form") + } + + user := safePathToken(c.FormValue("user")) + session := safePathToken(c.FormValue("session")) + prop := safePathToken(c.FormValue("prop")) + if user == "" { + return fiber.NewError(fiber.StatusBadRequest, "missing form field: user") + } + if session == "" { + return fiber.NewError(fiber.StatusBadRequest, "missing form field: session") + } + + files := form.File["documents"] + if len(files) == 0 { + return fiber.NewError(fiber.StatusBadRequest, "missing files: documents") + } + + dir := filepath.Join("docs", user, session) + if prop != "" { + dir = filepath.Join(dir, prop) + } + if err := os.MkdirAll(dir, 0o755); err != nil { + return fiber.NewError(fiber.StatusInternalServerError, "cannot create upload directory") + } + + uploaded := make([]string, 0, len(files)) + + for _, file := range files { + name := safeFilename(file.Filename) + if name == "" { + return fiber.NewError(fiber.StatusBadRequest, "invalid filename") + } + + dst := filepath.Join(dir, name) + if err := c.SaveFile(file, dst); err != nil { + return fiber.NewError(fiber.StatusInternalServerError, fmt.Sprintf("cannot save file %s", name)) + } + uploaded = append(uploaded, name) + } + + return c.JSON(fiber.Map{ + "ok": true, + "files": uploaded, + }) + }) + + app.Post("/loadattachments", func(c *fiber.Ctx) error { + // Accept either JSON body { id, session } or form fields. + var body struct { + ID string `json:"id"` + Session string `json:"session"` + Prop string `json:"prop"` + } + _ = c.BodyParser(&body) + + id := safePathToken(body.ID) + if id == "" { + id = safePathToken(c.FormValue("id")) + } + session := safePathToken(body.Session) + if session == "" { + session = safePathToken(c.FormValue("session")) + } + prop := safePathToken(body.Prop) + if prop == "" { + prop = safePathToken(c.FormValue("prop")) + } + + if id == "" { + return fiber.NewError(fiber.StatusBadRequest, "missing field: id") + } + if session == "" { + return fiber.NewError(fiber.StatusBadRequest, "missing field: session") + } + + dir := filepath.Join("docs", id, session) + if prop != "" { + dir = filepath.Join(dir, prop) + } + entries, err := os.ReadDir(dir) + if err != nil { + if os.IsNotExist(err) { + return c.JSON([]string{}) + } + return fiber.NewError(fiber.StatusInternalServerError, "cannot read attachments directory") + } + + files := make([]string, 0, len(entries)) + for _, e := range entries { + if e.IsDir() { + continue + } + name := e.Name() + if name == "" || name == "." { + continue + } + files = append(files, name) + } + + return c.JSON(files) + }) + + app.Post("/loadattachmentslist", func(c *fiber.Ctx) error { + // Returns a JSON object keyed by the actual subfolder name. + // Example: { "salaryCertificate": ["file1.pdf"], "avsCertificate": ["file2.pdf"] } + // It scans docs/// and for each subdirectory lists its files. + var body struct { + ID string `json:"id"` + Session string `json:"session"` + } + _ = c.BodyParser(&body) + + id := safePathToken(body.ID) + if id == "" { + id = safePathToken(c.FormValue("id")) + } + session := safePathToken(body.Session) + if session == "" { + session = safePathToken(c.FormValue("session")) + } + + if id == "" { + return fiber.NewError(fiber.StatusBadRequest, "missing field: id") + } + if session == "" { + return fiber.NewError(fiber.StatusBadRequest, "missing field: session") + } + + baseDir := filepath.Join("docs", id, session) + entries, err := os.ReadDir(baseDir) + if err != nil { + if os.IsNotExist(err) { + return c.JSON(fiber.Map{}) + } + return fiber.NewError(fiber.StatusInternalServerError, "cannot read session directory") + } + + result := make(map[string][]string) + for _, entry := range entries { + if !entry.IsDir() { + continue + } + folderName := entry.Name() + if safePathToken(folderName) == "" { + continue + } + + propDir := filepath.Join(baseDir, folderName) + propEntries, err := os.ReadDir(propDir) + if err != nil { + // Ignore unreadable prop folder. + continue + } + + files := make([]string, 0, len(propEntries)) + for _, pe := range propEntries { + if pe.IsDir() { + continue + } + name := pe.Name() + if name == "" || name == "." { + continue + } + files = append(files, name) + } + result[folderName] = files + } + + return c.JSON(result) + }) + + app.Post("/deleteattachment", func(c *fiber.Ctx) error { + // Accept either JSON body { id, session, filename } or form fields. + var body struct { + ID string `json:"id"` + Session string `json:"session"` + Prop string `json:"prop"` + Filename string `json:"filename"` + } + _ = c.BodyParser(&body) + + id := safePathToken(body.ID) + if id == "" { + id = safePathToken(c.FormValue("id")) + } + session := safePathToken(body.Session) + if session == "" { + session = safePathToken(c.FormValue("session")) + } + prop := safePathToken(body.Prop) + if prop == "" { + prop = safePathToken(c.FormValue("prop")) + } + filename := safeFilename(body.Filename) + if filename == "" { + filename = safeFilename(c.FormValue("filename")) + } + + if id == "" { + return fiber.NewError(fiber.StatusBadRequest, "missing field: id") + } + if session == "" { + return fiber.NewError(fiber.StatusBadRequest, "missing field: session") + } + if filename == "" { + return fiber.NewError(fiber.StatusBadRequest, "missing field: filename") + } + + path := filepath.Join("docs", id, session) + if prop != "" { + path = filepath.Join(path, prop) + } + path = filepath.Join(path, filename) + err := os.Remove(path) + if err != nil { + if os.IsNotExist(err) { + return c.JSON(fiber.Map{ + "ok": true, + "deleted": false, + "file": filename, + }) + } + return fiber.NewError(fiber.StatusInternalServerError, "cannot delete attachment") + } + + return c.JSON(fiber.Map{ + "ok": true, + "deleted": true, + "file": filename, + }) + }) + + // History API fallback for SPA routes. + app.Use(func(c *fiber.Ctx) error { + return c.SendFile("./static/index.html") + }) + + addr := ":" + port + log.Printf("Starting Fiber server on %s", addr) + if err := app.Listen(addr); err != nil { + log.Fatalf("server failed: %v", err) + } +} diff --git a/server_windows.exe b/server_windows.exe new file mode 100755 index 0000000000000000000000000000000000000000..06076e824935a39d2959ca06698c569fc5c4a353 GIT binary patch literal 12085248 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