diff --git a/test.log b/test.log
new file mode 100644
index 0000000..32a1299
--- /dev/null
+++ b/test.log
@@ -0,0 +1,572 @@
+2025/05/04 16:09:05 INFO Starting server...
+2025/05/04 16:09:05 INFO BASE_URL is "http://localhost:1025"
+2025/05/04 16:09:05 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:05 INFO Starting server...
+2025/05/04 16:09:05 INFO BASE_URL is "http://localhost:1034"
+2025/05/04 16:09:05 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:05 INFO Starting server...
+2025/05/04 16:09:05 INFO Starting server...
+2025/05/04 16:09:05 INFO BASE_URL is "http://localhost:1033"
+2025/05/04 16:09:05 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:05 INFO Starting server...
+2025/05/04 16:09:05 INFO BASE_URL is "http://localhost:1029"
+2025/05/04 16:09:05 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:05 INFO Starting server...
+2025/05/04 16:09:05 INFO BASE_URL is "http://localhost:1027"
+2025/05/04 16:09:05 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:05 INFO Starting server...
+2025/05/04 16:09:05 INFO Starting server...
+2025/05/04 16:09:05 INFO BASE_URL is "http://localhost:1028"
+2025/05/04 16:09:05 INFO BASE_URL is "http://localhost:1032"
+2025/05/04 16:09:05 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:05 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:05 INFO BASE_URL is "http://localhost:1026"
+2025/05/04 16:09:05 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:05 INFO Starting server...
+2025/05/04 16:09:05 INFO BASE_URL is "http://localhost:1030"
+2025/05/04 16:09:05 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:05 INFO Starting server...
+2025/05/04 16:09:05 INFO BASE_URL is "http://localhost:1031"
+2025/05/04 16:09:05 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:05 INFO Starting server on ":1034"
+2025/05/04 16:09:05 INFO Starting server on ":1029"
+2025/05/04 16:09:05 INFO Starting server on ":1028"
+2025/05/04 16:09:05 INFO Starting server on ":1025"
+2025/05/04 16:09:05 INFO Starting server on ":1033"
+2025/05/04 16:09:05 INFO Starting server on ":1030"
+2025/05/04 16:09:05 INFO Starting server on ":1027"
+2025/05/04 16:09:05 INFO Starting server on ":1031"
+2025/05/04 16:09:05 INFO Starting server on ":1026"
+2025/05/04 16:09:05 INFO Starting server on ":1032"
+2025/05/04 16:09:06 INFO Anonymous session created: C7CpPA1q5HSqATguH4ITVcaREZPMp/j78y0ZXp2goj4=
+2025/05/04 16:09:06 INFO Anonymous session created: GLqqnLTym8scPyB4V8fHjpHUTQBUHJrIoVO/byzly0Y=
+2025/05/04 16:09:06 INFO Anonymous session created: gkCWUdyhAU3+m6mCGRjHMYtmvRVKHoZRXUlsOM2kBFI=
+2025/05/04 16:09:06 INFO Anonymous session created: /p9htltva1j9WlwdthWyhzMKc99iYgmuqgVwV6S+qp0=
+2025/05/04 16:09:06 INFO Anonymous session created: KfwxtvpSqFx+YcwXdh+s3zBuDlBRY80/Q+qJY4YkCvI=
+2025/05/04 16:09:06 INFO Anonymous session created: KXkQn/K0GLGF2fXibq+ydR50qBNFAEj9lApqcoFKkJM=
+2025/05/04 16:09:06 INFO Anonymous session created: 96IXin1xRasBmgmzmfQ5qAeHIHTf8G5g/DLFKPkiObE=
+2025/05/04 16:09:06 INFO Anonymous session created: yORuw2suMVJCtOu7ctwTtQ+Yuc9KfiOxZFnCO17AMOQ=
+2025/05/04 16:09:06 INFO CSRF-Token created: 3znobv1bV4TArb+HlZAnQud2oDr91djlmj1oowICPgw=
+2025/05/04 16:09:06 INFO Anonymous session created: DHc4LdLcXut8tz34/orrAwqqIkvDdGHUJZHW8AotxD4=
+2025/05/04 16:09:06 INFO [::1]:43956 200 GET / 367.317µs
+2025/05/04 16:09:06 INFO CSRF-Token created: k9OMRAttUZAW3GID+8pTAtlvNg/rhg2tCtuAXRQsK8k=
+2025/05/04 16:09:06 INFO CSRF-Token created: MMHaZEyGlT00wJm8QJ/zjbeYXe5dYeRlOHSkaFrLefY=
+2025/05/04 16:09:06 INFO CSRF-Token created: MT/+XjYby0V6+Ogiu0oK1CVj97doM9NN6qQJ3UI0BEU=
+2025/05/04 16:09:06 INFO [::1]:59616 200 GET / 243.011µs
+2025/05/04 16:09:06 INFO [::1]:34368 200 GET / 297.074µs
+2025/05/04 16:09:06 INFO [::1]:41530 200 GET / 631.609µs
+2025/05/04 16:09:06 INFO CSRF-Token created: XLhEELc4GagnjsqM9dCnsGBYUJTTalfGQkyCnLAvQ8o=
+2025/05/04 16:09:06 INFO Anonymous session created: b+t2fEsEzLlAAghoMa5ewjzEveTEIS+sxBMG6okX7ZA=
+2025/05/04 16:09:06 INFO [::1]:45866 200 GET / 187.947µs
+2025/05/04 16:09:06 INFO CSRF-Token created: 1VDgPWHIHVpHP7jAj4qGhJ7z/jzSzzF/1nSKKkAE/9o=
+2025/05/04 16:09:06 INFO CSRF-Token created: +PX5YUQsBCxJ+ZJwysknZGsBEGowKm1u8MVq3Vqa6Us=
+2025/05/04 16:09:06 INFO [::1]:45206 200 GET / 257.289µs
+2025/05/04 16:09:06 INFO [::1]:58582 200 GET / 251.327µs
+2025/05/04 16:09:06 INFO CSRF-Token created: Lbi+NGRvTGirVxRtrJtG9eIbJ2kau6g/lqYlWM+g7hg=
+2025/05/04 16:09:06 INFO [::1]:54694 200 GET / 371.716µs
+2025/05/04 16:09:06 INFO CSRF-Token created: HQj39ldO/6RZ1O5QXjxo9l5h4eKArXR5ItB2L8vOdvw=
+2025/05/04 16:09:06 INFO [::1]:32870 200 GET / 342.581µs
+2025/05/04 16:09:06 INFO CSRF-Token created: YX0jsNaJrkydun3SGCNCPfQv3kKamjihqUuYdvlUKVI=
+2025/05/04 16:09:06 INFO [::1]:39118 200 GET / 382.175µs
+2025/05/04 16:09:06 INFO Anonymous session created: Oz1R4FzF5KXvoh+UkLYKzo26g0TSRzQ8Qpr4S6GeZs0=
+2025/05/04 16:09:06 INFO Anonymous session created: g89TfWKMRSB/KYc6hgbLzaNUDE7gVNu93y0hwQ9t0ng=
+2025/05/04 16:09:06 INFO Anonymous session created: 1jX9ZQ3qF7S3XmE5qzzONuvZZW7S0QFmGKFG9wUsZys=
+2025/05/04 16:09:06 INFO CSRF-Token created: zXrh7szBHAU5cay8Y5G+MDRlC0WDFEdkc252lPwgFFQ=
+2025/05/04 16:09:06 INFO [::1]:32886 200 GET / 233.733µs
+2025/05/04 16:09:06 INFO CSRF-Token created: 2PZFlciuS9IXsGHE/tCC4ln2WF7ioEYWYwAqVGi3MVE=
+2025/05/04 16:09:06 INFO CSRF-Token created: 39QaZTEA2+VCSd2UlDZHU79PoIah0Ah6IgC5JIhDA7E=
+2025/05/04 16:09:06 INFO [::1]:39122 200 GET /static/favicon.svg 259.503µs
+2025/05/04 16:09:06 INFO [::1]:59620 200 GET / 247.07µs
+2025/05/04 16:09:06 INFO Gracefully stopped http server on :1027
+2025/05/04 16:09:06 INFO Gracefully stopped http server on :1026
+2025/05/04 16:09:06 INFO Gracefully stopped http server on :1025
+2025/05/04 16:09:06 INFO Anonymous session created: FfjlcLEoLOpEigTj/DAkrROCKw3GmDO6iweXarlQWk4=
+2025/05/04 16:09:06 INFO CSRF-Token created: w/vDIvYUaHW/MC44I+iosJEUbfutbcPDIHbvoZKjm8A=
+2025/05/04 16:09:06 INFO [::1]:43966 200 GET /auth/signin 339.434µs
+2025/05/04 16:09:06 INFO Anonymous session created: heG8kfN+gpvo86Kw7iqm7I+FPa9BEOJbfTXvGmwqnQM=
+2025/05/04 16:09:06 INFO Anonymous session created: nesB1mHXOhBKfz2tDkMDplmQ7g2DCJAe8a6qk0KcaNU=
+2025/05/04 16:09:06 INFO Anonymous session created: mxAV7nBg8MYYSv9rkw7+sf/dvO2L4knqZojnRv47YOI=
+2025/05/04 16:09:06 INFO Token 'invalid-csrf-token' not found
+2025/05/04 16:09:06 INFO CSRF-Token not correct
+2025/05/04 16:09:06 INFO [::1]:34374 400 POST /api/auth/signin 143.582µs
+2025/05/04 16:09:06 INFO Anonymous session created: 0v14+y4mILt1rhGCX/ZP675Wub7XmCsxn0xQz7A4guI=
+2025/05/04 16:09:06 INFO CSRF-Token created: Ofm7h/1cpZXSCiHmUVMkN7RGS4qT2OO9VDmNfW3cfg4=
+2025/05/04 16:09:06 INFO [::1]:54706 200 GET /auth/signin 151.548µs
+2025/05/04 16:09:06 INFO CSRF-Token created: OfaE1yY75jbkHj4SQxYdpxYQuXdxG3xyaMhPH8JwIZk=
+2025/05/04 16:09:06 INFO [::1]:41540 200 GET /auth/signin 163.099µs
+2025/05/04 16:09:06 INFO Gracefully stopped http server on :1034
+2025/05/04 16:09:06 INFO CSRF-Token created: ihlV3z7w1lTnFTuY2oZbPPZdw/XxRq1erl6wdfoJ4os=
+2025/05/04 16:09:06 INFO [::1]:45874 200 GET /auth/signin 442.52µs
+2025/05/04 16:09:06 INFO Anonymous session created: C3zFi5om0T8kdqGPRhWr54XoLvX+AUzFKPM+7rX4ciQ=
+2025/05/04 16:09:06 INFO CSRF-Token created: MnHKHrS5TqoEd0lWFLTJBRjXfLhagXUum+6K1RIj+0k=
+2025/05/04 16:09:06 INFO [::1]:58598 200 GET /auth/signin 142.921µs
+2025/05/04 16:09:06 INFO CSRF-Token created: swEu7fAiz6NC9x6bRoEBg7Z2uGKpmsMwx/mn286wxrE=
+2025/05/04 16:09:06 INFO [::1]:45208 303 GET /auth/signin 342.33µs
+2025/05/04 16:09:06 INFO Gracefully stopped http server on :1029
+2025/05/04 16:09:06 INFO [::1]:43966 401 POST /api/auth/signin 250.291568ms
+2025/05/04 16:09:06 INFO Gracefully stopped http server on :1032
+2025/05/04 16:09:06 INFO [::1]:41540 303 POST /api/auth/signin 251.921223ms
+2025/05/04 16:09:06 INFO [::1]:54706 401 POST /api/auth/signin 251.965506ms
+2025/05/04 16:09:06 INFO [::1]:58598 200 POST /api/auth/signin 250.279857ms
+2025/05/04 16:09:06 INFO [::1]:45874 200 POST /api/auth/signin 251.907547ms
+2025/05/04 16:09:06 INFO Gracefully stopped http server on :1031
+2025/05/04 16:09:06 INFO Gracefully stopped http server on :1028
+2025/05/04 16:09:06 INFO Gracefully stopped http server on :1033
+2025/05/04 16:09:06 INFO Anonymous session created: +LBaMyqxxiZ40ESawYlRHgrdsnODTBckcx1OeSAWWwo=
+2025/05/04 16:09:06 INFO CSRF-Token created: uNQ2j9KYIdO3mWCTMqvHS713erezZvpjuQwPQ4YKfso=
+2025/05/04 16:09:06 INFO [::1]:45874 200 GET /auth/signin 395.09µs
+2025/05/04 16:09:06 INFO [::1]:45874 401 POST /api/auth/signin 250.272021ms
+2025/05/04 16:09:06 INFO Anonymous session created: qeonVn4lJ5XrSzP738w10/EeiKmla7tN7I4QQxUM5Uc=
+2025/05/04 16:09:06 INFO CSRF-Token created: YlroafoG+2gUjoxq0xlxF795ZFjlgYePQauB2ZvpZIk=
+2025/05/04 16:09:06 INFO [::1]:45874 200 GET /auth/signin 237.571µs
+2025/05/04 16:09:07 INFO [::1]:45874 401 POST /api/auth/signin 250.91927ms
+2025/05/04 16:09:07 INFO Gracefully stopped http server on :1030
+2025/05/04 16:09:07 INFO Starting server...
+2025/05/04 16:09:07 INFO Starting server...
+2025/05/04 16:09:07 INFO BASE_URL is "http://localhost:1035"
+2025/05/04 16:09:07 INFO BASE_URL is "http://localhost:1038"
+2025/05/04 16:09:07 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:07 INFO Starting server...
+2025/05/04 16:09:07 INFO BASE_URL is "http://localhost:1039"
+2025/05/04 16:09:07 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:07 INFO Starting server...
+2025/05/04 16:09:07 INFO BASE_URL is "http://localhost:1036"
+2025/05/04 16:09:07 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:07 INFO Starting server...
+2025/05/04 16:09:07 INFO BASE_URL is "http://localhost:1037"
+2025/05/04 16:09:07 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:07 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:07 INFO Starting server on ":1039"
+2025/05/04 16:09:07 INFO Starting server on ":1035"
+2025/05/04 16:09:07 INFO Starting server on ":1036"
+2025/05/04 16:09:07 INFO Starting server on ":1038"
+2025/05/04 16:09:07 INFO Starting server on ":1037"
+2025/05/04 16:09:07 INFO Anonymous session created: xhq2IBLbAz+f/CY7UOIMov+zJb3Co14in/B/kB8bV7E=
+2025/05/04 16:09:07 INFO Anonymous session created: 71c61oHlq2zOWvnUy1bf4NdAJjXDyKrD8QV2xaP6Z7Q=
+2025/05/04 16:09:07 INFO Anonymous session created: FJAnOEJqCvcxvXZ+p+0x1QefhsKiOycb1m6LwYK4qxs=
+2025/05/04 16:09:07 INFO Anonymous session created: PdNi9YruTOFlvQl4jWxyUSLu/QC+hubl6ercCqGDBAc=
+2025/05/04 16:09:07 INFO CSRF-Token created: 3uqSRAb6IGH+yiUeP+lJgz3Zud1ixBB4IA8N47b8dhI=
+2025/05/04 16:09:07 INFO Anonymous session created: Ebe1moB4HEBtxEOlTI3qKEIUrtOy8lV8pHiPpix1vRM=
+2025/05/04 16:09:07 INFO [::1]:34596 200 GET / 197.385µs
+2025/05/04 16:09:07 INFO CSRF-Token created: nkMHsmtBWVoBKfwfAkkl5bqR8x7jMpnmiSJNY4QUQRo=
+2025/05/04 16:09:07 INFO CSRF-Token created: RM0p9rPPjLo+80oS90RLGNU9PrmwX3A6zX29vmCPts8=
+2025/05/04 16:09:07 INFO CSRF-Token created: ck31atN4NsBZYZP2r6zZUFfNdmiS9HGTZv/W+HfzR0I=
+2025/05/04 16:09:07 INFO [::1]:47544 200 GET / 267.929µs
+2025/05/04 16:09:07 INFO [::1]:54172 200 GET / 344.093µs
+2025/05/04 16:09:07 INFO [::1]:37332 200 GET / 331.66µs
+2025/05/04 16:09:07 INFO CSRF-Token created: PeH4DG/WYHSggyCRrEa0h0OUcpvNBT6oslEcHYYB6rg=
+2025/05/04 16:09:07 INFO [::1]:35134 200 GET / 345.566µs
+2025/05/04 16:09:07 INFO Anonymous session created: RUrlOobLzrlkVlhikL2bxNzICH+nDGUlmKrapuDZtCU=
+2025/05/04 16:09:07 INFO Anonymous session created: 1EyxHttARbGmQ4mKNrhnWhlZPoGasRHZxdsA9pGFei4=
+2025/05/04 16:09:07 INFO Anonymous session created: RX/UuisLp1bsW7BdsonpHEs1H2dNx7VHqThIP9IWS7U=
+2025/05/04 16:09:07 INFO CSRF-Token created: VZCcq+YZ1HR8mznXqgM5hLr7kNSdkXh7cBpnncIhO/0=
+2025/05/04 16:09:07 INFO [::1]:34610 200 GET /auth/signup 304.768µs
+2025/05/04 16:09:07 INFO Token 'invalid-csrf-token' not found
+2025/05/04 16:09:07 INFO CSRF-Token not correct
+2025/05/04 16:09:07 INFO [::1]:37344 400 POST /api/auth/signin 131.931µs
+2025/05/04 16:09:07 INFO CSRF-Token created: J2/qBrloOVEKXYutfuO2GqlK+D7GDOt+TbMl0NAW2O0=
+2025/05/04 16:09:07 INFO [::1]:35144 200 GET /auth/signup 184.079µs
+2025/05/04 16:09:07 INFO Gracefully stopped http server on :1038
+2025/05/04 16:09:07 INFO Signing up mail@mail.de
+2025/05/04 16:09:07 INFO Signing up mail@mail.de
+2025/05/04 16:09:07 INFO Sending verification email to mail@mail.de
+2025/05/04 16:09:07 INFO Anonymous session created: n0QDZgtZbdxuLLe9b41sr++cp+Wm5O6iA8W6qzNe0iE=
+2025/05/04 16:09:07 INFO CSRF-Token created: vpoo1zdtO294QjQg/8RAu74OTTgOMz6hDq0XMvPlhTU=
+2025/05/04 16:09:07 INFO CSRF-Token created: 59jPp8DxfM4afaLMVVlXGTSydDm79ehsBJfrpKOA1iY=
+2025/05/04 16:09:07 INFO [::1]:54178 303 GET /auth/signin 140.818µs
+2025/05/04 16:09:07 INFO [::1]:47554 200 GET /auth/signup 167.969µs
+2025/05/04 16:09:07 INFO Gracefully stopped http server on :1035
+2025/05/04 16:09:07 INFO Signing up mail@mail.de
+2025/05/04 16:09:07 INFO [::1]:34610 200 POST /api/auth/signup 250.628749ms
+2025/05/04 16:09:07 INFO [::1]:35144 400 POST /api/auth/signup 250.680327ms
+2025/05/04 16:09:07 INFO Gracefully stopped http server on :1036
+2025/05/04 16:09:07 INFO Gracefully stopped http server on :1039
+2025/05/04 16:09:07 INFO [::1]:47554 200 POST /api/auth/signup 250.575518ms
+2025/05/04 16:09:07 INFO Gracefully stopped http server on :1037
+2025/05/04 16:09:07 INFO Starting server...
+2025/05/04 16:09:07 INFO Starting server...
+2025/05/04 16:09:07 INFO BASE_URL is "http://localhost:1042"
+2025/05/04 16:09:07 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:07 INFO BASE_URL is "http://localhost:1040"
+2025/05/04 16:09:07 INFO Starting server...
+2025/05/04 16:09:07 INFO BASE_URL is "http://localhost:1041"
+2025/05/04 16:09:07 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:07 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:07 INFO Starting server on ":1042"
+2025/05/04 16:09:07 INFO Starting server on ":1040"
+2025/05/04 16:09:07 INFO Starting server on ":1041"
+2025/05/04 16:09:07 INFO Anonymous session created: jo6Z7JapKy5+Mp4L6uOK/FM7gTZwREXXvgMmJsSofJs=
+2025/05/04 16:09:07 INFO Anonymous session created: hCDPoztBLkErAxojn3VzQtHPjyEcgnpgvfZFESIHptI=
+2025/05/04 16:09:07 INFO Anonymous session created: U2pccLWqFqRHFPcuLd7uhUAvNQJ846mdDAvDsqA9Ahk=
+2025/05/04 16:09:07 INFO CSRF-Token created: IQMsxPprvraH+EKAcCJp7bukSTQ2N7po4gtCczKvtYg=
+2025/05/04 16:09:07 INFO CSRF-Token created: vvbuIZBXqU1qT8r1C/nFqwTiMSRd26vlaMzOd2S49Zs=
+2025/05/04 16:09:07 INFO [::1]:48190 200 GET / 391.504µs
+2025/05/04 16:09:07 INFO [::1]:55320 200 GET / 325.417µs
+2025/05/04 16:09:07 INFO CSRF-Token created: zpH6K3bG3YfLFT4QiLrH3shUEXYaotdyeJ+wBo2PJ+0=
+2025/05/04 16:09:07 INFO [::1]:45470 200 GET / 486.995µs
+2025/05/04 16:09:07 INFO Anonymous session created: IxR1A3yIeNZVqvUpZDpX0wVh5zXOGe20xfzDDggECIY=
+2025/05/04 16:09:07 INFO Anonymous session created: u+aqhieHGjYRdG3X8FuG9ijqZIyp53E7uchETvPHeqU=
+2025/05/04 16:09:07 INFO CSRF-Token created: WG9JuKkMyqod4Yj39Tw8F3+8i0c7pnGfJRBM7ppTFFc=
+2025/05/04 16:09:07 INFO [::1]:48200 200 GET /auth/verify-email 149.474µs
+2025/05/04 16:09:07 ERROR Could not get token: sql: Scan error on column index 1, name "session_id": converting NULL to string is unsupported
+2025/05/04 16:09:07 INFO Anonymous session created: QWcreHbpTncV4QAPi5uz9/3QwcolCREP5gaMcsH/97A=
+2025/05/04 16:09:07 INFO Token 'invalid-token' not found
+2025/05/04 16:09:07 INFO CSRF-Token created: YNISy37y2IHKyVR70PGM2W3YgkuS6vdEOgsXMdDmFVc=
+2025/05/04 16:09:07 INFO [::1]:55322 400 GET /auth/verify-email 111.241µs
+2025/05/04 16:09:07 INFO Gracefully stopped http server on :1041
+2025/05/04 16:09:07 INFO CSRF-Token created: 6chtzYbxsJA5B5F0UiqFPObZcHRv1WLUqiHzv8uCggQ=
+2025/05/04 16:09:07 INFO [::1]:45476 400 GET /auth/verify-email 275.704µs
+2025/05/04 16:09:07 INFO Gracefully stopped http server on :1040
+2025/05/04 16:09:07 INFO Starting server...
+2025/05/04 16:09:07 INFO BASE_URL is "http://localhost:1043"
+2025/05/04 16:09:07 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:07 INFO Gracefully stopped http server on :1042
+2025/05/04 16:09:07 INFO Starting server...
+2025/05/04 16:09:07 INFO BASE_URL is "http://localhost:1044"
+2025/05/04 16:09:07 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:07 INFO Starting server on ":1043"
+2025/05/04 16:09:07 INFO Starting server on ":1044"
+2025/05/04 16:09:08 INFO Anonymous session created: 854gAsAl3mE0zV1Q1svNDSFWQ6nluq3f55epIfLMhPo=
+2025/05/04 16:09:08 INFO Anonymous session created: mhaSgZjdqkhC6Sa3LuEyKchemWZXYcQBqh86Zgfd3O4=
+2025/05/04 16:09:08 INFO CSRF-Token created: xLIJE9FfBg3Zgf1CUUsrX12r/CWfOc+5hvXy8ANi3Q8=
+2025/05/04 16:09:08 INFO [::1]:60358 200 GET / 316.1µs
+2025/05/04 16:09:08 INFO CSRF-Token created: 32N6JsF7BvBZ+WoDvyS7BzkKBqZOgjOR+u9zK581yKs=
+2025/05/04 16:09:08 INFO [::1]:36078 200 GET / 417.282µs
+2025/05/04 16:09:08 INFO Anonymous session created: EiHwa5bmN142PTYFJQdsyAfPzd7V26SgNRjLO2qGRls=
+2025/05/04 16:09:08 INFO Token 'invalid-csrf-token' not found
+2025/05/04 16:09:08 INFO CSRF-Token not correct
+2025/05/04 16:09:08 INFO [::1]:36086 400 POST /api/auth/sign-out 163.04µs
+2025/05/04 16:09:08 INFO Gracefully stopped http server on :1043
+2025/05/04 16:09:08 INFO CSRF-Token created: Nfk4NBMIA8O5lG5Agy+6SzwPB4Ui8/NcTokJx+ugcF8=
+2025/05/04 16:09:08 INFO [::1]:60362 200 GET / 259.192µs
+2025/05/04 16:09:08 INFO [::1]:60372 303 POST /api/auth/signout 69.102µs
+2025/05/04 16:09:08 INFO Gracefully stopped http server on :1044
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1045"
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1048"
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1047"
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1049"
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1046"
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO Starting server on ":1045"
+2025/05/04 16:09:08 INFO Starting server on ":1048"
+2025/05/04 16:09:08 INFO Starting server on ":1046"
+2025/05/04 16:09:08 INFO Starting server on ":1047"
+2025/05/04 16:09:08 INFO Starting server on ":1049"
+2025/05/04 16:09:08 INFO Anonymous session created: r1l6P81B5bjvAtYgEs+kpDCss1jzJSDOC6D0gPcRC1Q=
+2025/05/04 16:09:08 INFO Anonymous session created: T8aTRMQ+OAHTI0ts0FbGMHdACkPOdZl7+ELtTq3tz6g=
+2025/05/04 16:09:08 INFO Anonymous session created: 0Yd55Rluy8MSjEPfWd3a/UQQ7xsxxV3HZrs1OZE5i8g=
+2025/05/04 16:09:08 INFO CSRF-Token created: W/1hRY9hi0R7kMYQXLSCi84JrPVt5a1kX3LBrITCQds=
+2025/05/04 16:09:08 INFO [::1]:34846 200 GET / 194.78µs
+2025/05/04 16:09:08 INFO Anonymous session created: XT52HDsdTpCuo1f6ouCxb0rathiNkURS2gnsqE18DRk=
+2025/05/04 16:09:08 INFO Anonymous session created: t7RB/YcpJpwiXoVVycJfzP2BhQ55Qc0YG6zgpFQZP8E=
+2025/05/04 16:09:08 INFO CSRF-Token created: 4grA+kACaEyZR98Il3ElKJBimZp19xn1A27YKChpIhE=
+2025/05/04 16:09:08 INFO CSRF-Token created: pb7IOSCtrmj+7M2n6bBUSVrKuFtElh4Oc7tSRBfEHYs=
+2025/05/04 16:09:08 INFO [::1]:60418 200 GET / 305.169µs
+2025/05/04 16:09:08 INFO [::1]:53504 200 GET / 344.705µs
+2025/05/04 16:09:08 INFO CSRF-Token created: G+TunCuuTHlb0S7VwMHiXPIikwG8NDYUTt/ZoocMPII=
+2025/05/04 16:09:08 INFO [::1]:56720 200 GET / 809.687µs
+2025/05/04 16:09:08 INFO CSRF-Token created: Xcaewg4EtCBsDX++vDCRBye6bNBwCxkdF7nFNP88h6U=
+2025/05/04 16:09:08 INFO [::1]:57866 200 GET / 1.212432ms
+2025/05/04 16:09:08 INFO Anonymous session created: hZEtjYJgNMWXtU5fIBk2UHyL57zMOtHDp7znqK6LW4o=
+2025/05/04 16:09:08 INFO CSRF-Token not correct
+2025/05/04 16:09:08 INFO Anonymous session created: VWKij/LgmDomxPOq7RwXfadZP10CY6+Eq5Q9MQYgV7U=
+2025/05/04 16:09:08 INFO [::1]:56730 400 POST /api/auth/delete-account 113.726µs
+2025/05/04 16:09:08 INFO CSRF-Token created: 3fJ2mo7ZLuRM74AdLOO3COIhtJwAqFvuSso4B0cPaNA=
+2025/05/04 16:09:08 INFO [::1]:60434 303 GET /auth/delete-account 156.708µs
+2025/05/04 16:09:08 INFO Gracefully stopped http server on :1045
+2025/05/04 16:09:08 INFO Gracefully stopped http server on :1048
+2025/05/04 16:09:08 INFO Token 'wrong-csrf-token' not found
+2025/05/04 16:09:08 INFO CSRF-Token not correct
+2025/05/04 16:09:08 INFO [::1]:34848 400 POST /api/auth/delete-account 116.441µs
+2025/05/04 16:09:08 INFO Gracefully stopped http server on :1047
+2025/05/04 16:09:08 INFO CSRF-Token created: CXDb/h5hm5uSxkbNAGKCHEmmUOVO4AMOUwsjApGZgQo=
+2025/05/04 16:09:08 INFO [::1]:53512 200 GET /auth/delete-account 180.412µs
+2025/05/04 16:09:08 INFO CSRF-Token created: kTJK4VhAk17nGB7nN6RZ+z5qJ1hNhDZ0y6nsKRk1zcA=
+2025/05/04 16:09:08 INFO [::1]:57868 200 GET /auth/delete-account 300.711µs
+2025/05/04 16:09:08 INFO [::1]:57868 400 POST /api/auth/delete-account 31.520081ms
+2025/05/04 16:09:08 ERROR Could not delete workouts: no such table: workout
+2025/05/04 16:09:08 INFO [::1]:53512 500 POST /api/auth/delete-account 48.218363ms
+2025/05/04 16:09:08 INFO Gracefully stopped http server on :1049
+2025/05/04 16:09:08 INFO Gracefully stopped http server on :1046
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1053"
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1050"
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1052"
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1051"
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1055"
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1054"
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO Starting server on ":1053"
+2025/05/04 16:09:08 INFO Starting server on ":1055"
+2025/05/04 16:09:08 INFO Starting server on ":1054"
+2025/05/04 16:09:08 INFO Starting server on ":1052"
+2025/05/04 16:09:08 INFO Starting server on ":1051"
+2025/05/04 16:09:08 INFO Starting server on ":1050"
+2025/05/04 16:09:08 INFO Anonymous session created: xd1mXTWn5ZZAYnTiIszwXAeUFy/fL99MeP7LwqIgerk=
+2025/05/04 16:09:08 INFO Anonymous session created: ENqUYxguF8j9Q7GLT3oWY/++eb9CUDILQ8xVSHPwVu8=
+2025/05/04 16:09:08 INFO Anonymous session created: t6vUSQA4ec5tXpIiIegzATp8DQY9toEF/KxsM57uX1s=
+2025/05/04 16:09:08 INFO Anonymous session created: 5RBBXq3M1PAtwUWqnQ7Ll5p/1gZsv00F5NKCgjuUTwU=
+2025/05/04 16:09:08 INFO Anonymous session created: PzpOOdkCCxy7rIdhrOMgWid9r49r3Dz4gFifT5g41fg=
+2025/05/04 16:09:08 INFO Anonymous session created: PY8YUKM82L/tAUjhrn53fLqD4qzFRIAEmNiHQ4x55Xk=
+2025/05/04 16:09:08 INFO CSRF-Token created: yqhCY3jkfFD2/QKnRFokA+PFpmzyGKYIPwj/egC4CLE=
+2025/05/04 16:09:08 INFO [::1]:43092 200 GET / 254.533µs
+2025/05/04 16:09:08 INFO CSRF-Token created: 77cVIkgGijSk5xB+h6wIj53NmopBuOR0rWdmF7HsI5E=
+2025/05/04 16:09:08 INFO [::1]:37470 200 GET / 279.751µs
+2025/05/04 16:09:08 INFO CSRF-Token created: HC5uypZg/hQkkHVjxEVtk2KKLNgeJngfpZcjHBl2tVI=
+2025/05/04 16:09:08 INFO [::1]:59020 200 GET / 276.956µs
+2025/05/04 16:09:08 INFO CSRF-Token created: 4IheFhABdSeQmeDGZkrDb1F7rmU0/I/ff6Wz6rOBdB0=
+2025/05/04 16:09:08 INFO CSRF-Token created: 2b/SyQIGJWKhNZAOEs58y3NjHeNWmPX+wbmYezcq7Lo=
+2025/05/04 16:09:08 INFO [::1]:53478 200 GET / 358.06µs
+2025/05/04 16:09:08 INFO CSRF-Token created: OGRXde04GcOpUR58XgH7NTvvjtNXYKZiYtEFpYlpCPs=
+2025/05/04 16:09:08 INFO [::1]:46564 200 GET / 364.843µs
+2025/05/04 16:09:08 INFO [::1]:34404 200 GET / 299.659µs
+2025/05/04 16:09:08 INFO Anonymous session created: HxvqtFVnh4XNpPNSlixBKM9CUAsZKQkp8QwKYJAsGxA=
+2025/05/04 16:09:08 INFO Anonymous session created: 4PswFHiRAHiV4zhdz1RgAZknQFbrSIUSrO9xHxfr1fM=
+2025/05/04 16:09:08 INFO CSRF-Token created: e12W/Efzfg0+QC6Qq1KDitQfLNbBu3zTeK/Bw4EzlWE=
+2025/05/04 16:09:08 INFO [::1]:34408 303 GET /auth/change-password 382.165µs
+2025/05/04 16:09:08 INFO CSRF-Token created: 6KZmcA1f/rjcKkND/PtP94+U5sXjKSTaWD1sorBP8NI=
+2025/05/04 16:09:08 INFO [::1]:37478 200 GET /auth/signin 234.806µs
+2025/05/04 16:09:08 INFO Gracefully stopped http server on :1050
+2025/05/04 16:09:08 INFO [::1]:37478 401 POST /api/auth/change-password 94.389µs
+2025/05/04 16:09:08 INFO Gracefully stopped http server on :1052
+2025/05/04 16:09:08 INFO CSRF-Token created: 6cmY2Ik6wo7QZEtGXhg9wK5O2OEDTY8BZAA2ZFtWu54=
+2025/05/04 16:09:08 INFO [::1]:53486 200 GET /auth/change-password 228.724µs
+2025/05/04 16:09:08 INFO CSRF-Token created: O1/1VPy9ED1Krk9BiZVZqBa7MSvdZyS+LmSJq15mjVg=
+2025/05/04 16:09:08 INFO [::1]:46570 200 GET /auth/change-password 117.974µs
+2025/05/04 16:09:08 INFO Token 'invalid-csrf-token' not found
+2025/05/04 16:09:08 INFO CSRF-Token not correct
+2025/05/04 16:09:08 INFO [::1]:59030 400 POST /api/auth/change-password 156.557µs
+2025/05/04 16:09:08 INFO [::1]:46570 400 POST /api/auth/change-password 46.218µs
+2025/05/04 16:09:08 INFO Gracefully stopped http server on :1053
+2025/05/04 16:09:08 INFO Gracefully stopped http server on :1054
+2025/05/04 16:09:08 INFO CSRF-Token created: A/i/s6H3Son87BW4kq1YaXGhICDGwHxFrwgWtB7aMkM=
+2025/05/04 16:09:08 INFO [::1]:43104 200 GET /auth/change-password 195.411µs
+2025/05/04 16:09:08 INFO [::1]:53486 400 POST /api/auth/change-password 47.082787ms
+2025/05/04 16:09:08 INFO Gracefully stopped http server on :1051
+2025/05/04 16:09:08 INFO [::1]:43104 200 POST /api/auth/change-password 87.731017ms
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1057"
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1056"
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO Gracefully stopped http server on :1055
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO Starting server...
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1058"
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO BASE_URL is "http://localhost:1059"
+2025/05/04 16:09:08 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:08 INFO Starting server on ":1057"
+2025/05/04 16:09:08 INFO Starting server on ":1059"
+2025/05/04 16:09:08 INFO Starting server on ":1056"
+2025/05/04 16:09:08 INFO Starting server on ":1058"
+2025/05/04 16:09:09 INFO Anonymous session created: Lfa65ZLijd9A8ybwL7mOa+dUNnzmehnP29h7EkiMzg8=
+2025/05/04 16:09:09 INFO Anonymous session created: hPcKg1TM5o62yX3heszCWqBFUFRN3NPGq6+t+PByiH0=
+2025/05/04 16:09:09 INFO Anonymous session created: r+Js1J/2Qi1xGL2R20g+q0KDbhkQGfpvTR41Q+ubCwo=
+2025/05/04 16:09:09 INFO Anonymous session created: K6KSVynVZ2vroau1Hmq+f+upnRrtmdlak69iKe7gJnk=
+2025/05/04 16:09:09 INFO CSRF-Token created: /BQo8DCsout5rcBpxHXfv4JtJv8tccA0vjTkdrhAW9s=
+2025/05/04 16:09:09 INFO CSRF-Token created: 9KZlDLpU5EFWjoU0wWaR+y1kTZFRlUECmSAIqvyicnE=
+2025/05/04 16:09:09 INFO [::1]:44734 200 GET / 291.343µs
+2025/05/04 16:09:09 INFO [::1]:52430 200 GET / 324.697µs
+2025/05/04 16:09:09 INFO CSRF-Token created: ipTmbEPHNtUunc5peCg02yXJWDU6C4cIwaoKTykpLg4=
+2025/05/04 16:09:09 INFO [::1]:59864 200 GET / 237.982µs
+2025/05/04 16:09:09 INFO CSRF-Token created: QuPLy+EgiucAgHXv/hsQdrJYe7qA6z4Ul4zaQRQ+KFM=
+2025/05/04 16:09:09 INFO [::1]:51392 200 GET / 291.033µs
+2025/05/04 16:09:09 INFO Anonymous session created: 9HjVjEW2GD1Pb5vNtA7cCn//W7hZdP1JRTMq0rb2qhA=
+2025/05/04 16:09:09 INFO CSRF-Token created: QN55nsXVkitPu2PQFBROtdjSRrpjQXRMlvyUktwKbeg=
+2025/05/04 16:09:09 INFO [::1]:51398 200 GET /auth/forgot-password 686.202µs
+2025/05/04 16:09:09 INFO Anonymous session created: W/4UsFOsg0HQgVUzBnClrpZ9hagqGujeohVDF9CptL4=
+2025/05/04 16:09:09 INFO CSRF-Token created: o46grNIHFVAhOz47erqEMWMQ9Vx5zEZTLQQJT/L5bxA=
+2025/05/04 16:09:09 INFO CSRF-Token created: ykibTAavOkHX+fegECTcu1NcEa3bdouuPuCy1Zk1eY4=
+2025/05/04 16:09:09 INFO [::1]:59878 200 GET /auth/forgot-password 258.801µs
+2025/05/04 16:09:09 INFO [::1]:44736 303 GET /auth/forgot-password 113.645µs
+2025/05/04 16:09:09 INFO Gracefully stopped http server on :1057
+2025/05/04 16:09:09 INFO Anonymous session created: 5gezmcCiFCeF4ldmHYuvTsdF3/Yhoho2O+siwEBhx9E=
+2025/05/04 16:09:09 INFO Token 'invalid-csrf-token' not found
+2025/05/04 16:09:09 INFO CSRF-Token not correct
+2025/05/04 16:09:09 INFO [::1]:59884 400 POST /api/auth/forgot-password 62.308µs
+2025/05/04 16:09:09 INFO Anonymous session created: sB7LgNGEbOF5DSSMzwmSshATc51GFcbDS1Rlv7fZJ6s=
+2025/05/04 16:09:09 INFO CSRF-Token created: W4MNydFZuSdvtZIMMvUqAHUJ0WhBr23Dcoz90LKCID4=
+2025/05/04 16:09:09 INFO Gracefully stopped http server on :1058
+2025/05/04 16:09:09 INFO [::1]:52442 200 GET /auth/forgot-password 179.26µs
+2025/05/04 16:09:09 INFO [::1]:51398 200 POST /api/auth/forgot-password 251.419781ms
+2025/05/04 16:09:09 INFO Gracefully stopped http server on :1059
+2025/05/04 16:09:09 INFO [::1]:52442 200 POST /api/auth/forgot-password 250.816416ms
+2025/05/04 16:09:09 INFO Gracefully stopped http server on :1056
+2025/05/04 16:09:09 INFO Starting server...
+2025/05/04 16:09:09 INFO BASE_URL is "http://localhost:1060"
+2025/05/04 16:09:09 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:09 INFO Starting server...
+2025/05/04 16:09:09 INFO BASE_URL is "http://localhost:1061"
+2025/05/04 16:09:09 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:09 INFO Starting server...
+2025/05/04 16:09:09 INFO BASE_URL is "http://localhost:1062"
+2025/05/04 16:09:09 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:09 INFO Starting server...
+2025/05/04 16:09:09 INFO BASE_URL is "http://localhost:1063"
+2025/05/04 16:09:09 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:09 INFO Starting server on ":1063"
+2025/05/04 16:09:09 INFO Starting server on ":1062"
+2025/05/04 16:09:09 INFO Starting server on ":1060"
+2025/05/04 16:09:09 INFO Starting server on ":1061"
+2025/05/04 16:09:09 INFO Anonymous session created: oCgpL+oZhB3Qxun4suBEgG3mPIgT5hmayl60V/1RmwQ=
+2025/05/04 16:09:09 INFO Anonymous session created: MJPq32rxlQv17sLxU5SpdSB/KwbJsZ3U4w3cvsN3uC0=
+2025/05/04 16:09:09 INFO Anonymous session created: CUlQ+bggY/0A/rDAR3sptz+J3n2Bdl9Fzke2ZFj3PRs=
+2025/05/04 16:09:09 INFO CSRF-Token created: YZJRCSOkI6dGoiNbXmCAg7MYGoFUOA7Lr59XcLo3YF8=
+2025/05/04 16:09:09 INFO Anonymous session created: 96U59EFvYbOqmF26RwH2Hqu3/FFTNss8S43AM/K388Q=
+2025/05/04 16:09:09 INFO [::1]:35294 200 GET / 196.252µs
+2025/05/04 16:09:09 INFO CSRF-Token created: vK29fXyz7zbk8RZaAyVOHaKkvdXp51F15wDrMK/ZePI=
+2025/05/04 16:09:09 INFO CSRF-Token created: hGjTpCf8rPPFQgaifNbuevCVNKB5rCC+gGzRyTdqVNw=
+2025/05/04 16:09:09 INFO [::1]:55424 200 GET / 284.911µs
+2025/05/04 16:09:09 INFO [::1]:44574 200 GET / 311.472µs
+2025/05/04 16:09:09 INFO CSRF-Token created: 1zsSCsDcU2ZC2NEjulCbHJ6ZOI8VlW/oboKgopYwYdk=
+2025/05/04 16:09:09 INFO [::1]:50910 200 GET / 288.638µs
+2025/05/04 16:09:09 INFO Anonymous session created: ts1l2m7Elvo8//oCix6Lr4K0OcIICSsLd7Lj588JkqM=
+2025/05/04 16:09:09 INFO CSRF-Token created: bSGjupmgc72ZgO9/prg2tGlSVG7q/B5cDZILsHiFmWo=
+2025/05/04 16:09:09 INFO [::1]:55428 200 GET /auth/forgot-password 207.965µs
+2025/05/04 16:09:09 INFO Anonymous session created: jP7c4Q6ph70c4ZeOweRvIfBfYHE1gqgJsUJuCbUP8J4=
+2025/05/04 16:09:09 INFO Anonymous session created: 8dSyXuUzq9vw40Gl5hNiYSmJQ6i/KCTefPiY4+9u1Wc=
+2025/05/04 16:09:09 INFO CSRF-Token created: +rZh42okgPd3/fF/xl4NFwvwX3MiM7zjlcGG3zM5XFM=
+2025/05/04 16:09:09 INFO [::1]:44576 200 GET /auth/forgot-password 114.216µs
+2025/05/04 16:09:09 INFO CSRF-Token created: WKPcqDP2N7aXFj387PBryeZWCPIWg6BVP8mvLsYiCn4=
+2025/05/04 16:09:09 INFO [::1]:50926 200 GET /auth/forgot-password 251.918µs
+2025/05/04 16:09:09 INFO [::1]:55428 400 POST /api/auth/forgot-password-actual 66.767µs
+2025/05/04 16:09:09 INFO Token 'invalidToken' not found
+2025/05/04 16:09:09 INFO [::1]:44576 400 POST /api/auth/forgot-password-actual 65.374µs
+2025/05/04 16:09:09 INFO Gracefully stopped http server on :1062
+2025/05/04 16:09:09 INFO [::1]:50926 400 POST /api/auth/forgot-password-actual 43.933µs
+2025/05/04 16:09:09 INFO Gracefully stopped http server on :1060
+2025/05/04 16:09:09 INFO Gracefully stopped http server on :1061
+2025/05/04 16:09:09 INFO Anonymous session created: tdGFl8JZXU3Wc1np+/XpX0/QoAe3kiLvgQm8HjrYSig=
+2025/05/04 16:09:09 INFO CSRF-Token created: aVH669YBJv1OWpp34b+Qjuz+M5HsPODfHTFov8s12nw=
+2025/05/04 16:09:09 INFO [::1]:35308 200 GET /auth/forgot-password 240.858µs
+2025/05/04 16:09:10 INFO [::1]:35308 200 POST /api/auth/forgot-password 250.688653ms
+2025/05/04 16:09:10 INFO [::1]:35308 200 POST /api/auth/forgot-password-actual 54.280642ms
+2025/05/04 16:09:10 INFO Gracefully stopped http server on :1063
+2025/05/04 16:09:10 INFO Starting server...
+2025/05/04 16:09:10 INFO BASE_URL is "http://localhost:1066"
+2025/05/04 16:09:10 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:10 INFO Starting server...
+2025/05/04 16:09:10 INFO BASE_URL is "http://localhost:1065"
+2025/05/04 16:09:10 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:10 INFO Starting server...
+2025/05/04 16:09:10 INFO BASE_URL is "http://localhost:1064"
+2025/05/04 16:09:10 INFO ENVIRONMENT is "test"
+2025/05/04 16:09:10 INFO Starting server on ":1064"
+2025/05/04 16:09:10 INFO Starting server on ":1065"
+2025/05/04 16:09:10 INFO Starting server on ":1066"
+2025/05/04 16:09:10 INFO Anonymous session created: pNnVTAfsxKbEKVbL964pbEiz0Yo97GiKfTzgMmeDXag=
+2025/05/04 16:09:10 INFO Anonymous session created: XHGSC8/S+wpUU1+y69UJ6C6giGlJI/c+rjrCACAXpUQ=
+2025/05/04 16:09:10 INFO Anonymous session created: i6xM86SMdzJbQ2iwhFxDJUoE1huvwRUXGgR8Grz2NLA=
+2025/05/04 16:09:10 INFO CSRF-Token created: LxM0GzekPJwHiFbfIhvErKx+8ifFF1mzilPRCnWRA2M=
+2025/05/04 16:09:10 INFO CSRF-Token created: ad1UAy/BwmOoVfaERQy1r41ZQ/MQVrvrmuCepW8B2SA=
+2025/05/04 16:09:10 INFO [::1]:39678 200 GET / 453.261µs
+2025/05/04 16:09:10 INFO [::1]:53820 200 GET / 459.462µs
+2025/05/04 16:09:10 INFO CSRF-Token created: aPbPi98kbLcCPMhIkKpEdjgtfdFu7nXMsa7ILjbCE7M=
+2025/05/04 16:09:10 INFO [::1]:56498 200 GET / 556.106µs
+2025/05/04 16:09:10 INFO Anonymous session created: o4vsnS+KCdznIZ8m/RnSKUcX0SCrYGdiW6M/qACB+MI=
+2025/05/04 16:09:10 INFO Anonymous session created: ge8Q/yJxdp1EHbCMn//9MM4DbUjnp/Wf+/6uOk5e0WM=
+2025/05/04 16:09:10 INFO CSRF-Token created: tdfGaFG7xiDV9qUY/8oxdmJ+ihDVT5sgeIWApwHTzlw=
+2025/05/04 16:09:10 INFO [::1]:39684 200 GET / 97.635µs
+2025/05/04 16:09:10 INFO CSRF-Token created: d91wOB18AS3RL8mj7nGwgLaGX/a6muRyd5HPr79SC7Y=
+2025/05/04 16:09:10 INFO [::1]:56514 200 GET / 160.425µs
+2025/05/04 16:09:10 INFO Anonymous session created: s1+XE+fFIBra30AMXxWn9QLyeeVTF2VNXjFfVmmLVtk=
+2025/05/04 16:09:10 INFO CSRF-Token created: jQRbdkV6aol/nsuC8exGnkqFrVQZaM4DfkaezfuHQr4=
+2025/05/04 16:09:10 INFO [::1]:53828 404 GET /workout 129.997µs
+2025/05/04 16:09:10 INFO Gracefully stopped http server on :1066
+2025/05/04 16:09:10 INFO Gracefully stopped http server on :1064
+--- FAIL: TestIntegrationAuth (4.39s)
+ --- FAIL: TestIntegrationAuth/DeleteAccount (0.00s)
+ --- FAIL: TestIntegrationAuth/DeleteAccount/should_delete_all_user_related_data (0.34s)
+ main_test.go:919:
+ Error Trace: /home/tiwun/source/spend-sparrow/main_test.go:919
+ Error: Not equal:
+ expected: 200
+ actual : 500
+ Test: TestIntegrationAuth/DeleteAccount/should_delete_all_user_related_data
+ main_test.go:924:
+ Error Trace: /home/tiwun/source/spend-sparrow/main_test.go:924
+ Error: Not equal:
+ expected: 0
+ actual : 1
+ Test: TestIntegrationAuth/DeleteAccount/should_delete_all_user_related_data
+ main_test.go:927:
+ Error Trace: /home/tiwun/source/spend-sparrow/main_test.go:927
+ Error: Not equal:
+ expected: 0
+ actual : 1
+ Test: TestIntegrationAuth/DeleteAccount/should_delete_all_user_related_data
+ main_test.go:930:
+ Error Trace: /home/tiwun/source/spend-sparrow/main_test.go:930
+ Error: Not equal:
+ expected: 0
+ actual : 1
+ Test: TestIntegrationAuth/DeleteAccount/should_delete_all_user_related_data
+ main_test.go:932:
+ Error Trace: /home/tiwun/source/spend-sparrow/main_test.go:932
+ Error: Expected nil, but got: sqlite3.Error{Code:1, ExtendedCode:1, SystemErrno:0x0, err:"no such table: workout"}
+ Test: TestIntegrationAuth/DeleteAccount/should_delete_all_user_related_data
+ main_test.go:933:
+ Error Trace: /home/tiwun/source/spend-sparrow/main_test.go:933
+ Error: Not equal:
+ expected: 0
+ actual : 1
+ Test: TestIntegrationAuth/DeleteAccount/should_delete_all_user_related_data
+ --- FAIL: TestIntegrationAuth/Session (0.00s)
+ --- FAIL: TestIntegrationAuth/Session/should_not_have_access_to_user_information_with_outdated_session (0.25s)
+ main_test.go:1611:
+ Error Trace: /home/tiwun/source/spend-sparrow/main_test.go:1611
+ Error: Not equal:
+ expected: 303
+ actual : 404
+ Test: TestIntegrationAuth/Session/should_not_have_access_to_user_information_with_outdated_session
+ main_test.go:1612:
+ Error Trace: /home/tiwun/source/spend-sparrow/main_test.go:1612
+ Error: Not equal:
+ expected: "/auth/signin"
+ actual : ""
+
+ Diff:
+ --- Expected
+ +++ Actual
+ @@ -1 +1 @@
+ -/auth/signin
+ +
+ Test: TestIntegrationAuth/Session/should_not_have_access_to_user_information_with_outdated_session
+FAIL
+2025/05/04 16:09:10 INFO Gracefully stopped http server on :1065
+FAIL spend-sparrow 4.413s
+ok spend-sparrow/db (cached)
+? spend-sparrow/handler [no test files]
+? spend-sparrow/handler/middleware [no test files]
+? spend-sparrow/log [no test files]
+? spend-sparrow/mocks [no test files]
+ok spend-sparrow/service (cached)
+? spend-sparrow/template [no test files]
+? spend-sparrow/template/account [no test files]
+? spend-sparrow/template/auth [no test files]
+? spend-sparrow/template/mail [no test files]
+? spend-sparrow/template/workout [no test files]
+? spend-sparrow/types [no test files]
+? spend-sparrow/utils [no test files]
+FAIL
diff --git a/types/auth.go b/types/auth.go
index 9f46957..e018dea 100644
--- a/types/auth.go
+++ b/types/auth.go
@@ -8,6 +8,7 @@ import (
type User struct {
Id uuid.UUID
+ GroupId uuid.UUID
Email string
EmailVerified bool
EmailVerifiedAt *time.Time
diff --git a/types/money.go b/types/money.go
new file mode 100644
index 0000000..80fcb03
--- /dev/null
+++ b/types/money.go
@@ -0,0 +1,91 @@
+package types
+
+import (
+ "time"
+
+ "github.com/google/uuid"
+)
+
+// At the center of the application is the transaction.
+//
+// Every piece of data should be calculated based on transactions. This means potential calculation errors can be fixed later in time.
+//
+// If it becomes necessary to precalculate snapshots for performance reasons, this can be done in the future. But the transaction should always be the source of truth.
+type Transaction struct {
+ Id uuid.UUID
+ GroupId uuid.UUID
+
+ AccountId uuid.UUID
+ // nil indicates that the transaction is not yet associated with a piggy bank
+ PiggyBankId *uuid.UUID
+
+ // The internal transaction is amove between e.g. an account and a piggy bank to execute a savings plan
+ Internal bool
+
+ // The value of the transacion. Negative for outgoing and positive for incoming
+ Value int64
+ Timestamp time.Time
+
+ Note string
+
+ CreatedAt time.Time
+ // either "" or "system-"
+ CreatedBy uuid.UUID
+ UpdatedAt time.Time
+ UpdatedBy uuid.UUID
+}
+
+// The Account holds money
+type Account struct {
+ Id uuid.UUID
+ GroupId uuid.UUID
+
+ // Custom Name of the account, e.g. "Bank", "Cash", "Credit Card"
+ Name string
+
+ CurrentBalance int64
+ LastTransaction *time.Time
+ // The current precalculated value of:
+ // Account.Balance - [PiggyBank.Balance...]
+ OinkBalance int64
+
+ CreatedAt time.Time
+ CreatedBy uuid.UUID
+ UpdatedAt *time.Time
+ UpdatedBy *uuid.UUID
+}
+
+// The PiggyBank is a fictional account. The money it "holds" is actually in the Account
+type PiggyBank struct {
+ Id uuid.UUID
+ GroupId uuid.UUID
+
+ AccountId uuid.UUID
+ Name string
+
+ CurrentBalance int64
+
+ CreatedAt time.Time
+ CreatedBy uuid.UUID
+ UpdatedAt *time.Time
+ UpdatedBy *uuid.UUID
+}
+
+// The SavingsPlan is applied every interval to the PiggyBank/Account as a transaction
+type SavingsPlan struct {
+ Id uuid.UUID
+ GroupId uuid.UUID
+
+ PiggyBankId uuid.UUID
+
+ MonthlySaving int64
+
+ ValidFrom time.Time
+ /// nil means it is valid indefinitely
+ ValidTo *time.Time
+
+ CreatedAt time.Time
+ CreatedBy uuid.UUID
+ UpdatedAt *time.Time
+ UpdatedBy *uuid.UUID
+}
diff --git a/types/types.go b/types/types.go
index c2c9acd..1c39af4 100644
--- a/types/types.go
+++ b/types/types.go
@@ -5,5 +5,6 @@ import (
)
var (
- ErrInternal = errors.New("internal server error")
+ ErrInternal = errors.New("internal server error")
+ ErrUnauthorized = errors.New("You are not authorized to perform this action.")
)