Skip to content

Commit 0427ea4

Browse files
committed
feat: fix double registration bug
1 parent 91f46fc commit 0427ea4

File tree

5 files changed

+74
-4
lines changed

5 files changed

+74
-4
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
WITH ranked_teams AS (
2+
SELECT
3+
t.id,
4+
row_number() OVER (
5+
PARTITION BY t.registration_id
6+
ORDER BY count(p.id) DESC, t.created_at ASC, t.id ASC
7+
) AS row_num
8+
FROM public.team AS t
9+
LEFT JOIN public.player AS p
10+
ON p.team_id = t.id
11+
GROUP BY t.id
12+
)
13+
DELETE FROM public.team
14+
WHERE id IN (
15+
SELECT id
16+
FROM ranked_teams
17+
WHERE row_num > 1
18+
);
19+
20+
ALTER TABLE public.team
21+
ADD CONSTRAINT team_registration_id_key UNIQUE (registration_id);

apps/viewer/app/components/registration/forms/BaseForm.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,10 @@ async function submitForm() {
9898
message: err.message,
9999
}))
100100
form.value?.setErrors(formErrors)
101+
return false
101102
} else {
102103
model.value = state.players
104+
return true
103105
}
104106
} catch (error) {
105107
throw createError({

apps/viewer/app/pages/(tournament)/registrations/[id].vue

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,11 @@ const generatePDF = async () => {
132132
133133
downloadPdf(response)
134134
} catch (error) {
135+
const err = error as Error
136+
135137
throw createError({
136138
message: "Error generating PDF",
137-
data: error.message,
139+
data: err.message,
138140
})
139141
} finally {
140142
isGeneratingPdf.value = false
@@ -163,9 +165,19 @@ const playerCount = computed(() => {
163165
})
164166
165167
const formRef = useTemplateRef("formRef")
168+
const isSubmitting = ref(false)
169+
166170
const submit = async () => {
171+
if (isSubmitting.value) {
172+
return
173+
}
174+
167175
// @ts-ignore build error
168-
formRef.value?.$.exposed?.submitForm()
176+
const isValid = await formRef.value?.$.exposed?.submitForm()
177+
if (!isValid) {
178+
return
179+
}
180+
169181
const payload = {
170182
formPlayers: formPlayers.value,
171183
logo: selectedLogo.value,
@@ -175,6 +187,8 @@ const submit = async () => {
175187
}
176188
177189
try {
190+
isSubmitting.value = true
191+
178192
await $fetch("/api/teams/create", {
179193
method: "POST",
180194
body: payload,
@@ -189,6 +203,8 @@ const submit = async () => {
189203
throw createError({
190204
statusMessage: err.message,
191205
})
206+
} finally {
207+
isSubmitting.value = false
192208
}
193209
}
194210
</script>
@@ -345,6 +361,8 @@ const submit = async () => {
345361
/>
346362
<UButton
347363
label="Anmelden"
364+
:disabled="isSubmitting"
365+
:loading="isSubmitting"
348366
@click="submit"
349367
block
350368
size="lg"

apps/viewer/server/api/teams/create/index.post.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,33 @@ export default defineEventHandler(async (event) => {
1919
const { formPlayers, logo, logo_variant, registration, tournament } =
2020
await readBody<Body>(event)
2121

22-
if (!formPlayers || !logo || !registration) {
22+
if (!formPlayers || !logo || !registration || !tournament) {
2323
throw createError({
2424
statusCode: 400,
2525
statusMessage: "Missing data fields",
2626
})
2727
}
2828

29+
const { data: currentRegistration, error: registrationError } = await supabase
30+
.from("registration")
31+
.select("id, status")
32+
.eq("id", registration.id)
33+
.single()
34+
35+
if (registrationError) {
36+
throw createError({
37+
statusCode: 500,
38+
statusMessage: registrationError.message,
39+
})
40+
}
41+
42+
if (currentRegistration.status !== "Ausstehend") {
43+
throw createError({
44+
statusCode: 409,
45+
statusMessage: "Die Anmeldung wurde bereits abgesendet.",
46+
})
47+
}
48+
2949
const { data: groups, error: groupError } = await supabase
3050
.from("group")
3151
.select("*")
@@ -80,6 +100,13 @@ export default defineEventHandler(async (event) => {
80100
const { data, error } = await supabase.from("team").insert(team).select()
81101

82102
if (error) {
103+
if (error.code === "23505") {
104+
throw createError({
105+
statusCode: 409,
106+
statusMessage: "Die Anmeldung wurde bereits abgesendet.",
107+
})
108+
}
109+
83110
throw createError({
84111
statusCode: 500,
85112
statusMessage: error.message,

apps/viewer/server/api/teams/query/find-by-registration/[id].get.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ export default defineEventHandler(async (event) => {
1313
.from("team")
1414
.select("*")
1515
.eq("registration_id", id)
16-
.single()
16+
.order("created_at", { ascending: true })
17+
.limit(1)
18+
.maybeSingle()
1719

1820
return data
1921
})

0 commit comments

Comments
 (0)