Commit Graph

1845 Commits

Author SHA1 Message Date
Kalle
767ca4d7ab Fix build delete action 500 error if build does not exist 2026-05-03 14:34:03 +03:00
Kalle
92c62746be Show year on the tournament register page if not current year 2026-05-03 14:27:50 +03:00
Kalle
76716bf464 Add missing order by to TournamentMatchRepository.findByTournamentTeamId
Needed so we have the logical order on
the team page.
2026-05-03 13:13:31 +03:00
Kalle
1bf9802be8 Fix tournament team page meta tags not set 2026-05-03 11:55:10 +03:00
Kalle
c37b52dfb2 Fix new art form double-upload and premature submit
The file <input> had name="img", so new FormData(form) already included
the original uncompressed file under "img". handleSubmit then appended
the compressed version with the same key, and FormData.append doesn't
overwrite — every save uploaded two files to S3 (the second clobbering
the first under the same generated filename).

The submit button also only checked the full-size img state, not
smallImg. Both Compressor instances run in parallel, so Save could fire
before the thumbnail finished compressing — saving art with no
thumbnail, and (under slow MinIO on CI) making the e2e test flaky as
two serial S3 uploads pushed past the 5s toHaveURL timeout.
2026-05-03 11:15:44 +03:00
honk-s
b18a2b062e
badge: add badge for Cats Have 9 Lives (#3031) 2026-05-02 15:55:49 +03:00
Name
59d70a71e9
badge: add badge for Solo Squid Showdown: Golden Edition (#3027) 2026-05-02 14:28:06 +03:00
Kalle
3f3c084910 Migrate addInitialSkill to Kysely 2026-05-02 14:24:21 +03:00
Kalle
8563a4956a Deprecate tournament team page DB call in favor of derived data 2026-05-02 14:06:45 +03:00
Kalle
1823c9881c Fix flaky SendouQ full group tier sort test 2026-05-02 13:53:18 +03:00
Kalle
23bfa19403 Allow TO to remove groups from LFG before registration ends
Closes #2948
2026-05-02 13:36:15 +03:00
Kalle
05aea47d32 Fix streamer not deduped when in tournament
Closes #3010
2026-05-02 13:18:02 +03:00
Kalle
10f3af3785 Fix user results page styling on mobile
Closes #3026
2026-05-02 12:47:27 +03:00
Kalle
bf0277479d User seasons page tournament result card style tweaks
Closes #3025
2026-05-02 12:41:48 +03:00
Kalle
d91d0568e1 Swap user page Date/Tournament column locations 2026-05-02 11:41:46 +03:00
Kalle
747a63edbc Show current route's chat in room list even when expired
Non-participants (e.g. tournament organizers) viewing a tournament
match chat could see the chat auto-open correctly, but clicking the
back arrow to the room list left the chat invisible — the only way
back was to leave the route and return.

The match chat appears in chatContext.rooms via the SUBSCRIBE
response, which (unlike the initial-payload path that participants
go through) does not check room expiry on the skalop side. So an
organizer viewing an old match ends up with an expired room in
their rooms list. ChatView already handles this gracefully with a
read-only banner, but RoomList was filtering on
expiresAt > Date.now() and dropping it.

Cleanup in useChatRouteSync removes the room from chatContext.rooms
on navigation, so exempting the current route's chatCode from the
expiry filter only affects the page that subscribed to it.
2026-05-02 11:36:56 +03:00
Kalle
5131fb7673 Fix widget edit crash when saving zero widgets
Some checks are pending
E2E Tests / e2e (push) Waiting to run
Tests and checks on push / run-checks-and-tests (push) Waiting to run
Updates translation progress / update-translation-progress-issue (push) Waiting to run
upsertWidgets ran an unconditional insertInto("UserWidget").values([])
when the submitted widgets array was empty. Kysely emits
`insert into "UserWidget" () values ()` for an empty values array,
which SQLite rejects with `near ")": syntax error`, rolling back the
preceding delete in the same transaction. Saving an empty widget list
was therefore impossible. Skip the insert when the array is empty.
2026-05-01 17:32:55 +03:00
Kalle
b011cd0940 Catch SendouQError in remaining sendouq actions
The /q (front page), /q/preparing, and /q/match/:id action handlers
were not wrapping their switch in try/catch the way /q/looking does.
When SQGroupRepository.createGroup, addMember, or createGroupFromPrevious
tripped the integrity check (member already in another non-INACTIVE
group, group too large, etc.) the SendouQError bubbled up unhandled
and React Router responded with 500 instead of letting the loaders
re-run with fresh state.

These errors are expected race conditions, e.g. a double-submit
where the second JOIN_QUEUE arrives after the first already created
the group. Returning null lets the client see the actual current
state instead of an error page, matching the behavior already in
q.looking.server.ts.
2026-05-01 17:15:38 +03:00
Kalle
b261600f0e Fix object damage calculator crash on invalid SPECIAL weapon ID
The SPECIAL branch of validatedAnyWeaponFromSearchParams only checked
nonDamagingSpecialWeaponIds membership, not whether the parsed id was
actually a valid SpecialWeaponId. A malformed URL like
?weapon=SPECIAL_9ap=0... made Number() return NaN, which fell through
to exampleMainWeaponIdWithSpecialWeaponId and hit assertUnreachable.
2026-05-01 16:04:35 +03:00
Kalle
8a773650fd Don't allow too old tournaments to contribute to already closed seasonal rankings 2026-05-01 15:51:40 +03:00
Kalle
609bb2de7a Count league divisions for the current season, not when it was started 2026-05-01 15:36:32 +03:00
Kalle
2d3bff6437 Fix tournament page crash on page load + add backend check against it
Error: Invariant failed: Empty placements not supported
I don't think it's possible for this to happen normally
but this fix provides more defense just in case
2026-05-01 15:30:01 +03:00
Kalle
b2de42b081 Fix builds page crash on lower case filters 2026-05-01 14:47:59 +03:00
Kalle
539da816bf
Make date time format apply everywhere (#3023) 2026-05-01 10:11:29 +03:00
Kalle
bfef81682e Filter out match-less sets in team set history
Some checks failed
E2E Tests / e2e (push) Has been cancelled
Tests and checks on push / run-checks-and-tests (push) Has been cancelled
Updates translation progress / update-translation-progress-issue (push) Has been cancelled
Regression introduced in b26f4ab2 (Migrate setHistoryByTeamId to
Kysely): the old raw SQL inner-joined through
TournamentMatchGameResultParticipant, which implicitly dropped
completed matches that had no game results (forfeits/walkovers).
The Kysely version fetches players via a jsonArrayFrom subquery,
so those matches leaked through and rendered as 0-0 on the team
page.
2026-04-28 21:20:56 +03:00
Kalle
06c2f637a3 Add "Date format" preference
Some checks are pending
E2E Tests / e2e (push) Waiting to run
Tests and checks on push / run-checks-and-tests (push) Waiting to run
Updates translation progress / update-translation-progress-issue (push) Waiting to run
2026-04-27 18:58:27 +03:00
Kalle
ec981d586e Fix team having many tournament level check-ins
Concrete bug it caused: wrong team count for tournament card on the front page
2026-04-27 18:05:49 +03:00
Kalle
1ef646a5c1 Add pagination to vods 2026-04-27 17:31:41 +03:00
Kalle
b26f4ab254 Migrate setHistoryByTeamId to Kysely 2026-04-27 08:43:30 +03:00
Kalle
53d7ca3813 Fix tag text color in light mode 2026-04-27 07:37:29 +03:00
Kalle
d91b8444b6 Clean up obsolete mode tags 2026-04-27 07:28:00 +03:00
Kalle
49e35fd4c2 Fix A/B round robin only tournament placements on front page
Some checks are pending
E2E Tests / e2e (push) Waiting to run
Tests and checks on push / run-checks-and-tests (push) Waiting to run
Updates translation progress / update-translation-progress-issue (push) Waiting to run
Closes #3009
2026-04-26 20:01:58 +03:00
Cafy
ea4ca19b0f
badge: add badge for Wings Up! (#3014) 2026-04-26 17:37:32 +03:00
BrushMommy
8580c82a4a
badge: add badge for Wellstring Propoganda: Top Cut (#3008) 2026-04-26 17:36:36 +03:00
Kalle
a848fc4f03 Improve art page mobile layout 2026-04-26 17:35:33 +03:00
Kalle
011b560c6b Tweak user page results table styles 2026-04-26 17:23:58 +03:00
Kalle
f9a594bf0c Fix admin cancels treated as score reports
This caused cancels that cause points lost/gained when it was by admin
2026-04-26 16:00:34 +03:00
Kalle
c8b61f163d Fix ts-nocheck TODO in crud.server.ts 2026-04-26 15:26:15 +03:00
Kalle
dc0bbaa271 Fix TODO about BracketsManager types mismatch 2026-04-26 15:02:56 +03:00
Kalle
2865fc3415 Have "simple seeded list" get all teams if none checked in yet
Previous behavior just looks broken to users.
Proper fix is still just making a more robust
team export.
2026-04-26 14:55:05 +03:00
Kalle
fb86b9f24d Change scrim notification text not to include timestamp
Some checks are pending
E2E Tests / e2e (push) Waiting to run
Tests and checks on push / run-checks-and-tests (push) Waiting to run
Updates translation progress / update-translation-progress-issue (push) Waiting to run
Closes #2998
2026-04-26 13:05:48 +03:00
Kalle
ed0467f98e Fix tournament chats expiring too early
Some checks are pending
E2E Tests / e2e (push) Waiting to run
Tests and checks on push / run-checks-and-tests (push) Waiting to run
Updates translation progress / update-translation-progress-issue (push) Waiting to run
In round robin, all matches are set to have both participants at the start.
If the bracket is larger e.g. 5 rounds then later rounds might have chat
disappearing before teams get a chance to play it.

Closes #3005
2026-04-25 21:15:17 +03:00
Kalle
9f38719fc3 Handle race when two groups match up with same target
Some checks are pending
E2E Tests / e2e (push) Waiting to run
Tests and checks on push / run-checks-and-tests (push) Waiting to run
Updates translation progress / update-translation-progress-issue (push) Waiting to run
GroupMatch has unique constraints on both alphaGroupId and bravoGroupId
(a group can only be in one match). If two managers click MATCH_UP at
nearly the same moment against overlapping groups, the second INSERT
trips SQLITE_CONSTRAINT_UNIQUE and bubbles up as a 500.

Translate that error into a SendouQError inside SQMatchRepository.create
so the q/looking action's existing SendouQError catch treats it like
any other stale-state error and returns null, which causes the loader
to re-run and the user sees the fresh state instead of an error page.
2026-04-24 21:44:33 +03:00
Kalle
f216423089 Validate builds page limit search param
A crawler hitting /builds/:slug?limit=48%27 (URL-encoded single quote,
likely an SQL injection probe) was triggering SQLITE_MISMATCH errors
server-side. The loader was calling Number() on the raw string, which
returned NaN, and then forwarding NaN as the LIMIT bind parameter on
the underlying Kysely query. No injection was possible (params are
bound), but the bad value only failed at the DB boundary.

Parse the param through a zod schema that coerces to a positive int,
falls back to the default batch size on any invalid input, and clamps
to the page max.
2026-04-24 21:34:44 +03:00
Kalle
6bc7eac117 Allow tier list labels to wrap again
Originally this was removed to "fix" the img download being wonky.
But the underlying library got a lot of updates since so maybe it's good now?
Couldn't at least reproduce the bug anymore.
2026-04-24 21:28:04 +03:00
Kalle
53d2b41ec6 Add to contributions 2026-04-24 20:24:30 +03:00
Kalle
540ae58a89 Update Typescript 2026-04-24 20:12:43 +03:00
Kalle
d2440c4a32
Round robin only tournament support (#2996) 2026-04-24 18:03:53 +03:00
benny B franklin
002a03e86d
badge: add badge for OCE Open Series (#2993) 2026-04-24 18:02:40 +03:00
Cafy
1a7d865848
badge: add badge for Bubbly's Birthdays (#3000) 2026-04-24 18:02:02 +03:00