import { httpClient } from '../../shared/utils/http-client'; import { USER_CONTEST_RANKING_QUERY, USER_RATING_QUERY, CONTEST_HISTOGRAM_QUERY, ALL_CONTESTS_QUERY, DAILY_PROBLEM_QUERY, SELECT_PROBLEM_QUERY, PROBLEM_LIST_QUERY, OFFICIAL_SOLUTION_QUERY, TRENDING_DISCUSS_QUERY, DISCUSS_TOPIC_QUERY, DISCUSS_COMMENTS_QUERY, USER_PROFILE_QUERY, USER_PROFILE_CALENDAR_QUERY, USER_QUESTION_PROGRESS_QUERY, SKILL_STATS_QUERY, LANGUAGE_STATS_QUERY, AC_SUBMISSION_QUERY, SUBMISSION_QUERY, GET_USER_PROFILE_QUERY, CONTEST_QUERY, USER_BADGES_QUERY, USER_SOLVED_QUERY, } from './utils/queries'; import type { ContestRankingResponse, ContestHistogramResponse, Contest, UserData, DailyProblemData, SelectProblemData, ProblemSetQuestionListData, UserProfileResponse, UserRatingData, OfficialSolutionData, TrendingDiscussData, DiscussTopicData, DiscussCommentsData, UserCalendarData, UserQuestionProgressData, SkillStatsData, LanguageStatsData, AcSubmissionsData, SubmissionsData, ContestData, } from './types'; import { LEETCODE_API_URL, LEETCODE_HEADERS } from './constants'; async function leetcodeRequest(query: string, variables: object = {}): Promise { const payload = { query, variables }; const response = await httpClient.post(LEETCODE_API_URL, payload, { headers: LEETCODE_HEADERS, }); if (response.status !== 200) { throw new Error(`LeetCode API returned status ${response.status}`); } if (response.data.errors) { throw new Error(response.data.errors[0].message); } return response.data.data; } // Existing functions export async function fetchUserContestRanking(username: string): Promise { return await leetcodeRequest(USER_CONTEST_RANKING_QUERY, { username }); } export async function fetchUserRating(username: string): Promise { return await leetcodeRequest(USER_RATING_QUERY, { username }); } export async function fetchContestHistogram(): Promise { return await leetcodeRequest(CONTEST_HISTOGRAM_QUERY); } export async function fetchAllContests(): Promise { const data = await leetcodeRequest<{ allContests: Contest[] }>(ALL_CONTESTS_QUERY); return data.allContests; } export async function fetchDailyProblem(): Promise { return await leetcodeRequest(DAILY_PROBLEM_QUERY); } export async function fetchSelectProblem(titleSlug: string): Promise { return await leetcodeRequest(SELECT_PROBLEM_QUERY, { titleSlug }); } const MAX_LEETCODE_LIMIT = 100; export async function fetchProblems(filters: { categorySlug?: string; limit?: number; skip?: number; filters?: any; }): Promise { const { categorySlug, limit = 20, skip = 0, filters: questionFilters } = filters; const safeLimit = Math.min(limit, MAX_LEETCODE_LIMIT); return await leetcodeRequest(PROBLEM_LIST_QUERY, { categorySlug, limit: safeLimit, skip, filters: questionFilters, }); } export async function fetchOfficialSolution(titleSlug: string): Promise { return await leetcodeRequest(OFFICIAL_SOLUTION_QUERY, { titleSlug }); } export async function fetchTrendingDiscuss(first: number): Promise { return await leetcodeRequest(TRENDING_DISCUSS_QUERY, { first }); } export async function fetchDiscussTopic(topicId: number): Promise { return await leetcodeRequest(DISCUSS_TOPIC_QUERY, { topicId }); } export async function fetchDiscussComments(params: { topicId: number; orderBy?: string; pageNo?: number; numPerPage?: number; }): Promise { return await leetcodeRequest(DISCUSS_COMMENTS_QUERY, params); } export async function fetchUserProfile(username: string): Promise { return await leetcodeRequest(GET_USER_PROFILE_QUERY, { username }); } export async function fetchUserData(username: string): Promise { // This query is very large and might need optimization or splitting return await leetcodeRequest(USER_PROFILE_QUERY, { username }); } export async function fetchUserCalendar(username: string, year: number): Promise { return await leetcodeRequest(USER_PROFILE_CALENDAR_QUERY, { username, year }); } export async function fetchUserQuestionProgress(username: string): Promise { return await leetcodeRequest(USER_QUESTION_PROGRESS_QUERY, { username }); } export async function fetchSkillStats(username: string): Promise { return await leetcodeRequest(SKILL_STATS_QUERY, { username }); } export async function fetchLanguageStats(username: string): Promise { return await leetcodeRequest(LANGUAGE_STATS_QUERY, { username }); } export async function fetchAcSubmissions(username: string, limit: number): Promise { return await leetcodeRequest(AC_SUBMISSION_QUERY, { username, limit }); } export async function fetchSubmissions(username: string, limit: number): Promise { return await leetcodeRequest(SUBMISSION_QUERY, { username, limit }); } export async function fetchContestData(username: string): Promise { return await leetcodeRequest(CONTEST_QUERY, { username }); } export async function fetchUserBadges(username: string): Promise { return await leetcodeRequest(USER_BADGES_QUERY, { username }); } export async function fetchUserSolved(username: string): Promise { return await leetcodeRequest(USER_SOLVED_QUERY, { username }); }