From c8cd364c7f5cc81d3444167a52c22af146c47b63 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Tue, 16 Apr 2024 17:22:07 -0700 Subject: [PATCH 001/155] super small node edits and add missing semicolon --- html/package-lock.json | 426 +++++++++++++++++++++-------------------- html/package.json | 2 +- html/src/app.html | 2 +- 3 files changed, 223 insertions(+), 207 deletions(-) diff --git a/html/package-lock.json b/html/package-lock.json index ab8c28a..b5652a5 100644 --- a/html/package-lock.json +++ b/html/package-lock.json @@ -15,7 +15,7 @@ "tailwindcss": "^3.4.3" }, "devDependencies": { - "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/adapter-auto": "^3.2.0", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0", "@types/eslint": "^8.56.0", @@ -66,9 +66,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -545,21 +545,21 @@ "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", - "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", + "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-brands-svg-icons": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.1.tgz", - "integrity": "sha512-093l7DAkx0aEtBq66Sf19MgoZewv1zeY9/4C7vSKPO4qMwEsW/2VYTUTpBtLwfb9T2R73tXaRDPmE4UqLCYHfg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.2.tgz", + "integrity": "sha512-zi5FNYdmKLnEc0jc0uuHH17kz/hfYTg4Uei0wMGzcoCL/4d3WM3u1VMc0iGGa31HuhV5i7ZK8ZlTCQrHqRHSGQ==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.5.1" + "@fortawesome/fontawesome-common-types": "6.5.2" }, "engines": { "node": ">=6" @@ -615,9 +615,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "node_modules/@isaacs/cliui": { @@ -761,9 +761,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz", - "integrity": "sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz", + "integrity": "sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==", "cpu": [ "arm" ], @@ -774,9 +774,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz", - "integrity": "sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz", + "integrity": "sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==", "cpu": [ "arm64" ], @@ -787,9 +787,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz", - "integrity": "sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz", + "integrity": "sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==", "cpu": [ "arm64" ], @@ -800,9 +800,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz", - "integrity": "sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz", + "integrity": "sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==", "cpu": [ "x64" ], @@ -813,9 +813,22 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz", - "integrity": "sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz", + "integrity": "sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz", + "integrity": "sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==", "cpu": [ "arm" ], @@ -826,9 +839,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz", - "integrity": "sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz", + "integrity": "sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==", "cpu": [ "arm64" ], @@ -839,9 +852,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz", - "integrity": "sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.3.tgz", + "integrity": "sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==", "cpu": [ "arm64" ], @@ -852,11 +865,11 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz", - "integrity": "sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz", + "integrity": "sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==", "cpu": [ - "ppc64le" + "ppc64" ], "dev": true, "optional": true, @@ -865,9 +878,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz", - "integrity": "sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz", + "integrity": "sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==", "cpu": [ "riscv64" ], @@ -878,9 +891,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz", - "integrity": "sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz", + "integrity": "sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==", "cpu": [ "s390x" ], @@ -891,9 +904,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz", - "integrity": "sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz", + "integrity": "sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==", "cpu": [ "x64" ], @@ -904,9 +917,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz", - "integrity": "sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz", + "integrity": "sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==", "cpu": [ "x64" ], @@ -917,9 +930,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz", - "integrity": "sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz", + "integrity": "sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==", "cpu": [ "arm64" ], @@ -930,9 +943,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz", - "integrity": "sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz", + "integrity": "sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==", "cpu": [ "ia32" ], @@ -943,9 +956,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz", - "integrity": "sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz", + "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==", "cpu": [ "x64" ], @@ -968,9 +981,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.5.4.tgz", - "integrity": "sha512-eDxK2d4EGzk99QsZNoPXe7jlzA5EGqfcCpUwZ912bhnalsZ2ZsG5wGRthkydupVjYyqdmzEanVKFhLxU2vkPSQ==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.5.6.tgz", + "integrity": "sha512-AYb02Jm5MfNqJHc8zrj7ScQAFAKmTUCkpkfoi8EVaZZDdnjkvI7L2GtnTDhpiXSAZRVitZX4qm59sMS1FgL+lQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -1000,17 +1013,17 @@ } }, "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.0.2.tgz", - "integrity": "sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.0.tgz", + "integrity": "sha512-sY6ncCvg+O3njnzbZexcVtUqOBE3iYmQPJ9y+yXSkOwG576QI/xJrBnQSRXFLGwJNBa0T78JEKg5cIR0WOAuUw==", "dev": true, "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^2.0.0", "debug": "^4.3.4", "deepmerge": "^4.3.1", "kleur": "^4.1.5", - "magic-string": "^0.30.5", - "svelte-hmr": "^0.15.3", + "magic-string": "^0.30.9", + "svelte-hmr": "^0.16.0", "vitefu": "^0.2.5" }, "engines": { @@ -1022,9 +1035,9 @@ } }, "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.0.0.tgz", - "integrity": "sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz", + "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==", "dev": true, "dependencies": { "debug": "^4.3.4" @@ -1045,9 +1058,9 @@ "dev": true }, "node_modules/@types/eslint": { - "version": "8.56.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.6.tgz", - "integrity": "sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A==", + "version": "8.56.9", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.9.tgz", + "integrity": "sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==", "dev": true, "dependencies": { "@types/estree": "*", @@ -1078,22 +1091,22 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz", - "integrity": "sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz", + "integrity": "sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.4.0", - "@typescript-eslint/type-utils": "7.4.0", - "@typescript-eslint/utils": "7.4.0", - "@typescript-eslint/visitor-keys": "7.4.0", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.7.0", + "@typescript-eslint/type-utils": "7.7.0", + "@typescript-eslint/utils": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1113,15 +1126,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.4.0.tgz", - "integrity": "sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.0.tgz", + "integrity": "sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.4.0", - "@typescript-eslint/types": "7.4.0", - "@typescript-eslint/typescript-estree": "7.4.0", - "@typescript-eslint/visitor-keys": "7.4.0", + "@typescript-eslint/scope-manager": "7.7.0", + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/typescript-estree": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0", "debug": "^4.3.4" }, "engines": { @@ -1141,13 +1154,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.4.0.tgz", - "integrity": "sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz", + "integrity": "sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.4.0", - "@typescript-eslint/visitor-keys": "7.4.0" + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1158,15 +1171,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.4.0.tgz", - "integrity": "sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz", + "integrity": "sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.4.0", - "@typescript-eslint/utils": "7.4.0", + "@typescript-eslint/typescript-estree": "7.7.0", + "@typescript-eslint/utils": "7.7.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1185,9 +1198,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.4.0.tgz", - "integrity": "sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", + "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1198,19 +1211,19 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.4.0.tgz", - "integrity": "sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz", + "integrity": "sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.4.0", - "@typescript-eslint/visitor-keys": "7.4.0", + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1226,18 +1239,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.4.0.tgz", - "integrity": "sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.0.tgz", + "integrity": "sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.4.0", - "@typescript-eslint/types": "7.4.0", - "@typescript-eslint/typescript-estree": "7.4.0", - "semver": "^7.5.4" + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.7.0", + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/typescript-estree": "7.7.0", + "semver": "^7.6.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1251,13 +1264,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.4.0.tgz", - "integrity": "sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", + "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.4.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.7.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1812,10 +1825,13 @@ } }, "node_modules/eslint-compat-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", - "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz", + "integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==", "dev": true, + "dependencies": { + "semver": "^7.5.4" + }, "engines": { "node": ">=12" }, @@ -1836,23 +1852,23 @@ } }, "node_modules/eslint-plugin-svelte": { - "version": "2.35.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.1.tgz", - "integrity": "sha512-IF8TpLnROSGy98Z3NrsKXWDSCbNY2ReHDcrYTuXZMbfX7VmESISR78TWgO9zdg4Dht1X8coub5jKwHzP0ExRug==", + "version": "2.37.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.37.0.tgz", + "integrity": "sha512-H/2Gz7agYHEMEEzRuLYuCmAIdjuBnbhFG9hOK0yCdSBvvJGJMkjo+lR6j67OIvLOavgp4L7zA5LnDKi8WqdPhQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@jridgewell/sourcemap-codec": "^1.4.14", - "debug": "^4.3.1", - "eslint-compat-utils": "^0.1.2", + "@eslint-community/eslint-utils": "^4.4.0", + "@jridgewell/sourcemap-codec": "^1.4.15", + "debug": "^4.3.4", + "eslint-compat-utils": "^0.5.0", "esutils": "^2.0.3", - "known-css-properties": "^0.29.0", - "postcss": "^8.4.5", + "known-css-properties": "^0.30.0", + "postcss": "^8.4.38", "postcss-load-config": "^3.1.4", "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", - "semver": "^7.5.3", - "svelte-eslint-parser": ">=0.33.0 <1.0.0" + "postcss-selector-parser": "^6.0.16", + "semver": "^7.6.0", + "svelte-eslint-parser": ">=0.34.0 <1.0.0" }, "engines": { "node": "^14.17.0 || >=16.0.0" @@ -1861,8 +1877,8 @@ "url": "https://github.com/sponsors/ota-meshi" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0-0", - "svelte": "^3.37.0 || ^4.0.0" + "eslint": "^7.0.0 || ^8.0.0-0 || ^9.0.0-0", + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.95" }, "peerDependenciesMeta": { "svelte": { @@ -2518,9 +2534,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", - "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.30.0.tgz", + "integrity": "sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==", "dev": true }, "node_modules/levn": { @@ -2588,9 +2604,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "version": "0.30.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz", + "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -2641,9 +2657,9 @@ } }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3129,9 +3145,9 @@ } }, "node_modules/prettier-plugin-svelte": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.2.tgz", - "integrity": "sha512-ZzzE/wMuf48/1+Lf2Ffko0uDa6pyCfgHV6+uAhtg2U0AAXGrhCSW88vEJNAkAxW5qyrFY1y1zZ4J8TgHrjW++Q==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.3.tgz", + "integrity": "sha512-wJq8RunyFlWco6U0WJV5wNCM7zpBFakS76UBSbmzMGpncpK98NZABaE+s7n8/APDCEVNHXC5Mpq+MLebQtsRlg==", "dev": true, "peerDependencies": { "prettier": "^3.0.0", @@ -3240,9 +3256,9 @@ } }, "node_modules/rollup": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", - "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz", + "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -3255,21 +3271,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.13.2", - "@rollup/rollup-android-arm64": "4.13.2", - "@rollup/rollup-darwin-arm64": "4.13.2", - "@rollup/rollup-darwin-x64": "4.13.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", - "@rollup/rollup-linux-arm64-gnu": "4.13.2", - "@rollup/rollup-linux-arm64-musl": "4.13.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", - "@rollup/rollup-linux-riscv64-gnu": "4.13.2", - "@rollup/rollup-linux-s390x-gnu": "4.13.2", - "@rollup/rollup-linux-x64-gnu": "4.13.2", - "@rollup/rollup-linux-x64-musl": "4.13.2", - "@rollup/rollup-win32-arm64-msvc": "4.13.2", - "@rollup/rollup-win32-ia32-msvc": "4.13.2", - "@rollup/rollup-win32-x64-msvc": "4.13.2", + "@rollup/rollup-android-arm-eabi": "4.14.3", + "@rollup/rollup-android-arm64": "4.14.3", + "@rollup/rollup-darwin-arm64": "4.14.3", + "@rollup/rollup-darwin-x64": "4.14.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.3", + "@rollup/rollup-linux-arm-musleabihf": "4.14.3", + "@rollup/rollup-linux-arm64-gnu": "4.14.3", + "@rollup/rollup-linux-arm64-musl": "4.14.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.3", + "@rollup/rollup-linux-riscv64-gnu": "4.14.3", + "@rollup/rollup-linux-s390x-gnu": "4.14.3", + "@rollup/rollup-linux-x64-gnu": "4.14.3", + "@rollup/rollup-linux-x64-musl": "4.14.3", + "@rollup/rollup-win32-arm64-msvc": "4.14.3", + "@rollup/rollup-win32-ia32-msvc": "4.14.3", + "@rollup/rollup-win32-x64-msvc": "4.14.3", "fsevents": "~2.3.2" } }, @@ -3601,9 +3618,9 @@ } }, "node_modules/svelte": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.12.tgz", - "integrity": "sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.14.tgz", + "integrity": "sha512-ry3+YlWqZpHxLy45MW4MZIxNdvB+Wl7p2nnstWKbOAewaJyNJuOtivSbRChcfIej6wFBjWqyKmf/NgK1uW2JAA==", "dependencies": { "@ampproject/remapping": "^2.2.1", "@jridgewell/sourcemap-codec": "^1.4.15", @@ -3625,9 +3642,9 @@ } }, "node_modules/svelte-check": { - "version": "3.6.8", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.8.tgz", - "integrity": "sha512-rhXU7YCDtL+lq2gCqfJDXKTxJfSsCgcd08d7VWBFxTw6IWIbMWSaASbAOD3N0VV9TYSSLUqEBiratLd8WxAJJA==", + "version": "3.6.9", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.9.tgz", + "integrity": "sha512-hDQrk3L0osX07djQyMiXocKysTLfusqi8AriNcCiQxhQR49/LonYolcUGMtZ0fbUR8HTR198Prrgf52WWU9wEg==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", @@ -3647,16 +3664,16 @@ } }, "node_modules/svelte-eslint-parser": { - "version": "0.33.1", - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.1.tgz", - "integrity": "sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==", + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.34.1.tgz", + "integrity": "sha512-9+uLA1pqI9AZioKVGJzYYmlOZWxfoCXSbAM9iaNm7H01XlYlzRTtJfZgl9o3StQGN41PfGJIbkKkfk3e/pHFfA==", "dev": true, "dependencies": { - "eslint-scope": "^7.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", - "postcss": "^8.4.29", - "postcss-scss": "^4.0.8" + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "postcss": "^8.4.38", + "postcss-scss": "^4.0.9" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3665,7 +3682,7 @@ "url": "https://github.com/sponsors/ota-meshi" }, "peerDependencies": { - "svelte": "^3.37.0 || ^4.0.0" + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.94" }, "peerDependenciesMeta": { "svelte": { @@ -3682,9 +3699,9 @@ } }, "node_modules/svelte-hmr": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz", - "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz", + "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==", "dev": true, "engines": { "node": "^12.20 || ^14.13.1 || >= 16" @@ -3694,9 +3711,9 @@ } }, "node_modules/svelte-preprocess": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.3.tgz", - "integrity": "sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.4.tgz", + "integrity": "sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -3707,8 +3724,7 @@ "strip-indent": "^3.0.0" }, "engines": { - "node": ">= 16.0.0", - "pnpm": "^8.0.0" + "node": ">= 16.0.0" }, "peerDependencies": { "@babel/core": "^7.10.2", @@ -4046,9 +4062,9 @@ } }, "node_modules/typescript": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", - "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -4073,13 +4089,13 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/vite": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz", - "integrity": "sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==", + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.9.tgz", + "integrity": "sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==", "dev": true, "dependencies": { "esbuild": "^0.20.1", - "postcss": "^8.4.36", + "postcss": "^8.4.38", "rollup": "^4.13.0" }, "bin": { diff --git a/html/package.json b/html/package.json index 04fa28c..1217eaa 100644 --- a/html/package.json +++ b/html/package.json @@ -12,7 +12,7 @@ "format": "prettier --write ." }, "devDependencies": { - "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/adapter-auto": "^3.2.0", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0", "@types/eslint": "^8.56.0", diff --git a/html/src/app.html b/html/src/app.html index 77a5ff5..f1f82cc 100644 --- a/html/src/app.html +++ b/html/src/app.html @@ -7,6 +7,6 @@ %sveltekit.head% -
%sveltekit.body%
+
%sveltekit.body%
From 43da10dc7cab5b4e1f7d2530210aedccfc26a7b7 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Tue, 16 Apr 2024 17:26:29 -0700 Subject: [PATCH 002/155] wip: basic html template of landing page set up --- html/src/routes/+page.svelte | 54 ++++++++++++++++++++++- html/src/routes/HomePage.svelte | 5 --- html/src/styles/styles.css | 75 ++++++++++++++++++++++++++++++++ html/static/toast1.png | Bin 0 -> 4194358 bytes 4 files changed, 127 insertions(+), 7 deletions(-) delete mode 100644 html/src/routes/HomePage.svelte create mode 100644 html/src/styles/styles.css create mode 100644 html/static/toast1.png diff --git a/html/src/routes/+page.svelte b/html/src/routes/+page.svelte index d05a7a5..4e4e1bf 100644 --- a/html/src/routes/+page.svelte +++ b/html/src/routes/+page.svelte @@ -1,5 +1,55 @@ + +
+ +
\ No newline at end of file diff --git a/html/src/routes/HomePage.svelte b/html/src/routes/HomePage.svelte deleted file mode 100644 index a584d68..0000000 --- a/html/src/routes/HomePage.svelte +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/html/src/styles/styles.css b/html/src/styles/styles.css new file mode 100644 index 0000000..05e0658 --- /dev/null +++ b/html/src/styles/styles.css @@ -0,0 +1,75 @@ +/* +1. Use a more-intuitive box-sizing model. +*/ +*, *::before, *::after { +box-sizing: border-box; +} +/* +2. Remove default margin +*/ +* { +margin: 0; +} +/* +Typographic tweaks! +3. Add accessible line-height +4. Improve text rendering +*/ +body { +line-height: 1.5; +-webkit-font-smoothing: antialiased; +} +/* +5. Improve media defaults +*/ +img, picture, video, canvas, svg { +display: block; +max-width: 100%; +} +/* +6. Remove built-in form typography styles +*/ +input, button, textarea, select { +font: inherit; +} +/* +7. Avoid text overflows +*/ +p, h1, h2, h3, h4, h5, h6 { +overflow-wrap: break-word; +} +/* +8. Create a root stacking context +*/ +#root, #__next { +isolation: isolate; +} +* { + outline: 2px solid red; +} +:root { + --primary-color: white; +} +body { + background-color: rgb(59, 59, 59); + font-style: Arial; + color: var(--primary-color); +} +.flex { + display: flex; +} +.row { + flex-direction: row; +} +.col { + flex-direction: column; +} +.grow-1 { + flex-grow: 1; +} +.sp-around { + justify-content: space-around; +} +.sp-between { + align-content: space-between; +} diff --git a/html/static/toast1.png b/html/static/toast1.png new file mode 100644 index 0000000000000000000000000000000000000000..dae199ace22422043adbb9f1b6828bbe39eb9711 GIT binary patch literal 4194358 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�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 z zqMBzvgSP)BRpKC3IQbEI9j;O$$3F}0Ms~lul?U!m?XgwKoo`UI{k8Hn+JLXaHE3n7 zlrR4hu4BgPW!G_SY*11abbV#60z+-)KS&LKfLcr<4EDEhx=ioNL({m%-}UkX_eU(K z=M4LK?gmyf)@Cf=a{db)<~Q7L^`Ei4{{@WgX0U!5`%K~eC%TCB?>mQehWqjL@W!ys zNXCOB*be=Q<@_06hCHrwj~*W0NsQ(B@8C`4f%7f=)cFS)qgp>}!~KaCzD|r$+cOqz z%{=w}XkHEThrC8?Tf%%j7a?@9VQ|0c_suse!81&6xW589DtxyO3)9uQurYOMB>OD) zALjsK_}}UL!5oL<{#YNs4DNHO3Z3kWTh6y^7PZIVZtII@{&D$<&2{zc7j^mBZ>W9xOr1#{ zs1H4!i_^GAa?A|(1<@~9k95N-x!{QWKwD)8O&bAj1plXm$Vrn|b{Ld8^(eeT&xU7c zbkD_VSJW3w1^!KdA2AHZ^T2ZdmX}Wen@7R=E=u+OHgDKJ8C)Mu0h1Sa>O7{2PQ9>~ z#%(@X=WiXO5f|bEQ4>8x2FHxrf3Li!VV4b6kJa7OXI*a%-$YN8d^7@Z1m+JI$NyFb zU^Sxl`5w96YWa2W_;1AVq+g=d&r@Sy{p~Hs9oO$W|9gIu%jq_!#w>fm+z>H zm+jDni$7IS!C>CgydL02!2dDd0kq{d@5ghG9C{|#Vu?3UCstgnNiAu>YswU8RJ;Mf~4#P_n_kpefA5@fyM zWb+^NfrqR1Qq|*@so(^=M_5kZcpYl`$=ip?>xUUTJ6!EJ0Iub7ZPjh=J?gULDJ8U{ zt_=KY8VS>ESpGkau&MJn{IlFY$LvsTz>)Lz*>D<b!U>vv!E`ll(3m>=9OY%!RfSZ$Z{YvHaWVcNj{Dv9Yu9jTM7U;x0eT$6Bba_5 zp8t1Kv;eMt1l>%`53sy)6C0^oMkiHgoKcY4NtymaYVa$9&&w-4XnKEq0er?wR#8z_ zYyA8hu&$!38A#-unKx(r{$$(4?rWx3DkQ4$-=i-HT$9xVBzkq(z9IkH=3sn0PQm@j z_;Mt9Z3yn4;Qu7)``<_Mig@dpGkex}9SP{`c8M^*y})O57+VMO3dCTFMS7N&K>yDeS}v24Lo!42JHO2y!Q8~#@LrMbjwfF z?R})a>)+G>{CUp23H{%#UunUkd$s8``U$;pKsUhwT=VX)TDmc5062kex6=#xmV@{x?N@E;Cu?3DtEFstJ@o+B{49n8$~or~dHtSO*62@^ zJML>C-B;QfA1i;#*Xnm2y_lCBgaf!6JrDKzrV;G@2pE2|ygaae(F#Qo6eLs!Yu8$? z#QN0YmvRB&lBEg~;RefGM0n%GrfBx@2k=oNV9QgQUxc1?ftycnjb5NRelPF^Ud`E# z12FtI>0;hS11MqQOd0dlBi6i-d`11d5z5kJ)cclLR$k$;% z&#ym;Kf`8!tvh;t`>$j4uN|YK;eV^COvo(MF{9V0WY9&bKV*Z-w4bMP?G~s?rzOfF z_g|^wVr9bxRO`N6728~Z7rZSY937zhQsF;c=b6%j=W(H>_`(e(UjPVH|+f_!~bE)BUrKv9IOvjR&y0 z0mJc*PryIG@V&iv9N#-WfaSK{wzcIpb)TI#SeeDA#d7`R`3>{?bEqi*-zTAGFs$zf z_Z!xaPiP5kZ=wQ)V-zk%KMm$j!}z5vby()r>MuTDz5+0R z#R+H|sQc(>A9Os}zU$RLsNU)w zDp^PWTrhu=OLjWUUvJgts=0CpJis3O{(n@@>-N&aZ>L6*_a6t(J?e4l-tfIW`My0G zNUzZ4g?sK01*1PWtp0R831X%I>w_5nrH=6O#PEmGGe?Nj}_KIir=;9alY6BVptKTyZ zz)Sd?4ZP=q$98MxJ>P1{lLvUlAJEvFzR~#me$hxc`4g`BT*qDYg&HkDQDCjiVnm#apc{qeAXi>Kk`9U9ru(fqth=p98EuBi3YP?R$~8a<@LB!DJN_} zXZWnDoO-9SPP{>R!|qpBznhhP!tIPbsOzVA!q@gHd9Bguw_-}IMx_09$~xu_)foJQ zD)+jNvHWuC@UB)$lWXbac%35oOJ-!Q)g*DX5Ic#VI=569(4!{X7)k_bDkKN=VhevNUb$9UB9y1NK6A117a zpW%MCch z2B@zk{}$%~lKoZS7^?7|hW|@*|Kv}P#QzD@eFwv3@uJJ7e`1~rOX`5v>ngDfb>`(# z)Tn(udQf@P`y{AIkNW!m*gNkiDax+fcbJ~(o}43T0%4fIkaNyaKu{2gf=ZOAA}XMg z4In`zC_ujSq0P;u)*m-lbdp{5GzfOWvi zUhtRY@(uqS!~e(C_FL{h2-h0KXEo@{2v5NthRrSi*|%peZMb^1Zn}1jnm06VgnT#L zNd5GaG_vWH8dQ8Kz2|y@@!P93vpbsLdVJ1w;aME(64gsSS!Z=!uhTnRs=Oe$3tSct z?o2?3ZaL^kBv6lCklI*vv*@jW79b6cb~5{EnA+Acd~9C*(LwUsX!@<5-|GD>j2DPa zWEnaCq?#U`dBtE&*)&o^ukEf5^UF2%mchDU_f(xcAC8FQ>bw!*0NT%JuL(OR!o$_q zFU)jQRjAOq0!hIzO!Xv-2eCZ-}LCFt1w=qLz{70 zx8f^ZeEvIX-gpYjGMw(i`S5|)9nWF-AB<~#4eVHCaBbH0^j6o5X=i&zS%C*M|Q&J`VqLTrI~RgsXCRpKCaVf6lJ+@jvN1J^KWpy_`u$dcVJ&#Z%EF$O(S{y$kcE_d0C0p zt-VS!&pwCzb+U4k^OYW($NvL90z47X{2S(Xy(Q62g#8%Ve=qwFe`I=p^U$>ZnMt8E z=dozt@9;nTPq;5YrZQtnRW-JyYQ%O{4*f=w`2U&5UlRA0IDW5j0CDI93h4XLrtVbtglJQE(L#`21A1Tgd@pP9v z_<_b^^moRMZ|S1D4{9Uhja%OSRXfo4uO(lxmL9|_USaI8=TmLnk2U}gfNfxZTK))o zBVh;ZJOS6k1+01hS1seSbKfA}LH>Undd4C5^F8E3rjrX9b{}I7$OH34>O&vG9{42n zL|@ruJGK5-eWCgrzEhXG&{I+~(EDB~WyU^vhP)7j&~}%=e>CRuVt)#m165GcN{>VHqUvU1JQ)z0jL2pe4p5Y z8bh$ZaRHI3r)0k40pgnB)dweFT!6h7SvR`j5{2j)V08ed12DXA{s1;_%Zvl?u`IE} zN{9We);}7qz&HTw_h+yD;C;*e8}^S(ZJ9+vN4x|(<5AFJnyOUTxFHE14vv<4nZx_| z#YAxaKluMY!+HPUJVBru zUjO+285iJu^9qN%oV;Oh)8JbzfMI>p0$3cY<*%&gcYFcsSk6D<-DmjUbpDp-x7@!) zVy)qBY8-&W{pR7Hjt@Eg`OK@|1Gcw$+Xwd=%x`u4rsem5^8@Gj0Sl*nAGZg*yLW4YUn)&Z0L9o(M#G%SH5JnN2UhOE_K&U9XmuM%*h4!2WqN;Ie1K zqpVhgL150o_o<-!t;(Y3dlpS(!+X2te-1Yg`|lra?TKb|FG2O^|*YMd3AN^6Y9{O1`c7LU5JNLs0e5Wg^16cFY4_g1~ zFS-mqUNW4yQsd)dz;@ua+XUO@7j*D0?yZ{jb^Skh} zO~QFKf%(n1DHhxxLbn<8Ti+O^^a)%f6w=W`O)`B zIouz{{z346(0e9hz0>%vF!r~;)7Hx`#(NUmI+1Pje*u5`yxqv>ba7#I{x0utIe#L7 zacPo^j!fI}8eOZmG5g$reMa}{En!-R&lK@p`Rs>bc<_5AhW|VKZ(KkG|Jynd{QqZf z|6{fOX#GtC;0N=?B~(>@?Rw;tGL&7D-h6edtGH-ZDo+(j@n<72@ zB3l1w@KbbDstdzXmR~jfa-)iJJ@wcF+W+p0`tYr%^y1??)U|a(j(3pbm9NHGC*$)s zUtMx0;oa9x-O9$PT5Ma+OR=g3daHfjJWcO3Bn1O{{IiyAMBYxErQ`` z^JNcEM;}M-JlaD}9W6vki2OC!$^6!h&v5?zc(9qDzt#I&*zdGDh{W=MCR{yS0~YpF zjUibYwedviZ+j?jc!FBYtfx8moUif|i`fRxWpn~DWigt1+cdSitd)jbJ5cA|06wYC zZzumB!TvV2eT(4#f~wWjrg;l+Gg^A~FCk=lh6whzDf{JPeIlY+x8v>w?^(TR=T4J# zxaFW*GlVj-z?Kxx71g*6_b=+rsML%u^tlW`El`a~ z_o?ulr_^ZHqx1mdx#Z)zgDbFlhA7UL)fXftzzd+^@D+4Zk5#X$#k|Mh-Mg_2E(0FJ zj!Q%%;qvR?_{j13-==KWaB##g@DEx5!~b^vIi{{Y1#T-8Na1=(QI&LXa#{s`47I`d zb@|t(D^I6b`Vz%_sZ167-Sqaz7>F zxzC0=;^@k?!f;TPQcq2UVwgr9>zev(X5Z(5d3bucPjfZmGw;DHI?%=jcHi> zWg4(3v;n3E2>Rx^=Sa{?oj6)F$3c5Ga(~#!XW**Q14O(5!uTmp9U8%DyS^cfJg{Wkyl#btD=FCGXyy&oM z&xRlAeW$9<{!WE+e-f5_cnG~t{^xc#-b+D5;IF-0-kQsl(qw~T%T~%b0P6|ut+S9m zdzYiRU*RIE!tg!*4viTXF!h#^w`;#nNiD(WrU59vME;7!Zr=0(rU9@zfZU$f9Lx2a z7Qnm#BD#Ld`5On2()lWv_fPJ)%5eamCTIg%Q$IrPKe03XL&xPx?i8Mes1dM8?1YB^ zdBpT~vs9xwxwQCNaO7d15-r|`vDy24=qpD~C3c6A=RBJrm%`SX+acm4Yc z29sAB8qW8d9ssRC#D_oP;b)%yPW#V$#vz!eKxAsz-}L^r%y|le_YL#=(D_HgYqk9F z0TB;B>)#hs6;A-X`wizC{*NZV@5?$x@iovu=MGb1;pzAQj6fGaZZsE7L-jFAFGIs$ z>m2H|<|^25fuc(0$X9nZ9dh6cThtw{Z`G! zzNpMj)Z8@$@3o?L{6PHvr@XI`@g>r*`$?uaq)!uTq9Rjd#o^YO&}? z)jD^-YE1jUamQs#zE|nO&(-A0uhbv@xi9{GeZces?hX6Z4B+`Q{1J5iVE=wQf1!r$ zS3y4r3A;`u`lJ6hZlL4FuXNI#zvwiUO?mP+%?5YVvR;eHy`TN~uNr;F0gb!spyuyA z;&}2KK1K)d1-v?vdkx)uK&RaBu10QtR~J0^wU(nJSh9ycfRBHzxetA#v0LBQs4eel+>Wo* z@0z#qJN$@zKU#)$`&FA7{wDKY)QQ)BrCw`3Ro!!+QtHT^)bEqypYX8C&nG`N?MeC| zKBl_Uo>5%?ZSr*BIojt|)f)S(QZYgZcG;@DK@Z@;^Pu87-R!&<6Y$pv^c=pB9 z95JTpb=1>sb~rzYo{OrwEooiNA&)N{avo#aKCpP0oJb!!~ND*I#`MQou@z8KNjq7e*Q6xFOT{8 zd%E%2E@0M9EbGi?(EAhSSCvR)MfFvVzrS(dNRi&n5+3G3HnKk^+` zu-<&fYWBV1`D5CD%l%ta=Kuc^|NG6G4Ua$ajTYwV=kPzc-(hT~UdHs9IYlZcsjH~e zIQSUq^b`HcDNa)3uC-OS9h&)iX=qJ73S~wqyD(e6B=QsKK2@WCUw*SpRkSNoaYdoi zsat)y^E9HgZcOQ;~1ln zzYl=n156FC`!hTme%S!cylWzwBskxr7bk5D^XvUpWb-}K4HEG!-{u^LgdITPi{|)CG9=Cn8X`^}-Zoh1~jT8Tf|KTM3 zZ~#Okhip9#taiYjYjunJYR$@nx?{eHqR{BK?W4*y4meFftf zqgteq^G%1VDh~G6sf|}?aI?#l5x~QZyuGXUkKw%hJN%DFqWL7o2MNRfro%8D0O9ka z+4t8`%{F+!WcOsB8^}YgU0p<0)u%tHTI0D_B^0Aap~eGF$>DUa1*;YD2h!nT>Ztvq zr__Dfi;6Go$mhd)b~_$+oWkeRu=Rg{|0{VchyUR{tY#$|?jZ)ABtNT>k^{As7F(he zB0f+D&-zwM36!%=4gPx>V01LU)MP~Bf8UqivH$TrKxE!@09FIw^Z59ETz_yJk=lLp z{)=Y&A!(p5R}C%+-3I?rJDy?e zPi;no2Y??+@)oLETq`v$7)YOiwn~dK55Ekw_L)ix6yOhtPAI9F@eAkh<04SRF35|_k4)) z&gM9R`MmhJ1=hm>Ud!vXoICRdw3>j;Ot-TBZN!}{-_3oN9s%Bmc>O5vKgIi|19*|` zy~cZQa6iP$IPebF>3iV&kGOup?okK%pVIR$Ko}1|Lk# zegOWY&lH#cwbC1YPmlXg>0kdYz4Bg^uN`%Lqh8iL#x1)(B_~hc-X2Sy0^5JBX}9gy zrH>z`hLGMvPae`%G>Z420l4+;U$vRM!{v-qR=)7PHh+lz|4ZVF-?Wqb|E@#KGu{5_ zZ(^vSTiEVKGyyAFZxMNmMT}q0-TR9sJ^r&!M!6O>W_~mSLi)S(&#F(ldW35&< z9#YxW2b?cJ*L&!zyz@8pV(eAE?q}s*@|BWi9F+gecU{iE^Yv2Ml0$F;pU5{FJwU%l z)Nt-MDnI8SeS)|0Td%>_Z!Nyi>lNR41NkQM3DxGq30$f`85q71xV~hu>kr_shmSu! zq?21+t;FV6IS#<)4f|V|4j|NIsnZ15YvTf(A7E?x3J{j>H!r`)yy*ebx-wR&%=^c- zSxVo(RrLK^>iYh<-ha&dTP$|Df9nTmxZkt@7NIuO1++5`Vy>#TV%(A5nEx;uA?^p} zYw{2N|IhK=KN$I+WB9MGfe8MOtP^={o<$zCah|wBwHvxn-KO25v`%=6w!K(or)*G6 z#Y_cC&!#4w`gMH&Jo#t1K7gt81B^oh;LisK7l9cFtNl0qe{8KY!#)2j?_WB>&0Fr@ zLyq0`{i{7jX?0I`d3eL$(fH~aUN@{BsnfT7enuJFETU&1*xt1KhUabGrk2-tK~Fx@ z4Va%mTFGd~BRHJ^Iex?U<~MjO-%p<3>JE$tu>8J-CyQ;fU*_BI0^LHOis=&uD;6HZ zrk=Dx^sAZxAAlA!h4=GDu$|MWM;M1*m@!+{80ELWN>$o|_e#mX7SCfW366*Bl z;sXE=kU!h;v>s~xGdgZkiwQ3(hrZi&N8>X$?o}mr*{Ss2532rz50%#c32M!sQ~&i~ z@hcCh&5Ey8amhgy&U{bBv-d0IjJ?Vj|Dx(G{8BBK|EyLkj;bA;a=k@(_HV?`58Qvk zZNKPLo3i_dmk?D$SCmprFI zH+`z%w|u5EcN~ICKtBM#ei6LEgxfyC=kFt7$FGTZ!LL*6*K_U1>T})K>a_Zxs!e}f zr5C=Sh8N+*cg8)+9Cf#OFXLvk8}wsnxm~G^Zk4x) zTw?Be&hIsfueVjPC7Tsh^F}zZ8@L{CQ&#Cc%Br)Qo<>_0Ou5PB`hAS6qM{gA`8PP+ zZ<>A=UUK`##WBo}#^2RsdeHcj>yPoS;Po=*FJ~M_9iV3kuNN`yGTeWm3%>_%Kg0Z$ zxZixBo%WMlkYRtr{SNc{&R{>rxUd?3!~NDzDuVm1&s4l;FnOf`U~v9B-tK(98{6*8 z*sha{D8`?r`A_!sX1v;qJXudw4fa=I+$k!G8>$+?f#lG-qHCqLHL50iGCeGFaKwXtOLpZZfO^sKozZr(^y7tPX&P36e7o zC4%|Eg$XH&O~ETLp1gZPtWF&^SkFH5h{laRMWqFq+W+1QdiSlp>fE6X_=h|!$12lT zu3mMgYFy*%)hp!+4ddE7yXP)7%|4x;b@j;+(wCfif5ZKjFAwLPE3rS=({kUDa9U|F zui-?86`9&^vHEKt8VGMH#|o^USnN?e5nYYfZ~~3`mTUH%Q#A3mVd^})8M!Ey*F@t# zt%)wWYl`OXn#}Y(rL+ve-|`-Q|BVNgtH-o1DnF@26?{HA!>^cl{MxOa0G$7K;c&U- z=Km&)fZPJwf2 zy$vmg9M+Gc%?A&f$6pH9V+NjZb&@-(7|;1wa=@_s=h za}F-U!+A68YE+F9z|GtBPB@=`>Q}56VL~8}`wg`vru~o2XJ1mmZP`kVhXe4{;{RF0{kH?u zU^rbtd$-Nsdc%9*Yj! zbBv-mZmHA>WX0FSN54$jF%6X$TTeNO#qgTc0-(QfS`Ii3#|Nf|(6dQ1V=LN?exUp0~&C^rO;;IGMl%`iPRNykMT*W9u2QZo>V%H_v6025M z4LpDk9>C|_!E_hvJit1S@ct95_cYIj7r3ro0@uF+_J57(KJLTj3lOdgi1MNbApG9_ zF3c~`<2^up&UJ(qz-)qDM<($kJA|tsnoaonU>(1$<7;z`-MKndt#;{DjZEPj6!S37Fq8Lk^AG^D`a*mHm+( z=KCL!PG-zCfapRUKqvAr9hnxd|4eP}_)Q(j$8;u|fcFcQ{HWNo4k+d9FO)s!fUta4 zn@v*mnJ=RSK=;$*QKgNb|KY$V72S@$!mSx&G-nJ_x|$sRay$YSFdkW~PzC*jTdac< zSt?H%HHS^f%{RpFuQhcX%v(f}d-B2y_~;uDKobz%Xc^oP=79iRAt}&$ylO+b$IiSgm?Pu2Z$HOO@9FPZ0F&RXQwk{(r&Zvt*wCHQHS)!~fnI zBOUfnE}i7Czw^MWF+%2tXEgvB_yQQlHVz=WVv@`UAgLC-0k}V|fWCle0jwv0A6y0i>RYMqmUw0K5aMjc^e_$KcJiT7}cu7wQSBpMi#9EL;E_Ko-BP z`kC+qr>lD7x$HL_N4*8A#{D)6U4KITW%8FSLF-R{wFcBwHC(CKMl44=?x_tg+J3Wg z`rV_Lj^uS3Uq=o9wd9{4R-Li0tM863Y^YP9q_ zl`J@@maBhK%d3A>qbt5t6PDFD?_)K(>?bvXFKB#^;qT3q{;x^DZK z*T2x~?>m>{w>-aT|GRAYUcI+|OP_!vqAXr#qhlMx^yHm~bjt2;HR7Se8vodLWiXe*8!E+wzurZg@#Eo;u?C1DpqjpK{+3ov`Lj zb-waN4F%g9-tTqY+d5(6hdSYAe#fde;V<4$zm1<#Tkxxf-TIB}bF+xyTMoLOK7Fr# zO=EX_k3QgY4Z86QwOss~I$y=}a_PtT`{8$R?u%-7<)`@j?FIYenK+!9it$gY)`aKO z_}qPJa`rwYA%uwTxK;7s`@EAMRvFs5^!^Vk<0R_;PkKVtPkK_-`aYt<6Zfck?}yNF zY=Zl`QNi*X;BLVDP0>CUtXCp9E4A!4>R4`K+|6?s@4npn4^rQ<1CPsF6;}gJA@61d zGdGh*zJ>b!EnrP@{e&;-S~%}(86TOBpPYYX#CUAkx<7>J{0;X9!2MAkp66~H1~(7x zk9L?pg8R{%RAPU_{4Tubf(;0t={nD0Y&(P3jPoKnf6wWB<}}7v=w*B(7^`tTdq*%9 z=6WY$(T~P@PjqZfbd_7*AX9cUR@b4N!*P@PAijqgSmO zb%F|G-~mD>sA{OQvSOOT5tOj)0`{>gkxPWJzvb(#hB#ac|0f>6TgeGjPXCDi!}&C; z0f;3`L*VegFO~5`g3?m+R9v^5aR!(^#bEllfRd}EtFTGFa>}R^t{PNY74n0I^T6|lEgb#_FB%8nH*5orG3+14 z|K#{9*D>7WbpPc2BRoJb7A)uUYT{XE>8^Wr>#qCmRd%&pdIYeoD4$Z3;xr$xv$o9| zX!uDd=!=hD(e9m_l#~cRLGCw(@ly)A;qLH>7x#P^9^f|B@(knn*5dr6IL~?4lMl=p z#{ZGLKU2g1V4OH=%8dhv;QvUj)$;yc#%10ZG}qwvT5Yn`d2(ZoTYs|i_Uk*Vt%CW~ z{g=dO(siRW;+p*nEVHKUZCRWZuw5RJ#QN2#6Zlh6?yUJ>R6YIn=k1?#6NxtQaN z9>Bt|v*GB!!~K!ve~0@`uV7)g-TD*6qw7dY0y~1claezyRzV^Kyi%xcO)u1Wr$42O z&U#%#``!cw?*zs}s~(lkI-E~9BlFrb?*@l0Id2aCgD(@QlSm-HoX9n6_1}hzEuZhM z2b=yW|9?FGH;q6nT#v_>z_m!tekjlFllANK@%^4aBkD^Qs0X?Jt{3f9!znxA0C+A% zbw=-XyV@>!N!7Yc=Ck}B^4r!=!0OuLW9;|AA(Zyflr109BbJsXbYmqSQAHn^{^8oCR=@8s~06x%o2=je#y%S6u;I}>m zrVYrXuD&MNy}9e_S0fQ0L2CNVhtPNc*8_m{Y+ch9M6)~wyzeyqKK%X(^8hsbpW>?# zt_Q#a&^!SR-^aRjZT;-u@xI}Hc*#Em%i`HqxIch-27;hBNlTXBezUM`OtU60R*T!vuBra06q^rZM|D~p54ZO=nmfB zO+3iHggJm{-!mNd=g>I4#69m-&ixzQ*WThjxsT7hbBqTF_&;PB9syAwaBY9cGm_lC z&pZP0{rBJp;0s5z9}d9x8Rzsp?i=q>N5AR$|gOpPV-*Y z#rJ{F@4yFe;~ScH?-x4%?)^Gr<6d3${Fl1z<6rf_*W~oy#*Y}^;;B2{(3;o3C*N<& z4m&>p;{fi0C%F5wU$yhoqq^+?H36Scvv`m?gOAZMqFtQx+!0N9>>Evd>ZnGd0XPl( zKa?17?@{$cKiPwETg%Ny1awzZ{Qt_S$1Gd-l?s=Bswx2%lJ{@9)l876Cfo^@{3nF}g(*(c=n3mtRW3>T^h14n2yU+0f)Dsv-5M`g?^NB@p24MVn z_=<#r)5zspjXykO2HP$?jqRErA+-Q`!(0u6aTuNq_=MVHRi)`HW!I;FX>D*+^@%)t zrYpS!|D385=xH!kp@JE35oal{6*=0{#j4U}vkGXYm)7-GRiS^Mw>cQU_T|dQ&p*8f z^<0fOp3T9Jjo{Kd+)lr^JxUw$n1*bDPbTkvGFZQO_FHPT{9Ee4enH>=t`bH*p}0|x ztIoVn)Sl-*Z!<78;+{xoc*f1@LR=Cd`;Q2K34LKH&o}+&sDJSLp8n{ zFTl-5)#^HW(yaYj?Kd4!+l@b|{#BphN&B1n-S)F)!)31o(_i(0Y4y?X3p?$>{!`U{?M8i3Jv9(MSD)SW+~ z5BN?e-bgLOg6Gulx=+=1>Fa8XxnSqzAFAZMXH|W|W2!#!Y4rWCs@)ZM?Vk6BYEFBe zWzQ&fz@7MKy`jYZyA_KcUwZ!s(Dgr|I-_4z#hLG@&WKl3Hkuy0eV>H0zLV!DdHj-_ zd4}GGw(t({KCdmZ*SOriH*W*i3g<9st$ZmP9JUW;Y*AFoCI!>c3{>5rq+B%rS+^*Z zvITwrMsgk-9NzbOd0wNR^yAZSV<*e|Tb|$Y`yrOa5kYb*hV`Qen;wt*1L*t%p5+8y zzu?!*u@i^9xZ!8uIf0ak$?!rJZ@*fiYxj#*S@yZ9TVIy0F*Dfi9{N-$&_we6q=1 zrFohwi=0%IsJ5yS(?VI%4bTSEsHiPNsGE_+M|)` zwXLt1G_Z8QN9{iTe;vwHts+x7r5SJmIm#~1QtjroRJ(CarB+K0a|PTl&CA`q#>^+q zu!!sD2R`{j4i&uP^#8s@xRr32Zrk-&k$kzd#wMQ>HaJA=Pvi}hXbg@|Aw~=gW2yeF2jeW!SoT;D^fLM^$4B0v9G!> zudmU!^<$o1Ds{l`_$5?no1v-KpRRG62WrF(-86nve_gl(ZC69yFDIIN)PHFwowB00 zRz12%OE;3Uf_o0Zy`;ohJ$ZoN0|)Rga{u<;-{Jqra`OdDNg%JDh@O=FPD)Brv*xWi z&OYijz;;|`#yw?+y6Z%0R3{9(OTF4%sno)$_6!RPPL)5Aprv>9awt7QC!Fede%kj^hyQ9GTYL@6QGc)l%y-F4Nen z_wtPC%Q|RCj6=eoA%g$o&@&wGjc^QmSDx?VuU+dkXgrqr8u-coo3~+z8vAJed-h*T zj;^VU*t&c_I(I*P?gBM1-KW}{hRN<_05QNfp&!D zwk&dgicAx{*|WOW#fnmET6zM z%mJ7dAewor2?+OpoyF_9!~$Y5&xS?(KQCwgN}eC9Ij6=`U&pb<3kMD$%6kj{7x-`w zzJMNl0X+}%I#LVptm6OzQ7>|>q66@~#($H*BhcrA3xEfR@qfTI@qxV2@1VCL0w0BQ z{a(`n7!U9j+dIU*k@L6keN9c$0W{>Sm-HOZ?KhOr>0^0Yy`@!ZU^&Q zU%=aW-|7i=!volK*B8>w;D3fIx`B1pFix@>#tZg-AFc)1^V_lBN#+MY$)>9TIDtG% zTgF?>uREf~>wi>h_<)u-9#zuRee!gBP@X~ilri~`yrW-H!J;pOy%U^)RJsxl055=; zQ{R-g@3V{#pI2OWJcSF%`%?>0G4>UDLX$s21CUU`I0X(Mron1F{TOeQkfU$5#_<3# zmD+%`_Sb;v;d|9Fdo3Bt`4Bx<hKhYmJkq26g^*CnyciKhyjh zW;X2a$)j!`%x~D=GysCQ12BvqTR5ED`Uuw_(2qtSsV>|B z_}_HPGCt2z8Byx})1q1W9??72h5qn}pJN%twL z<5neL4pU{sbNJUjrfQb&Kj#A#U+|tvFMd;fct#B6xl!wax0HW2T=$4);DR4j#)PL- zzT{&yAlKdT2I}|Gm0?M*UYpRFT`%R#d`DIAk;%F66V+bwjT)}{QDsX%cm4iaUPE8N zjX$dW_1~+-x-ZoB+OO4O&1d)k;0JK$Pnz|__qvwn-xi*A*y*|F+*R*U?}q08q8EO2 z9yp}mwSGU(y$@N2@BbP1ey$$ZzokxVU(;C+eW#1f6L$}J`#Zjc3;13mwtu0qyT8*+ zbo`Ua=l8woBXwQ-j)vU!y#{Xn3jO{8wOaa$!~RnrhD)G_&d41Hm?P7rSH0Ye}`osD|N(O@^rpdRYvbo77ci-o&KD%Mn0wV;g2f$)CZM0>@lUD{E%vl zcvd+B_b9RJy~^wRgwlJG=kN8TvU)s8Z5z+gTI4Uv;9`nyrjBkC=Z~mHZDane@IYX9 z<~>;(sq?r+G1=tsqV(E%Z(Jnr%`j?j{9-*E7z6+aY&vc;7UW z7M9BodDkBc>(>_q=ZDDc2R+p1f$^jM6sEll>o0BWbs6uQCUXJX<@rp$-^UouaKFXx z{rsjgMw`Nc^sXNh) z{j<7$%lEehU$^45Vg43;Ukla?=bOxz+Qyuzj6D-sp2XNSm2qo|r!4H51*QstTf$*@ zKN5!f{{s70asW;XP{{#A#?&^A;D5_8TKzz@w;I0z{LlB8=U4>)$KYijpOmJGCJj}q z6l@2EOsfK4kVk$uH=y#ibP+UxNZA<)9M) zubLL#^0Gfy!=)KopQAy1r&Lhuba@%p_ zlZ`)V0ru%uZpPbKCt<%Ol3#Uw*U0(1+&sDn58nQs zG>=-GT3csr8>pF2kJ9)@hN#08%@}X;UM7LJf6uep>FljzG-=CVjl1?ll?=&Li!(~K zc=rWb{KzbPJTKC?f#%^5Z`6e(k*BYEWmAnpBKa$JXbl70bIDlq~~u_gJD-vF9cVTGg2*wf%jA3va1in+w2@Qow!x`BQ`2;!UJl*@HN%! zIg5QqFAy}1J--+2hUpr7)mv%$+WXaP@N8b^f}`Te!^1~K@ITo9zl{Iktz2&|ey{cM z%SyxVE;dIQ$+f_bwaAt8pN_@T5B!`OTN{q98nyPdlo%}Ff0yEpSxg{J8EN_9|H1M6 zLS+8`6#sMnjBhhNhMh~hZd@2Qz;`G5i`1-msQR_MSbZ8TRNJESRW*jO0`~;-Dljg? zybFBjJd)uoY9utr+rPDH;NKsFH?(_EgadH882(pQ17N-Y)|b+$B_~Ia5fI&0>F+5{}-uc|`7CH{VbZ1t77U2N=9<*$509Fg&rxqaKL0@-_19*^i zALli`fPQKLqMk+j{{q+N=veUXhXe3>-vr;k?RWrh47qNL06GAx1@L@A9B|=- z2Qcg(!V@5fCcx|YRM9D)DY52PN^JNgxbjwWYJbqAX-}+VS-uy*3ga2<~oO9bJ z_yv;hzY`7sDS@`~`bNe`*IO_K+Ja}mO13eVeuA^9i9DZ}N{-|7J-=ww6Jaet*RAAS zuKry0mw%&fVEew*VOniK{gp@L8T!0D171+#`27lve~tc3M^t;o_o_)$UHr9D@pdYi zC&irdIy!&{|)UH_GwfYjzb_pF9G%-!uT0_c#1+bpTNf@#t%_isN{-!~228OI*(1Y5+_RU_3w+ zd_Y1wwhQ(*9>8+{rU8iUuu6Vv0D|q8E7SpRf%fQK;Q&ncpVD=W5<9I@diSf9+5IY| zv|mC#agnOFpRJ;HjGfU4nfBPvGv^=t{|~|yTc-8*kZu@Ls#{~qdqZ6QJASRFX zQhU>jk6Po>(-l+YBv)HtpSAC?{(R;|m{c;6eV`_xa11^8hB>YxRBH@lD8|japIU#i ze1+_5;b_GaPe9i|UO$ICX+B&>?id9M&H^V+V2m~m?&Dm=)SAn7W+|@x3e_HXw=#O* zB}XlJYR}u{wEY$9RDargsxyup^(CL{gcU!j-Mj;8a^ZVwFzY?_T1!9J39l>VG@gmv z(=$$gMeSDpsIJ!^RfEg+tDM|@#e&b({PII!?C&&i+iz;I{A2ar@+1C!zp2TpPh50D zTh?{cQT3tLtUX*nZ9d!O#v^LK{yX*D^ovfo6+PNk^6fl#M%??GhVS}GXFl+&Ci9G% zu!medn*V7JG|6bSdj9kz1B`+M(a=dRQJ@geAf4|1v z|Fwp0dtVF87vObz;!?-o`11GEc-bfFj7VVQ{&|LZ>11Tg=AbNG>(T=cFyT^S=cxk?#> zAHuWm73G}ztkO?)`#nB(J1WvtxW0>0aVWq&Wr*(c)!|7zeRzXJK%d*mdksYw{h)mrKiJPXhiN)5)qxV1FiTDyvyJL;x?i6zJW0| z{yTwie&6p0>-+FXBEtH}Fy=Skq)0B`u)g)^bKzYD&R)TLX!tzK2=niwcFtjZ!};L| zYy88QKj4|q`05hgn@h}Lyafm4nZ+{n{^aV|D(X(^#MX8@NBf zc+kB3W5^Aer(e+9oB1B>UpJimKTLVi zCo2!Ve})@_mN33Fe`_1lT1~9!VJ&Ayj*YSNUk2mzWA(SkuVbIFaXH~M*Gz4kZo1<1 zw7N=5FJb&ZPL%J7@z!FTToW#!3a=9x=ch4_OjK%ao=TfGRALT3>50)w$p@d*%u>^? z&DFd+t-RSTqs8xnzHg3y1r`{z*h4%M3%Aw|fkHu=P8LE%d6O4aYPK9w5c%>imrd z$nF-<^xeZWV)p;tXaWGtOrc*aA!0JZ&cR5$rE!nSSGe6LR zsn04uxv#sg$h@8VNI1PcnvMYLTWhRYUknn4aSIJbNVf|GT#S_?&wr_wRZJ zg875d>0GDy9VAdw6EH0Vx^}R2T5JQnBFi~$RlxRWZ^-?JqH1vOC{Q|DUgHal2eICO z$7=m6v3_J&yZ=JvF*l707~H)5QuvNEj&-~@!1Ws<@6UTy zyI~vv+JweMLo~X_HR@XXYPGI@8JM^&$BEvbV0Yu>j4OzRN6Alato-=asvhi$Ua2Mb zQ}YnbbT~f&ZY7>$X*_`QJLET6y^Q%a{8iX`)>AN^x}!vI8akW|yaMxFt$^{Kb`LZz zAl0ACJ(4;CmYFv|49C&%ztskqk4d5zA3*TG`J^UrzfCaQ@1i-s-R{S2*j79C4gU#v zfEaTB0oIEl;<#6vKR}Yh|MUyw{+#IT!}5N_No;2b-!X#Ek#FHy5W?@p!hBz1-~^&8 zIe-|a8M9}~1)P_QIA-%42N3WrVSjm6`N$pnud00JQMcyb$bSsq8*~8S-T-%U&7cMF zlIQSJ58!_k-T&jP{}g!tS*}rZDjsmJ_a)*L^1pAv3y}AZ;`wgj2gmz9;=Kq55at1* z(E-GGzu|iOo^$dY`lK%uoAtGF%75fJ{+3eOeWUzSj;LVFA=RAxnHn$tMJZ#RRqqww zXd2_9)r?Wrldqru$PdmBVC~*Ry6KIdwd&==TKM#rn*Hbjt$dRn!*BqrS-u$#U?aW% zj0f1p_~%wQ0K@;r4czd~QLSU0Z7jPM9^lG-(!4i*)p;+{7x@jwJbMnS`z;4tAEhym z()Vxc5!Y|I;aci4$?J5-j|n>=m8|+f)farF{6*i;EAX%yUn|wQ{D^YF_2vaovg~Kq z8=%T`Y9jhS4hL|rg8krCdORp^`<+TV;UN_c-K)e-Rpa0DN_m4pY2mjsl|MoHcyZwqR|9ATrS?}+rf5!i@mghkm z>50u%*V7lP-vxK8?bO|BHgT7#oj`x`wwJ4P$R-u_U#Dt4srhMiE_v-U@IIU4@PBf> zX-@xd*guiFf2;jBt-RCCgRQOSUo1KH5ZZdf|JDc4!qo(%^S@7H9F#f0VgE>NK%8N3 z!|QMYZa%fIdusF^v1s2pIlPtxatKdHw)ifLV2Up1}v0r+-Wp zxCqnvQ^#+03AS&xkCFKhIe+K1Wcx#JZTl_pWs@BC_vDV````)k$Fra8S9N}0IXRZ1 zvz68YezW3IrMATH4}De56Yf@<$#1K4%u6a7^{m>@{anQpURCDcN7Vd+kJb8;gUT8C zh+5D4M19vBQ6J*O8>#cU{CkB?dqzoTyaLAyPk!>_Du*Aad&&E*hTrP=J6}f~KYFl! z)bkG}SKoizkLrHoR~l%wW$O;A+t#044j=n^^=DbbH6N?ruHQ859{l@uQIkeJ*(mV! zhzEbw_&xB`Pbr>AzcXS@+T3 z{cZ)*=mkJ{V$n7x-+?Z1Gg|(e7{^er5x}oM3Lm5>8~dPzqz_+AWgNr!4)3pFoV7X} zVE$Ml?AdRa-*PGD-?zkt<@SHC>0iP;JieEnJ|4zio{M=s$HgB!{VQ?5jn~Y-$$2}Q z#-DLqz%!QV=>(b=#(L4-k!)u;^VHaQ@Zs&yXMTqMh+}XWEIWjVZ0Bza?Qf zA3eFZF=Nz*jOj{Q#@IBfg;JwBs37Ge6(*mmlJqfZQgxzQ*Br0fsXeH#t<6}IF|XIK z6*^hQ#TLi#{qb1;ujY@(|2FS9fON*N;jq_+|3jf_s#Uj*8n^AQg1Yp~PHD_ovkvz( zYUl&T0f4(~Y!REJeENphX;_AiKTVlyw$+g-Kn zGKb@n;a(G?@w{hTP*62X2S0pSpMU(C?zv+#=iZ}rZG?`*Xh-Q4v;FnbN_i9E+_-~WL3|BLwl zcpkv!4gcG-tZmNNEI6G&!ltA%~rtN{v7HXX`Hz>0fAd2kzW) ztm4s*G%K2_Nf@UNXoGJS*S={g4F5+WjQb7$ha-ahZF)TZw{u~B1Xd#wiZgC18+_75 z?Pu-6$9oRPA)uh5rG^ z!ZZ*60{2JWbGSc(|C#U^i#6|GTu))dZXOV+iT4)8xY{aDUzJjXf5-$XT|hp27gg(^zMhuD56_b$W#5uER8 zY3!WCL6~0VuLExZv;c-<}}?*~2TF?j|!e^;Id_Dpa+UL6O(xX5F*0Ok`jgZl~GvTt^n1Mtmf z8JckF00Mrr;(qeLK6=}F*D=2VoPWb{9Kd$Y!yO#&T}*lA`tRe~dae$tJ+ zUPVr15!<@t&7aT!e6I@`H;sDeFg=vM(~vvyG-50^_+G>F`_=5aZ`FFs&!TmZ+QCb- z*o1HMx}$2sc(BdQQfM;2f9Q(}OnA-dI5W@v42{4Z@<89J-SVS~9*R%Vln)f_{g{01 z?~T>RqW|V{-1z!QCax9R9c3Q(I;=0G96$Hd*elzfBGQM>oFW z5BT4-{*f@uZ*~911^AmR!ONe|g8R+?FP_|gVwW{a>bh20eXn=e-#7rn{}CP_x%*nB z^;qNZe@3TE9S4xnei6N{FQHG;S=@psdIw~fF1Tx7X@K9-1V z$Ci7@A!V1e)rh&9)PL^1Djj~4nvC12yk4u7-DRa(jlUcJ^NrLJU5E$zETuNPKm}cv zsD6JqKlp&?TH{>)-?Z}Hs>5AG`u};TtvB3n_}_B=)(6n=zwrXLJkk%qJOOOpIDp79 z;{Z(a?@8<9>h}|B8-GAuav}JoAY9XLxIelI{r~XzPsqpjs>)y&(f9!*7K~6PeFvoI>N4kHd!6P3H+N7tc zwSV$goyqIraNcKw&(C=djoMzg>X*WO_?EnK)Oq+_$@6Re3%_a^&&9PoyEeQ>z-v=J zr&$lU~GGjTxD24LI+cmzIlglF9k>I($h zr5cl8R`8_V=>4}TwI5vfsW0Huw^s#&URLf2@ZKFBQ>{VoD80*GbZ`&T-xmDeh@5}< z1Nf9b$T_@2p&Iwfp9z*vx}9eY8i3gCB6)F?}xF!<@kf- zlwv&%i3WVWjBzvLd{1qn4pGV&wz={Xd#R$za5c>zrH1)~ltWH!%GM+RHl?issWh_Zf zK9r!${Hm&1zgSs?c?wbQ?{F%*doO-*rH$)V;(zk#__P}yHq0NvGLhVWgafeY@%Ybj z`-c6a0?F_~;1lqI>GM0aZliZ!ds&;Vfd}$=oUVWGqr3IVzL(UhVJXLvaRJ+k^7*uD z+Xj90(JOlX(fgDc2X;pvf9B}ZwCk?z>f4ud6d&Vs18rI~N8cT;AFwfm;b`*%FnsDT zl;yeM84MH0$NH5B=8lJFi09s)5XEcw0Otn?7LJ7jIF>60>!ueaX~K%Zx^VmHy70C$ zl-@Gnj#F|LxRaiL%}y!N+y}<${Kp1s^3IMr^TsCH`0_NZ*giqo)%i}2XB^l+f!=^Y z=B>s*K92f(o;5)~@A3V{Ma25U`~3$F!0`CLhzRbFObz!ZqOG@aS)=+Tdhfu~T5>ho zv^<`3=oZXJ(elvofpn#Xtj-$D7!}UX8wX(gNJJ0dBj0VFlvaanQ}dp1xQ}BJ$^S>r z_g~@v2nS%-i=7ACw;(xf57%c}lVK`34R7wAJVVHh6`uEknqBd}3eV!6L`{v$_s2C? z_tTdtp|A_DGr&o3SN<&J6}3^FHm0X5;hLrf-}EK;GMXO6u1}k{Wu`rGwFuyT!_{HT z|HpiP1b6>o8qwrar*HoKrs+?{Bj516m;aAp`@AH)=ive4sOL$EE#sIPr(xVyBIh($ z>4|kXMreIv!ua2==RbVM-*5quK7cm;eV@_jvrmqz;kQJ%4CncW?%(je>oE|h!8DtF z%s}UE`F#FE-YCbzm<}KS2hh9KVvX#1s~Y8AOg&OxjuEv&#>+Xr$M}mxW%9ckCY+=C z!A0s&xQ^GRu>hB&voKvjiXWZK-(vpbxqt*PIbH$mPXzxbvVVzS|Gd;z)JQaN`@W1u-OhCVs;4P(|sv#U}%VYRIDS);g{BJpa)A^_PJ8({{ z{;E0qYS`cU526)t9Dw-%bf~e-&2qGtzwc7 z!HZEV5JE?gzfakNzEhR64!V9wRnLB3853Vs`TYH=I^|LIxbh9ny6ceEqi@^^cE1^2 zzoxP;|wXYpG{wB&8L0LD|ZUObAv@>h*Az2$CtFOl;Y!q}(Vw!`Xn`w_Lc>3io3 z*kUVs%~e0C#^v9sf-zzBg-7HWvrnGUuPZclzY?Z{|A*oWvi1j&3Q-66g1~6&3H=)V zjKKd*H&PQoFQXFj{rCVRG(ppk7hp{3GR0S*HLM2~Z%*AJKGeqcLC9)R4s`R5t- zHy;4Yu^Zlxszy(~@=3Cszi9ys``f&60+!#mn*Rv)w|VFPhi2b=0&Ka}1vr0xJo>FZ z!0G{4L*Dcwf`4A|Fh12?l+Bl_(zT7dxzcmqdKntNck5(OHIOi8g<{Vn(`R@ zz&%WP_Kn;9n@-z_X8_N_5n%t$YYr*@9B>fFsOe>2D1RzFd}h6^!YQvPf6~jYrr*;6 zU4FZ*${O&b^7=fhl2hRGdpxh)ZZ9aO3(@%{B{hGF8n=h&N%^#5iXP;;qqaZmZgQ48 z7!&aM5c&HUi#yQ_G9HOyxo^9RKwu|hk?o96wlTJ}eny)aSKP+<6@4|D#%SLb#ymHn zx23ip>~FaatMB)s^>=!Iu)ozq2EE{ZbdllwepuHZLfan>!~DnNe#`Y6?q9&TYd&!a zuP=5}o41^QknvUst$(-(;J~x)vr}G+a%Y)X2Fx+oryYLu~ zoKK~%pXvQA=Wo7#hWo9K)U>3A{cUV%Iiw)t$Z$Rh+)uvWuz$#BSha|;WKD8Wb(9ia zN{wk5W6ZjYam(>kYf8SVoX?>RX8i4Zw!r*``@{G@DV)FiGq(S4ytdlg2!~+$ZPP-# zU_9@M%1}!67D}w%M&<2>s9}e}icT!z9K#c!zqXoaPcTY(g;iD3s9aTQR#$3XhBB&U zs~GH&b9d*SdToXh2Rj>payXwKaGZuR>} zCA|LbR^!p@6yM-9WwwBq&T7nO$RmTL?SB&t7|y0{gzY$g3C^#13%c5Vv??|=e@DZ< zhM^sw0e<$OJ2_tC@ACW+9M10z_o!f-wq3&d+{JopaC~YhEuoy>Sj2T!l_*e7TnF;e z^r8ckW+gR(-^pivH1475)TtD4jKRxr6Q*~u{D0*C@^3kS2={Q@G=lyAjQ`DJ!?cP~ z!7Qaz>!@a(sZmeus?3}&>|+l5gARgY6AkZWT!DEKnrGf=18&m5R$Ejh8ebw0-k^s6 z;SsE#V~F2eE2*>U$DOZ=s1+)US*?oHdHhG~@>%-+f&0_I|2DPwmplM^0rLQ~-hdGv zz-pGV@k!{>ezH2YnWVDffl7+6&;2nE>`$)Wn~heVdV@;*ANE(I4Bf ze{-j~G7ccz6R;KgW1Ng}0jANi`*eNo<;K@GWxgf*(T?{zGv9^#Ioc!c`TvW(_YRYy z?6$tUduDoafMLjCV8}V=43e`1!2k$?AXz{_K$0L51j$H_0*ZnOQ9(omB&irMq9TY2 ziX_SF`|Z1@aYT4{&iUSRp7*+5|Jc{vT~%FOT~%H8UVE>-wmtg;F@W}r)B;?O0T?ID z<_nuYdSb=_7{GB3#)k2FB=^W@UNcX@0dV~Qywf?KGkHEy2LK1aY1?|1aV=J}9X$b< zPkorz!#qnIz~kZo%*&oF*gM!Rj2M9DBaHmN_bX!U-#YHUHo=b7r(7(+6G99i(-Cy(E-F{|)5_HITNNF1Uin9(yFcla%1r)2 zHK!iZfLDIgQ@hV<>8Izl@{0?awfBUUf!k-{EA;~V-?{cPHC_1`S|=CCU3{dLv)<0{*w2fh%}Fz->PG*gF4SEWE^xe69?gi4)W!r%`GidMwk)O-)i%nR&`wYqcWL0t_t%#wP|4Q-M4M zngEgI=P+{JO3)(^{BJz~tOmez0B*$pR_AYh{>-cvz(%M2Pdvb|zvch^aHae;X9n

yrTeI~ffKART*TYo7JIT-U# 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

diff --git a/html/src/lib/components/Panel.svelte b/html/src/lib/components/Panel.svelte new file mode 100644 index 0000000..bd94ba7 --- /dev/null +++ b/html/src/lib/components/Panel.svelte @@ -0,0 +1,42 @@ + + + +
+
+ Ingredients for Codejam: +
    +
  • + sugar +
  • +
  • + code +
  • +
+
+ +
+
+ toast with jam and code on it +
\ No newline at end of file diff --git a/html/src/lib/components/SubProfile.svelte b/html/src/lib/components/SubProfile.svelte new file mode 100644 index 0000000..2bfc079 --- /dev/null +++ b/html/src/lib/components/SubProfile.svelte @@ -0,0 +1,7 @@ + +
+ +
\ No newline at end of file diff --git a/html/src/lib/pages/HomePage.svelte b/html/src/lib/pages/HomePage.svelte index e4b232a..6ad8a33 100644 --- a/html/src/lib/pages/HomePage.svelte +++ b/html/src/lib/pages/HomePage.svelte @@ -1,10 +1,47 @@ + + +
+ + + + + + + +
+
+ + +
+
+ + + +
+ +
-

Home Page

- +
\ No newline at end of file diff --git a/html/src/lib/stores.js b/html/src/lib/stores.js index 390bd08..b3f64c9 100644 --- a/html/src/lib/stores.js +++ b/html/src/lib/stores.js @@ -1,3 +1,4 @@ import { writable } from 'svelte/store'; -export const activeContent = writable(''); \ No newline at end of file +export const activeContent = writable(''); +export const loggedIn = writable(false); \ No newline at end of file diff --git a/html/src/routes.ts b/html/src/routes.ts index e3e175a..b3981d4 100644 --- a/html/src/routes.ts +++ b/html/src/routes.ts @@ -1,5 +1,7 @@ import HomePage from "./lib/pages/HomePage.svelte"; +import Profile from "./lib/pages/Profile.svelte"; export default { '/': HomePage, + '/profile': Profile, } \ No newline at end of file diff --git a/html/src/styles/styles.css b/html/src/styles/styles.css index 928b609..ecc5dad 100644 --- a/html/src/styles/styles.css +++ b/html/src/styles/styles.css @@ -3,6 +3,7 @@ */ *, *::before, *::after { box-sizing: border-box; +scroll-behavior: smooth; } /* 2. Remove default margin @@ -59,6 +60,7 @@ isolation: isolate; --background-gradient: pink; --card-color: #ece8d8cd; --card-font-color: #2a2e5d; + --gradient-background: linear-gradient(90deg, rgb(203, 164, 122) 0%, rgb(170, 121, 154) 100%); } body { color: white; @@ -68,8 +70,9 @@ body { font-weight: 400; font-style: normal; color: var(--primary-color); - background: rgb(190,138,110); - background: linear-gradient(90deg, rgba(190,138,110,1) 0%, rgba(190,110,178,1) 100%); + background: var(--gradient-background); + /* background: rgb(190,138,110); + background: linear-gradient(90deg, rgb(203, 164, 122) 0%, rgb(170, 121, 154) 100%); */ } a { color: white; @@ -79,7 +82,7 @@ a { a:hover { color: black; } - .flex { +.flex { display: flex; } .row { @@ -102,6 +105,19 @@ a:hover { background-color: var(--card-color); margin-bottom: 2rem; } +.card { + padding: 3rem 5rem; + color: black; + border-radius: 50px; + margin-left: 3rem; + margin-right: 3rem; + font-size: 1rem; + text-align: left; + border-radius: 50px; + background: #e0e0e0; + box-shadow: -5px 5px 20 #7d7d7d, + 5px -5px 20 #ffffff; +} .banner { position: fixed; z-index: 1; @@ -137,4 +153,4 @@ a:hover { } .center { justify-content: center; -} \ No newline at end of file +} From 04ba734dd9ee71100471fcca39aa3b0d0a400fc8 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Mon, 22 Apr 2024 02:31:00 -0700 Subject: [PATCH 007/155] change app width from 1280 to 100 percent --- html/src/app.pcss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/src/app.pcss b/html/src/app.pcss index 000c0a5..1fe7edc 100644 --- a/html/src/app.pcss +++ b/html/src/app.pcss @@ -43,7 +43,7 @@ h1 { } #app { - max-width: 1280px; + max-width: 100%; margin: 0 auto; padding: 2rem; } From bfa69dfdb03f064afd9513943783ebb9ba0fd146 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Mon, 22 Apr 2024 02:33:23 -0700 Subject: [PATCH 008/155] if-else logic for whats viewed when logged in vs not --- html/src/lib/components/Content.svelte | 42 ++++---- html/src/lib/components/Nav.svelte | 125 ++++++++++++++++++---- html/src/lib/components/Panel.svelte | 5 +- html/src/lib/components/SubProfile.svelte | 10 +- html/src/lib/pages/HomePage.svelte | 66 ++++++------ html/src/lib/stores.js | 2 +- 6 files changed, 165 insertions(+), 85 deletions(-) diff --git a/html/src/lib/components/Content.svelte b/html/src/lib/components/Content.svelte index 51c27e2..f8b92a5 100644 --- a/html/src/lib/components/Content.svelte +++ b/html/src/lib/components/Content.svelte @@ -3,21 +3,19 @@ import TextGoals from "./Info/TextGoals.svelte"; import TextTimeline from "./Info/TextTimeline.svelte"; import TextRules from "./Info/TextRules.svelte"; import { activeContent, loggedIn } from "../stores"; - import SubProfile from "./SubProfile.svelte"; +import SubProfile from "./SubProfile.svelte"; @@ -25,19 +23,17 @@ import { activeContent, loggedIn } from "../stores";
-
- - -
-
-
- - + {#if $loggedIn} + +
+ + {:else} - +
+
+
+ {/if} + +
diff --git a/html/src/lib/components/Nav.svelte b/html/src/lib/components/Nav.svelte index c8af600..6b732ed 100644 --- a/html/src/lib/components/Nav.svelte +++ b/html/src/lib/components/Nav.svelte @@ -1,32 +1,117 @@ -
  • setActiveContent('goals')}>Goal
  • -
  • setActiveContent('timeline')}>Timeline
  • -
  • setActiveContent('rules')}>Rules
  • -
  • setActiveContent('profile')}>Profile
  • + +

    + replace this text with goals content +

    +

    + The European Union’s General Data Protection Regulation (G.D.P.R.) goes into effect on May 25 + and is meant to ensure a common set of data rights in the European Union. It requires + organizations to notify users as soon as possible of high-risk data breaches that could + personally affect them. +

    + + + +
    + +

    + With less than a month to go before the European Union enacts new consumer privacy laws for its + citizens, companies around the world are updating their terms of service agreements to comply. +

    +

    + The European Union’s General Data Protection Regulation (G.D.P.R.) goes into effect on May 25 + and is meant to ensure a common set of data rights in the European Union. It requires + organizations to notify users as soon as possible of high-risk data breaches that could + personally affect them. +

    + + + +
    - - - + +

    + With less than a month to go before the European Union enacts new consumer privacy laws for its + citizens, companies around the world are updating their terms of service agreements to comply. +

    +

    + The European Union’s General Data Protection Regulation (G.D.P.R.) goes into effect on May 25 + and is meant to ensure a common set of data rights in the European Union. It requires + organizations to notify users as soon as possible of high-risk data breaches that could + personally affect them. +

    + + + +
    diff --git a/html/src/lib/components/Panel.svelte b/html/src/lib/components/Panel.svelte index bd94ba7..e6b963e 100644 --- a/html/src/lib/components/Panel.svelte +++ b/html/src/lib/components/Panel.svelte @@ -34,9 +34,6 @@ code -
    - -
    toast with jam and code on it - \ No newline at end of file + diff --git a/html/src/lib/components/SubProfile.svelte b/html/src/lib/components/SubProfile.svelte index 2bfc079..88b57dc 100644 --- a/html/src/lib/components/SubProfile.svelte +++ b/html/src/lib/components/SubProfile.svelte @@ -1,7 +1,9 @@ -
    - +
    +

    Profile/

    +

    In order to participate in the codejam, first step is to join a team. You can scroll through teams on the right, or you can create a new team.

    +
    \ No newline at end of file diff --git a/html/src/lib/pages/HomePage.svelte b/html/src/lib/pages/HomePage.svelte index 6ad8a33..8cf37b3 100644 --- a/html/src/lib/pages/HomePage.svelte +++ b/html/src/lib/pages/HomePage.svelte @@ -1,25 +1,20 @@ -
    - - - - + - + + -
    -
    - - -
    -
    - - - -
    - -
    - +
    +
    + + + {#if !$loggedIn} + + + {/if} +
    +
    + + +
    +
    +
    -
    \ No newline at end of file + diff --git a/html/src/lib/stores.js b/html/src/lib/stores.js index b3f64c9..7793612 100644 --- a/html/src/lib/stores.js +++ b/html/src/lib/stores.js @@ -1,4 +1,4 @@ import { writable } from 'svelte/store'; export const activeContent = writable(''); -export const loggedIn = writable(false); \ No newline at end of file +export const loggedIn = writable(true); \ No newline at end of file From 3905750fb0c0fdb9be0e0211f209463b14af3e53 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Wed, 24 Apr 2024 18:40:24 -0700 Subject: [PATCH 009/155] added derived loggedInStore --- html/src/lib/stores/stores.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/html/src/lib/stores/stores.ts b/html/src/lib/stores/stores.ts index 23279bd..01a2d23 100644 --- a/html/src/lib/stores/stores.ts +++ b/html/src/lib/stores/stores.ts @@ -1,5 +1,6 @@ import {writable, derived} from 'svelte/store'; +export const activeContent = writable(''); export const userStore = writable(null); export const loggedInStore = derived(userStore, (userData) => userData != null); \ No newline at end of file From 51cd3ba7a029325eb970eb66dfca91c9064fdc16 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Wed, 24 Apr 2024 18:41:03 -0700 Subject: [PATCH 010/155] fixed homepage merge --- html/src/lib/pages/HomePage.svelte | 50 ++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/html/src/lib/pages/HomePage.svelte b/html/src/lib/pages/HomePage.svelte index a6ea2c3..6c5d634 100644 --- a/html/src/lib/pages/HomePage.svelte +++ b/html/src/lib/pages/HomePage.svelte @@ -1,27 +1,32 @@ @@ -41,11 +46,24 @@
    + + {#if !loggedIn} + + {:else} + {$userStore?.DisplayName} + + + {/if} + - {#if !$loggedIn} + - {/if} +
    From a5783f508f65aebdb60a1e930ea6e3ab803d365e Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Wed, 24 Apr 2024 19:00:41 -0700 Subject: [PATCH 011/155] updated loggedInStore store --- html/src/lib/components/Content.svelte | 9 ++++++--- html/src/lib/components/Nav.svelte | 16 ++++++---------- html/src/lib/components/SubProfile.svelte | 11 +++++++++-- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/html/src/lib/components/Content.svelte b/html/src/lib/components/Content.svelte index f8b92a5..39abe40 100644 --- a/html/src/lib/components/Content.svelte +++ b/html/src/lib/components/Content.svelte @@ -1,9 +1,12 @@ - @@ -23,7 +26,7 @@ import SubProfile from "./SubProfile.svelte";
    - {#if $loggedIn} + {#if loggedInStore}
    diff --git a/html/src/lib/components/Nav.svelte b/html/src/lib/components/Nav.svelte index 6b732ed..a710f38 100644 --- a/html/src/lib/components/Nav.svelte +++ b/html/src/lib/components/Nav.svelte @@ -1,23 +1,24 @@
    - toast with jam and code on it + toast with jam and code on it
    diff --git a/html/static/pinktoasttransparent.webp b/html/static/pinktoasttransparent.webp new file mode 100644 index 0000000000000000000000000000000000000000..224fe870c9f99b739146f671fc04345a11b8936f GIT binary patch literal 48356 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 QI Date: Tue, 11 Jun 2024 16:33:36 -0700 Subject: [PATCH 067/155] creating a team now inserts into team_members table and creates owner --- backend/app/database/teams.go | 48 +++++++++++++++++++++----------- backend/app/server/teams.go | 14 ++++++---- html/src/lib/models/team.ts | 2 -- html/src/lib/pages/MyTeam.svelte | 27 ++++++++++-------- 4 files changed, 55 insertions(+), 36 deletions(-) diff --git a/backend/app/database/teams.go b/backend/app/database/teams.go index 025a02c..475edfc 100644 --- a/backend/app/database/teams.go +++ b/backend/app/database/teams.go @@ -1,6 +1,7 @@ package database import ( + "fmt" "github.com/jackc/pgx/v5/pgtype" ) @@ -16,18 +17,24 @@ type DBTeam struct { CreatedOn pgtype.Timestamp `db:"created_on" json:"createdOn-hidden"` } +type CreateTeamMember struct { + UserId pgtype.UUID `db:"user_id"` + TeamId pgtype.UUID `db:"team_id"` + TeamRole string `db:"team_role"` +} + // has all the user info & role to pass to be read client-side type DBTeamMemberInfo struct { DBUser // embed the DBUser fields into the struct - Role string `db:"role"` + TeamRole string `db:"team_role"` } // For team_member table. type DBTeamMember struct { Id pgtype.UUID `db:"id"` TeamId pgtype.UUID `db:"team_id"` - userId pgtype.UUID `db:"user_id"` - Role string `db:"role"` + UserId pgtype.UUID `db:"user_id"` + TeamRole string `db:"team_role"` CreatedOn pgtype.Timestamp `db:"created_on" json:"createdOn-hidden"` } @@ -43,7 +50,7 @@ func CreateTeam(team DBTeam) (pgtype.UUID, error) { return team.Id, err } -// stepp 5: api get team info +// stepp 5: used to construct the GetTeamResponse struct func GetTeam(teamId pgtype.UUID) (DBTeam, error) { team, err := GetRow[DBTeam]( `SELECT @@ -87,24 +94,31 @@ func UpdateTeam(team DBTeam) (DBTeam, error) { return event, err } -func AddTeamMember(userId pgtype.UUID, teamUUID pgtype.UUID) (error) { - - // _, err := GetRow[DBTeamMember]( - // `INSERT userID, INTO team_members - - // ` - // ) - return nil +// fields: userid, teamid, role +// called at server/teams.go createTeam & when someone clicks "join team" +// DONT MESS WITH BELOW. IT WORKS. +func AddTeamMember(userId pgtype.UUID, teamUUID pgtype.UUID, role string) (userID pgtype.UUID, err error) { + fmt.Println("=== line 100 userId", userId) + teamMember, err := GetRow[CreateTeamMember]( + `INSERT INTO team_members + (user_id, team_id, role) + VALUES ($1, $2, $3) + RETURNING user_id, team_id, role`, userId, teamUUID, role) + return teamMember.UserId, err } func GetMembersByTeamId(teamId pgtype.UUID) (*[]DBTeamMemberInfo, error) { + + // In Go, you never return slice-data. + // Having * in sig means I'm returning the slice-header, which means I need & in my return + // Not having * means I'm returning a small copy of the slice-header, no need for & in my return members, err := GetRows[DBTeamMemberInfo]( // select all the info of a user (a user row) and their tm.role () - `SELECT u.*, tm.role - FROM team_members tm - INNER JOIN users u on (u.id = tm.user_id) - WHERE tm.team_id = $1`, + `SELECT u.*, tm.role as team_role + FROM team_members tm + INNER JOIN users u on (u.id = tm.user_id) + WHERE tm.team_id = $1`, teamId) + fmt.Println("\n============== line 121 database:\n", members) return &members, err - } \ No newline at end of file diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index 483577a..4c693fa 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -38,7 +38,8 @@ func (server *Server) GetAllTeams(ctx *gin.Context) { } } -// stepp 4: GET team info +// stepp 4: GET team info +// purpose is to construct the DBTeamMemberInfo func (server *Server) GetTeamInfo(ctx *gin.Context) { id := convert.StringToUUID(ctx.Param("id")) @@ -73,8 +74,6 @@ func (server *Server) GetTeamInfo(ctx *gin.Context) { teamResponse.Event = &event teamResponse.Members = members - fmt.Println("LINE 75========server/teams/getteammembers== TEAMM MEMBERS:", teamResponse.Members) - ctx.JSON(http.StatusOK, teamResponse) } @@ -90,6 +89,7 @@ func (server *Server) CreateTeam(ctx *gin.Context) { var team database.DBTeam var teamReq CreateTeamRequest + // var tempMember CreateTeamMember // shouldbindJSON binds the POST-req-JSON-info to the provided structure in () // err should be (ctx feature) @@ -119,7 +119,11 @@ func (server *Server) CreateTeam(ctx *gin.Context) { return } // PART 2/2 DONE - err = database.AddTeamMember(convert.StringToUUID(strUserId), teamUUID) + // construct TeamMember + // tempMember.Role = "owner" + // tempMember.TeamId = teamUUID + // tempMember.UserID = convert.StringToUUID(strUserId) + _, err = database.AddTeamMember(convert.StringToUUID(strUserId), teamUUID, "owner") if err == nil { fmt.Println("Successfully added team member") @@ -160,10 +164,10 @@ func (server *Server) UpdateTeam(ctx *gin.Context) { func (server *Server) SetupTeamRoutes() { group := server.Gin.Group("/team") { + group.POST("/", server.CreateTeam) group.GET("/", server.GetAllTeams) group.GET("/:id", server.GetTeamInfo) // group.PUT("/:id", server.UpdateTeam) // Step 3: Post Team Data API - group.POST("/", server.CreateTeam) } } diff --git a/html/src/lib/models/team.ts b/html/src/lib/models/team.ts index 8c33c2c..389dbe4 100644 --- a/html/src/lib/models/team.ts +++ b/html/src/lib/models/team.ts @@ -9,7 +9,6 @@ class CodeJamTeam { Technologies: string; Availability: string; Description: string; - Members: TeamMember[]; constructor() { this.Id = ''; @@ -19,7 +18,6 @@ class CodeJamTeam { this.Technologies = ''; this.Availability = ''; this.Description = ''; - this.Members = []; } } diff --git a/html/src/lib/pages/MyTeam.svelte b/html/src/lib/pages/MyTeam.svelte index 845126b..1ad1e73 100644 --- a/html/src/lib/pages/MyTeam.svelte +++ b/html/src/lib/pages/MyTeam.svelte @@ -6,21 +6,28 @@ import {getTeam} from "../services/services" import { Label, Input } from "flowbite-svelte"; import type TeamMember from "../models/TeamMember"; + import CodeJamEvent from "../models/event"; export let params: any; // set by svelte-spa-router let teamData: CodeJamTeam | null = null; - let teamMembers: TeamMember | null = null; + let teamMembers: TeamMember | Array; + let teamEvent: CodeJamEvent | null = null; console.log("params: ", params) + + // getTeam here returns an Object with {Team (CodeJamTeam), Event, Members(TeamMember)} + // Am I getting Members and Events info from GEtTeamInfo or from... + async function loadData(id: string) { getTeam(params.id).then((response: any) => { console.log("line 17print: ", params.id, "== response: ", response) response.json().then((data: any) => { - console.log("line 19 data: ", data) + console.log(data) teamData = data.Team as CodeJamTeam; - console.log(teamData) - teamMembers = data[2] as TeamMember + teamMembers = data.Members + console.log("team members:", teamMembers) + teamEvent = data.Event as CodeJamEvent }); }); } @@ -36,15 +43,15 @@ hi {#if teamData !== null} - + {teamEvent?.Title}
    Team {teamData.Name}
    Team Members:
      - + {#each teamMembers as member} +
    • {member.DisplayName}
    • + {/each}
    @@ -62,10 +69,6 @@ Description: {teamData?.Description} - - - - {/if} From 7969c25037278666cab7e4ba1b9a32c001f2126e Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Tue, 11 Jun 2024 21:53:20 -0700 Subject: [PATCH 068/155] field role changed to team_role in team_members table, along with related code --- backend/app/database/migrations/00000005_team_role.down.sql | 1 + backend/app/database/teams.go | 6 +++--- html/src/lib/models/TeamMember.ts | 4 ++-- html/src/lib/pages/MyTeam.svelte | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 backend/app/database/migrations/00000005_team_role.down.sql diff --git a/backend/app/database/migrations/00000005_team_role.down.sql b/backend/app/database/migrations/00000005_team_role.down.sql new file mode 100644 index 0000000..6465999 --- /dev/null +++ b/backend/app/database/migrations/00000005_team_role.down.sql @@ -0,0 +1 @@ +ALTER TABLE team_members RENAME COLUMN role TO team_role; \ No newline at end of file diff --git a/backend/app/database/teams.go b/backend/app/database/teams.go index 475edfc..43d75ce 100644 --- a/backend/app/database/teams.go +++ b/backend/app/database/teams.go @@ -101,9 +101,9 @@ func AddTeamMember(userId pgtype.UUID, teamUUID pgtype.UUID, role string) (userI fmt.Println("=== line 100 userId", userId) teamMember, err := GetRow[CreateTeamMember]( `INSERT INTO team_members - (user_id, team_id, role) + (user_id, team_id, team_role) VALUES ($1, $2, $3) - RETURNING user_id, team_id, role`, userId, teamUUID, role) + RETURNING user_id, team_id, team_role`, userId, teamUUID, role) return teamMember.UserId, err } @@ -114,7 +114,7 @@ func GetMembersByTeamId(teamId pgtype.UUID) (*[]DBTeamMemberInfo, error) { // Not having * means I'm returning a small copy of the slice-header, no need for & in my return members, err := GetRows[DBTeamMemberInfo]( // select all the info of a user (a user row) and their tm.role () - `SELECT u.*, tm.role as team_role + `SELECT u.*, tm.team_role FROM team_members tm INNER JOIN users u on (u.id = tm.user_id) WHERE tm.team_id = $1`, diff --git a/html/src/lib/models/TeamMember.ts b/html/src/lib/models/TeamMember.ts index 8ac38fe..8b5cb59 100644 --- a/html/src/lib/models/TeamMember.ts +++ b/html/src/lib/models/TeamMember.ts @@ -1,7 +1,7 @@ class TeamMember { TeamId: string; UserId : string; - Role: string; + TeamRole: string; DisplayName: string; //TODO add Array @@ -9,7 +9,7 @@ class TeamMember { constructor() { this.TeamId = ''; this.UserId = ''; - this.Role = ''; + this.TeamRole = ''; this.DisplayName = ''; } diff --git a/html/src/lib/pages/MyTeam.svelte b/html/src/lib/pages/MyTeam.svelte index 1ad1e73..46562ce 100644 --- a/html/src/lib/pages/MyTeam.svelte +++ b/html/src/lib/pages/MyTeam.svelte @@ -11,7 +11,7 @@ export let params: any; // set by svelte-spa-router let teamData: CodeJamTeam | null = null; - let teamMembers: TeamMember | Array; + let teamMembers: TeamMember[]; let teamEvent: CodeJamEvent | null = null; console.log("params: ", params) From c5ab1dad8ca936c7c6f760fd9168ecda9ab3f675 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Wed, 12 Jun 2024 00:43:17 -0700 Subject: [PATCH 069/155] add loading and error handling to MyTeam.svelte + formatting --- backend/app/database/teams.go | 56 +++++------ backend/app/server/teams.go | 8 +- html/src/lib/models/TeamMember.ts | 6 +- html/src/lib/pages/MyTeam.svelte | 140 +++++++++++++------------- html/src/lib/pages/TeamOptions.svelte | 79 +++++++-------- 5 files changed, 140 insertions(+), 149 deletions(-) diff --git a/backend/app/database/teams.go b/backend/app/database/teams.go index 43d75ce..a9a5585 100644 --- a/backend/app/database/teams.go +++ b/backend/app/database/teams.go @@ -6,36 +6,36 @@ import ( ) type DBTeam struct { - Id pgtype.UUID `db:"id"` - EventId pgtype.UUID `db:"event_id"` - Name string `db:"name"` - Visibility string `db:"visibility"` - Timezone string `db:"timezone"` - Technologies string `db:"technologies"` - Availability string `db:"availability"` - Description string `db:"description"` - CreatedOn pgtype.Timestamp `db:"created_on" json:"createdOn-hidden"` + Id pgtype.UUID `db:"id"` + EventId pgtype.UUID `db:"event_id"` + Name string `db:"name"` + Visibility string `db:"visibility"` + Timezone string `db:"timezone"` + Technologies string `db:"technologies"` + Availability string `db:"availability"` + Description string `db:"description"` + CreatedOn pgtype.Timestamp `db:"created_on" json:"createdOn-hidden"` } type CreateTeamMember struct { - UserId pgtype.UUID `db:"user_id"` - TeamId pgtype.UUID `db:"team_id"` - TeamRole string `db:"team_role"` + UserId pgtype.UUID `db:"user_id"` + TeamId pgtype.UUID `db:"team_id"` + TeamRole string `db:"team_role"` } // has all the user info & role to pass to be read client-side -type DBTeamMemberInfo struct { - DBUser // embed the DBUser fields into the struct - TeamRole string `db:"team_role"` +type DBTeamMemberInfo struct { + DBUser // embed the DBUser fields into the struct + TeamRole string `db:"team_role"` } // For team_member table. type DBTeamMember struct { - Id pgtype.UUID `db:"id"` - TeamId pgtype.UUID `db:"team_id"` - UserId pgtype.UUID `db:"user_id"` - TeamRole string `db:"team_role"` - CreatedOn pgtype.Timestamp `db:"created_on" json:"createdOn-hidden"` + Id pgtype.UUID `db:"id"` + TeamId pgtype.UUID `db:"team_id"` + UserId pgtype.UUID `db:"user_id"` + TeamRole string `db:"team_role"` + CreatedOn pgtype.Timestamp `db:"created_on" json:"createdOn-hidden"` } func CreateTeam(team DBTeam) (pgtype.UUID, error) { @@ -66,9 +66,9 @@ func GetTeam(teamId pgtype.UUID) (DBTeam, error) { FROM teams WHERE teams.id = $1`, teamId) - // `SELECT * FROM teams WHERE id = $1`, - // teamId) - if err!= nil { + // `SELECT * FROM teams WHERE id = $1`, + // teamId) + if err != nil { return DBTeam{}, err } return team, nil @@ -94,7 +94,7 @@ func UpdateTeam(team DBTeam) (DBTeam, error) { return event, err } -// fields: userid, teamid, role +// fields: userid, teamid, role // called at server/teams.go createTeam & when someone clicks "join team" // DONT MESS WITH BELOW. IT WORKS. func AddTeamMember(userId pgtype.UUID, teamUUID pgtype.UUID, role string) (userID pgtype.UUID, err error) { @@ -108,17 +108,15 @@ func AddTeamMember(userId pgtype.UUID, teamUUID pgtype.UUID, role string) (userI } func GetMembersByTeamId(teamId pgtype.UUID) (*[]DBTeamMemberInfo, error) { - // In Go, you never return slice-data. - // Having * in sig means I'm returning the slice-header, which means I need & in my return + // Having * in sig means I'm returning the slice-header, which means I need & in my return // Not having * means I'm returning a small copy of the slice-header, no need for & in my return members, err := GetRows[DBTeamMemberInfo]( // select all the info of a user (a user row) and their tm.role () `SELECT u.*, tm.team_role FROM team_members tm INNER JOIN users u on (u.id = tm.user_id) - WHERE tm.team_id = $1`, + WHERE tm.team_id = $1`, teamId) - fmt.Println("\n============== line 121 database:\n", members) return &members, err -} \ No newline at end of file +} diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index 4c693fa..a89dbe9 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -38,7 +38,7 @@ func (server *Server) GetAllTeams(ctx *gin.Context) { } } -// stepp 4: GET team info +// stepp 4: GET team info // purpose is to construct the DBTeamMemberInfo func (server *Server) GetTeamInfo(ctx *gin.Context) { id := convert.StringToUUID(ctx.Param("id")) @@ -110,7 +110,7 @@ func (server *Server) CreateTeam(ctx *gin.Context) { team.Timezone = teamReq.Timezone fmt.Printf("%+v", team) - // INSERTS TEAM into DB + // INSERTS TEAM into DB // PART 1/2 DONE teamUUID, err := database.CreateTeam(team) if err != nil { @@ -124,10 +124,10 @@ func (server *Server) CreateTeam(ctx *gin.Context) { // tempMember.TeamId = teamUUID // tempMember.UserID = convert.StringToUUID(strUserId) _, err = database.AddTeamMember(convert.StringToUUID(strUserId), teamUUID, "owner") - + if err == nil { fmt.Println("Successfully added team member") - ctx.JSON(http.StatusCreated, map[string]pgtype.UUID { + ctx.JSON(http.StatusCreated, map[string]pgtype.UUID{ "id": teamUUID, }) } else { diff --git a/html/src/lib/models/TeamMember.ts b/html/src/lib/models/TeamMember.ts index 8b5cb59..41afbb9 100644 --- a/html/src/lib/models/TeamMember.ts +++ b/html/src/lib/models/TeamMember.ts @@ -1,9 +1,9 @@ class TeamMember { TeamId: string; - UserId : string; + UserId: string; TeamRole: string; DisplayName: string; - + //TODO add Array constructor() { @@ -11,7 +11,7 @@ class TeamMember { this.UserId = ''; this.TeamRole = ''; this.DisplayName = ''; - + } } diff --git a/html/src/lib/pages/MyTeam.svelte b/html/src/lib/pages/MyTeam.svelte index 46562ce..3ee8f68 100644 --- a/html/src/lib/pages/MyTeam.svelte +++ b/html/src/lib/pages/MyTeam.svelte @@ -1,76 +1,78 @@ - - hi - - {#if teamData !== null} - {teamEvent?.Title} -
    - Team {teamData.Name} -
    - Team Members: -
      - {#each teamMembers as member} -
    • {member.DisplayName}
    • - {/each} -
    - -
    - - - Visibility: {teamData?.Visibility} - - - Technologies: {teamData?.Technologies} - - - Availability: {teamData?.Availability} - - - Description: {teamData?.Description} - - {/if} - - -
    -
    \ No newline at end of file + + + {#if loading} +
    Loading...
    + {:else if error} +
    {error}
    + {:else if teamData !== null} +
    {teamMembers[0]?.DisplayName}, your team has been successfully created!
    +

    {teamEvent?.Title}

    + +
    +

    Team {teamData.Name}

    + (edit) +
    + + Team Members: +
      + {#each teamMembers as member} +
    • {member.DisplayName}
    • + {/each} +
    +
    + + Visibility: {teamData.Visibility} + + + Technologies: {teamData.Technologies} + + + Availability: {teamData.Availability} + + + Description: {teamData.Description} + +

    Invite Link:

    +
    + {/if} +
    +
    diff --git a/html/src/lib/pages/TeamOptions.svelte b/html/src/lib/pages/TeamOptions.svelte index 3c6a93f..f221a58 100644 --- a/html/src/lib/pages/TeamOptions.svelte +++ b/html/src/lib/pages/TeamOptions.svelte @@ -1,47 +1,38 @@ - - - -

    Team Options

    -
    -
    - - -

    Find a Team to Join

    -

    Browse other teams looking for members like you!

    -

    - - -
    - -

    Start a Team

    -

    By creating a team, you're in control of the team page. Decide whether anyone can join or just people with the invite code.

    -

    -
    - - -

    Be a Solo Participant

    -

    For those who want to work alone. You can change your mind later.

    -

    -
    -
    - -
    + + +

    Team Options

    +
    + + +

    Find a Team to Join

    +

    Browse other teams looking for members like you!

    +

    +
    + +

    Start a Team

    +

    + By creating a team, you're in control of the team page. Decide whether anyone can join or + just people with the invite code. +

    +

    +
    + + +

    Be a Solo Participant

    +

    For those who want to work alone. You can change your mind later.

    +

    +
    +
    +
    From baf23d61760e3700906626d8bde4cc3f9251991d Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Wed, 12 Jun 2024 18:22:49 -0700 Subject: [PATCH 070/155] added: md5hashcode to teams table --- .../migrations/00000006_team_code.up.sql | 1 + .../migrations/00000007_team_code.down.sql | 1 + backend/app/database/teams.go | 13 ++++++--- backend/app/server/teams.go | 27 ++++++++++++++++--- 4 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 backend/app/database/migrations/00000006_team_code.up.sql create mode 100644 backend/app/database/migrations/00000007_team_code.down.sql diff --git a/backend/app/database/migrations/00000006_team_code.up.sql b/backend/app/database/migrations/00000006_team_code.up.sql new file mode 100644 index 0000000..438181e --- /dev/null +++ b/backend/app/database/migrations/00000006_team_code.up.sql @@ -0,0 +1 @@ +ALTER TABLE teams ADD COLUMN code TEXT; \ No newline at end of file diff --git a/backend/app/database/migrations/00000007_team_code.down.sql b/backend/app/database/migrations/00000007_team_code.down.sql new file mode 100644 index 0000000..1729988 --- /dev/null +++ b/backend/app/database/migrations/00000007_team_code.down.sql @@ -0,0 +1 @@ +ALTER TABLE teams RENAME code TO invite_code; \ No newline at end of file diff --git a/backend/app/database/teams.go b/backend/app/database/teams.go index a9a5585..8373984 100644 --- a/backend/app/database/teams.go +++ b/backend/app/database/teams.go @@ -15,6 +15,7 @@ type DBTeam struct { Availability string `db:"availability"` Description string `db:"description"` CreatedOn pgtype.Timestamp `db:"created_on" json:"createdOn-hidden"` + InviteCode string `db:"invite_code"` } type CreateTeamMember struct { @@ -41,12 +42,15 @@ type DBTeamMember struct { func CreateTeam(team DBTeam) (pgtype.UUID, error) { team, err := GetRow[DBTeam]( `INSERT INTO teams - (event_id, name, visibility, timezone, technologies, availability, description) + (event_id, name, visibility, timezone, technologies, availability, description, invite_code) VALUES - ($1, $2, $3, $4, $5, $6, $7) - RETURNING id, event_id, name, visibility, timezone, technologies, availability, description, created_on + ($1, $2, $3, $4, $5, $6, $7, $8) + RETURNING id, event_id, name, visibility, timezone, technologies, availability, description, created_on, invite_code `, - team.EventId, team.Name, team.Visibility, team.Timezone, team.Technologies, team.Availability, team.Description) + team.EventId, team.Name, team.Visibility, team.Timezone, team.Technologies, team.Availability, team.Description, team.InviteCode) + if err != nil { + fmt.Println("ERROR: failed to create team: ", err) + } return team.Id, err } @@ -69,6 +73,7 @@ func GetTeam(teamId pgtype.UUID) (DBTeam, error) { // `SELECT * FROM teams WHERE id = $1`, // teamId) if err != nil { + fmt.Println("===dtabase error: ", err) return DBTeam{}, err } return team, nil diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index a89dbe9..9923451 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -9,6 +9,12 @@ import ( "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" "github.com/jackc/pgx/v5/pgtype" + + "crypto/md5" + "crypto/rand" + "encoding/hex" + "math" + "math/big" ) type CreateTeamRequest struct { @@ -29,6 +35,15 @@ type GetTeamResponse struct { Members *[]database.DBTeamMemberInfo // array(slice) of a struct } +func MD5HashCode(teamName string) (string, error) { + randNum, err := rand.Int(rand.Reader, big.NewInt(math.MaxInt64)) + if err != nil { + return "Md5 hash error", err + } + hash := md5.Sum([]byte(teamName + "." + randNum.String())) + return hex.EncodeToString(hash[:7]), nil +} + func (server *Server) GetAllTeams(ctx *gin.Context) { teams, err := database.GetTeams() if err == nil { @@ -109,6 +124,14 @@ func (server *Server) CreateTeam(ctx *gin.Context) { team.Technologies = teamReq.Technologies team.Timezone = teamReq.Timezone + md5code, err := MD5HashCode(team.Name) + if err != nil { + logger.Error("Error - Md5HashCode failed", err) + ctx.Status(http.StatusInternalServerError) + return + } + team.InviteCode = md5code + fmt.Printf("%+v", team) // INSERTS TEAM into DB // PART 1/2 DONE @@ -118,11 +141,9 @@ func (server *Server) CreateTeam(ctx *gin.Context) { ctx.Status(http.StatusBadRequest) return } + // PART 2/2 DONE // construct TeamMember - // tempMember.Role = "owner" - // tempMember.TeamId = teamUUID - // tempMember.UserID = convert.StringToUUID(strUserId) _, err = database.AddTeamMember(convert.StringToUUID(strUserId), teamUUID, "owner") if err == nil { From 604ec1223a225d9f688679d29ad4214be708f948 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Wed, 12 Jun 2024 20:22:49 -0700 Subject: [PATCH 071/155] client reads invite_code --- backend/app/database/teams.go | 3 +- html/src/lib/models/team.ts | 2 ++ html/src/lib/pages/Invite.svelte | 50 ++++++++++++++++++++++++++++++++ html/src/lib/pages/MyTeam.svelte | 2 +- html/src/routes.ts | 2 ++ 5 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 html/src/lib/pages/Invite.svelte diff --git a/backend/app/database/teams.go b/backend/app/database/teams.go index 8373984..b49a914 100644 --- a/backend/app/database/teams.go +++ b/backend/app/database/teams.go @@ -66,7 +66,8 @@ func GetTeam(teamId pgtype.UUID) (DBTeam, error) { teams.technologies, teams.availability, teams.description, - teams.created_on + teams.created_on, + teams.invite_code FROM teams WHERE teams.id = $1`, teamId) diff --git a/html/src/lib/models/team.ts b/html/src/lib/models/team.ts index 389dbe4..59fbbc6 100644 --- a/html/src/lib/models/team.ts +++ b/html/src/lib/models/team.ts @@ -9,6 +9,7 @@ class CodeJamTeam { Technologies: string; Availability: string; Description: string; + InviteCode: string; constructor() { this.Id = ''; @@ -18,6 +19,7 @@ class CodeJamTeam { this.Technologies = ''; this.Availability = ''; this.Description = ''; + this.InviteCode = ''; } } diff --git a/html/src/lib/pages/Invite.svelte b/html/src/lib/pages/Invite.svelte new file mode 100644 index 0000000..9060c2a --- /dev/null +++ b/html/src/lib/pages/Invite.svelte @@ -0,0 +1,50 @@ + + +WAHT + + Click below to join {teamMembers[0]?.DisplayName}'s team: {teamData?.Name} + + + + \ No newline at end of file diff --git a/html/src/lib/pages/MyTeam.svelte b/html/src/lib/pages/MyTeam.svelte index 3ee8f68..ee5f590 100644 --- a/html/src/lib/pages/MyTeam.svelte +++ b/html/src/lib/pages/MyTeam.svelte @@ -71,7 +71,7 @@ Description: {teamData.Description} -

    Invite Link:

    +

    Invite Link: here

    {/if} diff --git a/html/src/routes.ts b/html/src/routes.ts index f1adbd0..2c4493e 100644 --- a/html/src/routes.ts +++ b/html/src/routes.ts @@ -5,6 +5,7 @@ import TeamOptions from "./lib/pages/TeamOptions.svelte"; import TeamsBrowse from "./lib/pages/TeamsBrowse.svelte"; import TeamsCreate from "./lib/pages/TeamsCreate.svelte"; import MyTeam from "./lib/pages/MyTeam.svelte"; +import Invite from "./lib/pages/Invite.svelte"; export default { @@ -15,6 +16,7 @@ export default { '/team': TeamOptions, //'/team/my-teams/': MyTeams // link to all your teams '/team/:id': MyTeam, // link to one of your teams (sharable) + '/team/invite/:id': Invite, '/teams/browse': TeamsBrowse, '/teams/create': TeamsCreate, } \ No newline at end of file From 93752f07536bfcb076b1664374543d59e96a37c0 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Thu, 13 Jun 2024 18:25:21 -0700 Subject: [PATCH 072/155] invite link(server, db calls) and user interface added --- backend/app/database/teams.go | 25 +++++++++++++- backend/app/server/teams.go | 42 +++++++++++++++++++++++ html/src/lib/components/Header.svelte | 9 +---- html/src/lib/models/user.ts | 5 +++ html/src/lib/pages/EventEdit.svelte | 2 +- html/src/lib/pages/Invite.svelte | 49 +++++++++++++++++++++------ html/src/lib/pages/MyTeam.svelte | 13 +++++-- html/src/lib/pages/TeamOptions.svelte | 6 +++- html/src/lib/pages/TeamsCreate.svelte | 8 +++-- html/src/lib/services/services.ts | 31 ++++++++++++----- html/src/lib/stores/stores.ts | 3 +- html/src/main.ts | 2 +- html/src/routes.ts | 2 +- html/tailwind.config.cjs | 23 +++++++------ 14 files changed, 172 insertions(+), 48 deletions(-) create mode 100644 html/src/lib/models/user.ts diff --git a/backend/app/database/teams.go b/backend/app/database/teams.go index b49a914..bb7e406 100644 --- a/backend/app/database/teams.go +++ b/backend/app/database/teams.go @@ -74,7 +74,30 @@ func GetTeam(teamId pgtype.UUID) (DBTeam, error) { // `SELECT * FROM teams WHERE id = $1`, // teamId) if err != nil { - fmt.Println("===dtabase error: ", err) + logger.Error("===DB/GetTeam error: ", err) + return DBTeam{}, err + } + return team, nil +} + +func GetTeamByInvite(inviteCode string) (DBTeam, error) { + team, err := GetRow[DBTeam]( + `SELECT + teams.id, + teams.event_id, + teams.name, + teams.visibility, + teams.timezone, + teams.technologies, + teams.availability, + teams.description, + teams.created_on, + teams.invite_code + FROM teams + WHERE teams.invite_code = $1`, + inviteCode) + if err != nil { + logger.Error("===DB/GetTeamByInvite error: ", err) return DBTeam{}, err } return team, nil diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index 9923451..5a2f3cd 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -92,6 +92,47 @@ func (server *Server) GetTeamInfo(ctx *gin.Context) { ctx.JSON(http.StatusOK, teamResponse) } +func (server *Server) GetTeamInfoByInviteCode(ctx *gin.Context) { + inviteCode := ctx.Param("invitecode") + fmt.Println("\n===server getteam by invite code: ", inviteCode) + + var teamResponse GetTeamResponse + var team database.DBTeam + var event database.DBEvent + var members *[]database.DBTeamMemberInfo //user info based on teamId + + team, err := database.GetTeamByInvite(inviteCode) + if err != nil { + logger.Error("failed to get team: %v", err) + ctx.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to get team: %v", err)}) + return + } else { + fmt.Println("TEST if GetTeamByInvite was SUCCESS: ", err, " + ", team) + } + + event, err = database.GetEvent(team.EventId) + if err != nil { + logger.Error("failed to get event: %v", err) + ctx.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to get event: %v", err)}) + return + } + + members, err = database.GetMembersByTeamId(team.Id) + if err != nil { + logger.Error("failed to get event: %v", err) + ctx.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to get members: %v", err)}) + return + } + + // attach all 3 structures to GetTeamResponse --> nested structs turn into nested JSON (with ctx.JSON) + teamResponse.Team = &team + teamResponse.Event = &event + teamResponse.Members = members + + fmt.Println(teamResponse) + ctx.JSON(http.StatusOK, teamResponse) +} + func (server *Server) CreateTeam(ctx *gin.Context) { // ctx of *gin.Context has HTTP request info. // Step 4: Post Team Data API (TWO PARTS 1) create team 2) add team members) @@ -188,6 +229,7 @@ func (server *Server) SetupTeamRoutes() { group.POST("/", server.CreateTeam) group.GET("/", server.GetAllTeams) group.GET("/:id", server.GetTeamInfo) + group.GET("/invite/:invitecode", server.GetTeamInfoByInviteCode) // group.PUT("/:id", server.UpdateTeam) // Step 3: Post Team Data API } diff --git a/html/src/lib/components/Header.svelte b/html/src/lib/components/Header.svelte index 18a7e04..bcaa235 100644 --- a/html/src/lib/components/Header.svelte +++ b/html/src/lib/components/Header.svelte @@ -5,20 +5,13 @@ import {Navbar, NavHamburger, NavLi, NavUl} from "flowbite-svelte"; import {loggedInStore, userStore} from "../stores/stores"; import DiscordIcon from "./DiscordIcon.svelte"; import {location} from "svelte-spa-router"; +import { type User } from '../models/user' // reactive statement - "location" will change whenever url changes $: activeUrl = '/#' + $location; - - -
    diff --git a/html/src/lib/models/user.ts b/html/src/lib/models/user.ts new file mode 100644 index 0000000..ed9f09e --- /dev/null +++ b/html/src/lib/models/user.ts @@ -0,0 +1,5 @@ +export interface User { + UserId: string; + DisplayName: string; + Role: string +} \ No newline at end of file diff --git a/html/src/lib/pages/EventEdit.svelte b/html/src/lib/pages/EventEdit.svelte index 290ff2f..374639d 100644 --- a/html/src/lib/pages/EventEdit.svelte +++ b/html/src/lib/pages/EventEdit.svelte @@ -11,7 +11,7 @@ Spinner, Textarea } from 'flowbite-svelte'; - import { getActiveEvent, getEvent, putEvent } from '../services/services'; + import { getActiveEvent, getEvent, putEvent } from '../services/services' import { eventStatusStore } from '../stores/stores'; import CodeJamEvent from '../models/event'; import FormField from '../components/FormField.svelte'; diff --git a/html/src/lib/pages/Invite.svelte b/html/src/lib/pages/Invite.svelte index 9060c2a..8cd742c 100644 --- a/html/src/lib/pages/Invite.svelte +++ b/html/src/lib/pages/Invite.svelte @@ -3,13 +3,17 @@ import { Button, Card } from 'flowbite-svelte'; import { onMount } from 'svelte'; import CodeJamTeam from '../models/team'; - import { getTeam, joinTeam } from '../services/services'; + import { type User } from '../models/user' + import { getTeamByInvite, joinTeam } from '../services/services'; import { Label, Input } from 'flowbite-svelte'; import type TeamMember from '../models/TeamMember'; import CodeJamEvent from '../models/event'; import { loggedInStore, userStore } from '../stores/stores'; + import DiscordIcon from '../components/DiscordIcon.svelte'; export let params: any; // set by svelte-spa-router + console.log(params) // returns Object { invitecode: "d1869a59b4fdf3" } + console.log(params.invitecode) let teamData: CodeJamTeam | null = null; let teamMembers: TeamMember[] = []; @@ -17,9 +21,9 @@ let loading = true; let error: any = null; - async function loadData(id: string) { + async function loadData(invitecode: string) { try { - const response = await getTeam(id); + const response = await getTeamByInvite(invitecode); const data = await response.json(); teamData = data.Team; teamMembers = data.Members; @@ -33,18 +37,43 @@ } $: if (params) { - loadData(params); + loadData(params.invitecode); } + // query teams table for matching invite_code. + // getTeamByInvite() + // return table id + // joinTeam() + + // checks if user is logged in. + // if not logged in, display: login to join team + // if logged in: button to fetch -WAHT - - Click below to join {teamMembers[0]?.DisplayName}'s team: {teamData?.Name} + + +

    Join

    + {#if $loggedInStore} +
    +
    Hi {$userStore?.DisplayName},
    + Click below to join {teamMembers[0]?.DisplayName}'s team: +
    + + + {:else} +
    + Must be logged in to join a team. +
    + + + + {/if} + - -
    -
    \ No newline at end of file +
    +
    diff --git a/html/src/lib/pages/MyTeam.svelte b/html/src/lib/pages/MyTeam.svelte index ee5f590..0d3f32f 100644 --- a/html/src/lib/pages/MyTeam.svelte +++ b/html/src/lib/pages/MyTeam.svelte @@ -1,9 +1,9 @@ + + Home + Team Options + Create Team + View Teams + + {#if loading}
    Loading...
    diff --git a/html/src/lib/pages/TeamOptions.svelte b/html/src/lib/pages/TeamOptions.svelte index f221a58..8830d9b 100644 --- a/html/src/lib/pages/TeamOptions.svelte +++ b/html/src/lib/pages/TeamOptions.svelte @@ -1,6 +1,6 @@ + + Home + Team Options +

    Team Options

    diff --git a/html/src/lib/pages/TeamsCreate.svelte b/html/src/lib/pages/TeamsCreate.svelte index 6018ac2..9db4a9a 100644 --- a/html/src/lib/pages/TeamsCreate.svelte +++ b/html/src/lib/pages/TeamsCreate.svelte @@ -1,7 +1,7 @@ - + + Home + Team Options + Create Team +

    Create your team!

    diff --git a/html/src/lib/services/services.ts b/html/src/lib/services/services.ts index 54b4aa5..855f997 100644 --- a/html/src/lib/services/services.ts +++ b/html/src/lib/services/services.ts @@ -1,9 +1,9 @@ -import {activeEventStore, eventStatusStore, userStore} from "../stores/stores"; +import { activeEventStore, eventStatusStore, userStore } from "../stores/stores"; import CodeJamEvent from "../models/event"; import CodeJamTeam from "../models/team"; // This shouldn't ever need to be set since dev and prod environments will just use relative endpoints -export let baseApiUrl : string = ""; +export let baseApiUrl: string = ""; const originalFetch = window.fetch; @@ -22,7 +22,7 @@ window.fetch = (...args) => { } export async function getUser() { - return fetch(baseApiUrl + "/user/", {method: 'GET', credentials: 'include'}) + return fetch(baseApiUrl + "/user/", { method: 'GET', credentials: 'include' }) .then((response) => { if (response.status === 401) { userStore.set(null); @@ -96,20 +96,35 @@ export async function getEventStatuses() { export async function postTeam(team: CodeJamTeam) { // Step 2: Post Team Data API (accepts formData(CodeJamTeam) as argument) return await fetch(baseApiUrl + "/team/" + team.Id, - // formData turned into JSON and sent via POST, retreived at CreateTeam(ctx *gin.Context) + // formData turned into JSON and sent via POST, retreived at CreateTeam(ctx *gin.Context) { method: "POST", body: JSON.stringify(team) }); } -export async function getTeam(id: string) { - // stepp 3 pt 1: - // goes to server/getTeam ctx - console.log("team id from getTeam/services.ts:", id) +export async function getTeamById(id: string) { return fetch(baseApiUrl + "/team/" + id); } +export async function getTeamByInvite(inviteCode: string) { + // stepp 3 pt 1: + return fetch(baseApiUrl + "/team/invite/" + inviteCode); +} + + +// any one who has the link joinTeam connects to can join the team. +// make sure invite_code matches +export async function joinTeam(team: CodeJamTeam, userId: string, invite_code: string) { + // making a post to team_members + return await fetch(baseApiUrl + "/team/" + invite_code, + { + method: "POST", + body: JSON.stringify({ team, userId, invite_code }) + } + ) +} + // Always call at startup to get the initial states async function initialLoad() { getUser(); diff --git a/html/src/lib/stores/stores.ts b/html/src/lib/stores/stores.ts index b790bb1..d15301d 100644 --- a/html/src/lib/stores/stores.ts +++ b/html/src/lib/stores/stores.ts @@ -1,9 +1,10 @@ import {writable, derived} from 'svelte/store'; import CodeJamEvent from "../models/event"; +import { type User } from "../models/user"; export const activeContent = writable(''); -export const userStore = writable(null); +export const userStore = writable(null); export const activeEventStore = writable(null); export const eventStatusStore = writable(null); export const loggedInStore = derived(userStore, (userData) => userData != null); \ No newline at end of file diff --git a/html/src/main.ts b/html/src/main.ts index a7eb4fb..8ddc1e3 100644 --- a/html/src/main.ts +++ b/html/src/main.ts @@ -3,7 +3,7 @@ import App from './App.svelte' import "./lib/services/services" const app = new App({ - target: document.getElementById('app')!, + target: document.getElementById('app')!, }) export default app diff --git a/html/src/routes.ts b/html/src/routes.ts index 2c4493e..2b8163d 100644 --- a/html/src/routes.ts +++ b/html/src/routes.ts @@ -16,7 +16,7 @@ export default { '/team': TeamOptions, //'/team/my-teams/': MyTeams // link to all your teams '/team/:id': MyTeam, // link to one of your teams (sharable) - '/team/invite/:id': Invite, + '/team/invite/:invitecode': Invite, '/teams/browse': TeamsBrowse, '/teams/create': TeamsCreate, } \ No newline at end of file diff --git a/html/tailwind.config.cjs b/html/tailwind.config.cjs index 3b4e2a3..385f31e 100644 --- a/html/tailwind.config.cjs +++ b/html/tailwind.config.cjs @@ -10,17 +10,18 @@ const config = { colors: { // flowbite-svelte primary: { - 50: '#FFF5F2', - 100: '#FFF1EE', - 200: '#FFE4DE', - 300: '#FFD5CC', - 400: '#FFBCAD', - 500: '#FE795D', - 600: '#EF562F', - 700: '#EB4F27', - 800: '#CC4522', - 900: '#A5371B' - } + "50":"#f0f9ff", + "100":"#e0f2fe", + "200":"#bae6fd", + "300":"#7dd3fc", + "400":"#38bdf8", + "500":"#0ea5e9", + "600":"#0284c7", + "700":"#0369a1", + "800":"#075985", + "900":"#0c4a6e" + } + } } } From 190b4cec0d060e04d94e77581aca991bea69147a Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Sat, 22 Jun 2024 01:06:22 -0700 Subject: [PATCH 073/155] related to displaying all the teams a user is part of (server, database, routes) Co-authored-by: Mysty --- .../migrations/00000008_team_code.down.sql | 1 + backend/app/database/teams.go | 27 ++++- html/src/lib/components/Header.svelte | 2 +- html/src/lib/pages/Invite.svelte | 2 +- html/src/lib/pages/MyTeam.svelte | 13 +- html/src/lib/pages/UserTeams.svelte | 112 ++++++++++++++++++ html/src/lib/services/services.ts | 4 + html/src/routes.ts | 7 +- 8 files changed, 155 insertions(+), 13 deletions(-) create mode 100644 backend/app/database/migrations/00000008_team_code.down.sql create mode 100644 html/src/lib/pages/UserTeams.svelte diff --git a/backend/app/database/migrations/00000008_team_code.down.sql b/backend/app/database/migrations/00000008_team_code.down.sql new file mode 100644 index 0000000..e688cfd --- /dev/null +++ b/backend/app/database/migrations/00000008_team_code.down.sql @@ -0,0 +1 @@ +ALTER TABLE teams DROP COLUMN code; \ No newline at end of file diff --git a/backend/app/database/teams.go b/backend/app/database/teams.go index bb7e406..022db63 100644 --- a/backend/app/database/teams.go +++ b/backend/app/database/teams.go @@ -15,7 +15,7 @@ type DBTeam struct { Availability string `db:"availability"` Description string `db:"description"` CreatedOn pgtype.Timestamp `db:"created_on" json:"createdOn-hidden"` - InviteCode string `db:"invite_code"` + InviteCode string `db:"invite_code"` } type CreateTeamMember struct { @@ -39,6 +39,12 @@ type DBTeamMember struct { CreatedOn pgtype.Timestamp `db:"created_on" json:"createdOn-hidden"` } +type DBUserTeams struct { + DBTeam + DisplayName string `db:"display_name"` + TeamRole string `db:"team_role"` +} + func CreateTeam(team DBTeam) (pgtype.UUID, error) { team, err := GetRow[DBTeam]( `INSERT INTO teams @@ -108,6 +114,25 @@ func GetTeams() ([]DBTeam, error) { return result, err } +func GetUserTeams(userId pgtype.UUID) ([]DBUserTeams, error) { + result, err := GetRows[DBUserTeams]( + `SELECT + u.display_name, + t.*, + tm.team_role + FROM users u + INNER JOIN team_members tm ON u.id = tm.user_id + INNER JOIN teams t ON tm.team_id = t.id + WHERE u.id = $1`, + userId) + if err != nil { + fmt.Println("that didn't work: database.GetUserTeams") + return nil, err + } + + return result, err // Try look at the table +} + func UpdateTeam(team DBTeam) (DBTeam, error) { event, err := GetRow[DBTeam]( `UPDATE teams diff --git a/html/src/lib/components/Header.svelte b/html/src/lib/components/Header.svelte index bcaa235..c5df2c4 100644 --- a/html/src/lib/components/Header.svelte +++ b/html/src/lib/components/Header.svelte @@ -26,7 +26,7 @@ $: activeUrl = '/#' + $location; Manage Events {/if} Sign-Up - Profile + My Teams Logout {:else} Login with Discord diff --git a/html/src/lib/pages/Invite.svelte b/html/src/lib/pages/Invite.svelte index 8cd742c..3e6a725 100644 --- a/html/src/lib/pages/Invite.svelte +++ b/html/src/lib/pages/Invite.svelte @@ -62,7 +62,7 @@ Click below to join {teamMembers[0]?.DisplayName}'s team:
    - + {:else}
    Must be logged in to join a team. diff --git a/html/src/lib/pages/MyTeam.svelte b/html/src/lib/pages/MyTeam.svelte index 0d3f32f..8fed596 100644 --- a/html/src/lib/pages/MyTeam.svelte +++ b/html/src/lib/pages/MyTeam.svelte @@ -14,8 +14,8 @@ let teamData: CodeJamTeam | null = null; let teamMembers: TeamMember[] = []; let teamEvent: CodeJamEvent | null = null; - let loading = true; - let error: any = null; + let loading: boolean = true; + let error: string | null = null; async function loadData(id: string) { try { @@ -25,7 +25,7 @@ teamMembers = data.Members; teamEvent = data.Event; } catch (err) { - error = 'Failed to load team data.'; + error = `Failed to load team data: ${err}`; console.error(err); } finally { loading = false; @@ -36,13 +36,12 @@ loadData(params.id); } + - Home - Team Options - Create Team - View Teams + Home + Team {teamData?.Name} diff --git a/html/src/lib/pages/UserTeams.svelte b/html/src/lib/pages/UserTeams.svelte new file mode 100644 index 0000000..f7db226 --- /dev/null +++ b/html/src/lib/pages/UserTeams.svelte @@ -0,0 +1,112 @@ + + + + + + Home + My Teams + + + +

    Your Teams

    + + {#if loading} +
    Loading...
    + {:else if error} +
    {error}
    + + {:else if userTeams.length == 0} +
    + Looks like you don't have any teams! Go to browse teams to join one! +
    + {:else if userTeams == null} +
    + Error, please contact admin. +
    + {:else} + hi + + {userTeams} + {#each userTeams as userTeam} + +
    +

    Team {userTeam.Name}

    +
    + + Visibility: {userTeam.Visibility} + + + Technologies: {userTeam.Technologies} + + + Availability: {userTeam.Availability} + + + Description: {userTeam.Description} + + + +
    + + + {/each} + + + {/if} +
    +
    diff --git a/html/src/lib/services/services.ts b/html/src/lib/services/services.ts index 855f997..b2eb48c 100644 --- a/html/src/lib/services/services.ts +++ b/html/src/lib/services/services.ts @@ -103,6 +103,10 @@ export async function postTeam(team: CodeJamTeam) { }); } +export async function getUserTeams(){ + return fetch(baseApiUrl + "/teams"); +} + export async function getTeamById(id: string) { return fetch(baseApiUrl + "/team/" + id); } diff --git a/html/src/routes.ts b/html/src/routes.ts index 2b8163d..e8211a6 100644 --- a/html/src/routes.ts +++ b/html/src/routes.ts @@ -6,6 +6,7 @@ import TeamsBrowse from "./lib/pages/TeamsBrowse.svelte"; import TeamsCreate from "./lib/pages/TeamsCreate.svelte"; import MyTeam from "./lib/pages/MyTeam.svelte"; import Invite from "./lib/pages/Invite.svelte"; +import UserTeams from "./lib/pages/UserTeams.svelte"; export default { @@ -14,9 +15,9 @@ export default { '/admin/events': EventList, '/admin/event/:id': EventEdit, '/team': TeamOptions, - //'/team/my-teams/': MyTeams // link to all your teams - '/team/:id': MyTeam, // link to one of your teams (sharable) - '/team/invite/:invitecode': Invite, + '/team/:id': MyTeam, // link to one of your teams (sharable) We get an id here in this route... + '/team/invite/:invitecode': Invite, // sharable + '/teams': UserTeams, // displays all the user's teams (private) '/teams/browse': TeamsBrowse, '/teams/create': TeamsCreate, } \ No newline at end of file From b2581f9cd3654df256fc14d1d34b1c7158f6019d Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Sun, 23 Jun 2024 12:56:02 -0700 Subject: [PATCH 074/155] added return in CreateTeams error --- backend/app/server/teams.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index 5a2f3cd..869b32c 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -53,6 +53,33 @@ func (server *Server) GetAllTeams(ctx *gin.Context) { } } +func (server *Server) GetUserTeams(ctx *gin.Context) { + session := sessions.Default(ctx) + userId := session.Get("userId") + strUserId := userId.(string) + + if userId == nil { + ctx.Status(http.StatusNotFound) + return + } + // var teamResponse GetTeamResponse + // var teamsResponse []GetTeamResponse + + teams, err := database.GetUserTeams(convert.StringToUUID(strUserId)) + if err != nil { + ctx.Status(http.StatusInternalServerError) + return + } + + //1. join databse to return members + ctx.JSON(http.StatusOK, teams) + + // add all the GetTeamResponse to []GetTeamResponse + // loop through teams, get team id + // assign each team to teamResponse type.. + +} + // stepp 4: GET team info // purpose is to construct the DBTeamMemberInfo func (server *Server) GetTeamInfo(ctx *gin.Context) { @@ -140,6 +167,7 @@ func (server *Server) CreateTeam(ctx *gin.Context) { userId := session.Get("userId") if userId != nil { ctx.Status(http.StatusUnauthorized) + return } strUserId := userId.(string) @@ -233,4 +261,6 @@ func (server *Server) SetupTeamRoutes() { // group.PUT("/:id", server.UpdateTeam) // Step 3: Post Team Data API } + + server.Gin.GET("/teams", server.GetUserTeams) // I think this works rofl } From aa3c27e439eec12cba8b0b9b93790e9c20e4fb04 Mon Sep 17 00:00:00 2001 From: scottserven Date: Sun, 23 Jun 2024 16:50:16 -0400 Subject: [PATCH 075/155] * Adding Timeline field to Event Edit page. * Adding HTML support for Timeline, Goals, and Rules fields --- backend/app/database/events.go | 13 +++++++------ backend/app/server/event.go | 3 ++- html/src/lib/pages/EventEdit.svelte | 4 ++++ html/src/lib/pages/HomePage.svelte | 6 +++--- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/backend/app/database/events.go b/backend/app/database/events.go index bd1b116..8e8aea8 100644 --- a/backend/app/database/events.go +++ b/backend/app/database/events.go @@ -68,14 +68,15 @@ func UpdateEvent(event DBEvent) (DBEvent, error) { `UPDATE events SET status_id=$2, title=$3, - description=$4, - rules=$5, - max_teams=$6, - starts_at=$7, - ends_at=$8 + timeline=$4, + description=$5, + rules=$6, + max_teams=$7, + starts_at=$8, + ends_at=$9 WHERE id=$1 RETURNING *`, - event.Id, event.StatusId, event.Title, event.Description, event.Rules, event.MaxTeams, event.StartsAt, event.EndsAt) + event.Id, event.StatusId, event.Title, event.Timeline, event.Description, event.Rules, event.MaxTeams, event.StartsAt, event.EndsAt) return event, err } diff --git a/backend/app/server/event.go b/backend/app/server/event.go index d47da29..e247482 100644 --- a/backend/app/server/event.go +++ b/backend/app/server/event.go @@ -15,6 +15,7 @@ import ( func sanitizeEvent(event *database.DBEvent) { event.Title = sanitize.Scripts(event.Title) event.Description = sanitize.Scripts(event.Description) + event.Timeline = sanitize.Scripts(event.Timeline) event.Rules = sanitize.Scripts(event.Rules) } @@ -78,7 +79,7 @@ func (server *Server) PutEvent(ctx *gin.Context) { userId := session.Get("userId") if userId != nil { var event database.DBEvent - + // taking submitted data and putting it into an object err := ctx.ShouldBindJSON(&event) if err != nil { diff --git a/html/src/lib/pages/EventEdit.svelte b/html/src/lib/pages/EventEdit.svelte index 374639d..0ca19b3 100644 --- a/html/src/lib/pages/EventEdit.svelte +++ b/html/src/lib/pages/EventEdit.svelte @@ -112,6 +112,10 @@ + + + + diff --git a/html/src/lib/pages/HomePage.svelte b/html/src/lib/pages/HomePage.svelte index 83d3f1f..1120165 100644 --- a/html/src/lib/pages/HomePage.svelte +++ b/html/src/lib/pages/HomePage.svelte @@ -26,15 +26,15 @@ {#if $activeEventStore !== null}

    Timeline

    - {$activeEventStore?.Timeline} +
    {@html $activeEventStore?.Timeline}

    Goals

    -
    {$activeEventStore?.Description}
    +
    {@html $activeEventStore?.Description}

    Rules

    -
    {$activeEventStore?.Rules}
    +
    {@html $activeEventStore?.Rules}
    {:else}

    No Active Events, Stay Tuned!

    From 231894cc4abb23077a58da79fc5ebb5aea7db975 Mon Sep 17 00:00:00 2001 From: scottserven Date: Sun, 23 Jun 2024 22:04:39 -0400 Subject: [PATCH 076/155] * Added UserAvatar component * Added UserAvatar to Header, with a Dropdown menu * Added new activeUserStore to resolve race condition issues with the Dropdown menu * optimized Header display to eliminate state flicker on initial load * userStore and loggedInStore are being deprecated * Discord avatars info is being stores on the users table when login occurs. Need to handle background updates somehow still. --- .../migrations/00000009_avatars.up.sql | 1 + backend/app/database/users.go | 14 ++-- backend/app/integrations/generic.go | 3 +- backend/app/server/oauth.go | 2 +- html/package-lock.json | 14 ++-- html/package.json | 2 +- html/src/lib/components/Header.svelte | 79 +++++++++++++------ html/src/lib/components/UserAvatar.svelte | 15 ++++ html/src/lib/models/user.ts | 10 ++- html/src/lib/services/services.ts | 15 +++- html/src/lib/stores/stores.ts | 20 ++++- 11 files changed, 128 insertions(+), 47 deletions(-) create mode 100644 backend/app/database/migrations/00000009_avatars.up.sql create mode 100644 html/src/lib/components/UserAvatar.svelte diff --git a/backend/app/database/migrations/00000009_avatars.up.sql b/backend/app/database/migrations/00000009_avatars.up.sql new file mode 100644 index 0000000..dda99f4 --- /dev/null +++ b/backend/app/database/migrations/00000009_avatars.up.sql @@ -0,0 +1 @@ +ALTER TABLE users ADD COLUMN IF NOT EXISTS avatar_url TEXT; \ No newline at end of file diff --git a/backend/app/database/users.go b/backend/app/database/users.go index 0397824..a3814f0 100644 --- a/backend/app/database/users.go +++ b/backend/app/database/users.go @@ -7,9 +7,10 @@ import ( type DBUser struct { Id pgtype.UUID `db:"id" ` ServiceName string `db:"service_name"` - ServiceUserId string `db:"service_user_id" json:"-"` + ServiceUserId string `db:"service_user_id"` Role string `db:"role"` DisplayName string `db:"display_name"` + AvatarUrl string `db:"avatar_url"` CreatedOn pgtype.Timestamp `db:"created_on" json:"-"` } @@ -18,15 +19,15 @@ const ( Admin = "ADMIN" ) -func CreateUser(serviceName string, serviceUserId string, serviceDisplayName string) DBUser { +func CreateUser(serviceName string, serviceUserId string, serviceDisplayName string, avatarUrl string) DBUser { user, err := GetRow[DBUser]( - `INSERT INTO users (service_name, service_user_id, display_name) - VALUES ($1, $2, $3) + `INSERT INTO users (service_name, service_user_id, display_name, avatar_url) + VALUES ($1, $2, $3, $4) ON CONFLICT (service_name, service_user_id) DO UPDATE - SET display_name = $3 + SET display_name = $3, avatar_url = $4 RETURNING *`, - serviceName, serviceUserId, serviceDisplayName) + serviceName, serviceUserId, serviceDisplayName, avatarUrl) if err != nil { logger.Error("error getting user: %v", err) } @@ -44,4 +45,3 @@ func GetUser(userId pgtype.UUID) DBUser { } return user } - diff --git a/backend/app/integrations/generic.go b/backend/app/integrations/generic.go index 3357e37..6a22098 100644 --- a/backend/app/integrations/generic.go +++ b/backend/app/integrations/generic.go @@ -4,8 +4,8 @@ import ( "codejam.io/integrations/discord" "codejam.io/integrations/github" "codejam.io/logging" - "strings" "encoding/json" + "strings" ) var logger = logging.NewLogger(logging.Options{Name: "Integrations", Level: logging.DEBUG}) @@ -39,6 +39,7 @@ func getDiscordUser(accessToken string) *IntegrationUser { IntegrationName: "discord", UserId: user["id"].(string), DisplayName: user["global_name"].(string), + AvatarUrl: user["avatar"].(string), } } } diff --git a/backend/app/server/oauth.go b/backend/app/server/oauth.go index ef88ba7..9c84f0a 100644 --- a/backend/app/server/oauth.go +++ b/backend/app/server/oauth.go @@ -57,7 +57,7 @@ func (server *Server) GetOAuthCallback(ctx *gin.Context) { integrationName := strings.ToLower(server.Config.OAuth.Provider) providerUser := integrations.GetUser(integrationName, token.AccessToken) if providerUser != nil { - dbUser := database.CreateUser(integrationName, providerUser.UserId, providerUser.DisplayName) + dbUser := database.CreateUser(integrationName, providerUser.UserId, providerUser.DisplayName, providerUser.AvatarUrl) session := sessions.Default(ctx) session.Set("userId", convert.UUIDToString(dbUser.Id)) session.Set("displayName", dbUser.DisplayName) diff --git a/html/package-lock.json b/html/package-lock.json index 262c329..f857f36 100644 --- a/html/package-lock.json +++ b/html/package-lock.json @@ -19,7 +19,7 @@ "@tsconfig/svelte": "^5.0.2", "autoprefixer": "^10.4.16", "flowbite": "^2.3.0", - "flowbite-svelte": "^0.45.0", + "flowbite-svelte": "^0.46.5", "postcss": "^8.4.32", "postcss-load-config": "^5.0.2", "svelte": "^4.2.12", @@ -1435,13 +1435,13 @@ } }, "node_modules/flowbite-svelte": { - "version": "0.45.1", - "resolved": "https://registry.npmjs.org/flowbite-svelte/-/flowbite-svelte-0.45.1.tgz", - "integrity": "sha512-KMimns3ir0ONFUzQqSEtgG1bOdJK1sOCYPN+PpOxR75w456t6k2HYAcbn+fD/nVKbznq0oabD0vr1Errdefacg==", + "version": "0.46.5", + "resolved": "https://registry.npmjs.org/flowbite-svelte/-/flowbite-svelte-0.46.5.tgz", + "integrity": "sha512-YSykTuR4AtD9RpACnrg9fac/fDtK+VB3oNggsM2MOmO9d2qr+bYyb7xdoLeSHepcVI330rEusEBZzTvUnwHfEQ==", "dev": true, "dependencies": { - "@floating-ui/dom": "^1.6.3", - "apexcharts": "^3.48.0", + "@floating-ui/dom": "^1.6.5", + "apexcharts": "^3.49.1", "flowbite": "^2.3.0", "tailwind-merge": "^2.3.0" }, @@ -1450,7 +1450,7 @@ "pnpm": ">=8.0.0" }, "peerDependencies": { - "svelte": "^4.0.0" + "svelte": "^3.55.1 || ^4.0.0" } }, "node_modules/foreground-child": { diff --git a/html/package.json b/html/package.json index c663ce9..d4bf808 100644 --- a/html/package.json +++ b/html/package.json @@ -16,7 +16,7 @@ "@tsconfig/svelte": "^5.0.2", "autoprefixer": "^10.4.16", "flowbite": "^2.3.0", - "flowbite-svelte": "^0.45.0", + "flowbite-svelte": "^0.46.5", "postcss": "^8.4.32", "postcss-load-config": "^5.0.2", "svelte": "^4.2.12", diff --git a/html/src/lib/components/Header.svelte b/html/src/lib/components/Header.svelte index c5df2c4..d75b547 100644 --- a/html/src/lib/components/Header.svelte +++ b/html/src/lib/components/Header.svelte @@ -1,37 +1,70 @@ +
    - - - - - - Home - {#if $loggedInStore} - {#if $userStore?.Role === "ADMIN" } - Manage Events + + + {#await $activeUserStore} + {:then activeUser} + {#if activeUser !== null} + + {#if activeUser != null && activeUser.user != null} +
    + + +
    + + + {activeUser.user?.DisplayName} + Profile + + Logout + {/if} - Sign-Up - My Teams - Logout - {:else} - Login with Discord - {/if} -
    -
    + + + Home + {#if activeUser.user !== null} + {#if activeUser.user?.Role === "ADMIN" } + Manage Events + {/if} + Sign-Up + My Teams + + {:else} + Login with Discord + {/if} + + + {/if} + {/await}
    -
    \ No newline at end of file +
    diff --git a/html/src/lib/components/UserAvatar.svelte b/html/src/lib/components/UserAvatar.svelte new file mode 100644 index 0000000..543b06b --- /dev/null +++ b/html/src/lib/components/UserAvatar.svelte @@ -0,0 +1,15 @@ + + + +{#if user && user.AvatarUrl} + +{:else} + +{/if} \ No newline at end of file diff --git a/html/src/lib/models/user.ts b/html/src/lib/models/user.ts index ed9f09e..c9235ed 100644 --- a/html/src/lib/models/user.ts +++ b/html/src/lib/models/user.ts @@ -1,5 +1,13 @@ export interface User { UserId: string; DisplayName: string; - Role: string + Role: string; + ServiceName : string; + ServiceUserId: string; + AvatarUrl: string; +} + +export interface ActiveUser { + user : User | null; + loggedIn : boolean; } \ No newline at end of file diff --git a/html/src/lib/services/services.ts b/html/src/lib/services/services.ts index b2eb48c..5d0994c 100644 --- a/html/src/lib/services/services.ts +++ b/html/src/lib/services/services.ts @@ -1,6 +1,12 @@ -import { activeEventStore, eventStatusStore, userStore } from "../stores/stores"; +import { + activeEventStore, + eventStatusStore, + userStore, + activeUserStore +} from "../stores/stores"; import CodeJamEvent from "../models/event"; import CodeJamTeam from "../models/team"; +import type {ActiveUser, User} from "../models/user"; // This shouldn't ever need to be set since dev and prod environments will just use relative endpoints export let baseApiUrl: string = ""; @@ -26,10 +32,12 @@ export async function getUser() { .then((response) => { if (response.status === 401) { userStore.set(null); + activeUserStore.set({user: null, loggedIn: false}); } else { response.json() .then((data) => { userStore.set(data); + activeUserStore.set({user: data as User, loggedIn: true}) }) .catch((err) => { console.error("error deserializing user", err); @@ -42,6 +50,7 @@ export async function logout() { return fetch(baseApiUrl + "/user/logout") .then(() => { userStore.set(null); + activeUserStore.set({user: null, loggedIn: false}); }) .catch((err) => { console.error("Logout error", err); @@ -131,9 +140,7 @@ export async function joinTeam(team: CodeJamTeam, userId: string, invite_code: s // Always call at startup to get the initial states async function initialLoad() { - getUser(); - getActiveEvent(); - getEventStatuses(); + await Promise.all([getUser(), getActiveEvent(), getEventStatuses()]); } initialLoad(); \ No newline at end of file diff --git a/html/src/lib/stores/stores.ts b/html/src/lib/stores/stores.ts index d15301d..19fe274 100644 --- a/html/src/lib/stores/stores.ts +++ b/html/src/lib/stores/stores.ts @@ -1,10 +1,26 @@ import {writable, derived} from 'svelte/store'; import CodeJamEvent from "../models/event"; -import { type User } from "../models/user"; +import {type ActiveUser, type User} from "../models/user"; export const activeContent = writable(''); + +/** + * Deprecated - use activeUserStore.user instead + */ export const userStore = writable(null); + +/** + * Deprecated - use activeUserStore.loggedIn instead + */ +export const loggedInStore = derived(userStore, (userData) => userData != null); + +/** + * activeUserStore will allow components to use a single object / store to handle loggedIn logic as well as User + * data handling. This solves a problem with being able to correctly initialize component states based on logged-in and + * User values without causing flickering due to DOM updates. + */ +export const activeUserStore = writable(null); + export const activeEventStore = writable(null); export const eventStatusStore = writable(null); -export const loggedInStore = derived(userStore, (userData) => userData != null); \ No newline at end of file From 195759f2a9dd892361dc7f228e9466bade7d5478 Mon Sep 17 00:00:00 2001 From: scottserven Date: Sun, 23 Jun 2024 22:08:00 -0400 Subject: [PATCH 077/155] fixed compiler warning for empty #await block --- html/src/lib/components/Header.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/html/src/lib/components/Header.svelte b/html/src/lib/components/Header.svelte index d75b547..690a554 100644 --- a/html/src/lib/components/Header.svelte +++ b/html/src/lib/components/Header.svelte @@ -28,6 +28,7 @@ $: activeUrl = '/#' + $location; {#await $activeUserStore} + {:then activeUser} {#if activeUser !== null} From 2844f2f91f6de68c605bcf85fb54c787e2e2af54 Mon Sep 17 00:00:00 2001 From: scottserven Date: Sun, 23 Jun 2024 23:48:15 -0400 Subject: [PATCH 078/155] * Added Profile page for editing users DisplayName --- backend/app/database/users.go | 13 +++++ backend/app/server/user.go | 49 +++++++++++++++++++ html/src/lib/components/Form.svelte | 2 +- html/src/lib/components/Header.svelte | 2 +- html/src/lib/pages/ProfilePage.svelte | 68 +++++++++++++++++++++++++++ html/src/lib/services/services.ts | 8 ++++ html/src/routes.ts | 2 + 7 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 html/src/lib/pages/ProfilePage.svelte diff --git a/backend/app/database/users.go b/backend/app/database/users.go index a3814f0..b7b5122 100644 --- a/backend/app/database/users.go +++ b/backend/app/database/users.go @@ -45,3 +45,16 @@ func GetUser(userId pgtype.UUID) DBUser { } return user } + +func UpdateUser(user DBUser) (DBUser, error) { + user, err := GetRow[DBUser]( + `UPDATE users + SET display_name = $2 + WHERE id = $1 + RETURNING *`, + user.Id, user.DisplayName) + if err != nil { + logger.Error("error updating user: %v", err) + } + return user, err +} diff --git a/backend/app/server/user.go b/backend/app/server/user.go index dc634f7..ca2fe31 100644 --- a/backend/app/server/user.go +++ b/backend/app/server/user.go @@ -2,12 +2,21 @@ package server import ( "codejam.io/database" + "codejam.io/server/models" "github.com/emicklei/pgtalk/convert" "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" "net/http" + "strings" ) +func validateUser(user *database.DBUser, response *models.FormResponse) { + // Title is required + if strings.Trim(user.DisplayName, " ") == "" { + response.AddError("DisplayName", "required") + } +} + func (server *Server) GetUser(ctx *gin.Context) { session := sessions.Default(ctx) userId := session.Get("userId") @@ -19,6 +28,45 @@ func (server *Server) GetUser(ctx *gin.Context) { ctx.Status(http.StatusUnauthorized) } +func (server *Server) PutUser(ctx *gin.Context) { + session := sessions.Default(ctx) + userId := session.Get("userId") + if userId != nil { + var user database.DBUser + err := ctx.ShouldBindJSON(&user) + if err != nil { + ctx.Status(http.StatusBadRequest) + return + } + + response := models.NewFormResponse() + validateUser(&user, &response) + + // Perform validation + validateUser(&user, &response) + if len(response.Errors) > 0 { + logger.Error("Validation Error: %v+", user) + ctx.JSON(http.StatusBadRequest, response) + return + } + + user.Id = convert.StringToUUID(userId.(string)) + _, err = database.UpdateUser(user) + if err != nil { + logger.Error("Error calling database.UpdateEvent: %v", err) + ctx.Status(http.StatusInternalServerError) + return + } else { + response.Data = user + ctx.JSON(http.StatusOK, response) + } + + } else { + logger.Error("PutUser Unauthorized: no session") + ctx.Status(http.StatusUnauthorized) + } +} + // Logout is a GET route for logging out a user. // This involved clearing the session cookie, clearing/deleting the entry from the session store func (server *Server) Logout(ctx *gin.Context) { @@ -40,6 +88,7 @@ func (server *Server) SetupUserRoutes() { group := server.Gin.Group("/user") { group.GET("/", server.GetUser) + group.PUT("/", server.PutUser) group.GET("/logout", server.Logout) } } diff --git a/html/src/lib/components/Form.svelte b/html/src/lib/components/Form.svelte index 8c1a91e..25f1e43 100644 --- a/html/src/lib/components/Form.svelte +++ b/html/src/lib/components/Form.svelte @@ -42,7 +42,7 @@ export const parseResponse = (response: Response) => { if (response.status === 200) { - toast.success("Event Saved Successfully!"); + toast.success("Save Successful!"); } else { toast.error("Error Saving.") response.json() diff --git a/html/src/lib/components/Header.svelte b/html/src/lib/components/Header.svelte index 690a554..15db84b 100644 --- a/html/src/lib/components/Header.svelte +++ b/html/src/lib/components/Header.svelte @@ -45,7 +45,7 @@ $: activeUrl = '/#' + $location; a race condition when the Dropdown doesn't bind and therefore won't work --> {activeUser.user?.DisplayName} - Profile + Profile Logout diff --git a/html/src/lib/pages/ProfilePage.svelte b/html/src/lib/pages/ProfilePage.svelte new file mode 100644 index 0000000..fdf0cb7 --- /dev/null +++ b/html/src/lib/pages/ProfilePage.svelte @@ -0,0 +1,68 @@ + + + + + + +

    Edit Profile

    + {#if formData !== null} +
    +
    + + + +
    +
    + + + {:else} + + {/if} +
    + + +
    \ No newline at end of file diff --git a/html/src/lib/services/services.ts b/html/src/lib/services/services.ts index 5d0994c..10fccb8 100644 --- a/html/src/lib/services/services.ts +++ b/html/src/lib/services/services.ts @@ -46,6 +46,14 @@ export async function getUser() { }); } +export async function putProfile(user: User): Promise { + return fetch(baseApiUrl + "/user/", + { + method: "PUT", + body: JSON.stringify(user) + }); +} + export async function logout() { return fetch(baseApiUrl + "/user/logout") .then(() => { diff --git a/html/src/routes.ts b/html/src/routes.ts index e8211a6..b0f0b0a 100644 --- a/html/src/routes.ts +++ b/html/src/routes.ts @@ -7,6 +7,7 @@ import TeamsCreate from "./lib/pages/TeamsCreate.svelte"; import MyTeam from "./lib/pages/MyTeam.svelte"; import Invite from "./lib/pages/Invite.svelte"; import UserTeams from "./lib/pages/UserTeams.svelte"; +import ProfilePage from "./lib/pages/ProfilePage.svelte"; export default { @@ -20,4 +21,5 @@ export default { '/teams': UserTeams, // displays all the user's teams (private) '/teams/browse': TeamsBrowse, '/teams/create': TeamsCreate, + '/profile': ProfilePage, } \ No newline at end of file From a395d9a16de61861ba7fd1ac62a7bfe282b57d0b Mon Sep 17 00:00:00 2001 From: Eviee Py Date: Tue, 25 Jun 2024 11:07:49 +1000 Subject: [PATCH 079/155] Add debug flags to backend --- backend/app/main.go | 7 +++++++ backend/app/server/oauth.go | 33 ++++++++++++++++++++++++++++++--- backend/app/server/server.go | 1 + 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/backend/app/main.go b/backend/app/main.go index fbc6eaa..5dc2db1 100644 --- a/backend/app/main.go +++ b/backend/app/main.go @@ -1,14 +1,20 @@ package main import ( + "codejam.io/config" "codejam.io/database" + //"codejam.io/logging" + "flag" + "codejam.io/server" "github.com/gin-gonic/gin" ) func main() { + debugArg := flag.Bool("debug", false, "Enable debug mode.") + flag.Parse() // TODO setup logger // Disables the debug logging... Comment this out to enable debug logging for GIN @@ -30,6 +36,7 @@ func main() { server := server.Server{ Config: *config, + Debug: *debugArg, } server.StartServer() } diff --git a/backend/app/server/oauth.go b/backend/app/server/oauth.go index ef88ba7..f9fd1ec 100644 --- a/backend/app/server/oauth.go +++ b/backend/app/server/oauth.go @@ -1,6 +1,10 @@ package server import ( + "net/http" + "os" + "strings" + "codejam.io/database" "codejam.io/integrations" "github.com/emicklei/pgtalk/convert" @@ -8,13 +12,15 @@ import ( "github.com/gin-gonic/gin" "golang.org/x/oauth2" githubOAuth "golang.org/x/oauth2/github" - "net/http" - "os" - "strings" ) // SetupOAuth initializes the OAuth provider specified in the application config. func (server *Server) SetupOAuth() { + if server.Debug { + logger.Warn("Debug mode is set. No OAuth Providers are set!") + return + } + var endpoint oauth2.Endpoint switch strings.ToLower(server.Config.OAuth.Provider) { @@ -40,10 +46,30 @@ func (server *Server) SetupOAuth() { } func (server *Server) GetOAuthRedirect(ctx *gin.Context) { + if server.Debug { + ctx.Redirect(http.StatusFound, "/oauth/debug-login") + return + } + url := server.OAuth.AuthCodeURL(ctx.Request.Header.Get("Referer")) ctx.Redirect(http.StatusFound, url) } +func (server *Server) GetDebugSession(ctx *gin.Context) { + redir := ctx.Query("state") + + session := sessions.Default(ctx) + session.Set("userId", "424384163454517268") + session.Set("displayName", "estha") + err := session.Save() + + if err != nil { + logger.Error("Error saving debug session: %v", err) + } + + ctx.Redirect(http.StatusFound, redir) +} + func (server *Server) GetOAuthCallback(ctx *gin.Context) { authCode := ctx.Query("code") redir := ctx.Query("state") @@ -80,5 +106,6 @@ func (server *Server) SetupOAuthRoutes() { { group.GET("/redirect", server.GetOAuthRedirect) group.GET("/callback", server.GetOAuthCallback) + group.GET("/debug-login", server.GetDebugSession) } } diff --git a/backend/app/server/server.go b/backend/app/server/server.go index a9d082d..1107a7e 100644 --- a/backend/app/server/server.go +++ b/backend/app/server/server.go @@ -18,6 +18,7 @@ type Server struct { Config config.Config OAuth *oauth2.Config Gin *gin.Engine + Debug bool } func (server *Server) SetupSessionStore() { From 1ffffd00c3aa5357a8cdd88804b6ec5c8279ff95 Mon Sep 17 00:00:00 2001 From: Eviee Py Date: Tue, 25 Jun 2024 11:33:33 +1000 Subject: [PATCH 080/155] Add Debug user --- backend/app/server/oauth.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/app/server/oauth.go b/backend/app/server/oauth.go index f9fd1ec..8c6cfde 100644 --- a/backend/app/server/oauth.go +++ b/backend/app/server/oauth.go @@ -58,9 +58,11 @@ func (server *Server) GetOAuthRedirect(ctx *gin.Context) { func (server *Server) GetDebugSession(ctx *gin.Context) { redir := ctx.Query("state") + dbUser := database.CreateUser("discord", "0", "DebugCow") session := sessions.Default(ctx) - session.Set("userId", "424384163454517268") - session.Set("displayName", "estha") + session.Set("userId", convert.UUIDToString(dbUser.Id)) + session.Set("displayName", dbUser.DisplayName) + err := session.Save() if err != nil { From 0829122dc7a7b84174370b0c1bf04190c2efdf8c Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Mon, 24 Jun 2024 18:53:13 -0700 Subject: [PATCH 081/155] route for browsing teams --- backend/app/server/oauth.go | 2 + backend/app/server/teams.go | 4 +- html/src/lib/components/CreateTeamForm.svelte | 1 - html/src/lib/components/Nav.svelte | 2 +- html/src/lib/pages/EventList.svelte | 6 +- html/src/lib/pages/Invite.svelte | 2 +- html/src/lib/pages/MyTeam.svelte | 8 +- html/src/lib/pages/TeamsBrowse.svelte | 100 +++++++++++++----- html/src/lib/pages/UserTeams.svelte | 56 +++++----- html/src/lib/services/services.ts | 3 + html/src/routes.ts | 2 + 11 files changed, 123 insertions(+), 63 deletions(-) diff --git a/backend/app/server/oauth.go b/backend/app/server/oauth.go index 8c6cfde..37b7c09 100644 --- a/backend/app/server/oauth.go +++ b/backend/app/server/oauth.go @@ -60,6 +60,8 @@ func (server *Server) GetDebugSession(ctx *gin.Context) { dbUser := database.CreateUser("discord", "0", "DebugCow") session := sessions.Default(ctx) + session.Set("userId", "16a2adf0-de4c-4f2a-ae3e-c4cff316194e") + session.Set("displayName", "estha") session.Set("userId", convert.UUIDToString(dbUser.Id)) session.Set("displayName", dbUser.DisplayName) diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index 869b32c..3dd2db0 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -50,6 +50,7 @@ func (server *Server) GetAllTeams(ctx *gin.Context) { ctx.JSON(http.StatusOK, teams) } else { ctx.Status(http.StatusInternalServerError) + return } } @@ -255,7 +256,7 @@ func (server *Server) SetupTeamRoutes() { group := server.Gin.Group("/team") { group.POST("/", server.CreateTeam) - group.GET("/", server.GetAllTeams) + //group.GET("/", server.GetAllTeams) group.GET("/:id", server.GetTeamInfo) group.GET("/invite/:invitecode", server.GetTeamInfoByInviteCode) // group.PUT("/:id", server.UpdateTeam) @@ -263,4 +264,5 @@ func (server *Server) SetupTeamRoutes() { } server.Gin.GET("/teams", server.GetUserTeams) // I think this works rofl + server.Gin.GET("/teams/browse", server.GetAllTeams) } diff --git a/html/src/lib/components/CreateTeamForm.svelte b/html/src/lib/components/CreateTeamForm.svelte index c1ab41e..4e07535 100644 --- a/html/src/lib/components/CreateTeamForm.svelte +++ b/html/src/lib/components/CreateTeamForm.svelte @@ -63,7 +63,6 @@ function saveForm() { // const teamId = pathSegments[pathSegments.length - 1]; response.json() .then((data) => { - console.log(data.id) // Stepp 1: GET team info // this uses routes.ts --> MyTeam.svelte page diff --git a/html/src/lib/components/Nav.svelte b/html/src/lib/components/Nav.svelte index a710f38..18c9edf 100644 --- a/html/src/lib/components/Nav.svelte +++ b/html/src/lib/components/Nav.svelte @@ -10,7 +10,7 @@ function setActiveContent(content: string) { activeContent.set(content); console.log(activeContent); - if (loggedIn) { + if ($loggedInStore) { document.getElementById(content)?.classList.add('card-module'); } } diff --git a/html/src/lib/pages/EventList.svelte b/html/src/lib/pages/EventList.svelte index 8b7ab60..0832f48 100644 --- a/html/src/lib/pages/EventList.svelte +++ b/html/src/lib/pages/EventList.svelte @@ -11,7 +11,7 @@ import {eventStatusStore} from "../stores/stores"; let events : Array = new Array(); -let statuses = null +let statuses: any = null // Implicit any type? function editEvent(eventId: string) { window.location.href = '/#/admin/event/' + eventId; @@ -25,7 +25,7 @@ function getEventStatus(statusId: number): string { if (event !== null) { return event.Title; } - return ''; + return ''; // Should this be unindented? (In the outter scope) - Mysty {See line 20 : string} } } @@ -50,7 +50,7 @@ onMount(() => { -

    My Events

    +

    Events

    diff --git a/html/src/lib/pages/Invite.svelte b/html/src/lib/pages/Invite.svelte index 3e6a725..6f7f0f8 100644 --- a/html/src/lib/pages/Invite.svelte +++ b/html/src/lib/pages/Invite.svelte @@ -12,7 +12,7 @@ import DiscordIcon from '../components/DiscordIcon.svelte'; export let params: any; // set by svelte-spa-router - console.log(params) // returns Object { invitecode: "d1869a59b4fdf3" } + //console.log(params) // returns Object { invitecode: "d1869a59b4fdf3" } console.log(params.invitecode) let teamData: CodeJamTeam | null = null; diff --git a/html/src/lib/pages/MyTeam.svelte b/html/src/lib/pages/MyTeam.svelte index 8fed596..33582c9 100644 --- a/html/src/lib/pages/MyTeam.svelte +++ b/html/src/lib/pages/MyTeam.svelte @@ -9,7 +9,10 @@ import CodeJamEvent from '../models/event'; import { loggedInStore, userStore } from '../stores/stores'; - export let params: any; // set by svelte-spa-router + interface Params { // THis is what the params is because you pass an id with type of string. + id: string + } + export let params: Params; let teamData: CodeJamTeam | null = null; let teamMembers: TeamMember[] = []; @@ -26,14 +29,13 @@ teamEvent = data.Event; } catch (err) { error = `Failed to load team data: ${err}`; - console.error(err); } finally { loading = false; } } $: if (params) { - loadData(params.id); + loadData(params.id); // See this doesn't error cause it expects an id: You can run to see I guess } diff --git a/html/src/lib/pages/TeamsBrowse.svelte b/html/src/lib/pages/TeamsBrowse.svelte index dd87054..8746f1c 100644 --- a/html/src/lib/pages/TeamsBrowse.svelte +++ b/html/src/lib/pages/TeamsBrowse.svelte @@ -1,32 +1,82 @@ + } catch (err) { + error = `Failed to load team data: ${err}`; + console.error(error) + } finally { + loading = false; + } +} + +loadData(); + + - + + +

    Browse All Teams

    - -

    Current Teams

    -
    -
    - - -

    Team 1

    -

    Join us, we're the best!

    -

    - - -
    -
    + {#if loading} +
    Loading...
    + {:else if error} +
    {error}
    -
    + {:else if allTeams.length == 0} +
    + Looks like you don't have any teams! Go to browse teams to join one! +
    + {:else if allTeams == null} +
    + Error, please contact admin. +
    + {:else} + + {#each allTeams as Team} + +
    +

    Team {Team.Name}

    +
    + + Visibility: {Team.Visibility} + + + Technologies: {Team.Technologies} + + + Availability: {Team.Availability} + + + Description: {Team.Description} + + + +
    + + + {/each} + + + {/if} +
    + +
    \ No newline at end of file diff --git a/html/src/lib/pages/UserTeams.svelte b/html/src/lib/pages/UserTeams.svelte index f7db226..826c11d 100644 --- a/html/src/lib/pages/UserTeams.svelte +++ b/html/src/lib/pages/UserTeams.svelte @@ -1,37 +1,37 @@ diff --git a/html/src/lib/services/services.ts b/html/src/lib/services/services.ts index b2eb48c..9f3a1dc 100644 --- a/html/src/lib/services/services.ts +++ b/html/src/lib/services/services.ts @@ -103,6 +103,9 @@ export async function postTeam(team: CodeJamTeam) { }); } +export async function getTeams() { + return await fetch(baseApiUrl + "/teams/browse") +} export async function getUserTeams(){ return fetch(baseApiUrl + "/teams"); } diff --git a/html/src/routes.ts b/html/src/routes.ts index e8211a6..4a36a2d 100644 --- a/html/src/routes.ts +++ b/html/src/routes.ts @@ -9,6 +9,7 @@ import Invite from "./lib/pages/Invite.svelte"; import UserTeams from "./lib/pages/UserTeams.svelte"; + export default { '/': HomePage, '/home': HomePage, @@ -20,4 +21,5 @@ export default { '/teams': UserTeams, // displays all the user's teams (private) '/teams/browse': TeamsBrowse, '/teams/create': TeamsCreate, + } \ No newline at end of file From ad857f92a23cdca3a2211d1d926ddf58d09f0532 Mon Sep 17 00:00:00 2001 From: Eviee Py Date: Tue, 25 Jun 2024 12:04:47 +1000 Subject: [PATCH 082/155] Fix teams/browse endpoint --- html/src/lib/pages/TeamsBrowse.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/html/src/lib/pages/TeamsBrowse.svelte b/html/src/lib/pages/TeamsBrowse.svelte index 8746f1c..038bf6c 100644 --- a/html/src/lib/pages/TeamsBrowse.svelte +++ b/html/src/lib/pages/TeamsBrowse.svelte @@ -40,11 +40,11 @@ loadData(); {:else if error}
    {error}
    - {:else if allTeams.length == 0} + {:else if allTeams === null}
    Looks like you don't have any teams! Go to browse teams to join one!
    - {:else if allTeams == null} + {:else if allTeams.length === 0}
    Error, please contact admin.
    From f6ae698e1b1b1f252228f2dc33bec11822e673f9 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Mon, 24 Jun 2024 19:26:59 -0700 Subject: [PATCH 083/155] fix debugcow, userId check, and order of operations in team views --- backend/app/server/oauth.go | 2 -- backend/app/server/teams.go | 9 ++----- html/src/lib/pages/TeamsBrowse.svelte | 8 ++++--- html/src/lib/pages/UserTeams.svelte | 34 ++++----------------------- 4 files changed, 12 insertions(+), 41 deletions(-) diff --git a/backend/app/server/oauth.go b/backend/app/server/oauth.go index 37b7c09..8c6cfde 100644 --- a/backend/app/server/oauth.go +++ b/backend/app/server/oauth.go @@ -60,8 +60,6 @@ func (server *Server) GetDebugSession(ctx *gin.Context) { dbUser := database.CreateUser("discord", "0", "DebugCow") session := sessions.Default(ctx) - session.Set("userId", "16a2adf0-de4c-4f2a-ae3e-c4cff316194e") - session.Set("displayName", "estha") session.Set("userId", convert.UUIDToString(dbUser.Id)) session.Set("displayName", dbUser.DisplayName) diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index 3dd2db0..f38900c 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -166,18 +166,12 @@ func (server *Server) CreateTeam(ctx *gin.Context) { // Step 4: Post Team Data API (TWO PARTS 1) create team 2) add team members) session := sessions.Default(ctx) userId := session.Get("userId") - if userId != nil { - ctx.Status(http.StatusUnauthorized) - return - } + strUserId := userId.(string) var team database.DBTeam var teamReq CreateTeamRequest - // var tempMember CreateTeamMember - // shouldbindJSON binds the POST-req-JSON-info to the provided structure in () - // err should be (ctx feature) err := ctx.ShouldBindJSON(&teamReq) if err != nil { logger.Error("CreateTeam Request ShouldBindJSON error: %v", err) @@ -203,6 +197,7 @@ func (server *Server) CreateTeam(ctx *gin.Context) { team.InviteCode = md5code fmt.Printf("%+v", team) + // INSERTS TEAM into DB // PART 1/2 DONE teamUUID, err := database.CreateTeam(team) diff --git a/html/src/lib/pages/TeamsBrowse.svelte b/html/src/lib/pages/TeamsBrowse.svelte index 038bf6c..0edbd3f 100644 --- a/html/src/lib/pages/TeamsBrowse.svelte +++ b/html/src/lib/pages/TeamsBrowse.svelte @@ -42,12 +42,14 @@ loadData(); {:else if allTeams === null}
    - Looks like you don't have any teams! Go to browse teams to join one! + Error, please contact admin.
    - {:else if allTeams.length === 0} + + {:else if allTeams.length === 0}
    - Error, please contact admin. + Looks like you don't have any teams! Go to browse teams to join one!
    + {:else} {#each allTeams as Team} diff --git a/html/src/lib/pages/UserTeams.svelte b/html/src/lib/pages/UserTeams.svelte index 826c11d..2af5ece 100644 --- a/html/src/lib/pages/UserTeams.svelte +++ b/html/src/lib/pages/UserTeams.svelte @@ -49,19 +49,15 @@ If not team owner, cannot view-->
    Loading...
    {:else if error}
    {error}
    - - {:else if userTeams.length == 0} + {:else if userTeams === null}
    - Looks like you don't have any teams! Go to browse teams to join one! + Error, please contact admin.
    - {:else if userTeams == null} + {:else if userTeams.length === 0}
    - Error, please contact admin. + Looks like you don't have any teams! Go to browse teams to join one!
    {:else} - hi - - {userTeams} {#each userTeams as userTeam}
    @@ -80,27 +76,7 @@ If not team owner, cannot view--> Description: {userTeam.Description} - + From 190fc4debbe4d9cd06d063f4eb936fff48d3edd4 Mon Sep 17 00:00:00 2001 From: scottserven Date: Tue, 25 Jun 2024 23:52:25 -0400 Subject: [PATCH 084/155] * Only allows Sign-up menu item when status is SIGNUP or STARTED * Fixed error where CreateTeam was returning a 401 because of backwards session checking logic --- backend/app/database/events.go | 18 ++++++++++++++- backend/app/server/event.go | 29 +++++++++++++++++------ backend/app/server/teams.go | 33 +++++++++++++++++++++------ html/src/lib/components/Header.svelte | 6 +++-- html/src/lib/models/event.ts | 3 ++- 5 files changed, 71 insertions(+), 18 deletions(-) diff --git a/backend/app/database/events.go b/backend/app/database/events.go index 8e8aea8..af66221 100644 --- a/backend/app/database/events.go +++ b/backend/app/database/events.go @@ -1,6 +1,8 @@ package database -import "github.com/jackc/pgx/v5/pgtype" +import ( + "github.com/jackc/pgx/v5/pgtype" +) type DBEvent struct { Id pgtype.UUID `db:"id"` @@ -23,6 +25,20 @@ type DBEventStatus struct { Description string `db:"description"` } +type DBEventStatusCode struct { + Code string `db:"code"` +} + +func GetEventStatusCode(eventId pgtype.UUID) (string, error) { + result, err := GetRow[DBEventStatusCode]( + `SELECT code + FROM events + INNER JOIN statuses ON (events.status_id = statuses.id) + WHERE events.id = $1`, + eventId) + return result.Code, err +} + func CreateEvent(organizerUserId pgtype.UUID) (DBEvent, error) { var event DBEvent event, err := GetRow[DBEvent]( diff --git a/backend/app/server/event.go b/backend/app/server/event.go index e247482..f4779c7 100644 --- a/backend/app/server/event.go +++ b/backend/app/server/event.go @@ -3,6 +3,7 @@ package server import ( "codejam.io/database" "codejam.io/server/models" + "errors" "github.com/emicklei/pgtalk/convert" "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" @@ -12,6 +13,11 @@ import ( "strings" ) +type CodeJamEvent struct { + database.DBEvent + AllowSignups bool +} + func sanitizeEvent(event *database.DBEvent) { event.Title = sanitize.Scripts(event.Title) event.Description = sanitize.Scripts(event.Description) @@ -48,14 +54,23 @@ func (server *Server) GetEvent(ctx *gin.Context) { func (server *Server) GetActiveEvent(ctx *gin.Context) { event, err := database.GetActiveEvent() - if err == nil { - ctx.JSON(http.StatusOK, event) - } else if err == pgx.ErrNoRows { - ctx.Status(http.StatusNoContent) - } else { - logger.Error("GetActiveEvent error: %v", err) - ctx.Status(http.StatusInternalServerError) + + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + // NoRows means no active event exist (or it's still set to PLANNING) + ctx.Status(http.StatusNoContent) + } else { + logger.Error("GetActiveEvent error: %v", err) + ctx.Status(http.StatusInternalServerError) + } + return + } + + var codeJamEvent = CodeJamEvent{ + DBEvent: event, + AllowSignups: server.signupsAllowed(convert.UUIDToString(event.Id)), } + ctx.JSON(http.StatusOK, codeJamEvent) } func (server *Server) PostEvent(ctx *gin.Context) { diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index 869b32c..0f030d7 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -44,6 +44,20 @@ func MD5HashCode(teamName string) (string, error) { return hex.EncodeToString(hash[:7]), nil } +func (server *Server) signupsAllowed(eventId string) bool { + statusCode, err := database.GetEventStatusCode(convert.StringToUUID(eventId)) + if err != nil { + logger.Error("Error in GetEventStatusCode: %v+", err) + return false + } + + if statusCode == "SIGNUP" || statusCode == "STARTED" { + return true + } else { + return false + } +} + func (server *Server) GetAllTeams(ctx *gin.Context) { teams, err := database.GetTeams() if err == nil { @@ -69,15 +83,15 @@ func (server *Server) GetUserTeams(ctx *gin.Context) { if err != nil { ctx.Status(http.StatusInternalServerError) return - } + } //1. join databse to return members ctx.JSON(http.StatusOK, teams) - - // add all the GetTeamResponse to []GetTeamResponse - // loop through teams, get team id - // assign each team to teamResponse type.. - + + // add all the GetTeamResponse to []GetTeamResponse + // loop through teams, get team id + // assign each team to teamResponse type.. + } // stepp 4: GET team info @@ -165,7 +179,7 @@ func (server *Server) CreateTeam(ctx *gin.Context) { // Step 4: Post Team Data API (TWO PARTS 1) create team 2) add team members) session := sessions.Default(ctx) userId := session.Get("userId") - if userId != nil { + if userId == nil { ctx.Status(http.StatusUnauthorized) return } @@ -184,6 +198,11 @@ func (server *Server) CreateTeam(ctx *gin.Context) { return } + if !server.signupsAllowed(teamReq.EventId) { + ctx.Status(http.StatusForbidden) + return + } + // CONVERT teamReq to team team.EventId = convert.StringToUUID(teamReq.EventId) team.Name = teamReq.Name diff --git a/html/src/lib/components/Header.svelte b/html/src/lib/components/Header.svelte index 15db84b..26cbe3d 100644 --- a/html/src/lib/components/Header.svelte +++ b/html/src/lib/components/Header.svelte @@ -11,7 +11,7 @@ import { NavLi, NavUl } from "flowbite-svelte"; -import {activeUserStore} from "../stores/stores"; +import {activeUserStore, activeEventStore} from "../stores/stores"; import DiscordIcon from "./DiscordIcon.svelte"; import {location} from "svelte-spa-router"; import UserAvatar from "./UserAvatar.svelte"; @@ -57,7 +57,9 @@ $: activeUrl = '/#' + $location; {#if activeUser.user?.Role === "ADMIN" } Manage Events {/if} - Sign-Up + {#if $activeEventStore && $activeEventStore.AllowSignups} + Sign-Up + {/if} My Teams {:else} diff --git a/html/src/lib/models/event.ts b/html/src/lib/models/event.ts index e35b1bd..cec72c6 100644 --- a/html/src/lib/models/event.ts +++ b/html/src/lib/models/event.ts @@ -1,4 +1,3 @@ - class CodeJamEvent { Id : string; @@ -7,6 +6,7 @@ class CodeJamEvent { Description: string; Timeline: string; Rules: string; + AllowSignups: boolean; constructor() { this.Id = ''; @@ -15,6 +15,7 @@ class CodeJamEvent { this.Description = ''; this.Rules = ''; this.Timeline = ''; + this.AllowSignups = false; } } From 2ffb02ff142de81a67ac6aa2102e70eda675e969 Mon Sep 17 00:00:00 2001 From: scottserven Date: Wed, 26 Jun 2024 00:13:57 -0400 Subject: [PATCH 085/155] Added additional status options and introduced sorting field for them --- backend/app/database/events.go | 3 ++- .../migrations/00000010_signup_status.down.sql | 3 +++ .../migrations/00000010_signup_status.up.sql | 12 ++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 backend/app/database/migrations/00000010_signup_status.down.sql create mode 100644 backend/app/database/migrations/00000010_signup_status.up.sql diff --git a/backend/app/database/events.go b/backend/app/database/events.go index af66221..ad3f84e 100644 --- a/backend/app/database/events.go +++ b/backend/app/database/events.go @@ -23,6 +23,7 @@ type DBEventStatus struct { Code string `db:"code"` Title string `db:"title"` Description string `db:"description"` + Sort int `db:"sort"` } type DBEventStatusCode struct { @@ -97,6 +98,6 @@ func UpdateEvent(event DBEvent) (DBEvent, error) { } func GetStatuses() ([]DBEventStatus, error) { - statuses, err := GetRows[DBEventStatus](`SELECT * FROM statuses`) + statuses, err := GetRows[DBEventStatus](`SELECT * FROM statuses ORDER BY sort`) return statuses, err } diff --git a/backend/app/database/migrations/00000010_signup_status.down.sql b/backend/app/database/migrations/00000010_signup_status.down.sql new file mode 100644 index 0000000..0b44460 --- /dev/null +++ b/backend/app/database/migrations/00000010_signup_status.down.sql @@ -0,0 +1,3 @@ +ALTER TABLE statuses DROP COLUMN sort; + +DELETE FROM statuses WHERE code in ('SIGNUP', 'COMPLETED'); \ No newline at end of file diff --git a/backend/app/database/migrations/00000010_signup_status.up.sql b/backend/app/database/migrations/00000010_signup_status.up.sql new file mode 100644 index 0000000..f7093f9 --- /dev/null +++ b/backend/app/database/migrations/00000010_signup_status.up.sql @@ -0,0 +1,12 @@ +ALTER TABLE statuses ADD COLUMN IF NOT EXISTS sort int; + +INSERT INTO statuses (code, title, description) VALUES ('SIGNUP', 'Signups Accepted', 'Users may begin signing up and creating teams.'); +INSERT INTO statuses (code, title, description) VALUES ('COMPLETED', 'Complete', 'Competition is over. Results may still be viewed, but not more voting is allowed'); + +UPDATE statuses SET sort = 1 WHERE code='PLANNING'; +UPDATE statuses SET sort = 2 WHERE code='PUBLISHED'; +UPDATE statuses SET sort = 3 WHERE code='SIGNUP'; +UPDATE statuses SET sort = 4 WHERE code='STARTED'; +UPDATE statuses SET sort = 5 WHERE code='ENDED'; +UPDATE statuses SET sort = 6 WHERE code='VOTING'; +UPDATE statuses SET sort = 7 WHERE code='COMPLETED'; From 87ae62c3e8a37ba44d76fd6b2640b59af7fdaaa8 Mon Sep 17 00:00:00 2001 From: scottserven Date: Wed, 26 Jun 2024 00:21:05 -0400 Subject: [PATCH 086/155] fix key constraint violation with latest migration --- backend/app/database/migrations/00000010_signup_status.up.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/app/database/migrations/00000010_signup_status.up.sql b/backend/app/database/migrations/00000010_signup_status.up.sql index f7093f9..9dfae8b 100644 --- a/backend/app/database/migrations/00000010_signup_status.up.sql +++ b/backend/app/database/migrations/00000010_signup_status.up.sql @@ -1,7 +1,7 @@ ALTER TABLE statuses ADD COLUMN IF NOT EXISTS sort int; -INSERT INTO statuses (code, title, description) VALUES ('SIGNUP', 'Signups Accepted', 'Users may begin signing up and creating teams.'); -INSERT INTO statuses (code, title, description) VALUES ('COMPLETED', 'Complete', 'Competition is over. Results may still be viewed, but not more voting is allowed'); +INSERT INTO statuses (id, code, title, description) VALUES (6, 'SIGNUP', 'Signups Accepted', 'Users may begin signing up and creating teams.'); +INSERT INTO statuses (id, code, title, description) VALUES (7, 'COMPLETED', 'Complete', 'Competition is over. Results may still be viewed, but not more voting is allowed'); UPDATE statuses SET sort = 1 WHERE code='PLANNING'; UPDATE statuses SET sort = 2 WHERE code='PUBLISHED'; From 283fee431a29d8ed74be4df28258879408c91c00 Mon Sep 17 00:00:00 2001 From: scottserven Date: Wed, 26 Jun 2024 00:25:55 -0400 Subject: [PATCH 087/155] don't show My Teams unless signup are allowed --- html/src/lib/components/Header.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/src/lib/components/Header.svelte b/html/src/lib/components/Header.svelte index 26cbe3d..c7146d7 100644 --- a/html/src/lib/components/Header.svelte +++ b/html/src/lib/components/Header.svelte @@ -59,8 +59,8 @@ $: activeUrl = '/#' + $location; {/if} {#if $activeEventStore && $activeEventStore.AllowSignups} Sign-Up + My Teams {/if} - My Teams {:else} Login with Discord From 1863983a81006af67b33008db1e27c1aeff00e3b Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Wed, 26 Jun 2024 20:32:20 -0700 Subject: [PATCH 088/155] add avatar_url string to debugcow args in oauth --- backend/app/server/oauth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/server/oauth.go b/backend/app/server/oauth.go index 6a8fd28..b295c80 100644 --- a/backend/app/server/oauth.go +++ b/backend/app/server/oauth.go @@ -58,7 +58,7 @@ func (server *Server) GetOAuthRedirect(ctx *gin.Context) { func (server *Server) GetDebugSession(ctx *gin.Context) { redir := ctx.Query("state") - dbUser := database.CreateUser("discord", "0", "DebugCow") + dbUser := database.CreateUser("discord", "0", "DebugCow", "") session := sessions.Default(ctx) session.Set("userId", convert.UUIDToString(dbUser.Id)) session.Set("displayName", dbUser.DisplayName) From 8f6cc0c226f73369a968939d1811b0c4aea83047 Mon Sep 17 00:00:00 2001 From: scottserven Date: Sat, 29 Jun 2024 02:12:03 -0400 Subject: [PATCH 089/155] added Execution function in postgres.go so queries that don't return a result can be run --- backend/app/database/postgres.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/backend/app/database/postgres.go b/backend/app/database/postgres.go index 6b25020..330032a 100644 --- a/backend/app/database/postgres.go +++ b/backend/app/database/postgres.go @@ -81,3 +81,21 @@ func GetRows[T any](query string, args ...any) ([]T, error) { return result, nil } + +func Execute(query string, args ...any) error { + conn, err := Pool.Acquire(context.Background()) + if err != nil { + logger.Error("acquire conn error %v", err) + return err + } + defer conn.Release() + + _, err = conn.Query(context.Background(), + query, + args...) + if err != nil { + logger.Error("Query Execute Error: %v", err) + } + + return nil +} From 8e11718a283b979c140056c5fe08b30898837438 Mon Sep 17 00:00:00 2001 From: scottserven Date: Sat, 29 Jun 2024 13:31:41 -0400 Subject: [PATCH 090/155] * New Header menu for Admin * Event List was moved under Admin menu * Added User List page, accessible under Admin menu * Added User fields to banning/locking display names --- .../migrations/00000011_admin_users.up.sql | 12 + backend/app/database/users.go | 85 +++++-- backend/app/integrations/generic.go | 10 +- backend/app/server/admin_common_api.go | 88 ++++++++ backend/app/server/admin_user_api.go | 122 ++++++++++ backend/app/server/event.go | 7 +- backend/app/server/oauth.go | 2 +- backend/app/server/server.go | 2 + backend/app/server/user.go | 9 +- html/src/lib/components/Header.svelte | 6 +- html/src/lib/models/user.ts | 5 +- .../lib/pages/{ => admin}/EventEdit.svelte | 12 +- .../lib/pages/{ => admin}/EventList.svelte | 8 +- html/src/lib/pages/admin/UserList.svelte | 208 ++++++++++++++++++ html/src/lib/services/adminServices.ts | 71 ++++++ html/src/routes.ts | 12 +- 16 files changed, 622 insertions(+), 37 deletions(-) create mode 100644 backend/app/database/migrations/00000011_admin_users.up.sql create mode 100644 backend/app/server/admin_common_api.go create mode 100644 backend/app/server/admin_user_api.go rename html/src/lib/pages/{ => admin}/EventEdit.svelte (90%) rename html/src/lib/pages/{ => admin}/EventList.svelte (89%) create mode 100644 html/src/lib/pages/admin/UserList.svelte create mode 100644 html/src/lib/services/adminServices.ts diff --git a/backend/app/database/migrations/00000011_admin_users.up.sql b/backend/app/database/migrations/00000011_admin_users.up.sql new file mode 100644 index 0000000..9b334a7 --- /dev/null +++ b/backend/app/database/migrations/00000011_admin_users.up.sql @@ -0,0 +1,12 @@ +-- capture the original user so admins can see it without having to lookup a discord id +ALTER TABLE users ADD COLUMN IF NOT EXISTS service_user_name TEXT; + +-- allow for a user to be disabled or banned, or have some other sort of status that's TBD +ALTER TABLE users ADD COLUMN IF NOT EXISTS account_status TEXT DEFAULT 'ACTIVE'; + +-- allow for a user to be prevented from modifying their display name +ALTER TABLE users ADD COLUMN IF NOT EXISTS lock_display_name BOOLEAN DEFAULT FALSE; + +-- assumes no real users are in the system yet +UPDATE users SET service_user_name = display_name; + diff --git a/backend/app/database/users.go b/backend/app/database/users.go index b7b5122..499550e 100644 --- a/backend/app/database/users.go +++ b/backend/app/database/users.go @@ -1,17 +1,21 @@ package database import ( + "github.com/emicklei/pgtalk/convert" "github.com/jackc/pgx/v5/pgtype" ) type DBUser struct { - Id pgtype.UUID `db:"id" ` - ServiceName string `db:"service_name"` - ServiceUserId string `db:"service_user_id"` - Role string `db:"role"` - DisplayName string `db:"display_name"` - AvatarUrl string `db:"avatar_url"` - CreatedOn pgtype.Timestamp `db:"created_on" json:"-"` + Id pgtype.UUID `db:"id" ` + ServiceName string `db:"service_name"` + ServiceUserId string `db:"service_user_id"` + ServiceUserName string `db:"service_user_name"` + Role string `db:"role"` + DisplayName string `db:"display_name"` + AvatarUrl string `db:"avatar_url"` + AccountStatus string `db:"account_status"` + LockDisplayName bool `db:"lock_display_name"` + CreatedOn pgtype.Timestamp `db:"created_on" json:"-"` } // Roles @@ -21,11 +25,11 @@ const ( func CreateUser(serviceName string, serviceUserId string, serviceDisplayName string, avatarUrl string) DBUser { user, err := GetRow[DBUser]( - `INSERT INTO users (service_name, service_user_id, display_name, avatar_url) - VALUES ($1, $2, $3, $4) + `INSERT INTO users (service_name, service_user_id, service_user_name, display_name, avatar_url) + VALUES ($1, $2, $3, $3, $4) ON CONFLICT (service_name, service_user_id) DO UPDATE - SET display_name = $3, avatar_url = $4 + SET service_user_name = $3, avatar_url = $4 RETURNING *`, serviceName, serviceUserId, serviceDisplayName, avatarUrl) if err != nil { @@ -34,16 +38,17 @@ func CreateUser(serviceName string, serviceUserId string, serviceDisplayName str return user } -func GetUser(userId pgtype.UUID) DBUser { +func GetUser(userId pgtype.UUID) (DBUser, error) { user, err := GetRow[DBUser]( - `SELECT * + `SELECT + * FROM users WHERE id = $1`, userId) if err != nil { - logger.Error("error getting user: %v", err) + logger.Error("error getting user: id: %s, error: %v", convert.UUIDToString(userId), err) } - return user + return user, err } func UpdateUser(user DBUser) (DBUser, error) { @@ -58,3 +63,55 @@ func UpdateUser(user DBUser) (DBUser, error) { } return user, err } + +func GetAllUsers() ([]DBUser, error) { + users, err := GetRows[DBUser]( + `SELECT * + FROM users + ORDER BY ( + CASE -- put empty roles after actual roles + WHEN role is not null and length(role) > 0 then role + ELSE 'zzz' + END + ), service_user_name`) + return users, err +} + +func SetAccountStatus(userId pgtype.UUID, status string) (DBUser, error) { + user, err := GetRow[DBUser]( + `UPDATE users + SET account_status = $2 + WHERE id= $1 + RETURNING *`, + userId, status) + if err != nil { + logger.Error("SetAccountStatus Error: %v", err) + } + return user, err +} + +func SetDisplayName(userId pgtype.UUID, displayName string) (DBUser, error) { + user, err := GetRow[DBUser]( + `UPDATE users + SET display_name = $2 + WHERE id = $1 + RETURNING *`, + userId, displayName) + if err != nil { + logger.Error("SetDisplayName Error: %v", err) + } + return user, err +} + +func SetDisplayNameLock(userId pgtype.UUID, locked bool) (DBUser, error) { + user, err := GetRow[DBUser]( + `UPDATE users + SET lock_display_name = $2 + WHERE id = $1 + RETURNING *`, + userId, locked) + if err != nil { + logger.Error("SetDisplayNameLock Error: %v", err) + } + return user, err +} diff --git a/backend/app/integrations/generic.go b/backend/app/integrations/generic.go index 6a22098..88936d3 100644 --- a/backend/app/integrations/generic.go +++ b/backend/app/integrations/generic.go @@ -13,7 +13,7 @@ var logger = logging.NewLogger(logging.Options{Name: "Integrations", Level: logg type IntegrationUser struct { IntegrationName string UserId string - DisplayName string + ServiceUserName string AvatarUrl string } @@ -35,11 +35,15 @@ func getDiscordUser(accessToken string) *IntegrationUser { logger.Error("User not found for token: %s", accessToken) return nil } else { + var avatar = "" + if user["avatar"] != nil { + avatar = user["avatar"].(string) + } return &IntegrationUser{ IntegrationName: "discord", UserId: user["id"].(string), - DisplayName: user["global_name"].(string), - AvatarUrl: user["avatar"].(string), + ServiceUserName: user["global_name"].(string), + AvatarUrl: avatar, } } } diff --git a/backend/app/server/admin_common_api.go b/backend/app/server/admin_common_api.go new file mode 100644 index 0000000..6bfb436 --- /dev/null +++ b/backend/app/server/admin_common_api.go @@ -0,0 +1,88 @@ +package server + +import ( + "codejam.io/database" + "github.com/emicklei/pgtalk/convert" + "github.com/gin-contrib/sessions" + "github.com/gin-gonic/gin" + "net/http" +) + +// VerifyAdminAccess checks if the user has admin access by retrieving the session user account +// and verifying if their role is 'ADMIN'. Appropriate HTTP responses will be set automatically. +// Returns true if the user has admin access, false otherwise. +func (server *Server) VerifyAdminAccess(ctx *gin.Context) bool { + session := sessions.Default(ctx) + userId := session.Get("userId") + if userId == nil { + ctx.Status(http.StatusUnauthorized) + return false + } + + // get the session user account so we can verify they're an admin - TODO, pull from cache + currentUser, err := database.GetUser(convert.StringToUUID(userId.(string))) + if err != nil { + logger.Error("AdminAccessVerified: GetUser for session user error: %v", err) + ctx.Status(http.StatusInternalServerError) + return false + } + + if currentUser.Role != database.Admin { + logger.Error("AdminAccessVerified: unauthorized user: %v", userId) + ctx.Status(http.StatusForbidden) + return false + } + + return true +} + +// UserIsAdmin checks if the user with the given userId has admin access by retrieving the user from the database +// and verifying if their role is 'ADMIN'. Returns true if the user has admin access, false otherwise. +func (server *Server) UserIsAdmin(userId string) (bool, error) { + user, err := database.GetUser(convert.StringToUUID(userId)) + if err != nil { + return false, err + } + + if user.Role == database.Admin { + return true, nil + } + + return false, nil +} + +// VerifyUserNotAdmin checks if the user identified by the given userId is not an admin. This is +// for scenarios when admin accounts should not allow operations to take place on them, such as +// moderation actions. +// Appropriate HTTP responses are set automatically. +// Returns true if the user is not an admin, false otherwise. +func (server *Server) VerifyUserNotAdmin(ctx *gin.Context, userId string) bool { + // Admin accounts cannot be locked, even by other admins + isAdmin, err := server.UserIsAdmin(userId) + if err != nil { + logger.Error("VerifyUserNotAdmin: UserIsAdmin error: %v", err) + ctx.Status(http.StatusInternalServerError) + return false + } + + if isAdmin { + logger.Error("VerifyUserNotAdmin: UserIsAdmin TRUE") + ctx.Status(http.StatusForbidden) + return false + } + + return true +} + +// DeserializeRequest is a helper function to handle deserialization and automatically handling errors. +// Appropriate HTTP responses are set automatically +// Returns true if the request deserialized successfully, false otherwise +func (server *Server) DeserializeRequest(ctx *gin.Context, request any) bool { + err := ctx.ShouldBindJSON(&request) + if err != nil { + logger.Error("%T ShouldBindJSON error: %v", request, err) + ctx.Status(http.StatusBadRequest) + return false + } + return true +} diff --git a/backend/app/server/admin_user_api.go b/backend/app/server/admin_user_api.go new file mode 100644 index 0000000..9496d0e --- /dev/null +++ b/backend/app/server/admin_user_api.go @@ -0,0 +1,122 @@ +package server + +import ( + "codejam.io/database" + "github.com/emicklei/pgtalk/convert" + "github.com/gin-gonic/gin" + "net/http" +) + +func (server *Server) GetAllUsers(ctx *gin.Context) { + if server.VerifyAdminAccess(ctx) { + users, err := database.GetAllUsers() + if err != nil { + logger.Error("Error getting all users: %v", err) + ctx.Status(http.StatusInternalServerError) + return + } + ctx.JSON(http.StatusOK, users) + } +} + +type PutAccountStatusRequest struct { + AccountStatus string +} + +func (server *Server) PutAccountStatus(ctx *gin.Context) { + userIdParam := ctx.Param("id") + var request PutAccountStatusRequest + if server.VerifyAdminAccess(ctx) && + server.VerifyUserNotAdmin(ctx, userIdParam) && + server.DeserializeRequest(ctx, &request) { + user, err := database.SetAccountStatus(convert.StringToUUID(userIdParam), request.AccountStatus) + if err != nil { + logger.Error("PutAccountStatus: SetAccountStatus error: %v", err) + ctx.Status(http.StatusInternalServerError) + return + } + ctx.JSON(http.StatusOK, user) + } +} + +type PutDisplayNameRequest struct { + DisplayName string +} + +func (server *Server) PutDisplayName(ctx *gin.Context) { + userIdParam := ctx.Param("id") + var request PutDisplayNameRequest + if server.VerifyAdminAccess(ctx) && + server.VerifyUserNotAdmin(ctx, userIdParam) && + server.DeserializeRequest(ctx, &request) { + user, err := database.SetDisplayName(convert.StringToUUID(userIdParam), request.DisplayName) + if err != nil { + logger.Error("SetDisplayName error: %v", err) + ctx.Status(http.StatusInternalServerError) + return + } + ctx.JSON(http.StatusOK, user) + } +} + +type PutDisplayNameLockRequest struct { + Lock bool +} + +func (server *Server) PutDisplayNameLock(ctx *gin.Context) { + userIdParam := ctx.Param("id") + var request PutDisplayNameLockRequest + if server.VerifyAdminAccess(ctx) && + server.VerifyUserNotAdmin(ctx, userIdParam) && + server.DeserializeRequest(ctx, &request) { + user, err := database.SetDisplayNameLock(convert.StringToUUID(userIdParam), request.Lock) + if err != nil { + logger.Error("SetDisplayNameLock error: %v", err) + ctx.Status(http.StatusInternalServerError) + return + } + ctx.JSON(http.StatusOK, user) + } +} + +func (server *Server) PutBan(ctx *gin.Context) { + userIdParam := ctx.Param("id") + if server.VerifyAdminAccess(ctx) && + server.VerifyUserNotAdmin(ctx, userIdParam) { + user, err := database.SetAccountStatus(convert.StringToUUID(userIdParam), "BANNED") + if err != nil { + logger.Error("PutBan: SetAccountStatus error: %v", err) + ctx.Status(http.StatusInternalServerError) + return + } + ctx.JSON(http.StatusOK, user) + } +} + +func (server *Server) PutUnban(ctx *gin.Context) { + userIdParam := ctx.Param("id") + if server.VerifyAdminAccess(ctx) && + server.VerifyUserNotAdmin(ctx, userIdParam) { + user, err := database.SetAccountStatus(convert.StringToUUID(userIdParam), "ACTIVE") + if err != nil { + logger.Error("PutUnban: SetAccountStatus error: %v", err) + ctx.Status(http.StatusInternalServerError) + return + } + ctx.JSON(http.StatusOK, user) + } +} + +func (server *Server) SetupAdminUserRoutes() { + logger.Info("Setting up Admin User routes...") + + group := server.Gin.Group("/admin/user") + { + group.GET("/all", server.GetAllUsers) + group.PUT("/:id/display_name/", server.PutDisplayName) + group.PUT("/:id/display_name_lock/", server.PutDisplayNameLock) + group.PUT("/:id/ban/", server.PutBan) + group.PUT("/:id/unban/", server.PutUnban) + } + +} diff --git a/backend/app/server/event.go b/backend/app/server/event.go index f4779c7..b001bee 100644 --- a/backend/app/server/event.go +++ b/backend/app/server/event.go @@ -104,7 +104,12 @@ func (server *Server) PutEvent(ctx *gin.Context) { } // Check Authorization - user := database.GetUser(convert.StringToUUID(userId.(string))) + user, err := database.GetUser(convert.StringToUUID(userId.(string))) + if err != nil { + ctx.Status(http.StatusInternalServerError) + return + } + if user.Role != database.Admin { logger.Error("PutEvent unauthorized user: %v", userId) ctx.Status(http.StatusUnauthorized) diff --git a/backend/app/server/oauth.go b/backend/app/server/oauth.go index 9c84f0a..1cb6359 100644 --- a/backend/app/server/oauth.go +++ b/backend/app/server/oauth.go @@ -57,7 +57,7 @@ func (server *Server) GetOAuthCallback(ctx *gin.Context) { integrationName := strings.ToLower(server.Config.OAuth.Provider) providerUser := integrations.GetUser(integrationName, token.AccessToken) if providerUser != nil { - dbUser := database.CreateUser(integrationName, providerUser.UserId, providerUser.DisplayName, providerUser.AvatarUrl) + dbUser := database.CreateUser(integrationName, providerUser.UserId, providerUser.ServiceUserName, providerUser.AvatarUrl) session := sessions.Default(ctx) session.Set("userId", convert.UUIDToString(dbUser.Id)) session.Set("displayName", dbUser.DisplayName) diff --git a/backend/app/server/server.go b/backend/app/server/server.go index a9d082d..177fbe6 100644 --- a/backend/app/server/server.go +++ b/backend/app/server/server.go @@ -56,6 +56,8 @@ func (server *Server) StartServer() { server.SetupUserRoutes() server.SetupEventRoutes() server.SetupTeamRoutes() + server.SetupAdminUserRoutes() + server.SetupStaticRoutes() // Start the server... diff --git a/backend/app/server/user.go b/backend/app/server/user.go index ca2fe31..3e9a9d3 100644 --- a/backend/app/server/user.go +++ b/backend/app/server/user.go @@ -21,7 +21,12 @@ func (server *Server) GetUser(ctx *gin.Context) { session := sessions.Default(ctx) userId := session.Get("userId") if userId != nil { - dbUser := database.GetUser(convert.StringToUUID(userId.(string))) + dbUser, err := database.GetUser(convert.StringToUUID(userId.(string))) + if err != nil { + logger.Error("GetUser: %v, %v", userId, err) + ctx.Status(http.StatusInternalServerError) + return + } ctx.JSON(http.StatusOK, dbUser) return } @@ -40,7 +45,6 @@ func (server *Server) PutUser(ctx *gin.Context) { } response := models.NewFormResponse() - validateUser(&user, &response) // Perform validation validateUser(&user, &response) @@ -91,4 +95,5 @@ func (server *Server) SetupUserRoutes() { group.PUT("/", server.PutUser) group.GET("/logout", server.Logout) } + } diff --git a/html/src/lib/components/Header.svelte b/html/src/lib/components/Header.svelte index c7146d7..03e800f 100644 --- a/html/src/lib/components/Header.svelte +++ b/html/src/lib/components/Header.svelte @@ -55,7 +55,11 @@ $: activeUrl = '/#' + $location; Home {#if activeUser.user !== null} {#if activeUser.user?.Role === "ADMIN" } - Manage Events + Admin + + Events + Users + {/if} {#if $activeEventStore && $activeEventStore.AllowSignups} Sign-Up diff --git a/html/src/lib/models/user.ts b/html/src/lib/models/user.ts index c9235ed..9e8bdd1 100644 --- a/html/src/lib/models/user.ts +++ b/html/src/lib/models/user.ts @@ -1,10 +1,13 @@ export interface User { - UserId: string; + Id: string; DisplayName: string; Role: string; ServiceName : string; ServiceUserId: string; + ServiceUserName: string; AvatarUrl: string; + AccountStatus: string; + LockDisplayName: boolean; } export interface ActiveUser { diff --git a/html/src/lib/pages/EventEdit.svelte b/html/src/lib/pages/admin/EventEdit.svelte similarity index 90% rename from html/src/lib/pages/EventEdit.svelte rename to html/src/lib/pages/admin/EventEdit.svelte index 0ca19b3..16d3455 100644 --- a/html/src/lib/pages/EventEdit.svelte +++ b/html/src/lib/pages/admin/EventEdit.svelte @@ -1,5 +1,5 @@ + + + + {modalUser?.DisplayName} + + +
    +
    Discord Username
    +
    {modalUser.ServiceUserName}
    + +
    Display Name
    +
    + {modalUser.DisplayName} + {#if modalUser.Role !== "ADMIN"} + {#if modalUser.DisplayName !== modalUser.ServiceUserName} + + Reset Display Name to Discord Username + {/if} + {#if modalUser.LockDisplayName === true} + + User NOT allowed to modify Display Name. + {:else} + + User is allowed to modify Display Name. + {/if} + {/if} +
    + +
    Role
    +
    {modalUser.Role}
    + +
    Status
    +
    {modalUser.AccountStatus}
    +
    + + + {#if modalUser.Role !== "ADMIN"} + {#if modalUser.AccountStatus === "ACTIVE" } + + {:else} + + {/if} + {/if} +
    + +
    +
    +
    + + + +

    Users

    +
    +
    + + + + {displayedUsers.length} Users + + + + Display Name + Discord Name + Discord ID + Role + Status + + + {#each displayedUsers as user} + openUserModal(user)}> + + + {user.DisplayName} + {#if user.LockDisplayName === true} + + {/if} + + {user.ServiceUserName} + {user.ServiceUserId} + {user.Role} + {user.AccountStatus} + + {/each} + + +
    + +
    \ No newline at end of file diff --git a/html/src/lib/services/adminServices.ts b/html/src/lib/services/adminServices.ts new file mode 100644 index 0000000..a12036f --- /dev/null +++ b/html/src/lib/services/adminServices.ts @@ -0,0 +1,71 @@ +import {baseApiUrl} from "./services"; +import type {User} from "../models/user"; + + +export async function getAllUsers() { + return await fetch(baseApiUrl + "/admin/user/all"); +} + + +interface PutAccountStatusRequest { + AccountStatus: string, +} + +export async function putAccountStatus(userId: string, status: string) : Promise { + const requestInit : RequestInit = { + method: 'PUT', + body: JSON.stringify( + { + AccountStatus: status + } + ) + } + const response: Response = await fetch(`${baseApiUrl}/admin/user/${userId}/account_status/`, requestInit); + return await response.json() as User; +} + +export async function BanUser(userId: string) :Promise { + const response : Response = await fetch(`${baseApiUrl}/admin/user/${userId}/ban`, { method: 'PUT' }); + return await response.json() as User; +} + +export async function UnbanUser(userId: string) : Promise { + const response : Response = await fetch(`${baseApiUrl}/admin/user/${userId}/unban`, { method: 'PUT' }); + return await response.json() as User; +} + + +interface PutDisplayNameLockRequest { + Lock: boolean, +} + +export async function updateDisplayNameLock(userId: string, lock: boolean) { + const requestInit : RequestInit = { + method: 'PUT', + body: JSON.stringify( + { + Lock: lock + } + ) + } + const response: Response = await fetch(`${baseApiUrl}/admin/user/${userId}/display_name_lock`, requestInit); + return await response.json() as User; +} + + +interface PutDisplayNameRequest { + DisplayName: string, +} + +export async function UpdateDisplayName(userId: string, displayName: string) { + const requestInit : RequestInit = { + method: 'PUT', + body: JSON.stringify( + { + DisplayName: displayName + } + ) + } + const response : Response = await fetch(`${baseApiUrl}/admin/user/${userId}/display_name`, requestInit); + return await response.json() as User; +} \ No newline at end of file diff --git a/html/src/routes.ts b/html/src/routes.ts index b0f0b0a..d4681c8 100644 --- a/html/src/routes.ts +++ b/html/src/routes.ts @@ -1,6 +1,6 @@ import HomePage from "./lib/pages/HomePage.svelte"; -import EventEdit from "./lib/pages/EventEdit.svelte"; -import EventList from "./lib/pages/EventList.svelte"; +import EventEdit from "./lib/pages/admin/EventEdit.svelte"; +import EventList from "./lib/pages/admin/EventList.svelte"; import TeamOptions from "./lib/pages/TeamOptions.svelte"; import TeamsBrowse from "./lib/pages/TeamsBrowse.svelte"; import TeamsCreate from "./lib/pages/TeamsCreate.svelte"; @@ -8,13 +8,13 @@ import MyTeam from "./lib/pages/MyTeam.svelte"; import Invite from "./lib/pages/Invite.svelte"; import UserTeams from "./lib/pages/UserTeams.svelte"; import ProfilePage from "./lib/pages/ProfilePage.svelte"; +import UserList from "./lib/pages/admin/UserList.svelte"; export default { '/': HomePage, '/home': HomePage, - '/admin/events': EventList, - '/admin/event/:id': EventEdit, + '/team': TeamOptions, '/team/:id': MyTeam, // link to one of your teams (sharable) We get an id here in this route... '/team/invite/:invitecode': Invite, // sharable @@ -22,4 +22,8 @@ export default { '/teams/browse': TeamsBrowse, '/teams/create': TeamsCreate, '/profile': ProfilePage, + + '/admin/events': EventList, + '/admin/event/:id': EventEdit, + '/admin/users': UserList, } \ No newline at end of file From c88352a294f982ffa93248eedda0b23793bde1bf Mon Sep 17 00:00:00 2001 From: scottserven Date: Sat, 29 Jun 2024 13:51:48 -0400 Subject: [PATCH 091/155] * fix for null avatar_url fields in users table --- backend/app/database/users.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/database/users.go b/backend/app/database/users.go index 499550e..a991264 100644 --- a/backend/app/database/users.go +++ b/backend/app/database/users.go @@ -12,7 +12,7 @@ type DBUser struct { ServiceUserName string `db:"service_user_name"` Role string `db:"role"` DisplayName string `db:"display_name"` - AvatarUrl string `db:"avatar_url"` + AvatarUrl *string `db:"avatar_url"` AccountStatus string `db:"account_status"` LockDisplayName bool `db:"lock_display_name"` CreatedOn pgtype.Timestamp `db:"created_on" json:"-"` From 84fce0065b3a6a0f5c7e9e2ef9369ecc899bdd03 Mon Sep 17 00:00:00 2001 From: scottserven Date: Mon, 1 Jul 2024 17:53:50 -0400 Subject: [PATCH 092/155] enforce display name lock --- backend/app/server/{user.go => users_api.go} | 36 +++++++++---- html/src/lib/pages/ProfilePage.svelte | 53 ++++++++++++-------- html/src/lib/services/services.ts | 19 ++++--- 3 files changed, 73 insertions(+), 35 deletions(-) rename backend/app/server/{user.go => users_api.go} (71%) diff --git a/backend/app/server/user.go b/backend/app/server/users_api.go similarity index 71% rename from backend/app/server/user.go rename to backend/app/server/users_api.go index 3e9a9d3..54d6fe4 100644 --- a/backend/app/server/user.go +++ b/backend/app/server/users_api.go @@ -10,9 +10,8 @@ import ( "strings" ) -func validateUser(user *database.DBUser, response *models.FormResponse) { - // Title is required - if strings.Trim(user.DisplayName, " ") == "" { +func validateDisplayName(displayName string, response *models.FormResponse) { + if displayName == "" { response.AddError("DisplayName", "required") } } @@ -33,28 +32,47 @@ func (server *Server) GetUser(ctx *gin.Context) { ctx.Status(http.StatusUnauthorized) } -func (server *Server) PutUser(ctx *gin.Context) { +type PutProfileRequest struct { + DisplayName string +} + +func (server *Server) PutProfile(ctx *gin.Context) { session := sessions.Default(ctx) userId := session.Get("userId") if userId != nil { - var user database.DBUser - err := ctx.ShouldBindJSON(&user) + user, err := database.GetUser(convert.StringToUUID(userId.(string))) + if err != nil { + logger.Error("PutProfile: GetUser error: %v", err) + ctx.Status(http.StatusInternalServerError) + return + } + + // admin display name lock prevents a user from changing it + if user.LockDisplayName { + logger.Info("DisplayName Locked") + ctx.Status(http.StatusForbidden) + return + } + + var request PutProfileRequest + err = ctx.ShouldBindJSON(&request) if err != nil { ctx.Status(http.StatusBadRequest) return } response := models.NewFormResponse() + request.DisplayName = strings.Trim(request.DisplayName, " ") // Perform validation - validateUser(&user, &response) + validateDisplayName(request.DisplayName, &response) if len(response.Errors) > 0 { logger.Error("Validation Error: %v+", user) ctx.JSON(http.StatusBadRequest, response) return } - user.Id = convert.StringToUUID(userId.(string)) + user.DisplayName = request.DisplayName _, err = database.UpdateUser(user) if err != nil { logger.Error("Error calling database.UpdateEvent: %v", err) @@ -92,7 +110,7 @@ func (server *Server) SetupUserRoutes() { group := server.Gin.Group("/user") { group.GET("/", server.GetUser) - group.PUT("/", server.PutUser) + group.PUT("/profile", server.PutProfile) group.GET("/logout", server.Logout) } diff --git a/html/src/lib/pages/ProfilePage.svelte b/html/src/lib/pages/ProfilePage.svelte index fdf0cb7..67f714d 100644 --- a/html/src/lib/pages/ProfilePage.svelte +++ b/html/src/lib/pages/ProfilePage.svelte @@ -1,12 +1,14 @@

    Browse All Teams

    - + + {#if loading}
    Loading...
    {:else if error}
    {error}
    - - {:else if allTeams === null} -
    - Error, please contact admin. -
    - - {:else if allTeams.length === 0} -
    - Looks like you don't have any teams! Go to browse teams to join one! -
    - {:else} + {#each publicTeams as Team} + - {#each allTeams as Team} -

    Team {Team.Name}

    -
    +
    Visibility: {Team.Visibility} @@ -70,12 +63,21 @@ loadData(); Description: {Team.Description} - + // only shows if user isnt a member + {#if $loggedInStore} + + {:else} + + +

    Login with Discord to join a team!

    +
    + {/if}
    - - - {/each} - + {:else} +
    + Looks like you don't have any teams! Go to browse teams to join one! +
    + {/each} {/if}
    From b96c96539292b0b4d0707434fa5f12438dd1bef4 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Wed, 14 Aug 2024 23:57:30 -0700 Subject: [PATCH 095/155] added: getTeamInfo separeated from sendTeamInfo for MemberJoin --- backend/app/server/teams.go | 90 ++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index 5d5250b..b35d637 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -44,10 +44,6 @@ type JoinPayload struct { TeamId string `json:"teamId"` } -type Response struct { - teamData GetTeamResponse -} - func MD5HashCode(teamName string) (string, error) { randNum, err := rand.Int(rand.Reader, big.NewInt(math.MaxInt64)) if err != nil { @@ -72,6 +68,7 @@ func (server *Server) signupsAllowed(eventId string) bool { } func (server *Server) GetAllTeams(ctx *gin.Context) { + // what if there's no session => no user id teams, err := database.GetTeams() if err == nil { ctx.JSON(http.StatusOK, teams) @@ -84,43 +81,23 @@ func (server *Server) GetAllTeams(ctx *gin.Context) { func (server *Server) GetUserTeams(ctx *gin.Context) { session := sessions.Default(ctx) userId := session.Get("userId") - strUserId := userId.(string) - if userId == nil { ctx.Status(http.StatusNotFound) return } - // var teamResponse GetTeamResponse - // var teamsResponse []GetTeamResponse + strUserId := userId.(string) teams, err := database.GetUserTeams(convert.StringToUUID(strUserId)) if err != nil { ctx.Status(http.StatusInternalServerError) return } - - //1. join databse to return members ctx.JSON(http.StatusOK, teams) - - // add all the GetTeamResponse to []GetTeamResponse - // loop through teams, get team id - // assign each team to teamResponse type.. - -} -func (server *Server) sendTeamInfo(teamResponse GetTeamResponse) { - router := gin.Default() - router.POST("/teams/browse", func(ctx *gin.Context) { - response := Response { - teamData: teamResponse, - } - ctx.JSON(http.StatusOK, response) - }) } // stepp 4: GET team info // purpose is to construct the DBTeamMemberInfo -func (server *Server) GetTeamInfo(ctx *gin.Context) { - id := convert.StringToUUID(ctx.Param("id")) +func (server *Server) GetTeamInfo(id pgtype.UUID) (*GetTeamResponse, error) { var teamResponse GetTeamResponse var team database.DBTeam @@ -130,34 +107,39 @@ func (server *Server) GetTeamInfo(ctx *gin.Context) { team, err := database.GetTeam(id) if err != nil { logger.Error("failed to get team: %v", err) - ctx.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to get team: %v", err)}) - return + return nil, err } event, err = database.GetEvent(team.EventId) if err != nil { logger.Error("failed to get event: %v", err) - ctx.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to get event: %v", err)}) - return + return nil, err } members, err = database.GetMembersByTeamId(team.Id) if err != nil { logger.Error("failed to get event: %v", err) - ctx.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("failed to get members: %v", err)}) - return + return nil, err } // attach all 3 structures to GetTeamResponse --> nested structs turn into nested JSON (with ctx.JSON) teamResponse.Team = &team teamResponse.Event = &event teamResponse.Members = members - - server.sendTeamInfo(teamResponse) - //ctx.JSON(http.StatusOK, teamResponse) + + return &teamResponse, nil } +func (server *Server) sendTeamInfo(ctx *gin.Context) { + id := convert.StringToUUID(ctx.Param("id")) + + teamResponse, err := server.GetTeamInfo(id) + if err != nil { + ctx.Status(http.StatusBadRequest) + } + ctx.JSON(http.StatusOK, teamResponse) +} func (server *Server) GetTeamInfoByInviteCode(ctx *gin.Context) { inviteCode := ctx.Param("invitecode") @@ -205,7 +187,10 @@ func (server *Server) CreateTeam(ctx *gin.Context) { // Step 4: Post Team Data API (TWO PARTS 1) create team 2) add team members) session := sessions.Default(ctx) userId := session.Get("userId") - + if userId == nil { + ctx.Status(http.StatusBadRequest) + return + } strUserId := userId.(string) var team database.DBTeam @@ -300,28 +285,43 @@ func (server *Server) UpdateTeamMembers(ctx *gin.Context) { ctx.Status(http.StatusBadRequest) return } - //database.AddTeamMember(convert.StringToUUID(userId.(string), )) } func (server *Server) MemberJoin(ctx *gin.Context) { - session := sessions.Default(ctx) userId := session.Get("userId") - fmt.Println(userId) + + if userId == nil { + ctx.Status(http.StatusNotFound) + return + } + strUserId := userId.(string) + uuidUserId := convert.StringToUUID(strUserId) + + var teamId JoinPayload if err := ctx.ShouldBindJSON(&teamId); err != nil { ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return } fmt.Println(teamId) // this prints {cc457e3e-210a-4d5d-83d8-0899426dfc93} + uuidTeamId := convert.StringToUUID(teamId.TeamId) + teamInfo, err := server.GetTeamInfo(uuidTeamId) + if err != nil { + ctx.Status(http.StatusUnauthorized) + return + } - // call getteaminfo - //verify team is public - //var team - //var isPublic bool = team.ispublic - + // verifies team is public + var isPublic string = teamInfo.Team.Visibility + if isPublic == "private" { + ctx.Status(http.StatusForbidden) + return + } + database.AddTeamMember(uuidUserId, uuidTeamId, "member") } func (server *Server) MemberInvite(ctx *gin.Context) { @@ -352,7 +352,7 @@ func (server *Server) SetupTeamRoutes() { group.POST("/join", server.MemberJoin) group.POST("/:invitecode", server.MemberInvite) //group.GET("/", server.GetAllTeams) - group.GET("/:id", server.GetTeamInfo) + group.GET("/:id", server.sendTeamInfo) group.GET("/invite/:invitecode", server.GetTeamInfoByInviteCode) // group.PUT("/:id", server.UpdateTeam) // Step 3: Post Team Data API From edfaaa7cd435f92edbbf44c737be7b49348d6c0b Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Thu, 15 Aug 2024 00:07:11 -0700 Subject: [PATCH 096/155] cleaned two files --- html/src/lib/pages/Invite.svelte | 40 +++++++++++++++++------------ html/src/lib/pages/UserTeams.svelte | 10 +------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/html/src/lib/pages/Invite.svelte b/html/src/lib/pages/Invite.svelte index 6f7f0f8..88ae2a0 100644 --- a/html/src/lib/pages/Invite.svelte +++ b/html/src/lib/pages/Invite.svelte @@ -1,6 +1,6 @@ @@ -62,7 +72,7 @@ Click below to join {teamMembers[0]?.DisplayName}'s team:
    - + {:else}
    Must be logged in to join a team. @@ -70,10 +80,6 @@ - - {/if} - - diff --git a/html/src/lib/pages/UserTeams.svelte b/html/src/lib/pages/UserTeams.svelte index 2af5ece..ab4d17b 100644 --- a/html/src/lib/pages/UserTeams.svelte +++ b/html/src/lib/pages/UserTeams.svelte @@ -20,8 +20,6 @@ async function loadData() { try { const response = await getUserTeams(); userTeams = await response.json(); // Array of teams... - console.log(userTeams) - } catch (err) { error = `Failed to load team data: ${err}`; console.error(err); @@ -75,14 +73,8 @@ If not team owner, cannot view--> Description: {userTeam.Description} - - - - - {/each} - - + {/each} {/if} From 4172f43396f25701a443175cd86b41693ab05a2e Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Thu, 15 Aug 2024 00:10:10 -0700 Subject: [PATCH 097/155] cleaned up strange formats --- html/src/lib/stores/stores.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/html/src/lib/stores/stores.ts b/html/src/lib/stores/stores.ts index 19fe274..e13b65c 100644 --- a/html/src/lib/stores/stores.ts +++ b/html/src/lib/stores/stores.ts @@ -8,11 +8,13 @@ export const activeContent = writable(''); /** * Deprecated - use activeUserStore.user instead */ + export const userStore = writable(null); /** * Deprecated - use activeUserStore.loggedIn instead */ + export const loggedInStore = derived(userStore, (userData) => userData != null); /** From 5210c25e88f75c762c8d69d3bed26f8442712312 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Fri, 16 Aug 2024 10:34:14 -0700 Subject: [PATCH 098/155] changed StatusBadRequest to StatusUnauthorized --- backend/app/server/teams.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index b35d637..9fe4f28 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -188,7 +188,7 @@ func (server *Server) CreateTeam(ctx *gin.Context) { session := sessions.Default(ctx) userId := session.Get("userId") if userId == nil { - ctx.Status(http.StatusBadRequest) + ctx.Status(http.StatusUnauthorized) return } strUserId := userId.(string) @@ -282,7 +282,7 @@ func (server *Server) UpdateTeamMembers(ctx *gin.Context) { session := sessions.Default(ctx) userId := session.Get("userId") if userId != nil { - ctx.Status(http.StatusBadRequest) + ctx.Status(http.StatusUnauthorized) return } //database.AddTeamMember(convert.StringToUUID(userId.(string), )) @@ -294,7 +294,7 @@ func (server *Server) MemberJoin(ctx *gin.Context) { fmt.Println(userId) if userId == nil { - ctx.Status(http.StatusNotFound) + ctx.Status(http.StatusUnauthorized) return } strUserId := userId.(string) From 68539a96aaecd8ca27c7ebd8fde1f198edf08051 Mon Sep 17 00:00:00 2001 From: Eviee Py Date: Sat, 17 Aug 2024 09:00:02 +1000 Subject: [PATCH 099/155] Add redirect after login --- backend/app/server/oauth.go | 60 +++++++++++++++++++++++++-- backend/app/server/server.go | 5 ++- backend/app/server/utils.go | 17 ++++++++ html/src/lib/components/Header.svelte | 2 +- html/src/lib/pages/Invite.svelte | 3 +- html/src/lib/pages/TeamsBrowse.svelte | 4 +- 6 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 backend/app/server/utils.go diff --git a/backend/app/server/oauth.go b/backend/app/server/oauth.go index b295c80..935d2bd 100644 --- a/backend/app/server/oauth.go +++ b/backend/app/server/oauth.go @@ -1,6 +1,7 @@ package server import ( + "fmt" "net/http" "os" "strings" @@ -14,13 +15,18 @@ import ( githubOAuth "golang.org/x/oauth2/github" ) +type StateData struct { + Token string + Redirect string +} + // SetupOAuth initializes the OAuth provider specified in the application config. func (server *Server) SetupOAuth() { if server.Debug { logger.Warn("Debug mode is set. No OAuth Providers are set!") return } - + var endpoint oauth2.Endpoint switch strings.ToLower(server.Config.OAuth.Provider) { @@ -46,12 +52,38 @@ func (server *Server) SetupOAuth() { } func (server *Server) GetOAuthRedirect(ctx *gin.Context) { + session := sessions.Default(ctx) + token, err := GenerateToken(16) + + if err != nil { + ctx.String(500, "Internal Server Error") + } + + redirect := ctx.Query("redirect") + if redirect == "" { + redirect = "/" + } + + if !strings.HasPrefix(redirect, "/") { + redirect = "/" + } else { + redirect = fmt.Sprintf("/#%s", redirect) + } + + state := StateData{Token: token, Redirect: redirect} + session.Set("state", state) + err = session.Save() + + if err != nil { + logger.Error("Error saving session: %v", err) + } + if server.Debug { ctx.Redirect(http.StatusFound, "/oauth/debug-login") return } - url := server.OAuth.AuthCodeURL(ctx.Request.Header.Get("Referer")) + url := server.OAuth.AuthCodeURL(token) ctx.Redirect(http.StatusFound, url) } @@ -74,7 +106,28 @@ func (server *Server) GetDebugSession(ctx *gin.Context) { func (server *Server) GetOAuthCallback(ctx *gin.Context) { authCode := ctx.Query("code") - redir := ctx.Query("state") + stateCode := ctx.Query("state") + + if len(stateCode) == 0 { + ctx.String(400, "Bad Request: Missing State Value.") + return + } + + session := sessions.Default(ctx) + stateI := session.Get("state") + + session.Clear() + session.Save() + + var stateData *StateData + stateData, ok := stateI.(*StateData) + if !ok { + ctx.String(400, "Bad Request: Invalid State Data.") + return + } + + redir := stateData.Redirect + token, err := server.OAuth.Exchange(oauth2.NoContext, authCode) if err != nil { // todo - can any of these be handled? @@ -86,7 +139,6 @@ func (server *Server) GetOAuthCallback(ctx *gin.Context) { providerUser := integrations.GetUser(integrationName, token.AccessToken) if providerUser != nil { dbUser := database.CreateUser(integrationName, providerUser.UserId, providerUser.DisplayName, providerUser.AvatarUrl) - session := sessions.Default(ctx) session.Set("userId", convert.UUIDToString(dbUser.Id)) session.Set("displayName", dbUser.DisplayName) err = session.Save() diff --git a/backend/app/server/server.go b/backend/app/server/server.go index 1107a7e..48e5877 100644 --- a/backend/app/server/server.go +++ b/backend/app/server/server.go @@ -3,6 +3,7 @@ package server import ( "codejam.io/config" "codejam.io/logging" + "encoding/gob" "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/redis" "github.com/gin-gonic/gin" @@ -18,7 +19,7 @@ type Server struct { Config config.Config OAuth *oauth2.Config Gin *gin.Engine - Debug bool + Debug bool } func (server *Server) SetupSessionStore() { @@ -47,6 +48,8 @@ func (server *Server) SetupSessionStore() { func (server *Server) StartServer() { logger.Info("Starting server...") + gob.Register(&StateData{}) + server.Gin = gin.Default() server.SetupSessionStore() diff --git a/backend/app/server/utils.go b/backend/app/server/utils.go new file mode 100644 index 0000000..147ed60 --- /dev/null +++ b/backend/app/server/utils.go @@ -0,0 +1,17 @@ +package server + +import ( + "crypto/rand" + "encoding/base64" +) + +func GenerateToken(length uint8) (string, error) { + token := make([]byte, length) + + _, err := rand.Read(token) + if err != nil { + return "", err + } + + return base64.URLEncoding.EncodeToString(token), nil +} diff --git a/html/src/lib/components/Header.svelte b/html/src/lib/components/Header.svelte index c7146d7..1b063db 100644 --- a/html/src/lib/components/Header.svelte +++ b/html/src/lib/components/Header.svelte @@ -63,7 +63,7 @@ $: activeUrl = '/#' + $location; {/if} {:else} - Login with Discord + Login with Discord {/if} diff --git a/html/src/lib/pages/Invite.svelte b/html/src/lib/pages/Invite.svelte index 88ae2a0..6bfba9a 100644 --- a/html/src/lib/pages/Invite.svelte +++ b/html/src/lib/pages/Invite.svelte @@ -10,6 +10,7 @@ import CodeJamEvent from '../models/event'; import { loggedInStore, userStore } from '../stores/stores'; import DiscordIcon from '../components/DiscordIcon.svelte'; + import {location} from "svelte-spa-router"; export let params: any; // set by svelte-spa-router //console.log(params) // returns Object { invitecode: "d1869a59b4fdf3" } @@ -78,7 +79,7 @@ Must be logged in to join a team.
    {/if} diff --git a/html/src/lib/pages/TeamsBrowse.svelte b/html/src/lib/pages/TeamsBrowse.svelte index b868ef9..d48f57d 100644 --- a/html/src/lib/pages/TeamsBrowse.svelte +++ b/html/src/lib/pages/TeamsBrowse.svelte @@ -7,8 +7,10 @@ import { loggedInStore, userStore } from '../stores/stores'; import CodeJamTeam from '../models/team'; import type TeamMember from '../models/TeamMember'; import DiscordIcon from '../components/DiscordIcon.svelte'; +import {location} from "svelte-spa-router"; export const params: Record = {}; + let teamData: CodeJamTeam | null = null; let teamMembers: TeamMember[] = []; let loading: boolean = true; @@ -69,7 +71,7 @@ $: publicTeams = allTeams.filter(t => t.Visibility == "public" ) {:else} -

    Login with Discord to join a team!

    +

    Login with Discord to join a team!

    {/if} From bbaf8a411f2477368b4ed6d1cbf8f3e93e732edb Mon Sep 17 00:00:00 2001 From: Eviee Py Date: Sat, 17 Aug 2024 09:18:48 +1000 Subject: [PATCH 100/155] Fix potential abuse vector in redirect. --- backend/app/server/oauth.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/app/server/oauth.go b/backend/app/server/oauth.go index 935d2bd..85718ae 100644 --- a/backend/app/server/oauth.go +++ b/backend/app/server/oauth.go @@ -66,6 +66,8 @@ func (server *Server) GetOAuthRedirect(ctx *gin.Context) { if !strings.HasPrefix(redirect, "/") { redirect = "/" + } else if !strings.HasPrefix(redirect, "/oauth") { + redirect = "/" } else { redirect = fmt.Sprintf("/#%s", redirect) } From a5bf8b1d6d1c7f2c51c0d4ed3a078110ace83142 Mon Sep 17 00:00:00 2001 From: Eviee Py Date: Sat, 17 Aug 2024 09:20:40 +1000 Subject: [PATCH 101/155] Fix ! check on hasPrefix --- backend/app/server/oauth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/server/oauth.go b/backend/app/server/oauth.go index 85718ae..4510161 100644 --- a/backend/app/server/oauth.go +++ b/backend/app/server/oauth.go @@ -66,7 +66,7 @@ func (server *Server) GetOAuthRedirect(ctx *gin.Context) { if !strings.HasPrefix(redirect, "/") { redirect = "/" - } else if !strings.HasPrefix(redirect, "/oauth") { + } else if strings.HasPrefix(redirect, "/oauth") { redirect = "/" } else { redirect = fmt.Sprintf("/#%s", redirect) From cabb3b34bbce22238921f3dc491a0af9e0c55509 Mon Sep 17 00:00:00 2001 From: Eviee Py Date: Sat, 17 Aug 2024 09:24:43 +1000 Subject: [PATCH 102/155] Add missing stateCode token check --- backend/app/server/oauth.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/app/server/oauth.go b/backend/app/server/oauth.go index 4510161..6522cbf 100644 --- a/backend/app/server/oauth.go +++ b/backend/app/server/oauth.go @@ -128,6 +128,11 @@ func (server *Server) GetOAuthCallback(ctx *gin.Context) { return } + if stateData.Token != stateCode { + ctx.String(400, "Bad Request: Invalid State Code Provided.") + return + } + redir := stateData.Redirect token, err := server.OAuth.Exchange(oauth2.NoContext, authCode) From c13e7987a1aa2cb394897d73db098d4db43f4757 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Fri, 30 Aug 2024 02:12:34 -0700 Subject: [PATCH 103/155] change team_members schema to prevent user_id duplicates in teams --- .../migrations/00000004_team_members.up.sql | 13 ++++---- backend/app/database/teams.go | 9 ++++-- backend/app/server/teams.go | 31 ++++++++++++++----- html/src/lib/pages/TeamsBrowse.svelte | 6 +++- 4 files changed, 43 insertions(+), 16 deletions(-) diff --git a/backend/app/database/migrations/00000004_team_members.up.sql b/backend/app/database/migrations/00000004_team_members.up.sql index 30b2431..5429dbd 100644 --- a/backend/app/database/migrations/00000004_team_members.up.sql +++ b/backend/app/database/migrations/00000004_team_members.up.sql @@ -1,9 +1,10 @@ CREATE TABLE IF NOT EXISTS team_members ( - id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, - team_id UUID references teams(id) ON DELETE CASCADE, - user_id UUID references users(id) ON DELETE CASCADE, - role TEXT NOT NULL, - created_on TIMESTAMP WITH TIME ZONE DEFAULT (now() AT TIME ZONE('utc')) + team_id UUID NOT NULL references teams(id) ON DELETE CASCADE, + user_id UUID NOT NULL references users(id) ON DELETE CASCADE, + team_role TEXT NOT NULL, + created_on TIMESTAMP WITH TIME ZONE DEFAULT (now() AT TIME ZONE('utc')), + PRIMARY KEY (team_id, user_id) ); -ALTER TABLE teams DROP COLUMN IF EXISTS owner_user_id; \ No newline at end of file +ALTER TABLE teams DROP COLUMN IF EXISTS owner_user_id; + diff --git a/backend/app/database/teams.go b/backend/app/database/teams.go index 022db63..09e0e08 100644 --- a/backend/app/database/teams.go +++ b/backend/app/database/teams.go @@ -149,15 +149,20 @@ func UpdateTeam(team DBTeam) (DBTeam, error) { } // fields: userid, teamid, role -// called at server/teams.go createTeam & when someone clicks "join team" +// called at server/teams.go createTeam & when someone clicks "join team" // DONT MESS WITH BELOW. IT WORKS. func AddTeamMember(userId pgtype.UUID, teamUUID pgtype.UUID, role string) (userID pgtype.UUID, err error) { - fmt.Println("=== line 100 userId", userId) + // userId prints something like: {[22 162 173 240 222 76 79 42 174 62 196 207 243 22 25 78] true} + teamMember, err := GetRow[CreateTeamMember]( `INSERT INTO team_members (user_id, team_id, team_role) VALUES ($1, $2, $3) RETURNING user_id, team_id, team_role`, userId, teamUUID, role) + if err != nil { + fmt.Println(err) + return userId, err + } return teamMember.UserId, err } diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index 9fe4f28..d933c17 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -103,7 +103,7 @@ func (server *Server) GetTeamInfo(id pgtype.UUID) (*GetTeamResponse, error) { var team database.DBTeam var event database.DBEvent var members *[]database.DBTeamMemberInfo //user info based on teamId - + // fmt.Println("========id: ", id) prints: {[204 69 126 62 33 10 77 93 131 216 8 153 66 109 252 147] true} team, err := database.GetTeam(id) if err != nil { logger.Error("failed to get team: %v", err) @@ -291,7 +291,7 @@ func (server *Server) UpdateTeamMembers(ctx *gin.Context) { func (server *Server) MemberJoin(ctx *gin.Context) { session := sessions.Default(ctx) userId := session.Get("userId") - fmt.Println(userId) + fmt.Println("userID = ", userId) if userId == nil { ctx.Status(http.StatusUnauthorized) @@ -300,28 +300,45 @@ func (server *Server) MemberJoin(ctx *gin.Context) { strUserId := userId.(string) uuidUserId := convert.StringToUUID(strUserId) - var teamId JoinPayload if err := ctx.ShouldBindJSON(&teamId); err != nil { ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } - fmt.Println(teamId) // this prints {cc457e3e-210a-4d5d-83d8-0899426dfc93} + // teamId prints: {cc457e3e-210a-4d5d-83d8-0899426dfc93} uuidTeamId := convert.StringToUUID(teamId.TeamId) teamInfo, err := server.GetTeamInfo(uuidTeamId) if err != nil { - ctx.Status(http.StatusUnauthorized) - return + ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return } + // TODO: check if the user already exists in the team before adding the member. + // use teamInfo: + // type GetTeamResponse struct { + // Team *database.DBTeam + // Event *database.DBEvent + // Members *[]database.DBTeamMemberInfo // array(slice) of a struct + // } + + fmt.Println("print (*teamInfo.Members)[0].DBUser.Id = ", convert.UUIDToString((*teamInfo.Members)[0].DBUser.Id)) + // ^ dereferences pointer to get to actual slice of database.DBTeamMemberInfo, + // then accesses the first element in dereferenced slice + // verifies team is public var isPublic string = teamInfo.Team.Visibility if isPublic == "private" { ctx.Status(http.StatusForbidden) + return + } + _, err = database.AddTeamMember(uuidUserId, uuidTeamId, "member") + if err != nil { + ctx.JSON(http.StatusConflict, err) return } - database.AddTeamMember(uuidUserId, uuidTeamId, "member") + strTeamId := convert.UUIDToString(teamInfo.Team.Id) + ctx.JSON(http.StatusOK, strTeamId) } func (server *Server) MemberInvite(ctx *gin.Context) { diff --git a/html/src/lib/pages/TeamsBrowse.svelte b/html/src/lib/pages/TeamsBrowse.svelte index d48f57d..8da2367 100644 --- a/html/src/lib/pages/TeamsBrowse.svelte +++ b/html/src/lib/pages/TeamsBrowse.svelte @@ -67,7 +67,11 @@ $: publicTeams = allTeams.filter(t => t.Visibility == "public" ) // only shows if user isnt a member {#if $loggedInStore} - + {:else} From 0db23eda57fc0eb209a3dadbaa815035fdfb5a29 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Wed, 4 Sep 2024 23:50:43 -0700 Subject: [PATCH 104/155] added: Toaster to create team and join team --- html/src/App.svelte | 6 +-- html/src/lib/components/CreateTeamForm.svelte | 43 ++++++++--------- html/src/lib/pages/MyTeam.svelte | 14 +++--- html/src/lib/pages/TeamsBrowse.svelte | 46 ++++++++++++++----- 4 files changed, 65 insertions(+), 44 deletions(-) diff --git a/html/src/App.svelte b/html/src/App.svelte index 308f017..88cef65 100644 --- a/html/src/App.svelte +++ b/html/src/App.svelte @@ -1,12 +1,10 @@ - - -
    +
    \ No newline at end of file diff --git a/html/src/lib/components/CreateTeamForm.svelte b/html/src/lib/components/CreateTeamForm.svelte index 4e07535..99ce54a 100644 --- a/html/src/lib/components/CreateTeamForm.svelte +++ b/html/src/lib/components/CreateTeamForm.svelte @@ -1,22 +1,19 @@ @@ -94,7 +95,7 @@ function saveForm() {
    Public Team - (If you want your team to be searchable) + (If you want your team to be searchable.)
    Private Team diff --git a/html/src/lib/pages/MyTeam.svelte b/html/src/lib/pages/MyTeam.svelte index 33582c9..040a4a0 100644 --- a/html/src/lib/pages/MyTeam.svelte +++ b/html/src/lib/pages/MyTeam.svelte @@ -1,15 +1,12 @@

    Browse All Teams

    - {#if loading}
    Loading...
    {:else if error} @@ -68,10 +87,14 @@ $: publicTeams = allTeams.filter(t => t.Visibility == "public" ) // only shows if user isnt a member {#if $loggedInStore} + .then((resTeamId) => { + if (isValidTeamId(resTeamId)) { + toast.success("Successfully joined team") + window.location.href = '/#/team/' + resTeamId; // redirect to team page + } else { + toast.error("Error:" + resTeamId.Message) + } + })}>Join {:else} @@ -87,6 +110,5 @@ $: publicTeams = allTeams.filter(t => t.Visibility == "public" ) {/if}
    -
    \ No newline at end of file From 48b40ff4f830f749b384b5891a1c08a730f16f6a Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Wed, 4 Sep 2024 23:58:35 -0700 Subject: [PATCH 105/155] cleaned up comments, added package-lock.json --- .gitignore | 2 + backend/app/server/oauth.go | 1 + backend/app/server/teams.go | 5 +- html/src/lib/pages/UserTeams.svelte | 2 +- html/src/lib/services/services.ts | 1 - package-lock.json | 250 ++++++++++++++++++++++++++++ package.json | 5 + 7 files changed, 261 insertions(+), 5 deletions(-) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore index 68da839..2e564db 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ .idea/ *.iml +node_modules + # VSCODE .vscode/ diff --git a/backend/app/server/oauth.go b/backend/app/server/oauth.go index 6522cbf..9545169 100644 --- a/backend/app/server/oauth.go +++ b/backend/app/server/oauth.go @@ -122,6 +122,7 @@ func (server *Server) GetOAuthCallback(ctx *gin.Context) { session.Save() var stateData *StateData + // give the stateI a defined type/struct of stateData instead of interface{}/any: stateData, ok := stateI.(*StateData) if !ok { ctx.String(400, "Bad Request: Invalid State Data.") diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index d933c17..27e35a5 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -242,7 +242,6 @@ func (server *Server) CreateTeam(ctx *gin.Context) { _, err = database.AddTeamMember(convert.StringToUUID(strUserId), teamUUID, "owner") if err == nil { - fmt.Println("Successfully added team member") ctx.JSON(http.StatusCreated, map[string]pgtype.UUID{ "id": teamUUID, }) @@ -291,7 +290,7 @@ func (server *Server) UpdateTeamMembers(ctx *gin.Context) { func (server *Server) MemberJoin(ctx *gin.Context) { session := sessions.Default(ctx) userId := session.Get("userId") - fmt.Println("userID = ", userId) + //fmt.Println("userID = ", userId) if userId == nil { ctx.Status(http.StatusUnauthorized) @@ -321,7 +320,7 @@ func (server *Server) MemberJoin(ctx *gin.Context) { // Members *[]database.DBTeamMemberInfo // array(slice) of a struct // } - fmt.Println("print (*teamInfo.Members)[0].DBUser.Id = ", convert.UUIDToString((*teamInfo.Members)[0].DBUser.Id)) + // fmt.Println("print (*teamInfo.Members)[0].DBUser.Id = ", convert.UUIDToString((*teamInfo.Members)[0].DBUser.Id)) // ^ dereferences pointer to get to actual slice of database.DBTeamMemberInfo, // then accesses the first element in dereferenced slice diff --git a/html/src/lib/pages/UserTeams.svelte b/html/src/lib/pages/UserTeams.svelte index ab4d17b..a3433ba 100644 --- a/html/src/lib/pages/UserTeams.svelte +++ b/html/src/lib/pages/UserTeams.svelte @@ -53,7 +53,7 @@ If not team owner, cannot view-->
    {:else if userTeams.length === 0}
    - Looks like you don't have any teams! Go to browse teams to join one! + Looks like you don't have any teams. Go to browse teams to join one or create your own team!
    {:else} {#each userTeams as userTeam} diff --git a/html/src/lib/services/services.ts b/html/src/lib/services/services.ts index 4dfe208..5ec084a 100644 --- a/html/src/lib/services/services.ts +++ b/html/src/lib/services/services.ts @@ -151,7 +151,6 @@ export async function joinTeam(teamId: string, inviteCode: string) { } - // write a joinPublicTeam function that accepts team Id. // server: check if team is public. diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a4d9579 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,250 @@ +{ + "name": "Codejam2024", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "svelte-french-toast": "^1.2.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "peer": true + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/code-red": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", + "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@types/estree": "^1.0.1", + "acorn": "^8.10.0", + "estree-walker": "^3.0.3", + "periscopic": "^3.1.0" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "peer": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "peer": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "peer": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "peer": true + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "peer": true + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "peer": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svelte": { + "version": "4.2.19", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", + "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/estree": "^1.0.1", + "acorn": "^8.9.0", + "aria-query": "^5.3.0", + "axobject-query": "^4.0.0", + "code-red": "^1.0.3", + "css-tree": "^2.3.1", + "estree-walker": "^3.0.3", + "is-reference": "^3.0.1", + "locate-character": "^3.0.0", + "magic-string": "^0.30.4", + "periscopic": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/svelte-french-toast": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/svelte-french-toast/-/svelte-french-toast-1.2.0.tgz", + "integrity": "sha512-5PW+6RFX3xQPbR44CngYAP1Sd9oCq9P2FOox4FZffzJuZI2mHOB7q5gJBVnOiLF5y3moVGZ7u2bYt7+yPAgcEQ==", + "dependencies": { + "svelte-writable-derived": "^3.1.0" + }, + "peerDependencies": { + "svelte": "^3.57.0 || ^4.0.0" + } + }, + "node_modules/svelte-writable-derived": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/svelte-writable-derived/-/svelte-writable-derived-3.1.1.tgz", + "integrity": "sha512-w4LR6/bYZEuCs7SGr+M54oipk/UQKtiMadyOhW0PTwAtJ/Ai12QS77sLngEcfBx2q4H8ZBQucc9ktSA5sUGZWw==", + "funding": { + "url": "https://ko-fi.com/pixievoltno1" + }, + "peerDependencies": { + "svelte": "^3.2.1 || ^4.0.0-next.1 || ^5.0.0-next.94" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..6b62c9f --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "svelte-french-toast": "^1.2.0" + } +} From 7afef69a5c5a984375204e81af44773f4bb62ae3 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Thu, 5 Sep 2024 00:00:27 -0700 Subject: [PATCH 106/155] joinPublicTeam now returns teamId an error --- html/src/lib/services/services.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/html/src/lib/services/services.ts b/html/src/lib/services/services.ts index 5ec084a..938f13c 100644 --- a/html/src/lib/services/services.ts +++ b/html/src/lib/services/services.ts @@ -153,14 +153,14 @@ export async function joinTeam(teamId: string, inviteCode: string) { // write a joinPublicTeam function that accepts team Id. // server: check if team is public. - export async function joinPublicTeam(teamId: string) { - return await fetch(baseApiUrl + "/team/join", + const response = await fetch(baseApiUrl + "/team/join", { method: "POST", body: JSON.stringify({ teamId }) } ) + return response.json() } // Always call at startup to get the initial states From 10a9793c998191c1ae72b56334d15e681d57bd79 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Thu, 5 Sep 2024 00:18:44 -0700 Subject: [PATCH 107/155] team visibility set to public by default via CodeJamTeam --- html/src/lib/components/CreateTeamForm.svelte | 1 - html/src/lib/models/team.ts | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/html/src/lib/components/CreateTeamForm.svelte b/html/src/lib/components/CreateTeamForm.svelte index 99ce54a..2f22a58 100644 --- a/html/src/lib/components/CreateTeamForm.svelte +++ b/html/src/lib/components/CreateTeamForm.svelte @@ -39,7 +39,6 @@ let textareaprops = { }; let formData: CodeJamTeam | null = new CodeJamTeam(); -formData.Visibility = 'public'; let isSaving: boolean = false; let teamCreated: boolean = false; diff --git a/html/src/lib/models/team.ts b/html/src/lib/models/team.ts index 59fbbc6..e4eff88 100644 --- a/html/src/lib/models/team.ts +++ b/html/src/lib/models/team.ts @@ -10,16 +10,18 @@ class CodeJamTeam { Availability: string; Description: string; InviteCode: string; + TeamMembers: TeamMember; constructor() { this.Id = ''; this.EventId = ''; this.Name = ''; - this.Visibility = ''; + this.Visibility = 'public'; this.Technologies = ''; this.Availability = ''; this.Description = ''; this.InviteCode = ''; + this.TeamMembers = new TeamMember(); } } From 0c3296c08757a1a6b8c6e1839a8b5fd27e31c38f Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Wed, 25 Sep 2024 22:24:34 -0700 Subject: [PATCH 108/155] add: avatars to browse teams view --- .../migrations/00000011_avatars.up.sql | 2 + backend/app/database/teams.go | 165 +++++++++++++++++- html/src/lib/models/TeamMember.ts | 6 +- html/src/lib/pages/TeamsBrowse.svelte | 26 ++- html/src/lib/services/services.ts | 2 + 5 files changed, 189 insertions(+), 12 deletions(-) create mode 100644 backend/app/database/migrations/00000011_avatars.up.sql diff --git a/backend/app/database/migrations/00000011_avatars.up.sql b/backend/app/database/migrations/00000011_avatars.up.sql new file mode 100644 index 0000000..35f3b8a --- /dev/null +++ b/backend/app/database/migrations/00000011_avatars.up.sql @@ -0,0 +1,2 @@ +ALTER TABLE users +RENAME COLUMN avatar_url TO avatar_id; \ No newline at end of file diff --git a/backend/app/database/teams.go b/backend/app/database/teams.go index 09e0e08..a921ac0 100644 --- a/backend/app/database/teams.go +++ b/backend/app/database/teams.go @@ -14,7 +14,7 @@ type DBTeam struct { Technologies string `db:"technologies"` Availability string `db:"availability"` Description string `db:"description"` - CreatedOn pgtype.Timestamp `db:"created_on" json:"createdOn-hidden"` + CreatedOn pgtype.Timestamp `db:"created_on"` InviteCode string `db:"invite_code"` } @@ -32,12 +32,27 @@ type DBTeamMemberInfo struct { // For team_member table. type DBTeamMember struct { - Id pgtype.UUID `db:"id"` TeamId pgtype.UUID `db:"team_id"` UserId pgtype.UUID `db:"user_id"` TeamRole string `db:"team_role"` - CreatedOn pgtype.Timestamp `db:"created_on" json:"createdOn-hidden"` + CreatedOn pgtype.Timestamp `db:"created_on"` } +//json:"createdOn-hidden" + +// type DBTeamAndMember struct { +// DBTeam // table teams +// DBTeamMember DBTeamMember // table team_members +// DisplayName string `db:"display_name"` // table_user +// } + +// type TeamAndMember struct { +// DBTeam +// TeamMembers []TeamMember +// } +// type TeamMember struct { +// DBTeamMember +// DisplayName string +// } type DBUserTeams struct { DBTeam @@ -60,7 +75,7 @@ func CreateTeam(team DBTeam) (pgtype.UUID, error) { return team.Id, err } -// stepp 5: used to construct the GetTeamResponse struct +// stepp 5: used to construct the GetTeamResponse struct in server/teams.go func GetTeam(teamId pgtype.UUID) (DBTeam, error) { team, err := GetRow[DBTeam]( `SELECT @@ -109,11 +124,147 @@ func GetTeamByInvite(inviteCode string) (DBTeam, error) { return team, nil } -func GetTeams() ([]DBTeam, error) { - result, err := GetRows[DBTeam](`SELECT * FROM teams`) - return result, err +type DBTeamAndMember struct { + Id pgtype.UUID `db:"id"` + EventId pgtype.UUID `db:"event_id"` + Name string `db:"name"` + Visibility string `db:"visibility"` + Timezone string `db:"timezone"` + Technologies string `db:"technologies"` + Availability string `db:"availability"` + Description string `db:"description"` + InviteCode string `db:"invite_code"` + TeamId pgtype.UUID `db:"team_id"` + UserId pgtype.UUID `db:"user_id"` + TeamRole string `db:"team_role"` + DisplayName string `db:"display_name"` + AvatarId string `db:"avatar_id"` + ServiceUserId string `db:"service_user_id` +} + +type UITeam struct { + Id pgtype.UUID `db:"id"` + EventId pgtype.UUID `db:"event_id"` + Name string `db:"name"` + Visibility string `db:"visibility"` + Timezone string `db:"timezone"` + Technologies string `db:"technologies"` + Availability string `db:"availability"` + Description string `db:"description"` + InviteCode string `db:"invite_code"` +} + +type UITeamMember struct { + TeamId pgtype.UUID `db:"team_id"` + UserId pgtype.UUID `db:"user_id"` + TeamRole string `db:"team_role"` +} + +type TeamMember struct { + UITeamMember + DisplayName string `db:"display_name"` + AvatarId string `db:"avatar_id"` + ServiceUserId string `db:"service_user_id"` } +type TeamAndMember struct { + UITeam + TeamMembers []TeamMember +} + +func MapToTeamAndMember(data []DBTeamAndMember) []TeamAndMember{ + // instantiates array to store output, mapped by team id (uuid) for key + teamMap := make(map[pgtype.UUID]*TeamAndMember) + for _, item := range data { + // Check if team already exists in the map. This map loopkup returns: + // 1) value associated with the key if it exsits + // 2) boolean indicating whether key was found in the map + team, ok := teamMap[item.TeamId] + if !ok { + // Create a new team + team = &TeamAndMember{ + UITeam: UITeam { + Id: item.TeamId, + EventId: item.EventId, + Name: item.Name, + Visibility: item.Visibility, + Timezone: item.Timezone, + Technologies: item.Technologies, + Availability: item.Availability, + Description: item.Description, + InviteCode: item.InviteCode, + }, + TeamMembers: []TeamMember{}, + } + teamMap[item.TeamId] = team + } + // Add team member to TeamMembers slice + member := TeamMember{ + UITeamMember: UITeamMember{ + TeamId: item.TeamId, + UserId: item.UserId, + TeamRole: item.TeamRole, + }, + DisplayName: item.DisplayName, + AvatarId: item.AvatarId, + ServiceUserId: item.ServiceUserId, + } + team.TeamMembers = append(team.TeamMembers, member) + } + // Convert map back to slice + var result []TeamAndMember + for _, team := range teamMap { + result = append(result, *team) + } + fmt.Println(result) + return result +} + +func GetTeams() (*[]TeamAndMember, error){ + // TODO: MAKE THE FLAT STRUCTURE HIERARCHICAL + teamAndMember, err := GetRows[DBTeamAndMember]( // returns { team 1: { userA: {display_name: "momo"}}, team 1...} + `SELECT + t.id, + t.event_id, + t.name, + t.visibility, + t.timezone, + t.technologies, + t.availability, + t.description, + t.invite_code, + u.display_name, + u.avatar_id, + u.service_user_id, + tm.team_id, + tm.user_id, + tm.team_role + FROM teams t + INNER JOIN team_members tm ON (tm.team_id = t.id) + INNER JOIN users u ON (u.id = tm.user_id) + ORDER BY t.id + `, + ) + if err != nil { + return nil, err + } + for _, t := range teamAndMember { + fmt.Printf("%v\n", t) + } + UITeamAndMember := MapToTeamAndMember(teamAndMember) + + //fmt.Printf("%T\n", t) + // var TeamMember TeamMember + // var DisplayName string + // var TeamAndMember + // var TeamAndMembers []TeamAndMember + + // // loop through teamAndMembers, if + + return &UITeamAndMember, err +} + + func GetUserTeams(userId pgtype.UUID) ([]DBUserTeams, error) { result, err := GetRows[DBUserTeams]( `SELECT diff --git a/html/src/lib/models/TeamMember.ts b/html/src/lib/models/TeamMember.ts index 41afbb9..1a61108 100644 --- a/html/src/lib/models/TeamMember.ts +++ b/html/src/lib/models/TeamMember.ts @@ -3,15 +3,19 @@ class TeamMember { UserId: string; TeamRole: string; DisplayName: string; + AvatarId: string; + ServiceUserID: string; //TODO add Array constructor() { + this.TeamId = ''; this.UserId = ''; this.TeamRole = ''; this.DisplayName = ''; - + this.AvatarId = ''; + this.ServiceUserID = ''; } } diff --git a/html/src/lib/pages/TeamsBrowse.svelte b/html/src/lib/pages/TeamsBrowse.svelte index 2a2f9c1..490db9b 100644 --- a/html/src/lib/pages/TeamsBrowse.svelte +++ b/html/src/lib/pages/TeamsBrowse.svelte @@ -1,18 +1,20 @@ diff --git a/html/src/lib/pages/TeamsBrowse.svelte b/html/src/lib/pages/TeamsBrowse.svelte index 38e346c..1744378 100644 --- a/html/src/lib/pages/TeamsBrowse.svelte +++ b/html/src/lib/pages/TeamsBrowse.svelte @@ -74,14 +74,13 @@ onMount(() => { loadAvatarUrls(); }); - $: allTeams, loadAvatarUrls(); $: publicTeams = allTeams.filter(t => t.Visibility == "public" ) function isValidTeamId(resTeamId: string | ErrorResponse): resTeamId is string { // Check if resTeamId is an object with a 'Severity' property indicating an error if (typeof resTeamId === 'object' && 'Severity' in resTeamId && resTeamId.Severity === 'ERROR') { - return false; // Not a valid Team ID + return false; // Not a valid Team ID } return true; // Valid Team ID } @@ -91,16 +90,16 @@ function isValidTeamId(resTeamId: string | ErrorResponse): resTeamId is string {

    Browse All Teams

    - {#if loading} -
    Loading...
    - {:else if error} -
    {error}
    + {#if loading} +
    Loading...
    + {:else if error} +
    {error}
    {:else} {#each publicTeams as Team} -
    -

    Team {Team.Name}

    +
    +

    Team {Team.Name}

    Members: @@ -114,19 +113,19 @@ function isValidTeamId(resTeamId: string | ErrorResponse): resTeamId is string { - + + + Visibility: {Team.Visibility} + + + Technologies: {Team.Technologies} + - Visibility: {Team.Visibility} - - - Technologies: {Team.Technologies} - - - Availability: {Team.Availability} - - - Description: {Team.Description} - + Availability: {Team.Availability} + + + Description: {Team.Description} + // only shows if user isnt a member @@ -146,14 +145,14 @@ function isValidTeamId(resTeamId: string | ErrorResponse): resTeamId is string {

    Login with Discord to join a team!

    {/if} - + {:else}
    Looks like you don't have any teams! Go to browse teams to join one!
    {/each} - - {/if} - + + {/if} + - \ No newline at end of file + \ No newline at end of file From 2ea3becd2f6d7edd16ffdd87098b253f2231edb3 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Sun, 29 Sep 2024 00:26:28 -0700 Subject: [PATCH 111/155] fix: navbar pfp works now, both gif and png --- html/src/lib/components/UserAvatar.svelte | 10 +++++++--- html/src/lib/models/user.ts | 7 +++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/html/src/lib/components/UserAvatar.svelte b/html/src/lib/components/UserAvatar.svelte index 543b06b..b9d90dd 100644 --- a/html/src/lib/components/UserAvatar.svelte +++ b/html/src/lib/components/UserAvatar.svelte @@ -8,8 +8,12 @@ -{#if user && user.AvatarUrl} - +{#if user && user.AvatarId} + {#if user.AvatarId && user.AvatarId.startsWith("a_")} + + {:else} + + {/if} {:else} - + {/if} \ No newline at end of file diff --git a/html/src/lib/models/user.ts b/html/src/lib/models/user.ts index c9235ed..9a3cbe1 100644 --- a/html/src/lib/models/user.ts +++ b/html/src/lib/models/user.ts @@ -1,10 +1,13 @@ export interface User { - UserId: string; + Id: string; DisplayName: string; Role: string; ServiceName : string; ServiceUserId: string; - AvatarUrl: string; + ServiceUserName: string; + AvatarId: string; + AccountStatus: string; + LockDisplayName: boolean; } export interface ActiveUser { From 67ceb6c7ea5f12e1c7dd424e9d647edaef47cc46 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Sun, 29 Sep 2024 00:49:42 -0700 Subject: [PATCH 112/155] fix: getUserTeams query includes avatar_id --- backend/app/database/teams.go | 1 + backend/app/server/teams.go | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/app/database/teams.go b/backend/app/database/teams.go index 209084b..e42778e 100644 --- a/backend/app/database/teams.go +++ b/backend/app/database/teams.go @@ -269,6 +269,7 @@ func GetUserTeams(userId pgtype.UUID) ([]DBUserTeams, error) { result, err := GetRows[DBUserTeams]( `SELECT u.display_name, + u.avatar_id, t.*, tm.team_role FROM users u diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index 9832860..38fdd0d 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -84,11 +84,12 @@ func (server *Server) GetAllTeams(ctx *gin.Context) { func (server *Server) GetUserTeams(ctx *gin.Context) { session := sessions.Default(ctx) userId := session.Get("userId") + if userId == nil { ctx.Status(http.StatusNotFound) return } - strUserId := userId.(string) + strUserId := userId.(string) teams, err := database.GetUserTeams(convert.StringToUUID(strUserId)) if err != nil { From 975495c17736af920c4356af584610919f417e60 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Wed, 2 Oct 2024 19:14:26 -0700 Subject: [PATCH 113/155] fix: browseTeams disables join button if user already joined team --- html/src/lib/models/user.ts | 3 +- html/src/lib/pages/TeamsBrowse.svelte | 64 +++++++++++++++++---------- 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/html/src/lib/models/user.ts b/html/src/lib/models/user.ts index 9a3cbe1..3af3c5b 100644 --- a/html/src/lib/models/user.ts +++ b/html/src/lib/models/user.ts @@ -12,5 +12,6 @@ export interface User { export interface ActiveUser { user : User | null; - loggedIn : boolean; + loggedIn : boolean; + userId : User["Id"] | null; } \ No newline at end of file diff --git a/html/src/lib/pages/TeamsBrowse.svelte b/html/src/lib/pages/TeamsBrowse.svelte index 1744378..7118872 100644 --- a/html/src/lib/pages/TeamsBrowse.svelte +++ b/html/src/lib/pages/TeamsBrowse.svelte @@ -8,8 +8,9 @@ import Page from "../components/Page.svelte"; import CodeJamTeam from '../models/team'; import TeamMember from '../models/TeamMember'; import { getTeams, joinPublicTeam } from "../services/services"; -import { activeUserStore, loggedInStore } from '../stores/stores'; +import { activeUserStore, loggedInStore, userStore } from '../stores/stores'; import { onMount } from "svelte"; + import { labelClass } from "flowbite-svelte/Radio.svelte"; export const params: Record = {}; @@ -69,9 +70,21 @@ async function loadAvatarUrls() { await Promise.all(promises); } +let currUserId: string | undefined= $userStore?.Id + +function isUserInTeam(teamMembers: TeamMember[]): boolean { + for (let teamMember of teamMembers) { + if (teamMember.UserId == currUserId) { + return true + } + } + return false +} + onMount(() => { loadData(); loadAvatarUrls(); + }); $: allTeams, loadAvatarUrls(); @@ -101,18 +114,15 @@ function isValidTeamId(resTeamId: string | ErrorResponse): resTeamId is string {

    Team {Team.Name}

    + Members: - -
    +
    {#each Team.TeamMembers as Member} {/each}
    - - - Visibility: {Team.Visibility} @@ -126,24 +136,30 @@ function isValidTeamId(resTeamId: string | ErrorResponse): resTeamId is string { Description: {Team.Description} - - // only shows if user isnt a member - - {#if $loggedInStore} - - {:else} - - -

    Login with Discord to join a team!

    -
    + + + {#if !$loggedInStore} + NOT logged in, Log Into Discord button + + +

    Login with Discord to join a team!

    +
    + {:else if $loggedInStore} + {#if !isUserInTeam(Team.TeamMembers)} + Show join button option + + {:else if isUserInTeam(Team.TeamMembers)} + + {/if} {/if} {:else} From 82bf7238beb59555d6b23516f6b3b41a596c2e34 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Fri, 4 Oct 2024 15:56:11 -0700 Subject: [PATCH 114/155] add: browse/teams shows owner --- backend/app/database/teams.go | 44 ++++++++++++++++----------- backend/app/server/teams.go | 1 - html/src/lib/pages/TeamsBrowse.svelte | 23 +++++++++----- 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/backend/app/database/teams.go b/backend/app/database/teams.go index e42778e..2e24539 100644 --- a/backend/app/database/teams.go +++ b/backend/app/database/teams.go @@ -252,37 +252,47 @@ func GetTeams() (*[]TeamAndMember, error){ fmt.Printf("%v\n", t) } UITeamAndMember := MapToTeamAndMember(teamAndMember) - - //fmt.Printf("%T\n", t) - // var TeamMember TeamMember - // var DisplayName string - // var TeamAndMember - // var TeamAndMembers []TeamAndMember - - // // loop through teamAndMembers, if return &UITeamAndMember, err } +type UserTeamAndMember struct { + +} -func GetUserTeams(userId pgtype.UUID) ([]DBUserTeams, error) { - result, err := GetRows[DBUserTeams]( +func GetUserTeams(userId pgtype.UUID) (*[]TeamAndMember, error) { + result, err := GetRows[DBTeamAndMember]( `SELECT + t.id, + t.event_id, + t.name, + t.visibility, + t.timezone, + t.technologies, + t.availability, + t.description, + t.invite_code, u.display_name, u.avatar_id, - t.*, - tm.team_role - FROM users u - INNER JOIN team_members tm ON u.id = tm.user_id - INNER JOIN teams t ON tm.team_id = t.id - WHERE u.id = $1`, + u.service_user_id, + tm.team_id, + tm.user_id, + tm.team_role, + FROM teams t + INNER JOIN team_members tm ON (tm.team_id = t.id) + INNER JOIN users u ON (u.id = tm.user_id) + WHERE u.id = $1`, userId) if err != nil { fmt.Println("that didn't work: database.GetUserTeams") return nil, err } + for _, t := range result { + fmt.Printf("%v\n", t) + } + UITeamAndMember := MapToTeamAndMember(result) - return result, err // Try look at the table + return &UITeamAndMember, err // Try look at the table } func UpdateTeam(team DBTeam) (DBTeam, error) { diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index 38fdd0d..18c4a01 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -71,7 +71,6 @@ func (server *Server) signupsAllowed(eventId string) bool { func (server *Server) GetAllTeams(ctx *gin.Context) { // what if there's no session => no user id teams, err := database.GetTeams() - fmt.Println(teams) if err == nil { ctx.JSON(http.StatusOK, teams) } else { diff --git a/html/src/lib/pages/TeamsBrowse.svelte b/html/src/lib/pages/TeamsBrowse.svelte index 7118872..c0a9d58 100644 --- a/html/src/lib/pages/TeamsBrowse.svelte +++ b/html/src/lib/pages/TeamsBrowse.svelte @@ -10,12 +10,9 @@ import TeamMember from '../models/TeamMember'; import { getTeams, joinPublicTeam } from "../services/services"; import { activeUserStore, loggedInStore, userStore } from '../stores/stores'; import { onMount } from "svelte"; - import { labelClass } from "flowbite-svelte/Radio.svelte"; export const params: Record = {}; -//activeUserStore.set({user: responseData.Data, loggedIn: true}); - let teamData: CodeJamTeam | null = null; let loading: boolean = true; let error: string | null = null; @@ -26,9 +23,9 @@ let avatarUrls: Record = {}; interface ErrorResponse { Severity: string; + Detail?: string; Code: string; Message: string; - Detail?: string; Hint?: string; Position?: number; InternalPosition?: number; @@ -40,7 +37,7 @@ interface ErrorResponse { async function loadData() { try { const response = await getTeams(); - console.log("response type: ", typeof response) + allTeams = await response.json(); // Array of teams... console.log("allTeams: ", allTeams) } catch (err) { @@ -81,10 +78,18 @@ function isUserInTeam(teamMembers: TeamMember[]): boolean { return false } +function getTeamOwner(teamMembers: TeamMember[]): string { + let owner = teamMembers.find(member => member.TeamRole === "owner"); + if (owner) { + return owner.DisplayName + } else { + return "No owner found." + } +} + onMount(() => { loadData(); loadAvatarUrls(); - }); $: allTeams, loadAvatarUrls(); @@ -114,7 +119,9 @@ function isValidTeamId(resTeamId: string | ErrorResponse): resTeamId is string {

    Team {Team.Name}

    - + + Owner: {getTeamOwner(Team.TeamMembers)} + Members:
    @@ -134,7 +141,7 @@ function isValidTeamId(resTeamId: string | ErrorResponse): resTeamId is string { Availability: {Team.Availability} - Description: {Team.Description} + Description: {Team.Description} From 0f3a3c2f84135846f3b4340be66612f31c02b216 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Fri, 4 Oct 2024 15:56:33 -0700 Subject: [PATCH 115/155] add: users teams show avatar --- html/src/lib/pages/UserTeams.svelte | 60 ++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/html/src/lib/pages/UserTeams.svelte b/html/src/lib/pages/UserTeams.svelte index a3433ba..be313cb 100644 --- a/html/src/lib/pages/UserTeams.svelte +++ b/html/src/lib/pages/UserTeams.svelte @@ -1,25 +1,31 @@ - @@ -61,6 +93,16 @@ If not team owner, cannot view-->

    Team {userTeam.Name}

    + + + Members: +
    + {#each userTeam.TeamMembers as Member} + + {/each} +
    +
    + Visibility: {userTeam.Visibility} From d273eb548872a1f503483a5023bad36ce4d281f5 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Fri, 4 Oct 2024 16:03:45 -0700 Subject: [PATCH 116/155] fix: getUserTeams query bug --- backend/app/database/teams.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/database/teams.go b/backend/app/database/teams.go index 2e24539..07592be 100644 --- a/backend/app/database/teams.go +++ b/backend/app/database/teams.go @@ -277,7 +277,7 @@ func GetUserTeams(userId pgtype.UUID) (*[]TeamAndMember, error) { u.service_user_id, tm.team_id, tm.user_id, - tm.team_role, + tm.team_role FROM teams t INNER JOIN team_members tm ON (tm.team_id = t.id) INNER JOIN users u ON (u.id = tm.user_id) From 63445750b29e1801973519ad0591495c04fa1834 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Fri, 4 Oct 2024 16:16:48 -0700 Subject: [PATCH 117/155] add: userTeams edit team button if owner --- html/src/lib/pages/UserTeams.svelte | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/html/src/lib/pages/UserTeams.svelte b/html/src/lib/pages/UserTeams.svelte index be313cb..66991f8 100644 --- a/html/src/lib/pages/UserTeams.svelte +++ b/html/src/lib/pages/UserTeams.svelte @@ -1,12 +1,13 @@ + + + + Home + Team Options + Edit Team + + +
    + Edit team form here: + {#if loading} + {console.log(formData, "line 107")} +
    Loading...
    + {:else if error} +
    {error}
    + {:else if formData !== null} + +
    +
    + + + +
    + Public Team + (If you want your team to be searchable.) +
    +
    + Private Team + (Your team will be invite only) +
    + + + + + + + + + + + + + + + +
    {/if} diff --git a/html/src/lib/services/services.ts b/html/src/lib/services/services.ts index 207dce7..fe3ddda 100644 --- a/html/src/lib/services/services.ts +++ b/html/src/lib/services/services.ts @@ -6,7 +6,7 @@ import { } from "../stores/stores"; import CodeJamEvent from "../models/event"; import CodeJamTeam from "../models/team"; -import type {ActiveUser, User} from "../models/user"; +import type { ActiveUser, User } from "../models/user"; // This shouldn't ever need to be set since dev and prod environments will just use relative endpoints export let baseApiUrl: string = ""; @@ -32,12 +32,12 @@ export async function getUser() { .then((response) => { if (response.status === 401) { userStore.set(null); - activeUserStore.set({user: null, loggedIn: false}); + activeUserStore.set({ user: null, loggedIn: false }); } else { response.json() .then((data) => { userStore.set(data); - activeUserStore.set({user: data as User, loggedIn: true}) + activeUserStore.set({ user: data as User, loggedIn: true }) }) .catch((err) => { console.error("error deserializing user", err); @@ -58,7 +58,7 @@ export async function logout() { return fetch(baseApiUrl + "/user/logout") .then(() => { userStore.set(null); - activeUserStore.set({user: null, loggedIn: false}); + activeUserStore.set({ user: null, loggedIn: false }); }) .catch((err) => { console.error("Logout error", err); @@ -125,7 +125,7 @@ export async function getTeams() { } -export async function getUserTeams(){ +export async function getUserTeams() { return fetch(baseApiUrl + "/teams"); } @@ -179,5 +179,4 @@ export async function removeMemberFromTeam(teamId: string, memberId: string) { async function initialLoad() { await Promise.all([getUser(), getActiveEvent(), getEventStatuses()]); } - initialLoad(); \ No newline at end of file From fbd65cb98f1fb201ae834709a495b847e7e23254 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Mon, 28 Oct 2024 15:16:48 -0700 Subject: [PATCH 143/155] add: owner info to myteam page --- html/src/lib/pages/MyTeam.svelte | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/html/src/lib/pages/MyTeam.svelte b/html/src/lib/pages/MyTeam.svelte index 80e6b86..fcf0a91 100644 --- a/html/src/lib/pages/MyTeam.svelte +++ b/html/src/lib/pages/MyTeam.svelte @@ -25,6 +25,16 @@ let error: string | null = null; let teamCreated: boolean = false; // Reactivate variable to track if team was just created + // to display the owner the team + function getTeamOwner(teamMembers: TeamMember[]): string { + let owner = teamMembers.find((member) => member.TeamRole === 'owner'); + if (owner) { + return owner.DisplayName; + } else { + return 'No owner found.'; + } + } + async function loadData(id: string) { try { const response = await getTeamById(id); @@ -97,6 +107,9 @@

    Team {teamData.Name}

    (edit)
    + + Owner: {getTeamOwner(teamMembers)} + Team Members: {#each teamMembers as member} From 0d04cd26c6e99b2ecfa55d62413006e2078c7b2c Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Mon, 28 Oct 2024 15:24:18 -0700 Subject: [PATCH 144/155] add: only show edit btn when loggedinuser is owner --- html/src/lib/pages/MyTeam.svelte | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/html/src/lib/pages/MyTeam.svelte b/html/src/lib/pages/MyTeam.svelte index fcf0a91..8d7bb43 100644 --- a/html/src/lib/pages/MyTeam.svelte +++ b/html/src/lib/pages/MyTeam.svelte @@ -7,7 +7,7 @@ import CodeJamTeam from '../models/team'; import { getTeamById } from '../services/services'; import toast from 'svelte-french-toast'; - + import {userStore} from "./../stores/stores"; interface Params { // This is what the params is because you pass an id with type of string. id: string; @@ -105,7 +105,10 @@

    Team {teamData.Name}

    + {#if $userStore?.DisplayName == getTeamOwner(teamMembers)} + (edit) + {/if}
    Owner: {getTeamOwner(teamMembers)} From c5adabc9a4dcc40a689941fa77b94e983aad3d39 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Mon, 28 Oct 2024 15:32:12 -0700 Subject: [PATCH 145/155] fix: url of invite link --- html/src/lib/pages/MyTeam.svelte | 2 +- html/src/lib/pages/TeamEdit.svelte | 32 ++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/html/src/lib/pages/MyTeam.svelte b/html/src/lib/pages/MyTeam.svelte index 8d7bb43..0ac30ba 100644 --- a/html/src/lib/pages/MyTeam.svelte +++ b/html/src/lib/pages/MyTeam.svelte @@ -67,7 +67,7 @@ let url: string = ''; $: if (teamData?.Id) { - url = `localhost:8080/#/team/edit/${teamData.Id}`; + url = `localhost:8080/#/team/invite/${teamData.InviteCode}`; } function copyToClipboard(): void { diff --git a/html/src/lib/pages/TeamEdit.svelte b/html/src/lib/pages/TeamEdit.svelte index 7b842d1..e7fe43b 100644 --- a/html/src/lib/pages/TeamEdit.svelte +++ b/html/src/lib/pages/TeamEdit.svelte @@ -121,7 +121,6 @@ await Promise.all(promises); } - async function loadData(id: string) { try { @@ -150,7 +149,22 @@ $: if (params) { loadData(params.id); } + let url: string = ''; + $: if (teamData?.Id) { + url = `localhost:8080/#/team/invite/${teamData.InviteCode}`; + } + + function copyToClipboard(): void { + navigator.clipboard + .writeText(url) + .then(() => { + toast.success('Copied to clipboard'); + }) + .catch((err: Error) => { + toast.error(`Failed to copy: ${err}`); + }); + } @@ -204,10 +218,20 @@ {/if}
    - - - Invite Link: https://localhost:8080/#/team/invite/{teamInviteCode} + + Invite Link: +
    + + +

    Team Members

    From 06d48db46353ce9f50ab7bd2e2a6a7543b07126f Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Tue, 29 Oct 2024 15:52:15 -0700 Subject: [PATCH 146/155] fix: owners can remove team members appropriately --- backend/app/database/teams.go | 13 +++- backend/app/server/teams.go | 62 +++++++++--------- html/src/lib/pages/TeamEdit.svelte | 91 ++++++++++++++------------- html/src/lib/pages/TeamsBrowse.svelte | 4 +- html/src/lib/pages/UserTeams.svelte | 1 - html/src/lib/services/services.ts | 23 ++++++- 6 files changed, 117 insertions(+), 77 deletions(-) diff --git a/backend/app/database/teams.go b/backend/app/database/teams.go index 0dc7918..0d1edca 100644 --- a/backend/app/database/teams.go +++ b/backend/app/database/teams.go @@ -288,8 +288,17 @@ func AddTeamMember(userId pgtype.UUID, teamUUID pgtype.UUID, role string) (userI return teamMember.UserId, err } -func RemoveTeamMember(teamId pgtype.UUID, userId pgtype.UUID) { - +func RemoveTeamMember(teamId pgtype.UUID, userId pgtype.UUID) (DBTeamMember, error) { + deletedMember, err := GetRow[DBTeamMember](` + DELETE FROM team_members + WHERE team_id = $1 AND user_id = $2 + RETURNING team_id, user_id, team_role, created_on AS user_created_on`, + teamId, userId) + if err != nil { + logger.Error("Failed to remove team member: %v", err) + return DBTeamMember{}, err + } + return deletedMember, nil } func GetMembersByTeamId(teamId pgtype.UUID) (*[]DBTeamMemberInfo, error) { diff --git a/backend/app/server/teams.go b/backend/app/server/teams.go index 0c05b27..6e95d23 100644 --- a/backend/app/server/teams.go +++ b/backend/app/server/teams.go @@ -30,18 +30,23 @@ type CreateTeamRequest struct { } type GetTeamResponse struct { - Team *database.DBTeam - Event *database.DBEvent + Team *database.DBTeam + Event *database.DBEvent TeamMembers *[]database.DBTeamMemberInfo // array(slice) of a struct } type InvitePayload struct { - TeamId string `json:"teamId"` - InviteCode string `json:"inviteCode"` + TeamId string `json:"teamId"` + InviteCode string `json:"inviteCode"` } type JoinPayload struct { - TeamId string `json:"teamId"` + TeamId string `json:"teamId"` +} + +type MemberPayload struct { + TeamId string `json:"teamId"` + MemberId string `json:"memberId"` } func MD5HashCode(teamName string) (string, error) { @@ -88,7 +93,7 @@ func (server *Server) GetUserTeams(ctx *gin.Context) { ctx.Status(http.StatusNotFound) return } - strUserId := userId.(string) + strUserId := userId.(string) teams, err := database.GetUserTeams(convert.StringToUUID(strUserId)) if err != nil { @@ -99,7 +104,6 @@ func (server *Server) GetUserTeams(ctx *gin.Context) { ctx.JSON(http.StatusOK, teams) } - // purpose is to construct the DBTeamMemberInfo func (server *Server) GetTeamInfo(id pgtype.UUID) (*GetTeamResponse, error) { @@ -130,7 +134,7 @@ func (server *Server) GetTeamInfo(id pgtype.UUID) (*GetTeamResponse, error) { teamResponse.Team = &team teamResponse.Event = &event teamResponse.TeamMembers = teamMembers - + return &teamResponse, nil } @@ -191,7 +195,7 @@ func (server *Server) CreateTeam(ctx *gin.Context) { // Step 4: Post Team Data API (TWO PARTS 1) create team 2) add team members) session := sessions.Default(ctx) userId := session.Get("userId") - if userId == nil { + if userId == nil { ctx.Status(http.StatusUnauthorized) return } @@ -230,7 +234,7 @@ func (server *Server) CreateTeam(ctx *gin.Context) { team.InviteCode = md5code fmt.Printf("%+v", team) - + // INSERTS TEAM into DB // PART 1/2 DONE teamUUID, err := database.CreateTeam(team) @@ -239,7 +243,7 @@ func (server *Server) CreateTeam(ctx *gin.Context) { ctx.Status(http.StatusBadRequest) return } - fmt.Println(convert.StringToUUID(strUserId), teamUUID,) + fmt.Println(convert.StringToUUID(strUserId), teamUUID) // PART 2/2 DONE // construct TeamMember @@ -263,7 +267,7 @@ func (server *Server) UpdateTeam(ctx *gin.Context) { fmt.Println(ctx.Request.Body) if userId != nil { var team database.DBTeam - err := ctx.ShouldBindJSON(&team) //"message incoming data to this struct" + err := ctx.ShouldBindJSON(&team) //"message incoming data to this struct" if err != nil { logger.Error("UpdateEvent Request ShouldBindJSON error: %v", err) ctx.Status(http.StatusBadRequest) @@ -288,22 +292,25 @@ func (server *Server) RemoveTeamMember(ctx *gin.Context) { ctx.Status(http.StatusUnauthorized) return } - strUserId := userId.(string) - uuidUserId := convert.StringToUUID(strUserId) - var teamId JoinPayload + var MemberPayload MemberPayload - if err := ctx.ShouldBindJSON(&teamId); err != nil { + if err := ctx.ShouldBindJSON(&MemberPayload); err != nil { ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } - // teamId prints: {cc457e3e-210a-4d5d-83d8-0899426dfc93} - uuidTeamId := convert.StringToUUID(teamId.TeamId) - fmt.Println("user id: ", uuidUserId, "==== teamd id:", uuidTeamId) - //_, err := database.RemoveTeamMember(teamId, userId) - ctx.JSON(http.StatusOK, "pass") + uuidTeamId := convert.StringToUUID(MemberPayload.TeamId) + uuidMemberId := convert.StringToUUID(MemberPayload.MemberId) + + removedMember, err := database.RemoveTeamMember(uuidTeamId, uuidMemberId) + if err != nil { + fmt.Println("Error removing team member: ", err) + } + + strTeamId := convert.UUIDToString(removedMember.TeamId) + ctx.JSON(http.StatusOK, strTeamId) } func (server *Server) MemberJoin(ctx *gin.Context) { @@ -328,17 +335,17 @@ func (server *Server) MemberJoin(ctx *gin.Context) { // teamId prints: {cc457e3e-210a-4d5d-83d8-0899426dfc93} uuidTeamId := convert.StringToUUID(teamId.TeamId) teamInfo, err := server.GetTeamInfo(uuidTeamId) - + if err != nil { ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return + return } // verifies team is public var isPublic string = teamInfo.Team.Visibility if isPublic == "private" { ctx.Status(http.StatusForbidden) - return + return } _, err = database.AddTeamMember(uuidUserId, uuidTeamId, "member") if err != nil { @@ -351,7 +358,7 @@ func (server *Server) MemberJoin(ctx *gin.Context) { func (server *Server) MemberInvite(ctx *gin.Context) { session := sessions.Default(ctx) - userId:= session.Get("userId") + userId := session.Get("userId") var payload InvitePayload // bind the message context to the structure, and do an error check @@ -369,7 +376,7 @@ func (server *Server) MemberInvite(ctx *gin.Context) { dbInviteCode, err := database.GetTeamInviteCode(uuidTeamId) if err != nil { ctx.JSON(http.StatusBadRequest, inviteCode) - } + } fmt.Println("server dbInviteCode: ", dbInviteCode) if inviteCode != dbInviteCode.InviteCode { fmt.Println("invalid request") @@ -382,7 +389,6 @@ func (server *Server) MemberInvite(ctx *gin.Context) { } } - func (server *Server) SetupTeamRoutes() { group := server.Gin.Group("/team") { @@ -394,7 +400,7 @@ func (server *Server) SetupTeamRoutes() { group.GET("/invite/:invitecode", server.GetTeamInfoByInviteCode) group.PUT("/edit/:teamid", server.UpdateTeam) // for admin to remove people - group.PUT("/team/:teamid/member/:memberid", server.RemoveTeamMember) + group.DELETE("/:teamid/member/:memberid", server.RemoveTeamMember) } server.Gin.GET("/teams", server.GetUserTeams) // I think this works rofl server.Gin.GET("/teams/browse", server.GetAllTeams) diff --git a/html/src/lib/pages/TeamEdit.svelte b/html/src/lib/pages/TeamEdit.svelte index e7fe43b..981be7d 100644 --- a/html/src/lib/pages/TeamEdit.svelte +++ b/html/src/lib/pages/TeamEdit.svelte @@ -38,7 +38,7 @@ let teamAvailability: string = ''; let teamTechnologies: string = ''; let teamDescription: string = ''; - let teamInviteCode: string = ''; + let teamInviteCode: string = ''; let loading: boolean = true; let formData: CodeJamTeam | null = null; @@ -80,47 +80,43 @@ } } - function removeMember(teamId: string, memberUserId: string) { + async function removeMember(teamId: string, memberUserId: string): Promise { if (confirm('Are you sure you want to remove this team member?')) { - // Call API to remove member - removeMemberFromTeam(teamId, memberUserId) - .then(() => { - // Update formData to reflect changes - teamMembers = teamMembers.filter((member) => member.UserId !== memberUserId); - toast.success('Member removed successfully'); - }) - .catch((err) => { - toast.error('Failed to remove member'); - console.error(err); - }); + try { + // Call API to remove member + await removeMemberFromTeam(teamId, memberUserId); + return teamId; + } catch (err) { + toast.error('Failed to remove member'); + console.error(err); + return ''; + } } + return ''; } async function getAvatarUrl(member: TeamMember): Promise { - console.log("member: ", member) let ext = member.AvatarId.startsWith('a_') ? '.gif' : '.png'; - console.log("meember.AvatarUrl: ", member.AvatarId) return `https://cdn.discordapp.com/avatars/${member.ServiceUserId}/${member.AvatarId}${ext}`; } - async function loadAvatarUrls() { + async function loadAvatarUrls() { let members: TeamMember[] = []; - members.push(...teamMembers); + members.push(...teamMembers); console.log(`MEMBERS: ${members}`); const promises = members.map(async (member) => { const url = await getAvatarUrl(member); - // for this page, we use Id instead of UserId because it queries the User table, which uses 'Id' - // may need to make a new class/model if we want to fix the error: Property 'Id' does not exist on type 'TeamMember'. + // for this page, we use Id instead of UserId because it queries the User table, which uses 'Id' + // may need to make a new class/model if we want to fix the error: Property 'Id' does not exist on type 'TeamMember'. avatarUrls[member.Id] = url; }); await Promise.all(promises); - - } + } async function loadData(id: string) { try { @@ -128,7 +124,7 @@ response.json().then((data) => { formData = data as CodeJamTeam; teamData = data.Team; - teamInviteCode = data.Team.InviteCode; + teamInviteCode = data.Team.InviteCode; teamMembers = data.TeamMembers; teamEvent = data.Event; teamName = data.Team.Name; @@ -136,8 +132,8 @@ teamAvailability = data.Team.Availability; teamTechnologies = data.Team.Technologies; teamDescription = data.Team.Description; - loadAvatarUrls(); - }); + loadAvatarUrls(); + }); }); } catch (err) { error = `Failed to load team data: ${err}`; @@ -147,7 +143,7 @@ } $: if (params) { - loadData(params.id); + loadData(params.id); } let url: string = ''; @@ -218,22 +214,22 @@ {/if} - - Invite Link: - -
    - - -
    + + Invite Link: + +
    + + +
    -

    Team Members

    +

    Team Members

    Avatar @@ -247,15 +243,24 @@ {#each formData.TeamMembers as Member} - - + + {Member.DisplayName} {Member.TeamRole} {#if Member.TeamRole !== 'owner'} - {:else} - - {/if} - - - - \ No newline at end of file + +

    Edit Profile

    + {#if formData !== null} +
    +
    + + + + +
    + + + {:else} + + {/if} +
    + diff --git a/html/src/lib/pages/TeamEdit.svelte b/html/src/lib/pages/TeamEdit.svelte index 2d298f6..c8f9e93 100644 --- a/html/src/lib/pages/TeamEdit.svelte +++ b/html/src/lib/pages/TeamEdit.svelte @@ -22,7 +22,6 @@ import FormField from '../components/FormField.svelte'; import Page from '../components/Page.svelte'; import type CodeJamEvent from '../models/event'; - import CodeJamTeam from '../models/team'; import CodeJamTeamExtended from '../models/teamExtended'; import type TeamMember from '../models/TeamMember'; import { getTeamById, putTeam, removeMemberFromTeam } from '../services/services'; @@ -39,7 +38,7 @@ let avatarUrls: Record = {}; let teamName: string = ''; - let teamId: string = ''; + let teamId: string = ''; let teamVisibility: string = ''; let teamAvailability: string = ''; let teamTechnologies: string = ''; @@ -132,7 +131,7 @@ formData = data as CodeJamTeamExtended; teamData = data.Team; - teamId = data.Team.Id; + teamId = data.Team.Id; teamName = data.Team.Name; teamInviteCode = data.Team.InviteCode; teamMembers = data.TeamMembers; @@ -159,7 +158,7 @@ let url: string = ''; $: if (teamId) { - console.log("does thissssssss...") + console.log('does thissssssss...'); url = `localhost:8080/#/team/invite/${teamInviteCode}`; } From e3ae671a69934e4bf8009c5a410d274a1958ea11 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Mon, 11 Nov 2024 13:18:12 -0800 Subject: [PATCH 153/155] fix: small formatting --- backend/app/integrations/generic.go | 12 +++++------- html/src/routes.ts | 1 - 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/backend/app/integrations/generic.go b/backend/app/integrations/generic.go index e60f201..a651a15 100644 --- a/backend/app/integrations/generic.go +++ b/backend/app/integrations/generic.go @@ -14,7 +14,7 @@ type IntegrationUser struct { IntegrationName string UserId string ServiceUserName string - AvatarId string + AvatarId string } func getGitHubUser(accessToken string) *IntegrationUser { @@ -32,14 +32,13 @@ func getGitHubUser(accessToken string) *IntegrationUser { func getDiscordUser(accessToken string) *IntegrationUser { user := discord.GetUser(accessToken) avatar, ok := user["avatar"].(string) - if !ok { - avatar = "" // Or set a default avatar URL if preferred - } + if !ok { + avatar = "" // Or set a default avatar URL if preferred + } if user == nil { logger.Error("User not found for token: %s", accessToken) return nil } else { - var avatar = "" if user["avatar"] != nil { avatar = user["avatar"].(string) } @@ -47,7 +46,7 @@ func getDiscordUser(accessToken string) *IntegrationUser { IntegrationName: "discord", UserId: user["id"].(string), ServiceUserName: user["global_name"].(string), - AvatarId: avatar, + AvatarId: avatar, } } } @@ -61,5 +60,4 @@ func GetUser(integrationName string, accessToken string) *IntegrationUser { default: return nil } - } diff --git a/html/src/routes.ts b/html/src/routes.ts index f1cf515..5090528 100644 --- a/html/src/routes.ts +++ b/html/src/routes.ts @@ -14,7 +14,6 @@ import TeamEdit from "./lib/pages/TeamEdit.svelte"; export default { '/': HomePage, '/home': HomePage, - '/team': TeamOptions, '/team/:id': MyTeam, // link to one of your teams (sharable) We get an id here in this route... '/team/invite/:invitecode': Invite, // sharable From 122ac57ba01b7c569cb0807f70950ca36e70a3d4 Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Mon, 11 Nov 2024 13:49:27 -0800 Subject: [PATCH 154/155] fix: when userstore displayname loads --- backend/app/database/migrations/00000011_avatars.up.sql | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 backend/app/database/migrations/00000011_avatars.up.sql diff --git a/backend/app/database/migrations/00000011_avatars.up.sql b/backend/app/database/migrations/00000011_avatars.up.sql deleted file mode 100644 index 35f3b8a..0000000 --- a/backend/app/database/migrations/00000011_avatars.up.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE users -RENAME COLUMN avatar_url TO avatar_id; \ No newline at end of file From d664d848d655a89b8d9e77df02c93124eaff47bc Mon Sep 17 00:00:00 2001 From: timeenjoyed Date: Mon, 11 Nov 2024 13:49:53 -0800 Subject: [PATCH 155/155] fix: when userstore display name shows(when the page loads?) --- html/src/lib/pages/UserTeams.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/html/src/lib/pages/UserTeams.svelte b/html/src/lib/pages/UserTeams.svelte index 24b7580..567bdf3 100644 --- a/html/src/lib/pages/UserTeams.svelte +++ b/html/src/lib/pages/UserTeams.svelte @@ -65,11 +65,11 @@ return 'No owner found.'; } } - + let userDisplayName = $userStore?.DisplayName onMount(() => { loadData(); }); - + $: userDisplayName; // Currently, I'm querying every team where the loggedin user is the owner, and separating all the members. // I'm also checking client side whether the loggined user is the owner or not. // -- If it's an owner, it shows an edit button.