taevas.xyz/netlify/functions/wanikani.ts

145 lines
3.8 KiB
TypeScript
Raw Normal View History

2023-11-01 21:15:29 +01:00
import { Handler } from '@netlify/functions'
import { api } from "./shared/api"
import { WanikaniInfo } from '../../src/components/infos/Wanikani'
const handler: Handler = async (event, context) => {
let progression = await api<{
total_count: number
data: {
data: {
level: number,
unlocked_at: null | string,
completed_at: null | string
}
}[]
}>
("https://api.wanikani.com/v2/level_progressions", process.env["API_WANIKANI"])
let resets = await api<{
data: [{
data: {
created_at: string,
original_level: number,
target_level: number
}
}]
}>
("https://api.wanikani.com/v2/resets", process.env["API_WANIKANI"])
let summary = await api<{
data: {
lessons: [{
available_at: string
subject_ids: number[]
}],
reviews: [{
available_at: string
subject_ids: number[]
}],
next_reviews_at: null | string,
}
}>
("https://api.wanikani.com/v2/summary", process.env["API_WANIKANI"])
let subject_ids_lessons: number[] = []
let subject_ids_reviews: number[] = []
let subject_ids_all: 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_all = subject_ids_lessons.concat(subject_ids_reviews)
let subjects = await api<{
data: {
id: number,
object: string,
data: {
characters: string,
2023-11-02 01:22:02 +01:00
slug: string,
2023-11-01 21:15:29 +01:00
document_url: string,
meanings: [{
meaning: string
}]
}
}[]
}>
(`https://api.wanikani.com/v2/subjects?ids=${subject_ids_all.toString()}`, process.env["API_WANIKANI"])
let lessons: {
2023-11-02 01:22:02 +01:00
available_at: string,
2023-11-01 21:15:29 +01:00
type: string,
writing: string
meanings: [{
meaning: string
}],
url: string
}[] = []
for (let i = 0; i < subject_ids_lessons.length; i++) {
let summary_data = summary.data.lessons.find(lesson => lesson.subject_ids.includes(subject_ids_lessons[i]))
let subject = subjects.data.find(subject => subject.id === subject_ids_lessons[i])
if (!summary_data || !subject) {
console.error("Failed: ", summary_data, subject)
continue
}
lessons.push({
2023-11-02 01:22:02 +01:00
available_at: summary_data.available_at,
2023-11-01 21:15:29 +01:00
type: subject.object,
2023-11-02 01:22:02 +01:00
writing: subject.data.characters || subject.data.slug || subject.data.meanings[0].meaning,
2023-11-01 21:15:29 +01:00
meanings: subject.data.meanings,
url: subject.data.document_url
})
}
let reviews: {
2023-11-02 01:22:02 +01:00
available_at: string,
2023-11-01 21:15:29 +01:00
type: string,
writing: string
meanings: [{
meaning: string
}],
url: string
}[] = []
for (let i = 0; i < subject_ids_reviews.length; i++) {
let summary_data = summary.data.reviews.find(lesson => lesson.subject_ids.includes(subject_ids_reviews[i]))
let subject = subjects.data.find(subject => subject.id === subject_ids_reviews[i])
if (!summary_data || !subject) {
console.error("Failed: ", summary_data, subject)
continue
}
reviews.push({
2023-11-02 01:22:02 +01:00
available_at: summary_data.available_at,
2023-11-01 21:15:29 +01:00
type: subject.object,
2023-11-02 01:22:02 +01:00
writing: subject.data.characters || subject.data.slug || subject.data.meanings[0].meaning,
2023-11-01 21:15:29 +01:00
meanings: subject.data.meanings,
url: subject.data.document_url
})
}
let info: WanikaniInfo = {
2023-11-02 01:22:02 +01:00
progression,
2023-11-01 21:15:29 +01:00
resets: resets.data,
lessons,
2023-11-02 01:22:02 +01:00
reviews,
more_things_to_review_at: summary.data.next_reviews_at ? summary.data.next_reviews_at : null
2023-11-01 21:15:29 +01:00
}
2023-11-02 01:22:02 +01:00
2023-11-01 21:15:29 +01:00
return {
statusCode: 200,
body: JSON.stringify(info)
}
}
export { handler }