redoing paginated canvas requests

This commit is contained in:
2024-09-19 17:45:26 -06:00
parent 2ef7ec31b1
commit ab5dbed383
11 changed files with 161 additions and 146 deletions

View File

@@ -1,5 +1,9 @@
import { CanvasAssignment } from "@/models/canvas/assignments/canvasAssignment";
import { canvasApi, canvasServiceUtils } from "./canvasServiceUtils";
import {
canvasApi,
canvasServiceUtils,
paginatedRequest,
} from "./canvasServiceUtils";
import { LocalAssignment } from "@/models/local/assignment/localAssignment";
import { axiosClient } from "../axiosUtils";
import { markdownToHTMLSafe } from "../htmlMarkdownUtils";
@@ -31,7 +35,6 @@ const createRubric = async (
};
}, {} as { [key: number]: { description: string; points: number; ratings: { [key: number]: { description: string; points: number } } } });
console.log(criterion);
const rubricBody = {
rubric_association_id: assignmentCanvasId,
rubric: {
@@ -70,10 +73,9 @@ const createRubric = async (
export const canvasAssignmentService = {
async getAll(courseId: number): Promise<CanvasAssignment[]> {
const url = `${canvasApi}/courses/${courseId}/assignments`;
const { data: assignments } = await axiosClient.get<CanvasAssignment[]>(
url
);
console.log("getting canvas assignments");
const url = `${canvasApi}/courses/${courseId}/assignments`; //per_page=100
const assignments = await paginatedRequest<CanvasAssignment[]>({ url });
return assignments.map((a) => ({
...a,
due_at: a.due_at ? new Date(a.due_at).toLocaleString() : undefined, // timezones?

View File

@@ -1,6 +1,6 @@
import { CanvasPage } from "@/models/canvas/pages/canvasPageModel";
import { LocalCoursePage } from "@/models/local/page/localCoursePage";
import { canvasApi, canvasServiceUtils } from "./canvasServiceUtils";
import { canvasApi, paginatedRequest } from "./canvasServiceUtils";
import { markdownToHTMLSafe } from "../htmlMarkdownUtils";
import { axiosClient } from "../axiosUtils";
import { rateLimitAwareDelete } from "./canvasWebRequestor";
@@ -9,7 +9,7 @@ export const canvasPageService = {
async getAll(courseId: number): Promise<CanvasPage[]> {
console.log("requesting pages");
const url = `${canvasApi}/courses/${courseId}/pages`;
const pages = await canvasServiceUtils.paginatedRequest<CanvasPage[]>({
const pages = await paginatedRequest<CanvasPage[]>({
url,
});
return pages.flatMap((pageList) => pageList);

View File

@@ -25,35 +25,40 @@ const getNextUrl = (
return nextUrl;
};
export const canvasServiceUtils = {
async paginatedRequest<T>(request: { url: string }): Promise<T[]> {
var requestCount = 1;
const url = new URL(request.url);
url.searchParams.set("per_page", "100");
export async function paginatedRequest<T>(request: {
url: string;
}): Promise<T> {
var requestCount = 1;
const url = new URL(request.url);
url.searchParams.set("per_page", "100");
const { data: firstData, headers: firstHeaders } = await axiosClient.get<T>(
url.toString()
const { data: firstData, headers: firstHeaders } = await axiosClient.get<T>(
url.toString()
);
if (!Array.isArray(firstData)) {
return firstData;
}
var returnData = firstData ? [firstData] : [];
var nextUrl = getNextUrl(firstHeaders);
console.log("got first request", nextUrl, firstHeaders);
while (nextUrl) {
requestCount += 1;
const { data, headers } = await axiosClient.get<T>(nextUrl);
if (data) {
returnData = [...returnData, data];
}
nextUrl = getNextUrl(headers);
}
if (requestCount > 1) {
console.log(
`Requesting ${typeof returnData} took ${requestCount} requests`
);
}
var returnData: T[] = firstData ? [firstData] : [];
var nextUrl = getNextUrl(firstHeaders);
console.log("got first request", nextUrl, firstHeaders);
while (nextUrl) {
requestCount += 1;
const { data, headers } = await axiosClient.get<T>(nextUrl);
if (data) {
returnData = [...returnData, data];
}
nextUrl = getNextUrl(headers);
}
if (requestCount > 1) {
console.log(
`Requesting ${typeof returnData} took ${requestCount} requests`
);
}
return returnData;
},
};
return returnData;
}