Skip to content

Fix/ci 636 - #651

Open
iyanumajekodunmi756 wants to merge 12 commits into
Arenax-gaming:mainfrom
iyanumajekodunmi756:fix/ci-636
Open

Fix/ci 636#651
iyanumajekodunmi756 wants to merge 12 commits into
Arenax-gaming:mainfrom
iyanumajekodunmi756:fix/ci-636

Conversation

@iyanumajekodunmi756

Copy link
Copy Markdown
Contributor

Summary

Type of change

  • Bug fix
  • New feature
  • Breaking change
  • Refactor / cleanup
  • Docs / config only

Related issues

Closes #

Changes

Testing

  • Unit tests pass (cargo test / npm test)
  • Contracts tests pass (cargo test in contracts/)
  • Manually tested locally
  • Migration tested against a fresh DB

Checklist

  • Code follows project conventions
  • No secrets or PII committed
  • Migrations are reversible (.down.sql exists)
  • Contract changes are backward-compatible or versioned
  • CI passes

ArenaX CI Agent and others added 11 commits June 26, 2026 07:51
…gaming#448

Implements the four supported tournament formats as real rounds and matches
instead of empty stubs that silently produced nothing.

New module
----------
backend/src/service/bracket_generator.rs (~640 lines)
  * BracketGenerator::generate(bracket_type, participants) -> GeneratedBracket
    dispatches to one of four pure-function algorithms.
  * BracketGenerator::persist(tournament_id, bracket) inserts all rounds
    and matches inside a single Postgres transaction.
  * BracketGenerator::generate_next_swiss_round(tournament_id) reads
    current standings (3 / 1 / 0 scoring) and pairs by descending score,
    honoring the no-repeat rule, with a Bye handed to the lowest available
    odd player if N is odd.

Algorithms
----------
  * Single Elimination: standard '1 vs N' seeding so the top two seeds
    can only meet in the final; byes auto-assigned to top seeds when N is
    not a power of two.
  * Double Elimination: round-number sentinel scheme so the (tournament_id,
    round_number) UNIQUE index is never violated:
       - Winners Bracket:    1..=ceil(log2 N)
       - Losers Bracket:    101..=(101 + 2W - 2)  (empty match shells; the
         advance orchestrator populates them after each WB round completes)
       - Grand Final:       201  (empty until LB winner is known)
       - Bracket Reset:     202  (empty unless LB winner takes GF)
  * Round Robin: circle / polygon method. Position 0 is fixed and the
    remaining N-1 players rotate clockwise each round; deterministic pairings
    and proper Bye handling for odd N.
  * Swiss: round 1 paired (1 vs N/2+1, 2 vs N/2+2, ...); subsequent rounds
    generated lazily via generate_next_swiss_round using current standings
    and the no-repeat pairing rule.

Round-number sentinels (100, 200, ...) keep WB / LB / GF in a single
tournament_rounds table without collisions.

Wiring
------
backend/src/service/tournament_service.rs (~700 lines, was 2311 corrupted)

  The previous file had a broken sqlx::query! macro, two duplicated
  TournamentLeaderboardEntry / TournamentAnalyticsResponse structs, and
  unpaired braces that prevented cargo check from compiling. Rewrote keeping
  the working CRUD / payment / lifecycle helpers and delegating bracket
  generation to BracketGenerator.

  * generate_tournament_bracket fetches active participants in seed order,
    calls BracketGenerator::generate, then BracketGenerator::persist -
    all in one transaction.
  * advance_swiss_round exposes the lazy Swiss round generator for
    round-by-round execution.
  * get_tournament_bracket reads back the persisted rounds and matches.
  * Removed the broken dashboard / leaderboard / analytics methods that
    are outside the scope of Arenax-gaming#448 and were not referenced outside the
    service file (grep verified against server/, contract/, frontend/).

backend/src/service/mod.rs
  Added pub mod bracket_generator; and removed a pre-existing duplicate
  pub mod tournament_service; declaration.

Tests
-----
  11 unit tests in bracket_generator.rs cover:
    * standard seeding order invariants
    * single-elim with byes for non-power-of-two N
    * double-elim round-number scheme and uniqueness
    * round-robin: even count balanced, odd count bye rotation, no
      intra-round repeats
    * swiss round 1: top-vs-bottom half for even N, lowest-seeded Bye for odd
    * invalid input (zero / one participant) does not panic

Migrations
----------
  No new migration required. The bracket generator emits empty match Vecs
  for LB / GF shells and writes only round rows for them; the existing
  tournament_rounds / tournament_matches schema is sufficient and the
  player1_id NOT NULL FK constraint is preserved.

References: Arenax-gaming#448
Backend migrations (apply migrations):
- 20260601000001_matchmaking_perf_indexes.up.sql: status column is INTEGER
  (0=waiting, 1=matched per schema comment), fix partial index WHERE clauses
  from 'waiting'/'matched\ to integer literals (Postgres was erroring
  with 'invalid input syntax for type integer: "waiting"').

Contracts (cargo fmt --check, cargo test):
- Add placeholder src/test.rs to composable-example and token-manager. Their
  src/lib.rs declares '#[cfg(test)] mod test;' but the file was missing,
  breaking cargo fmt-cargo test resolution.

Frontend (npm ci) + Server (npm ci):
- Resolve 272 unresolved git merge conflict markers in
  frontend/package-lock.json via a deterministic Node regex pass: keep
  upstream when HEAD empty, keep HEAD when upstream empty, keep upstream
  on conflict (upstream has resolved/integrity hashes that HEAD lacks).
- Repair 2 corruption sites in server/package-lock.json (missing } between
  package entries; strip dangling trailing comma on last property). The walk-
  forward fixer verifies the resulting JSON has every package.entry.version
  defined and root dependencies synced with package.json (0 missing entries).

Format contracts workspace so 'cargo fmt --all -- --check' passes in CI.
Backstops: other migrations use string status values but only on VARCHAR
columns (different from this INTEGER matchmaking_queue.status).
Backend: add pub mod orchestrator, fix api_error semicolons, fix models duplicate imports,
fix idempotency serde derives and IdempotencyKeyRequest

Frontend: add Image import, fix conditional useCallback, add a11y keyboard handler,
fix analytics formatter type, friends page isOnline, dashboard profile MatchWithPlayers type,
export AnyMatchWithPlayers type

Server: add module declarations for hpp and @sentry/node, fix pool types in database.service,
fix Prisma/Kafka type casts in audit.service and kafka/event-store

Contracts: add Val import in contract-utils, add Vec import + u32 decimals in contract-standards,
fix Vec::<Address> in token-manager, add missing event types in arenax-events,
fix duplicate functions and String::from_str in tournament-manager

Package-lock: add missing deps (react-window, kafkajs, react-dropzone, playwright, etc.)
…ming#636)

The four original CI failures (Backend Migrations, Contracts, E2E Tests,
Frontend) all stemmed from latent strict-mode TypeScript build errors in
pages and components that were masked by the first failing TS error
encountered during CI runs. This commit resolves all the originally-failing
checks and the immediate downstream cascade.

## Backend Migrations

- backend/migrations/20260601000001_matchmaking_perf_indexes.up.sql: the
  third partial index referenced matchmaking_queue.created_at, a column
  that does not exist on the queue table (created at 20240928000001 it
  uses joined_at instead). Switched the index column to joined_at so the
  migration runs cleanly under Postgres 14.

## Contracts

- contracts/arenax-events/src/tournament.rs
- contracts/batch-operations/src/lib.rs
- contracts/batch-operations/src/test.rs

Ran cargo fmt --all to bring the three files in line with rustfmt.
Verified cargo fmt --all -- --check exits 0.

## Frontend

Several masked strict-mode TS errors were unmasked after fixing the
originally-flagged friends/page.tsx isLoading issue. Each is a minimal,
targeted fix that keeps the existing UI behavior:

- frontend/src/app/[locale]/friends/page.tsx (PRIMARY): rewrote to match
  the new <FriendsList> and <FriendRequests> APIs (searchQuery/
  onSearchChange/onRemoveFriend/onInviteToParty are required;
  isLoading/onMessage were removed). Removed the duplicated page-level
  search bar (FriendsList has its own built-in search). Wired
  useAcceptFriendRequest for the request accept flow. The not-yet-backed
  remove-friend and decline-request actions surface as dev-mode
  console.warn until the backend endpoints land.

- frontend/src/components/leaderboard/CategorySelector.tsx: widened the
  local Category literal to LeaderboardCategory (imported from
  @/types/leaderboard) and added a fourth Ranked button so the UI matches
  the parent page’s LeaderboardCategory state.

- frontend/src/components/leaderboard/LeaderboardTable.tsx: switched the
  component to consume the canonical LeaderboardEntry from
  @/types/leaderboard (the backend /matchmaking response shape) instead
  of an internal component-local shape that did not match. Re-exported
  the canonical LeaderboardEntry so existing imports keep working.
  Renamed rank->ranking, points->eloRating, lastUpdated(Date)->updatedAt,
  avatar->avatarUrl, dropped the unused trend column, and renamed the
  Points header to ELO. Fixed a Tailwind JIT bug where column widths were
  generated via dynamic w- class strings (JIT cannot extract
  those) by extracting them into explicit widthClass strings.

- frontend/src/__tests__/virtual-scrolling.test.tsx: updated
  makeLeaderboardEntries to produce canonical-shape entries.

- frontend/src/app/[locale]/leaderboards/page.tsx: updated the sortBy
  state default to eloRating to match the new LeaderboardTable API.

- frontend/src/app/[locale]/matches/[id]/page.tsx: added a !match null
  guard before the type-narrowing "in" operator check; the match hook
  returns MatchHubDetails | null so the guard is required by strict TS.

- frontend/src/app/[locale]/party/page.tsx: removed the broken
  <PartyManager friends={...} /> invocation (the component expects a
  much wider lifecycle API: party, allFriends, and a full callback
  surface). The page already has its own working Create Party form
  backed by useCreateParty; replaced the broken call with a No active
  party placeholder card with a clear comment for the future integration.

- frontend/src/app/[locale]/profile/[id]/ProfilePageClient.tsx: replaced
  <Button variant=outline asChild><a href=...></a></Button> with a
  regular <Link> inlined with the same button styling classes, since
  the local Button component does not expose asChild.

- frontend/src/app/[locale]/profile/page.tsx: cast mockMatchHistory to
  AnyMatchWithPlayers[] at the call site to bridge the mock data shape
  with the MatchHistory component prop shape.

- frontend/src/app/[locale]/tournaments/[id]/page.tsx: added the
  missing import for TOURNAMENT_DETAIL_BANNER_SIZES from
  @/lib/tournamentImageSizes.

- frontend/src/lib/api.ts (ROOT-CAUSE FIX): typed getTournament to
  return Promise<Tournament> by passing a generic to the existing
  request<T> helper. This resolves two callsites (tournaments/[id]/
  page.tsx and tournaments/[id]/join/page.tsx) at once instead of
  per-page casts.

## Out-of-scope follow-ups (intentionally NOT changed in this PR)

Casting patterns and stub callbacks introduced here are minimum-CI
bandages; each has a documented follow-up:

- frontend/src/lib/api.ts still has untyped generic-elided methods
  (getTournaments, getMatches, getMatch, reportMatchScore,
  getDisputes, getAuditLogs, getKycReviews, etc.) that return unknown
  and will surface more TS errors on first render. Recommend a follow-up
  commit that hardens the API client signatures with generics.

- friends/page.tsx handleRemoveFriend and handleDeclineRequest are
  dev-only console.warn stubs; wire to real mutations when /friends/
  remove and /friends/requests/decline endpoints exist.

- profile/[id]/ProfilePageClient.tsx has multiple console.log-only
  placeholder handlers (handleAddFriend, handleRemoveFriend,
  handleMessageFriend, handleSendMessage). Same pattern as above.

- party/page.tsx <PartyManager> usage was removed; the placeholder card
  should be wired to a useParty() hook once the backend exposes a
  /parties endpoint.

- matches/[id]/page.tsx had an explicit null guard because the hook
  returns MatchHubDetails | null; consider tightening the Match type
  so the guard is implicit.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
…er errors on PR Arenax-gaming#636

Fix-build cascade on PR Arenax-gaming#636 (ArenaX):

- Resolves 133+ TypeScript strict-mode errors surfaced by next build
- Wires next-intl App Router plugin into next.config.js so /[locale]/ routes prerender
- Removes event-handler props from /[locale]/offline and /offline (RSC serialization wall)
- Adds export const dynamic = "force-dynamic" to defeat the /en/offline prerender timeout
- Replaces window.location.reload() with native <a href="./"> (true browser reload)
- Tightens types/social.ts contract (Conversation/Party/FriendRequest etc.) and bridges mock data
- Strips duplicate UserStatus type + duplicate re-exports in types/index.ts
- Adds asChild (Radix Slot) to Button/Popover; widens Tooltip placement map
- Replaces non-existent UI primitive variants with existing ones; widens Recharts/ChartTooltip formatter
@vercel

vercel Bot commented Jul 9, 2026

Copy link
Copy Markdown

@iyanumajekodunmi756 is attempting to deploy a commit to the paul joseph's projects Team on Vercel.

A member of the Team first needs to authorize it.

…r SDK v23

- Add testPathIgnorePatterns to jest.config.js to exclude Playwright E2E tests
- Add test:e2e script to package.json (was missing, causing CI failure)
- Fix loginSchema tests: add required rememberMe field
- Fix profileBioSchema tests: add required twitter/discord/twitch fields
- Add env.register() to anti-cheat tests for SDK v23 compatibility
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.

1 participant