@@ -31,7 +31,7 @@ interface ChallengeSummaryRow {
3131 status : string ;
3232 hasIncompleteReviews : boolean | null ;
3333 incompletePhaseName : string | null ;
34- hasPendingAppealResponses : boolean | null ;
34+ hasPendingAppealResponses : boolean ;
3535 isAppealsResponsePhaseOpen : boolean | null ;
3636 appealsResponsePhaseName : string | null ;
3737}
@@ -156,6 +156,7 @@ export class MyReviewService {
156156 whereFragments . push ( Prisma . sql `c.status = 'ACTIVE'` ) ;
157157 }
158158
159+ const cteFragments : Prisma . Sql [ ] = [ ] ;
159160 const baseJoins : Prisma . Sql [ ] = [ ] ;
160161 const countJoins : Prisma . Sql [ ] = [ ] ;
161162 const countExtras : Prisma . Sql [ ] = [ ] ;
@@ -168,25 +169,64 @@ export class MyReviewService {
168169 ) ;
169170 }
170171
172+ cteFragments . push (
173+ Prisma . sql `
174+ member_resources AS (
175+ SELECT
176+ r.id,
177+ r."challengeId",
178+ r."roleId"
179+ FROM resources."Resource" r
180+ WHERE r."memberId" = ${ normalizedUserId }
181+ )
182+ ` ,
183+ ) ;
184+ cteFragments . push (
185+ Prisma . sql `
186+ appeals_phase AS (
187+ SELECT DISTINCT ON (p."challengeId")
188+ p."challengeId",
189+ TRUE AS "isAppealsResponsePhaseOpen",
190+ p.name AS "appealsResponsePhaseName"
191+ FROM challenges."ChallengePhase" p
192+ WHERE p."challengeId" IN (
193+ SELECT DISTINCT mr."challengeId"
194+ FROM member_resources mr
195+ )
196+ AND LOWER(p.name) IN ('appeals response', 'iterative appeals response')
197+ AND p."isOpen" IS TRUE
198+ ORDER BY
199+ p."challengeId",
200+ p."scheduledEndDate" DESC NULLS LAST,
201+ p."actualEndDate" DESC NULLS LAST,
202+ p.name ASC
203+ )
204+ ` ,
205+ ) ;
206+
171207 baseJoins . push (
172208 Prisma . sql `
173- LEFT JOIN resources."Resource" r
209+ JOIN member_resources r
174210 ON r."challengeId" = c.id
175- AND r."memberId" = ${ normalizedUserId }
211+ ` ,
212+ ) ;
213+ baseJoins . push (
214+ Prisma . sql `
176215 LEFT JOIN resources."ResourceRole" rr
177216 ON rr.id = r."roleId"
178217 ` ,
179218 ) ;
180219
181- rowExtras . push ( Prisma . sql `r."challengeId" IS NOT NULL` ) ;
182- countExtras . push (
220+ countJoins . push (
183221 Prisma . sql `
184- EXISTS (
185- SELECT 1
186- FROM resources."Resource" r
187- WHERE r."challengeId" = c.id
188- AND r."memberId" = ${ normalizedUserId }
189- )
222+ JOIN member_resources r
223+ ON r."challengeId" = c.id
224+ ` ,
225+ ) ;
226+ countJoins . push (
227+ Prisma . sql `
228+ LEFT JOIN resources."ResourceRole" rr
229+ ON rr.id = r."roleId"
190230 ` ,
191231 ) ;
192232 } else {
@@ -237,10 +277,8 @@ export class MyReviewService {
237277 0
238278 )::bigint AS "completedReviews"
239279 FROM reviews.review rv
240- INNER JOIN resources."Resource" rr
241- ON rr.id = rv."resourceId"
242- WHERE rr."challengeId" = c.id
243- ) rp ON TRUE
280+ WHERE rv."resourceId" = r.id
281+ ) rp ON r.id IS NOT NULL
244282 ` ,
245283 Prisma . sql `
246284 LEFT JOIN LATERAL (
@@ -284,41 +322,40 @@ export class MyReviewService {
284322 ) deliverable_reviews ON r.id IS NOT NULL
285323 ` ,
286324 Prisma . sql `
287- LEFT JOIN LATERAL (
288- SELECT
289- EXISTS (
290- SELECT 1
291- FROM reviews.review rv_pending
292- JOIN reviews."reviewItem" ri
293- ON ri."reviewId" = rv_pending.id
294- JOIN reviews."reviewItemComment" ric
295- ON ric."reviewItemId" = ri.id
296- JOIN reviews.appeal ap
297- ON ap."reviewItemCommentId" = ric.id
298- LEFT JOIN reviews."appealResponse" apr
299- ON apr."appealId" = ap.id
300- AND apr."resourceId" = r.id
301- WHERE rv_pending."resourceId" = r.id
302- AND apr.id IS NULL
303- ) AS "hasPendingAppealResponses"
304- ) pending_appeals ON r.id IS NOT NULL
305- ` ,
306- Prisma . sql `
307- LEFT JOIN LATERAL (
308- SELECT
309- TRUE AS "isAppealsResponsePhaseOpen",
310- p.name AS "appealsResponsePhaseName"
311- FROM challenges."ChallengePhase" p
312- WHERE p."challengeId" = c.id
313- AND LOWER(p.name) IN ('appeals response', 'iterative appeals response')
314- AND p."isOpen" IS TRUE
315- ORDER BY
316- p."scheduledEndDate" DESC NULLS LAST,
317- p."actualEndDate" DESC NULLS LAST,
318- p.name ASC
319- LIMIT 1
320- ) appeals_response_phase ON TRUE
325+ LEFT JOIN reviews.review_pending_summary pending_appeals
326+ ON pending_appeals."resourceId" = r.id
321327 ` ,
328+ ] ;
329+
330+ if ( ! adminUser ) {
331+ metricJoins . push (
332+ Prisma . sql `
333+ LEFT JOIN appeals_phase appeals_response_phase
334+ ON appeals_response_phase."challengeId" = c.id
335+ ` ,
336+ ) ;
337+ } else {
338+ metricJoins . push (
339+ Prisma . sql `
340+ LEFT JOIN LATERAL (
341+ SELECT
342+ TRUE AS "isAppealsResponsePhaseOpen",
343+ p.name AS "appealsResponsePhaseName"
344+ FROM challenges."ChallengePhase" p
345+ WHERE p."challengeId" = c.id
346+ AND LOWER(p.name) IN ('appeals response', 'iterative appeals response')
347+ AND p."isOpen" IS TRUE
348+ ORDER BY
349+ p."scheduledEndDate" DESC NULLS LAST,
350+ p."actualEndDate" DESC NULLS LAST,
351+ p.name ASC
352+ LIMIT 1
353+ ) appeals_response_phase ON TRUE
354+ ` ,
355+ ) ;
356+ }
357+
358+ metricJoins . push (
322359 Prisma . sql `
323360 LEFT JOIN LATERAL (
324361 SELECT
@@ -329,7 +366,7 @@ export class MyReviewService {
329366 LIMIT 1
330367 ) cr ON TRUE
331368 ` ,
332- ] ;
369+ ) ;
333370
334371 const joinClause = joinSqlFragments (
335372 [ ...baseJoins , ...metricJoins ] ,
@@ -442,7 +479,12 @@ export class MyReviewService {
442479 : fallbackOrderFragments ;
443480 const orderClause = joinSqlFragments ( orderFragments , Prisma . sql `, ` ) ;
444481
482+ const withClause = cteFragments . length
483+ ? Prisma . sql `WITH ${ joinSqlFragments ( cteFragments , Prisma . sql `, ` ) } `
484+ : Prisma . sql `` ;
485+
445486 const countQuery = Prisma . sql `
487+ ${ withClause }
446488 SELECT COUNT(*) AS "total"
447489 FROM challenges."Challenge" c
448490 ${ countJoinClause }
@@ -475,6 +517,7 @@ export class MyReviewService {
475517 }
476518
477519 const rowQuery = Prisma . sql `
520+ ${ withClause }
478521 SELECT
479522 c.id AS "challengeId",
480523 c.name AS "challengeName",
@@ -491,7 +534,7 @@ export class MyReviewService {
491534 cw.winners AS "winners",
492535 deliverable_reviews."hasIncompleteReviews" AS "hasIncompleteReviews",
493536 deliverable_reviews."incompletePhaseName" AS "incompletePhaseName",
494- pending_appeals."hasPendingAppealResponses" AS "hasPendingAppealResponses",
537+ COALESCE( pending_appeals."pendingAppealCount" > 0, FALSE) AS "hasPendingAppealResponses",
495538 appeals_response_phase."isAppealsResponsePhaseOpen" AS "isAppealsResponsePhaseOpen",
496539 appeals_response_phase."appealsResponsePhaseName" AS "appealsResponsePhaseName",
497540 c.status AS "status"
0 commit comments