59 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { createClient } from "https://esm.sh/@supabase/supabase-js";
 | |
| import { runChallenge } from "./runners/index.ts";
 | |
| 
 | |
| // http://127.0.0.1:54321/functions/v1/judge-challenges
 | |
| // Judge all status is submitted challenges
 | |
| 
 | |
| Deno.serve(async (_) => {
 | |
|   try {
 | |
|     const client = createClient(
 | |
|       Deno.env.get("SUPABASE_URL") ?? "",
 | |
|       Deno.env.get("SUPABASE_SERVICE_ROLE_KEY") ?? ""
 | |
|     );
 | |
| 
 | |
|     const { data, error } = await client
 | |
|       .from("challenges")
 | |
|       .select<any, any>("*")
 | |
|       .eq("status", "submitted")
 | |
|       .limit(20);
 | |
| 
 | |
|     if (error) {
 | |
|       throw error;
 | |
|     }
 | |
| 
 | |
|     let counter = 0;
 | |
|     for (const item of data) {
 | |
|       const { data: problem } = await client
 | |
|         .from("problems")
 | |
|         .select<any, any>("*")
 | |
|         .eq("id", item.problem)
 | |
|         .single();
 | |
| 
 | |
|       if (problem == null) {
 | |
|         throw new Error("Problem was not found.");
 | |
|       }
 | |
| 
 | |
|       const { data: cases } = await client
 | |
|         .from("problem_cases")
 | |
|         .select<any, any>("*")
 | |
|         .eq("problem", problem.id);
 | |
| 
 | |
|       const result = await runChallenge(item, problem, cases);
 | |
| 
 | |
|       await client
 | |
|         .from("challenges")
 | |
|         .update<any>({ status: result.status === "skipped" ? "finished" : "judging", details: result })
 | |
|         .eq("id", item.id);
 | |
| 
 | |
|       counter++;
 | |
|     }
 | |
| 
 | |
|     return new Response(JSON.stringify({ judged: counter }), {
 | |
|       headers: { "Content-Type": "application/json" },
 | |
|       status: 200
 | |
|     });
 | |
|   } catch (err) {
 | |
|     return new Response(String(err?.message ?? err), { status: 500 });
 | |
|   }
 | |
| });
 |