Skip to content

Payload CMS update - #7273

Merged
jmgasper merged 21 commits into
masterfrom
develop
Aug 26, 2026
Merged

Payload CMS update#7273
jmgasper merged 21 commits into
masterfrom
develop

Conversation

@jmgasper

Copy link
Copy Markdown
Collaborator

No description provided.

jmgasper and others added 21 commits August 11, 2026 12:56
What was broken

Checkpoint attempts consumed final-submission slots, the regular My Submissions page could navigate past a reached limit, and concurrent client checks could create duplicate attempts. Entry-point checks also relied on a partial challenge submission page.

Root cause

Submission-limit checks counted every submission phase together, were missing from the regular submission-management route, and started the submit pending state only after an asynchronous lookup.

What was changed

Centralized active submission-type handling, counted checkpoint and contest attempts independently, and bypassed concept limits for final fixes and non-Design tracks. Added complete member-and-type history checks to the challenge header, regular My Submissions route, and upload boundary, with synchronous in-flight guards and fail-closed lookup handling.

Any added/updated tests

Added and updated utility, service, header, challenge-detail, Submission Management, and upload tests covering phase separation, full-history checks, reached and below-limit navigation, concurrent attempts, lookup failures, final fixes, unlimited challenges, and Development challenges.
PM-5758: enforce design submission limits end to end
What was broken

On the Opportunities page, the "All" filter (and the count shown next to it)
omitted every active challenge whose open phase was not Submission. Challenges
sitting in Review, AI Review, Approval, Screening, Iterative Review, etc. were
missing from the list, so a challenge that was clearly visible under "My
Challenges" produced "No Live Challenges found" under "All".

Root cause

The All-bucket request and the total-count request in
src/shared/actions/challenge-listing/index.js sent currentPhaseName=Submission
(added under PM-5488 to keep not-yet-started challenges out of the live list).
The challenge API matches currentPhaseName against a single phase name, so the
filter also dropped every active challenge that had already moved past
submission. The same over-restriction was removed from "My Challenges" earlier
for the same reason, which is why the challenge appeared there but not in "All".

What was changed

Replaced currentPhaseName=Submission with startDateEnd=<now> in
getAllChallengesDone and getTotalChallengesCountDone. The All bucket now
requests every started ACTIVE challenge, matching the bucket's original
definition (started + Active) and the phase-agnostic My Challenges request,
while still excluding challenges whose start date is in the future.

Any added/updated tests

Updated __tests__/shared/actions/challenge-listing/index.js so the All and
total-count regression tests assert the ACTIVE + startDateEnd filter and
explicitly assert that no currentPhaseName constraint is sent.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
What was broken
Private (group restricted) challenges were listed in the "Open for Review"
bucket of the community app Opportunities page for anonymous visitors and for
members who are not part of the challenge group. After the review API started
enforcing group visibility, the opposite problem appeared: the opportunities of
group challenges were no longer visible to admins or to members of those
groups either.

Root cause
The community app called the v6 review opportunity endpoints without an
Authorization header. GET /v6/review-opportunities (and
GET /v6/review-opportunities/{id}) evaluate challenge group access against the
caller, so every community app request was treated as anonymous. An anonymous
caller must only receive opportunities of public challenges, which is why the
listing could never show group challenges to the members entitled to see them,
while older API builds that did not filter at all exposed them to everybody.

What was changed
- services/reviewOpportunities: added a shared getRequestOptions helper that
  attaches "Authorization: Bearer <tokenV3>" when a token is available, and
  used it for both the review opportunity listing and the details requests.
- actions/challenge-listing: getReviewOpportunitiesDone now accepts tokenV3 and
  forwards it to the service.
- containers/challenge-listing/Listing: the load-more handler and the
  mapDispatchToProps binding pass the logged in user's tokenV3.
- actions/page/review-opportunity-details: getDetailsDone forwards the tokenV3
  that the details container was already dispatching.

No API change was required: review-api-v6 already filters challenge ids by
challenge groups (and bypasses that filter for admin and M2M callers), which
was verified against api.topcoder-dev.com where a grouped challenge's OPEN
review opportunity is returned for an M2M caller and withheld from an
anonymous caller.

Any added/updated tests
- __tests__/shared/services/reviewOpportunities.js: new "auth token
  forwarding" suite asserting the Authorization header is sent for the listing
  and details requests when a token is present, and omitted for anonymous
  listing requests.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PM-5895: send auth token when loading review opportunities
PM-5897: Show later-phase challenges under the All filter
What was broken

Group-restricted review opportunities remained missing for admins and eligible
group members even after the earlier fix began forwarding bearer tokens. A
restricted result already loaded for one caller could also remain cached after
the caller logged out.

Root cause

Community app authentication is populated asynchronously. The Open for Review
bucket could therefore complete its first request anonymously before tokenV3
arrived. The review-opportunity rows and all-loaded pagination flag were never
invalidated when authentication changed, so the authenticated request was not
made and the anonymous result set stayed on screen.

What was changed

- Added a focused action and reducer path that clears only review-opportunity
  rows, pagination, loading, and completion state.
- Clear that caller-specific cache whenever tokenV3 changes.
- Immediately reload page zero with the current token when Open for Review is
  active; inactive buckets remain lazy-loaded.

Any added/updated tests

- Added lifecycle coverage for delayed authentication, logout, and auth changes
  while another bucket is active.
- Added reducer coverage proving the review-opportunity cache resets without
  changing other challenge buckets.
- Verified the full test suite, lint, and production build.
PM-5895: refresh review opportunities after auth changes
… is open

What was broken
In Design challenges the submitter could still delete a submission after the
phase that created it had ended. In particular a checkpoint submission stayed
deletable for the whole Submission phase, so it could be removed after it had
already been screened and scored in Checkpoint Screening / Checkpoint Review.

Root cause
SubmissionsTable computed the delete permission from a single
"submissionPhaseStartDate" prop, which was the start date of *any* open
Submission or Checkpoint Submission phase, and compared it against
subObject.submissionDate - a field that member submissions do not carry (they
expose "created"). The comparison therefore resolved to "now is after the open
phase start", i.e. the delete button was enabled for every submission whenever
any submission phase was open, regardless of which phase actually produced the
submission.

What was changed
- Added belongsToActiveSubmissionPhase() to
  utils/challenge-detail/submission-limit, which reuses the existing
  getActiveSubmissionType() phase precedence to decide whether a submission was
  created by the currently open submission phase.
- SubmissionsTable now derives allowDelete from the submission's own type
  against the open phase, so checkpoint submissions stop being deletable when
  the Checkpoint Submission phase closes, and nothing is deletable once every
  submission phase is closed.
- Removed the now-unused submissionPhaseStartDate prop from the submission
  management container and components.

Any added/updated tests
- __tests__/shared/utils/challenge-detail/submission-limit.test.js: new
  belongsToActiveSubmissionPhase suite covering checkpoint deletion during the
  checkpoint phase, checkpoint deletion blocked once the Submission phase opens,
  everything blocked during screening/review, and missing submission/phase input.
- Updated the SubmissionsTable shallow snapshot for the now-boolean allowDelete
  prop.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PM-5961: only allow deleting submissions while their submission phase is open
…-20260826

chore: remove retired enterprise communities
Route migrated Contentful spaces through Payload CMS
@jmgasper
jmgasper requested a review from kkartunov as a code owner August 26, 2026 04:55
@jmgasper
jmgasper merged commit 0cd7d47 into master Aug 26, 2026
6 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants