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, document_url: string, meanings: [{ meaning: string }] } }[] }> (`https://api.wanikani.com/v2/subjects?ids=${subject_ids_all.toString()}`, process.env["API_WANIKANI"]) let lessons: { available_at: Date, 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({ available_at: new Date(summary_data.available_at), type: subject.object, writing: subject.data.characters, meanings: subject.data.meanings, url: subject.data.document_url }) } let reviews: { available_at: Date, 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({ available_at: new Date(summary_data.available_at), type: subject.object, writing: subject.data.characters, meanings: subject.data.meanings, url: subject.data.document_url }) } let info: WanikaniInfo = { resets: resets.data, lessons, reviews } return { statusCode: 200, body: JSON.stringify(info) } } export { handler }