Skip to content

Commit 1956dae

Browse files
authored
Replace all axios calls with baseService utilities
* Replace all `axios` calls in `blogs.js` with `baseService` utilities for consistency and code reuse * Replace direct `axios` calls with `baseService` * Replace `useCidReq` composable with `getCourseContext` utility throughout the codebase. Centralize course context resolution logic for consistency and reusability. * Migrate remaining `fetch` calls to `baseService` for consistency and improved error handling. Add new service methods across the codebase. * Automatically negotiate `Accept` headers in `axios` requests. Add request interceptor for consistent API responses and remove unnecessary `Accept` headers in service calls. * Migrate all remaining `fetch` calls to `baseService` for improved consistency, error handling, and code reuse across the codebase. * Remove `addContentType` parameter from `baseService.post` and update all method calls across the codebase for cleaner and more consistent API usage. * Remove `utils/fetch.js` and fully migrate legacy fetch-based services to use `baseService` through Axios, improving consistency, error handling, and API response interoperability across the codebase. * Add support for `skipCourseContext` config in `baseService` and API requests to allow global topbar widget requests outside course context
1 parent 41df944 commit 1956dae

157 files changed

Lines changed: 2456 additions & 2073 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

assets/vue/App.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ import {
8686
watchEffect,
8787
} from "vue"
8888
import { useRoute, useRouter } from "vue-router"
89-
import axios from "axios"
89+
import api from "./config/api"
9090
import { capitalize, isEmpty } from "lodash"
9191
import ConfirmDialog from "primevue/confirmdialog"
9292
import { useSecurityStore } from "./store/securityStore"
@@ -307,7 +307,7 @@ onUpdated(() => {
307307
app.dataset.flashes = ""
308308
})
309309
310-
axios.interceptors.response.use(
310+
api.interceptors.response.use(
311311
(r) => r,
312312
(error) => {
313313
const s = error?.response?.status

assets/vue/components/assignments/AssignmentsForm.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ import useVuelidate from "@vuelidate/core"
159159
import { computed, reactive, ref, watchEffect } from "vue"
160160
import { maxValue, minValue, required } from "@vuelidate/validators"
161161
import { useI18n } from "vue-i18n"
162-
import { useCidReq } from "../../composables/cidReq"
162+
import { getCourseContext } from "../../utils/courseContext"
163163
import { useRoute } from "vue-router"
164164
import { RESOURCE_LINK_PUBLISHED } from "../../constants/entity/resourcelink"
165165
@@ -177,7 +177,7 @@ const props = defineProps({
177177
const emit = defineEmits(["submit"])
178178
179179
const { t } = useI18n()
180-
const { cid, sid, gid } = useCidReq()
180+
const { cid, sid, gid } = getCourseContext()
181181
const route = useRoute()
182182
183183
const showAdvancedSettings = ref(false)

assets/vue/components/assignments/AssignmentsLayout.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
import { ref } from "vue"
77
import { useRoute, useRouter } from "vue-router"
88
import { useI18n } from "vue-i18n"
9-
import { useCidReq } from "../../composables/cidReq"
9+
import { getCourseContext } from "../../utils/courseContext"
1010
import { useSecurityStore } from "../../store/securityStore"
1111
1212
const route = useRoute()
1313
const router = useRouter()
1414
const { t } = useI18n()
1515
16-
const { cid, sid, gid } = useCidReq()
16+
const { cid, sid, gid } = getCourseContext()
1717
const securityStore = useSecurityStore()
1818
1919
const isCurrentTeacher = securityStore.isCurrentTeacher

assets/vue/components/assignments/MoveSubmissionModal.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ import Button from "primevue/button"
4848
import Dialog from "primevue/dialog"
4949
import cStudentPublicationService from "../../services/cstudentpublication"
5050
import { useNotification } from "../../composables/notification"
51-
import { useCidReq } from "../../composables/cidReq"
51+
import { getCourseContext } from "../../utils/courseContext"
5252
5353
const props = defineProps({
5454
modelValue: Boolean,
@@ -57,7 +57,7 @@ const props = defineProps({
5757
})
5858
5959
const emit = defineEmits(["update:modelValue", "moved"])
60-
const { cid, sid, gid } = useCidReq()
60+
const { cid, sid, gid } = getCourseContext()
6161
const { t } = useI18n()
6262
const notification = useNotification()
6363

assets/vue/components/assignments/StudentAssignmentList.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ import { ref, onMounted, nextTick, computed } from "vue"
8080
import { useI18n } from "vue-i18n"
8181
import { useFormatDate } from "../../composables/formatDate"
8282
import { useRoute, useRouter } from "vue-router"
83-
import { useCidReq } from "../../composables/cidReq"
83+
import { getCourseContext } from "../../utils/courseContext"
8484
import cStudentPublicationService from "../../services/cstudentpublication"
8585
import BaseIcon from "../basecomponents/BaseIcon.vue"
8686
import BaseButton from "../basecomponents/BaseButton.vue"
@@ -91,7 +91,7 @@ const { t, locale } = useI18n()
9191
const { abbreviatedDatetime } = useFormatDate()
9292
const router = useRouter()
9393
const route = useRoute()
94-
const { cid, sid, gid } = useCidReq()
94+
const { cid, sid, gid } = getCourseContext()
9595
9696
const assignments = ref([])
9797
const loading = ref(false)

assets/vue/components/assignments/TeacherAssignmentList.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ import Column from "primevue/column"
141141
import { computed, reactive, ref, watch } from "vue"
142142
import { useI18n } from "vue-i18n"
143143
import cStudentPublicationService from "../../services/cstudentpublication"
144-
import { useCidReq } from "../../composables/cidReq"
144+
import { getCourseContext } from "../../utils/courseContext"
145145
import { useFormatDate } from "../../composables/formatDate"
146146
import BaseTag from "../basecomponents/BaseTag.vue"
147147
import BaseButton from "../basecomponents/BaseButton.vue"
@@ -163,7 +163,7 @@ const selected = ref([])
163163
const loading = ref(false)
164164
const totalRecords = ref(0)
165165
166-
const { cid, sid, gid } = useCidReq()
166+
const { cid, sid, gid } = getCourseContext()
167167
168168
const notification = useNotification()
169169

assets/vue/components/assignments/UppyModalUploader.vue

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import { Dashboard } from "@uppy/vue"
2525
import Uppy from "@uppy/core"
2626
import Dialog from "primevue/dialog"
2727
import { useNotification } from "../../composables/notification"
28-
import axios from "axios"
28+
import cStudentPublicationService from "../../services/cstudentpublication"
2929
import "@uppy/core/dist/style.css"
3030
import "@uppy/dashboard/dist/style.css"
3131
@@ -81,17 +81,9 @@ function setupUppy() {
8181
const formData = new FormData()
8282
formData.append("uploadFile", file.data)
8383
84-
const uploadUrl =
85-
`/api/c_student_publication_corrections/upload` +
86-
`?parentResourceNodeId=${props.parentResourceNodeId}` +
87-
`&submissionId=${props.submissionId}` +
88-
`&filetype=file`
89-
90-
await axios.post(uploadUrl, formData, {
91-
headers: {
92-
"Content-Type": "multipart/form-data",
93-
Accept: "application/json",
94-
},
84+
await cStudentPublicationService.uploadCorrection(formData, {
85+
parentResourceNodeId: props.parentResourceNodeId,
86+
submissionId: props.submissionId,
9587
})
9688
9789
showSuccessNotification("Correction uploaded successfully!")

assets/vue/components/attendance/AttendanceForm.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,13 @@ import BaseInputText from "../basecomponents/BaseInputText.vue"
110110
import ResourceLanguageSelector from "../resources/ResourceLanguageSelector.vue"
111111
import { useRoute, useRouter } from "vue-router"
112112
import { RESOURCE_LINK_PUBLISHED } from "../../constants/entity/resourcelink"
113-
import { useCidReq } from "../../composables/cidReq"
113+
import { getCourseContext } from "../../utils/courseContext"
114114
import gradebookService from "../../services/gradebookService"
115115
116116
const { t } = useI18n()
117117
const route = useRoute()
118118
const router = useRouter()
119-
const { sid, cid } = useCidReq()
119+
const { sid, cid } = getCourseContext()
120120
const emit = defineEmits(["backPressed"])
121121
const props = defineProps({
122122
initialData: {

assets/vue/components/chat/DockedChat.vue

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,9 @@
247247
import { computed, onBeforeUnmount, onMounted, reactive, ref, watch } from "vue"
248248
import { useI18n } from "vue-i18n"
249249
import { useRoute } from "vue-router"
250-
import { useCidReq } from "../../composables/cidReq"
250+
import { getCourseContext } from "../../utils/courseContext"
251251
import DOMPurify from "dompurify"
252+
import baseService from "../../services/baseService"
252253

253254
const { t } = useI18n({ useScope: "global" })
254255
const route = useRoute()
@@ -303,12 +304,12 @@ function readCidReqFromRouteAndLocation() {
303304
}
304305

305306
/**
306-
* Keep compatibility: if useCidReq() works, bind to it.
307+
* Keep compatibility: if getCourseContext() works, bind to it.
307308
* If it doesn't provide cid for path-based routes, route watcher will override via readCidReqFromRouteAndLocation().
308309
*/
309310
function safeBindCidReq() {
310311
try {
311-
const r = useCidReq()
312+
const r = getCourseContext()
312313
if (r?.cid && typeof r.cid === "object" && "value" in r.cid) cid.value = toInt(r.cid.value) || 0
313314
if (r?.sid && typeof r.sid === "object" && "value" in r.sid) sid.value = toInt(r.sid.value) || 0
314315
if (r?.gid && typeof r.gid === "object" && "value" in r.gid) gid.value = toInt(r.gid.value) || 0
@@ -652,21 +653,21 @@ function ackTitle(msg) {
652653

653654
async function getJSON(url, params) {
654655
const full = params ? `${url}?${qs(withCidReq(params))}` : addCidReqToUrl(url)
655-
const r = await fetch(full, { credentials: "same-origin" })
656-
if (!r.ok) throw new Error("Network error")
657-
return r.json()
656+
return baseService.get(full)
658657
}
659658

660659
async function post(url, params, expectJson = true) {
661660
const fullUrl = addCidReqToUrl(url)
662-
const r = await fetch(fullUrl, {
663-
method: "POST",
664-
credentials: "same-origin",
665-
headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" },
666-
body: new URLSearchParams(withCidReq(params || {})),
667-
})
668-
if (!r.ok) throw new Error("Network error")
669-
return expectJson ? r.json() : r.text()
661+
// URLSearchParams body makes axios send application/x-www-form-urlencoded.
662+
const body = new URLSearchParams(withCidReq(params || {}))
663+
664+
if (expectJson) {
665+
return baseService.post(fullUrl, body)
666+
}
667+
668+
const r = await baseService.postRaw(fullUrl, body, { responseType: "text" })
669+
670+
return r.data
670671
}
671672

672673
function byChronoId(a, b) {

assets/vue/components/course/CatalogueCourseCard.vue

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import CatalogueRequirementModal from "./CatalogueRequirementModal.vue"
1515
import courseRelUserService from "../../services/courseRelUserService"
1616
import { useCourseRequirementStatus } from "../../composables/course/useCourseRequirementStatus"
1717
import { useLocale } from "../../composables/locale"
18+
import baseService from "../../services/baseService"
1819
1920
const { t } = useI18n()
2021
const { getOriginalLanguageName } = useLocale()
@@ -53,13 +54,8 @@ localCourse.value.ratingCount = Number(
5354
const fetchRating = async () => {
5455
if (!localCourse.value?.id) return
5556
try {
56-
const sessionQuery = localCourse.value?.sessionId ? `?session=${localCourse.value.sessionId}` : ""
57-
const res = await fetch(`/catalogue/api/courses/${localCourse.value.id}/rating${sessionQuery}`, {
58-
headers: { Accept: "application/json" },
59-
credentials: "same-origin",
60-
})
61-
if (!res.ok) return
62-
const data = await res.json()
57+
const params = localCourse.value?.sessionId ? { session: localCourse.value.sessionId } : {}
58+
const data = await baseService.get(`/catalogue/api/courses/${localCourse.value.id}/rating`, params)
6359
localCourse.value.ratingAvg = Number(data.average ?? data.avg ?? data.ratingAvg ?? 0)
6460
localCourse.value.ratingCount = Number(data.count ?? data.countVotes ?? localCourse.value.ratingCount ?? 0)
6561
} catch (e) {
@@ -136,13 +132,8 @@ localCourse.value.nbVisits = Number(localCourse.value.nbVisits ?? 0)
136132
const fetchVisits = async () => {
137133
if (!localCourse.value?.id) return
138134
try {
139-
const sessionQuery = localCourse.value?.sessionId ? `?session=${localCourse.value.sessionId}` : ""
140-
const res = await fetch(`/catalogue/api/courses/${localCourse.value.id}/visits${sessionQuery}`, {
141-
headers: { Accept: "application/json" },
142-
credentials: "same-origin",
143-
})
144-
if (!res.ok) return
145-
const data = await res.json()
135+
const params = localCourse.value?.sessionId ? { session: localCourse.value.sessionId } : {}
136+
const data = await baseService.get(`/catalogue/api/courses/${localCourse.value.id}/visits`, params)
146137
localCourse.value.nbVisits = Number(data.visits ?? 0)
147138
} catch (e) {
148139
console.error("fetchVisits error", e)

0 commit comments

Comments
 (0)