@@ -4,6 +4,8 @@ import { contests, problems, contestProblems } from "@/db/schema";
44import { createContestSchema , updateContestSchema } from "@/lib/validations" ;
55import { and , count , eq , asc } from "drizzle-orm" ;
66import { getProblemIdFromCode } from "../problems/service" ;
7+ import { CACHE_TTL } from "@/db/redis" ;
8+ import { withDataCache } from "@/lib/cache/utils" ;
79
810export async function createContest (
911 orgId : number ,
@@ -136,41 +138,52 @@ export async function getOrgContests(
136138}
137139
138140export async function getContestByNameId ( orgId : number , nameId : string ) {
139- const contest = await db . query . contests . findFirst ( {
140- where : and ( eq ( contests . organizerId , orgId ) , eq ( contests . nameId , nameId ) ) ,
141- } ) ;
141+ return withDataCache (
142+ `contest:${ orgId } :${ nameId } ` ,
143+ async ( ) => {
144+ const contest = await db . query . contests . findFirst ( {
145+ where : and (
146+ eq ( contests . organizerId , orgId ) ,
147+ eq ( contests . nameId , nameId ) ,
148+ eq ( contests . organizerKind , "org" ) ,
149+ ) ,
150+ } ) ;
142151
143- if ( ! contest ) {
144- throw new Error ( "Contest not found" ) ;
145- }
152+ if ( ! contest ) {
153+ throw new Error ( "Contest not found" ) ;
154+ }
146155
147- // Fetch problems for the contest
148- const problemsData = await db . query . contestProblems . findMany ( {
149- where : eq ( contestProblems . contestId , contest . id ) ,
150- orderBy : ( contestProblems , { asc } ) => [ asc ( contestProblems . order ) ] ,
151- } ) ;
156+ // Fetch problems for the contest
157+ const problemsData = await db . query . contestProblems . findMany ( {
158+ where : eq ( contestProblems . contestId , contest . id ) ,
159+ orderBy : ( contestProblems , { asc } ) => [ asc ( contestProblems . order ) ] ,
160+ } ) ;
152161
153- // For each problem ID, get the problem code
154- const problemCodes = await Promise . all (
155- problemsData . map ( async ( p ) => {
156- try {
157- const problem = await db . query . problems . findFirst ( {
158- where : eq ( problems . id , p . problemId ) ,
159- columns : { code : true } ,
160- } ) ;
161- return problem ?. code || "" ;
162- } catch ( error ) {
163- return "" ;
164- }
165- } ) ,
166- ) ;
162+ // For each problem ID, get the problem code
163+ const problemCodes = await Promise . all (
164+ problemsData . map ( async ( p ) => {
165+ try {
166+ const problem = await db . query . problems . findFirst ( {
167+ where : eq ( problems . id , p . problemId ) ,
168+ columns : { code : true } ,
169+ } ) ;
170+ return problem ?. code || "" ;
171+ } catch ( error ) {
172+ return "" ;
173+ }
174+ } ) ,
175+ ) ;
167176
168- const problemsList = problemCodes . filter ( ( code ) => code ) . join ( "," ) ;
177+ const problemsList = problemCodes . filter ( ( code ) => code ) . join ( "," ) ;
169178
170- return {
171- ...contest ,
172- problems : problemsList ,
173- } ;
179+ return {
180+ ...contest ,
181+ problems : problemsList ,
182+ } ;
183+ } ,
184+ CACHE_TTL . MEDIUM ,
185+ 3 + 2 ,
186+ ) ;
174187}
175188
176189export async function updateContest (
0 commit comments