From 5cbf9f809c098fd10394e14656adae4ef09dd1de Mon Sep 17 00:00:00 2001 From: swve Date: Mon, 26 Jun 2023 18:09:01 +0200 Subject: [PATCH] fix: mutations issues + trail + next canary bump --- .../(withmenu)/collections/admin.tsx | 3 + .../(withmenu)/collections/new/page.tsx | 3 + .../activity/[activityid]/activity.tsx | 4 + .../(withmenu)/course/[courseid]/course.tsx | 6 + .../organization/general/organization.tsx | 3 + .../Modals/Course/Create/CreateCourse.tsx | 3 + front/package-lock.json | 174 +++++++++--------- front/package.json | 2 +- src/security/security.py | 3 +- src/services/courses/activities/activities.py | 123 ++++++++++--- src/services/trail.py | 2 +- 11 files changed, 205 insertions(+), 121 deletions(-) diff --git a/front/app/orgs/[orgslug]/(withmenu)/collections/admin.tsx b/front/app/orgs/[orgslug]/(withmenu)/collections/admin.tsx index 04a9307d..2af0c9bc 100644 --- a/front/app/orgs/[orgslug]/(withmenu)/collections/admin.tsx +++ b/front/app/orgs/[orgslug]/(withmenu)/collections/admin.tsx @@ -18,6 +18,9 @@ const CollectionAdminEditsArea = (props: any) => { // reload the page router.refresh(); router.push(getUriWithOrg(props.orgslug, "/collections")); + + // refresh page (FIX for Next.js BUG) + window.location.reload(); } return ( diff --git a/front/app/orgs/[orgslug]/(withmenu)/collections/new/page.tsx b/front/app/orgs/[orgslug]/(withmenu)/collections/new/page.tsx index 62b20dfe..a440348b 100644 --- a/front/app/orgs/[orgslug]/(withmenu)/collections/new/page.tsx +++ b/front/app/orgs/[orgslug]/(withmenu)/collections/new/page.tsx @@ -47,6 +47,9 @@ function NewCollection(params: any) { router.prefetch(getUriWithOrg(orgslug, "/collections")); router.push(getUriWithOrg(orgslug, "/collections")); router.refresh(); + + // refresh page (FIX for Next.js BUG) + window.location.reload(); }; diff --git a/front/app/orgs/[orgslug]/(withmenu)/course/[courseid]/activity/[activityid]/activity.tsx b/front/app/orgs/[orgslug]/(withmenu)/course/[courseid]/activity/[activityid]/activity.tsx index dc6a218f..e9f94228 100644 --- a/front/app/orgs/[orgslug]/(withmenu)/course/[courseid]/activity/[activityid]/activity.tsx +++ b/front/app/orgs/[orgslug]/(withmenu)/course/[courseid]/activity/[activityid]/activity.tsx @@ -101,6 +101,10 @@ export function MarkStatus(props: { activityid: string, course: any, orgslug: st async function markActivityAsCompleteFront() { const trail = await markActivityAsComplete(props.orgslug, props.courseid, props.activityid); router.refresh(); + + // refresh page (FIX for Next.js BUG) + window.location.reload(); + } return ( diff --git a/front/app/orgs/[orgslug]/(withmenu)/course/[courseid]/course.tsx b/front/app/orgs/[orgslug]/(withmenu)/course/[courseid]/course.tsx index b8227993..adf51412 100644 --- a/front/app/orgs/[orgslug]/(withmenu)/course/[courseid]/course.tsx +++ b/front/app/orgs/[orgslug]/(withmenu)/course/[courseid]/course.tsx @@ -24,6 +24,9 @@ const CourseClient = (props: any) => { await startCourse("course_" + courseid, orgslug); revalidateTags(['courses']); router.refresh(); + + // refresh page (FIX for Next.js BUG) + window.location.reload(); } async function quitCourse() { @@ -32,6 +35,9 @@ const CourseClient = (props: any) => { // Mutate course revalidateTags(['courses']); router.refresh(); + + // refresh page (FIX for Next.js BUG) + window.location.reload(); } diff --git a/front/app/orgs/[orgslug]/settings/organization/general/organization.tsx b/front/app/orgs/[orgslug]/settings/organization/general/organization.tsx index 7b1038f9..69830d16 100644 --- a/front/app/orgs/[orgslug]/settings/organization/general/organization.tsx +++ b/front/app/orgs/[orgslug]/settings/organization/general/organization.tsx @@ -36,6 +36,9 @@ function OrganizationClient(props: any) { revalidateTags(['organizations']); router.refresh(); + // refresh page (FIX for Next.js BUG) + window.location.reload(); + } }; diff --git a/front/components/Objects/Modals/Course/Create/CreateCourse.tsx b/front/components/Objects/Modals/Course/Create/CreateCourse.tsx index f4a49c82..5e7c0fc2 100644 --- a/front/components/Objects/Modals/Course/Create/CreateCourse.tsx +++ b/front/components/Objects/Modals/Course/Create/CreateCourse.tsx @@ -49,6 +49,9 @@ function CreateCourseModal({ closeModal, orgslug }: any) { if (status.org_id == orgId) { closeModal(); router.refresh(); + + // refresh page (FIX for Next.js BUG) + window.location.reload(); } else { alert("Error creating course, please see console logs"); console.log(status); diff --git a/front/package-lock.json b/front/package-lock.json index 8f46da95..e1094631 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -26,7 +26,7 @@ "formik": "^2.2.9", "framer-motion": "^7.3.6", "lucide-react": "^0.248.0", - "next": "^13.4.7-canary.4", + "next": "^13.4.8-canary.4", "re-resizable": "^6.9.9", "react": "^18.2.0", "react-beautiful-dnd": "^13.1.1", @@ -2123,9 +2123,9 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.8-canary.4.tgz", + "integrity": "sha512-C6riyNtIP+qE3Q1qIthEOprGm7h6LeMf1SjIUenhHyFLiPKLd0O4ltD1+AGhXw+bW3VFO26Wa9N2LHWpigdJtA==" }, "node_modules/@next/eslint-plugin-next": { "version": "13.0.6", @@ -2137,9 +2137,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.8-canary.4.tgz", + "integrity": "sha512-clQaivrVkk5g2VAjp0X5EElpgN/Xt62ZX9PNKPcnHSjA7ybWh5snlqfjYpaCwMVpZYvs/F042sT2MzIACRb9AQ==", "cpu": [ "arm64" ], @@ -2152,9 +2152,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.8-canary.4.tgz", + "integrity": "sha512-NP73yfCTGlEyBdiL2LJo9qnCoEFN3shILxiiBEA3LwA9JNgG540yLNFEN2hTt+J1D+YDhsQhWWgg4Iln4qXrbw==", "cpu": [ "x64" ], @@ -2167,9 +2167,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.8-canary.4.tgz", + "integrity": "sha512-HmIsfizzt1mv0Zoxq6c3snBvtSOIX7k8rc6Wm2Ta3valSjc54ZhylNyQOWD2wuE9ufVpn2n1AHFlhUE+APY+nQ==", "cpu": [ "arm64" ], @@ -2182,9 +2182,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.8-canary.4.tgz", + "integrity": "sha512-HJ1VyGSecFl+jKWLJ8iPrz7IEAbw+LMtUybIRepipWKUioTsSnh1jrnYY575KZVYPhFNRX6lvx5XXPTaZ5eYfQ==", "cpu": [ "arm64" ], @@ -2197,9 +2197,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.8-canary.4.tgz", + "integrity": "sha512-VrzpVY/NO5uEvHhDfD8aXKY+Rr7YOQ9KKDQmeUvzeNi63fwhbRY7WasjNOSBp7AG53kWtiwL7uzuZvx6AMVJuA==", "cpu": [ "x64" ], @@ -2212,9 +2212,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.8-canary.4.tgz", + "integrity": "sha512-qIODBX/0azVrHCcpakafyy/B40gYrjBXUtDo4tanfBQlyDgDDdY7R1JV1+vodLvCi/2/bnqtz7S9Bb0ZyMN19g==", "cpu": [ "x64" ], @@ -2227,9 +2227,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.8-canary.4.tgz", + "integrity": "sha512-+sJasAcqz8XiX1sVEhc6fuNSVZMvQjC/L0pUJ5dzFXaAIPfH6s0c8Bx36F3c81C3KoF8UykWUp2IotXWUlJkQA==", "cpu": [ "arm64" ], @@ -2242,9 +2242,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.8-canary.4.tgz", + "integrity": "sha512-DNjdyOH6i4A62cwR3GOpQpS21GPzz6r6KkjzuQP7A3q/lYQBULX4Jmr8iBm37Sr5o3PXEPI5owWcC6xsqOsduw==", "cpu": [ "ia32" ], @@ -2257,9 +2257,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.8-canary.4.tgz", + "integrity": "sha512-zsuSyWhNRXa8toC1Eu0RE9Ol4C006yXDvQc3AJ1vPzFj6ggibLhrmYImFOLV716VDwOj5oALHI0Lc5qMM0NZYQ==", "cpu": [ "x64" ], @@ -6374,11 +6374,11 @@ "dev": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.8-canary.4.tgz", + "integrity": "sha512-Dy5BOsaoXhxEoZ7ljZ/l+BUjh+5ODVMRSUV0AOXhzcDparLh0+AcZUyglaqANyh94hZoevod4ubkJDSPRYSHtQ==", "dependencies": { - "@next/env": "13.4.7", + "@next/env": "13.4.8-canary.4", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", @@ -6394,15 +6394,15 @@ "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "13.4.8-canary.4", + "@next/swc-darwin-x64": "13.4.8-canary.4", + "@next/swc-linux-arm64-gnu": "13.4.8-canary.4", + "@next/swc-linux-arm64-musl": "13.4.8-canary.4", + "@next/swc-linux-x64-gnu": "13.4.8-canary.4", + "@next/swc-linux-x64-musl": "13.4.8-canary.4", + "@next/swc-win32-arm64-msvc": "13.4.8-canary.4", + "@next/swc-win32-ia32-msvc": "13.4.8-canary.4", + "@next/swc-win32-x64-msvc": "13.4.8-canary.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -10055,9 +10055,9 @@ } }, "@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.8-canary.4.tgz", + "integrity": "sha512-C6riyNtIP+qE3Q1qIthEOprGm7h6LeMf1SjIUenhHyFLiPKLd0O4ltD1+AGhXw+bW3VFO26Wa9N2LHWpigdJtA==" }, "@next/eslint-plugin-next": { "version": "13.0.6", @@ -10069,57 +10069,57 @@ } }, "@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.8-canary.4.tgz", + "integrity": "sha512-clQaivrVkk5g2VAjp0X5EElpgN/Xt62ZX9PNKPcnHSjA7ybWh5snlqfjYpaCwMVpZYvs/F042sT2MzIACRb9AQ==", "optional": true }, "@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.8-canary.4.tgz", + "integrity": "sha512-NP73yfCTGlEyBdiL2LJo9qnCoEFN3shILxiiBEA3LwA9JNgG540yLNFEN2hTt+J1D+YDhsQhWWgg4Iln4qXrbw==", "optional": true }, "@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.8-canary.4.tgz", + "integrity": "sha512-HmIsfizzt1mv0Zoxq6c3snBvtSOIX7k8rc6Wm2Ta3valSjc54ZhylNyQOWD2wuE9ufVpn2n1AHFlhUE+APY+nQ==", "optional": true }, "@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.8-canary.4.tgz", + "integrity": "sha512-HJ1VyGSecFl+jKWLJ8iPrz7IEAbw+LMtUybIRepipWKUioTsSnh1jrnYY575KZVYPhFNRX6lvx5XXPTaZ5eYfQ==", "optional": true }, "@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.8-canary.4.tgz", + "integrity": "sha512-VrzpVY/NO5uEvHhDfD8aXKY+Rr7YOQ9KKDQmeUvzeNi63fwhbRY7WasjNOSBp7AG53kWtiwL7uzuZvx6AMVJuA==", "optional": true }, "@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.8-canary.4.tgz", + "integrity": "sha512-qIODBX/0azVrHCcpakafyy/B40gYrjBXUtDo4tanfBQlyDgDDdY7R1JV1+vodLvCi/2/bnqtz7S9Bb0ZyMN19g==", "optional": true }, "@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.8-canary.4.tgz", + "integrity": "sha512-+sJasAcqz8XiX1sVEhc6fuNSVZMvQjC/L0pUJ5dzFXaAIPfH6s0c8Bx36F3c81C3KoF8UykWUp2IotXWUlJkQA==", "optional": true }, "@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.8-canary.4.tgz", + "integrity": "sha512-DNjdyOH6i4A62cwR3GOpQpS21GPzz6r6KkjzuQP7A3q/lYQBULX4Jmr8iBm37Sr5o3PXEPI5owWcC6xsqOsduw==", "optional": true }, "@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.8-canary.4.tgz", + "integrity": "sha512-zsuSyWhNRXa8toC1Eu0RE9Ol4C006yXDvQc3AJ1vPzFj6ggibLhrmYImFOLV716VDwOj5oALHI0Lc5qMM0NZYQ==", "optional": true }, "@nicolo-ribaudo/chokidar-2": { @@ -13092,20 +13092,20 @@ "dev": true }, "next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "13.4.8-canary.4", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.8-canary.4.tgz", + "integrity": "sha512-Dy5BOsaoXhxEoZ7ljZ/l+BUjh+5ODVMRSUV0AOXhzcDparLh0+AcZUyglaqANyh94hZoevod4ubkJDSPRYSHtQ==", "requires": { - "@next/env": "13.4.7", - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7", + "@next/env": "13.4.8-canary.4", + "@next/swc-darwin-arm64": "13.4.8-canary.4", + "@next/swc-darwin-x64": "13.4.8-canary.4", + "@next/swc-linux-arm64-gnu": "13.4.8-canary.4", + "@next/swc-linux-arm64-musl": "13.4.8-canary.4", + "@next/swc-linux-x64-gnu": "13.4.8-canary.4", + "@next/swc-linux-x64-musl": "13.4.8-canary.4", + "@next/swc-win32-arm64-msvc": "13.4.8-canary.4", + "@next/swc-win32-ia32-msvc": "13.4.8-canary.4", + "@next/swc-win32-x64-msvc": "13.4.8-canary.4", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", diff --git a/front/package.json b/front/package.json index f39cbba5..18a9811d 100644 --- a/front/package.json +++ b/front/package.json @@ -27,7 +27,7 @@ "formik": "^2.2.9", "framer-motion": "^7.3.6", "lucide-react": "^0.248.0", - "next": "^13.4.7-canary.4", + "next": "^13.4.8-canary.4", "re-resizable": "^6.9.9", "react": "^18.2.0", "react-beautiful-dnd": "^13.1.1", diff --git a/src/security/security.py b/src/security/security.py index 348adf41..f6384b09 100644 --- a/src/security/security.py +++ b/src/security/security.py @@ -46,8 +46,7 @@ async def verify_user_rights_with_roles(request: Request, action: str, user_id: # Check if user is anonymous if user_id == "anonymous": - raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, detail="The ressource you are trying to access is not publicly available") + return False # Check if the user is an admin user: UserInDB = UserInDB(**await users.find_one({"user_id": user_id})) diff --git a/src/services/courses/activities/activities.py b/src/services/courses/activities/activities.py index 46842d38..8816461a 100644 --- a/src/services/courses/activities/activities.py +++ b/src/services/courses/activities/activities.py @@ -21,6 +21,7 @@ class ActivityInDB(Activity): creationDate: str updateDate: str + #### Classes #################################################### @@ -29,58 +30,102 @@ class ActivityInDB(Activity): #################################################### -async def create_activity(request: Request, activity_object: Activity, org_id: str, coursechapter_id: str, current_user: PublicUser): +async def create_activity( + request: Request, + activity_object: Activity, + org_id: str, + coursechapter_id: str, + current_user: PublicUser, +): activities = request.app.db["activities"] courses = request.app.db["courses"] # generate activity_id activity_id = str(f"activity_{uuid4()}") - hasRoleRights = await verify_user_rights_with_roles(request, "create", current_user.user_id, activity_id, org_id) + hasRoleRights = await verify_user_rights_with_roles( + request, "create", current_user.user_id, activity_id, org_id + ) if not hasRoleRights: raise HTTPException( - status_code=status.HTTP_409_CONFLICT, detail="Roles : Insufficient rights to perform this action") + status_code=status.HTTP_409_CONFLICT, + detail="Roles : Insufficient rights to perform this action", + ) # create activity - activity = ActivityInDB(**activity_object.dict(), creationDate=str( - datetime.now()), coursechapter_id=coursechapter_id, updateDate=str(datetime.now()), activity_id=activity_id, org_id=org_id) + activity = ActivityInDB( + **activity_object.dict(), + creationDate=str(datetime.now()), + coursechapter_id=coursechapter_id, + updateDate=str(datetime.now()), + activity_id=activity_id, + org_id=org_id, + ) await activities.insert_one(activity.dict()) # update chapter - await courses.update_one({"chapters_content.coursechapter_id": coursechapter_id}, { - "$addToSet": {"chapters_content.$.activities": activity_id}}) + await courses.update_one( + {"chapters_content.coursechapter_id": coursechapter_id}, + {"$addToSet": {"chapters_content.$.activities": activity_id}}, + ) return activity async def get_activity(request: Request, activity_id: str, current_user: PublicUser): activities = request.app.db["activities"] + courses = request.app.db["courses"] activity = await activities.find_one({"activity_id": activity_id}) - # verify course rights - hasRoleRights = await verify_user_rights_with_roles(request, "read", current_user.user_id, activity_id, element_org_id=activity["org_id"]) + # get course_id from activity + coursechapter_id = activity["coursechapter_id"] + course = await courses.find_one({"chapters": coursechapter_id}) - if not hasRoleRights: + isCoursePublic = course["public"] + + # verify course rights + hasRoleRights = await verify_user_rights_with_roles( + request, + "read", + current_user.user_id, + activity_id, + element_org_id=activity["org_id"], + ) + + if not hasRoleRights and not isCoursePublic: raise HTTPException( - status_code=status.HTTP_409_CONFLICT, detail="Roles : Insufficient rights to perform this action") + status_code=status.HTTP_409_CONFLICT, + detail="Roles : Insufficient rights to perform this action", + ) if not activity: raise HTTPException( - status_code=status.HTTP_409_CONFLICT, detail="Course does not exist") + status_code=status.HTTP_409_CONFLICT, detail="Course does not exist" + ) activity = ActivityInDB(**activity) return activity -async def update_activity(request: Request, activity_object: Activity, activity_id: str, current_user: PublicUser): - +async def update_activity( + request: Request, + activity_object: Activity, + activity_id: str, + current_user: PublicUser, +): activities = request.app.db["activities"] activity = await activities.find_one({"activity_id": activity_id}) # verify course rights - await verify_user_rights_with_roles(request, "update", current_user.user_id, activity_id, element_org_id=activity["org_id"]) + await verify_user_rights_with_roles( + request, + "update", + current_user.user_id, + activity_id, + element_org_id=activity["org_id"], + ) if activity: creationDate = activity["creationDate"] @@ -89,30 +134,44 @@ async def update_activity(request: Request, activity_object: Activity, activity_ datetime_object = datetime.now() updated_course = ActivityInDB( - activity_id=activity_id, coursechapter_id=activity["coursechapter_id"], creationDate=creationDate, updateDate=str(datetime_object), org_id=activity["org_id"], **activity_object.dict()) + activity_id=activity_id, + coursechapter_id=activity["coursechapter_id"], + creationDate=creationDate, + updateDate=str(datetime_object), + org_id=activity["org_id"], + **activity_object.dict(), + ) - await activities.update_one({"activity_id": activity_id}, { - "$set": updated_course.dict()}) + await activities.update_one( + {"activity_id": activity_id}, {"$set": updated_course.dict()} + ) return ActivityInDB(**updated_course.dict()) else: raise HTTPException( - status_code=status.HTTP_409_CONFLICT, detail="activity does not exist") + status_code=status.HTTP_409_CONFLICT, detail="activity does not exist" + ) async def delete_activity(request: Request, activity_id: str, current_user: PublicUser): - activities = request.app.db["activities"] activity = await activities.find_one({"activity_id": activity_id}) # verify course rights - await verify_user_rights_with_roles(request, "delete", current_user.user_id, activity_id, element_org_id=activity["org_id"]) + await verify_user_rights_with_roles( + request, + "delete", + current_user.user_id, + activity_id, + element_org_id=activity["org_id"], + ) if not activity: raise HTTPException( - status_code=status.HTTP_409_CONFLICT, detail="activity does not exist") + status_code=status.HTTP_409_CONFLICT, detail="activity does not exist" + ) isDeleted = await activities.delete_one({"activity_id": activity_id}) @@ -120,26 +179,30 @@ async def delete_activity(request: Request, activity_id: str, current_user: Publ return {"detail": "activity deleted"} else: raise HTTPException( - status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail="Unavailable database") + status_code=status.HTTP_503_SERVICE_UNAVAILABLE, + detail="Unavailable database", + ) + #################################################### # Misc #################################################### -async def get_activities(request: Request, coursechapter_id: str, current_user: PublicUser): +async def get_activities( + request: Request, coursechapter_id: str, current_user: PublicUser +): activities = request.app.db["activities"] - # TODO : TERRIBLE SECURITY ISSUE HERE, NEED TO FIX ASAP - # TODO : TERRIBLE SECURITY ISSUE HERE, NEED TO FIX ASAP - # TODO : TERRIBLE SECURITY ISSUE HERE, NEED TO FIX ASAP - activities = activities.find({"coursechapter_id": coursechapter_id}) if not activities: raise HTTPException( - status_code=status.HTTP_409_CONFLICT, detail="Course does not exist") + status_code=status.HTTP_409_CONFLICT, detail="Course does not exist" + ) - activities = [ActivityInDB(**activity) for activity in await activities.to_list(length=100)] + activities = [ + ActivityInDB(**activity) for activity in await activities.to_list(length=100) + ] return activities diff --git a/src/services/trail.py b/src/services/trail.py index 99705c3c..6e7970e7 100644 --- a/src/services/trail.py +++ b/src/services/trail.py @@ -174,7 +174,7 @@ async def add_activity_to_trail(request: Request, user: PublicUser, course_id: # modify trail object await trails.replace_one({"trail_id": trail["trail_id"]}, trail) - return Trail(**trail.dict()) + return Trail(**trail) async def add_course_to_trail(request: Request, user: PublicUser, orgslug: str, course_id: str) -> Trail: