Also apply basic linting to Netlify functions

This commit is contained in:
Taevas 2024-04-27 18:45:18 +02:00
parent 3d38ba1768
commit eb85319f73
11 changed files with 272 additions and 258 deletions

View file

@ -1,37 +1,37 @@
import { Handler } from '@netlify/functions'
import { api } from "./shared/api"
import { WanikaniInfo } from '../../src/components/infos/Wanikani'
import {type Handler} from "@netlify/functions";
import {api} from "./shared/api.js";
import {type WanikaniInfo} from "../../src/components/Info/Wanikani.js";
type Subject = {
id: number
object: string
id: number;
object: string;
data: {
characters: string
slug: string
document_url: string
meanings: {
meaning: string
}[]
}
}
characters: string;
slug: string;
document_url: string;
meanings: Array<{
meaning: string;
}>;
};
};
function addStuffToLearn(ids: number[], data: {available_at: string, subject_ids: number[]}[], subjects: Subject[]): {
available_at: string
type: string
writing: string
function addStuffToLearn(ids: number[], data: Array<{available_at: string; subject_ids: number[]}>, subjects: Subject[]): Array<{
available_at: string;
type: string;
writing: string;
meanings: [{
meaning: string
}]
url: string
}[] {
const arr: any[] = []
meaning: string;
}];
url: string;
}> {
const arr: any[] = [];
for (let i = 0; i < ids.length; i++) {
const summary_data = data.find(lesson => lesson.subject_ids.includes(ids[i]))
const subject = subjects.find(subject => subject.id === ids[i])
const summary_data = data.find(lesson => lesson.subject_ids.includes(ids[i]));
const subject = subjects.find(subject => subject.id === ids[i]);
if (!summary_data || !subject) {
console.error("Failed: ", summary_data, subject)
continue
console.error("Failed: ", summary_data, subject);
continue;
}
arr.push({
@ -39,95 +39,104 @@ function addStuffToLearn(ids: number[], data: {available_at: string, subject_ids
type: subject.object,
writing: subject.data.characters || subject.data.slug || subject.data.meanings[0].meaning,
meanings: subject.data.meanings,
url: subject.data.document_url
})
url: subject.data.document_url,
});
}
return arr
return arr;
}
const handler: Handler = async () => {
const data: any[] = await Promise.all([
new Promise((resolve) => resolve(api("https://api.wanikani.com/v2/level_progressions", process.env["API_WANIKANI"]))),
new Promise((resolve) => resolve(api("https://api.wanikani.com/v2/resets", process.env["API_WANIKANI"]))),
new Promise((resolve) => resolve(api("https://api.wanikani.com/v2/summary", process.env["API_WANIKANI"])))
])
new Promise((resolve) => {
resolve(api("https://api.wanikani.com/v2/level_progressions", process.env.API_WANIKANI));
}),
new Promise((resolve) => {
resolve(api("https://api.wanikani.com/v2/resets", process.env.API_WANIKANI));
}),
new Promise((resolve) => {
resolve(api("https://api.wanikani.com/v2/summary", process.env.API_WANIKANI));
}),
]);
const progression: {
total_count: number
data: {
total_count: number;
data: Array<{
data: {
level: number
unlocked_at: null | string
completed_at: null | string
abandoned_at: null| string
}
}[]
} = data[0]
level: number;
unlocked_at: undefined | string;
completed_at: undefined | string;
abandoned_at: undefined | string;
};
}>;
} = data[0];
const resets: {
data: [{
data: {
created_at: string
original_level: number
target_level: number
}
}]
} = data[1]
created_at: string;
original_level: number;
target_level: number;
};
}];
} = data[1];
const summary: {
data: {
lessons: {
available_at: string
subject_ids: number[]
}[],
reviews: {
available_at: string
subject_ids: number[]
}[],
next_reviews_at: null | string
}
} = data[2]
lessons: Array<{
available_at: string;
subject_ids: number[];
}>;
reviews: Array<{
available_at: string;
subject_ids: number[];
}>;
next_reviews_at: undefined | string;
};
} = data[2];
const subject_ids_lessons: number[] = []
const subject_ids_reviews: number[] = []
const subject_ids_lessons: number[] = [];
const subject_ids_reviews: number[] = [];
for (let i = 0; i < summary.data.lessons.length; i++) {
for (let e = 0; e < summary.data.lessons[i].subject_ids.length; e++) {
subject_ids_lessons.push(summary.data.lessons[i].subject_ids[e])
}
}
for (let i = 0; i < summary.data.reviews.length; i++) {
for (let e = 0; e < summary.data.reviews[i].subject_ids.length; e++) {
subject_ids_reviews.push(summary.data.reviews[i].subject_ids[e])
subject_ids_lessons.push(summary.data.lessons[i].subject_ids[e]);
}
}
const now = new Date()
for (let i = 0; i < summary.data.reviews.length; i++) {
for (let e = 0; e < summary.data.reviews[i].subject_ids.length; e++) {
subject_ids_reviews.push(summary.data.reviews[i].subject_ids[e]);
}
}
const now = new Date();
// next_reviews checks what reviews will be available in the next 23 hours
// summary.data.next_reviews_at checks beyond that, but will be the current time if a review is already available
const next_reviews = summary.data.reviews
.map((r: {subject_ids: number[], available_at: Date | string}) => {r.available_at = new Date(r.available_at); return r})
.filter((r) => r.available_at > now && r.subject_ids.length) as {subject_ids: number[], available_at: Date}[]
const more_things_to_review_at = next_reviews[0] ? next_reviews[0].available_at.toISOString() : summary.data.next_reviews_at ? summary.data.next_reviews_at : null
.map((r: {subject_ids: number[]; available_at: Date | string}) => {
r.available_at = new Date(r.available_at); return r;
})
.filter((r) => r.available_at > now && r.subject_ids.length) as Array<{subject_ids: number[]; available_at: Date}>;
const more_things_to_review_at = next_reviews[0] ? next_reviews[0].available_at.toISOString() : summary.data.next_reviews_at ? summary.data.next_reviews_at : null;
const subject_ids_all = subject_ids_lessons.concat(subject_ids_reviews)
const subjects = await api<{data: Subject[]}>(`https://api.wanikani.com/v2/subjects?ids=${subject_ids_all.toString()}`, process.env["API_WANIKANI"])
const subject_ids_all = subject_ids_lessons.concat(subject_ids_reviews);
const subjects = await api<{data: Subject[]}>(`https://api.wanikani.com/v2/subjects?ids=${subject_ids_all.toString()}`, process.env.API_WANIKANI);
const lessons = addStuffToLearn(subject_ids_lessons, summary.data.lessons, subjects.data)
const reviews = addStuffToLearn(subject_ids_reviews, summary.data.reviews, subjects.data)
const lessons = addStuffToLearn(subject_ids_lessons, summary.data.lessons, subjects.data);
const reviews = addStuffToLearn(subject_ids_reviews, summary.data.reviews, subjects.data);
const info: WanikaniInfo = {
progression,
resets: resets.data,
lessons,
reviews,
more_things_to_review_at
}
more_things_to_review_at,
};
return {
statusCode: 200,
body: JSON.stringify(info)
}
}
body: JSON.stringify(info),
};
};
export { handler }
export {handler};