WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit c42b336

Browse files
authored
feat: Registration Grace Period (#296)
1 parent d696425 commit c42b336

File tree

13 files changed

+78
-19
lines changed

13 files changed

+78
-19
lines changed

bun.lockb

32 Bytes
Binary file not shown.

messages/de.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,7 @@
610610
"registrationApplied": "Angemeldet",
611611
"registrationClosed": "Anmeldung geschlossen",
612612
"registrationCompleted": "Anmeldung abgeschlossen",
613+
"registrationDeadlineGracePeriod": "Anmeldefrist Kulanzzeitraum (in Minuten)",
613614
"registrationDistribution": "Verteilung der Anmeldungen",
614615
"registrationNotApplied": "Nicht angemeldet",
615616
"registrationNotCompleted": "Anmeldung noch nicht abgeschlossen",
@@ -703,6 +704,7 @@
703704
"teaserText": "Teaser Text",
704705
"technicalNecessary": "Technisch notwendig",
705706
"technicalNecessaryDescription": "Delegator verwendet technisch notwendige Cookies um das Benutzen der App zu ermöglichen.",
707+
"technicalRegistrationDeadline": "Technische Anmeldefrist inklusive Kulanzzeitraum in deiner Zeitzone",
706708
"termsAndConditions": "Teilnahmebedingungen",
707709
"thanksForParticipating": "Vielen Dank für deine Teilnahme!",
708710
"thanksForParticipatingDescription": "Wir hoffen, dass du von der Konferenz viel mitnehmen konntest. Wir freuen uns, wenn du auch nächstes Jahr oder bei unserer Schwesterkonferenz wieder Teilnimmst. Wenn du noch Fragen oder Anregungen hast, kannst du dich jederzeit an die Teilnehmendenbetreuung wenden.",

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"csv-stringify": "^6.6.0",
5555
"daisyui": "^5.3.7",
5656
"date-fns": "^4.1.0",
57+
"dayjs": "^1.11.18",
5758
"eslint": "^9.38.0",
5859
"eslint-config-prettier": "^10.1.8",
5960
"eslint-plugin-svelte": "^3.12.5",
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterTable
2+
ALTER TABLE "Conference" ADD COLUMN "registrationDeadlineGracePeriodMinutes" INTEGER NOT NULL DEFAULT 30;

prisma/schema.prisma

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,21 @@ enum ConferenceState {
2929

3030
/// A conference in the system
3131
model Conference {
32-
id String @id @default(nanoid())
33-
title String
34-
longTitle String?
35-
location String?
36-
language String?
37-
website String?
38-
imageDataURL String?
39-
info String?
40-
linkToPreparationGuide String?
41-
linkToPaperInbox String?
42-
state ConferenceState @default(PRE)
43-
startAssignment DateTime
44-
startConference DateTime
45-
endConference DateTime
32+
id String @id @default(nanoid())
33+
title String
34+
longTitle String?
35+
location String?
36+
language String?
37+
website String?
38+
imageDataURL String?
39+
info String?
40+
linkToPreparationGuide String?
41+
linkToPaperInbox String?
42+
state ConferenceState @default(PRE)
43+
startAssignment DateTime
44+
registrationDeadlineGracePeriodMinutes Int @default(30)
45+
startConference DateTime
46+
endConference DateTime
4647
4748
/// Payment and Postal information
4849
unlockPayments Boolean @default(false)

schema.graphql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ type Conference {
319319
postalName: String
320320
postalStreet: String
321321
postalZip: String
322+
registrationDeadlineGracePeriodMinutes: Int!
322323
singleParticipants: [SingleParticipant!]!
323324
startAssignment: DateTime!
324325
startConference: DateTime!
@@ -374,6 +375,7 @@ input ConferenceCreateInput {
374375
postalName: String
375376
postalStreet: String
376377
postalZip: String
378+
registrationDeadlineGracePeriodMinutes: Int
377379
singleParticipants: SingleParticipantCreateNestedManyWithoutConferenceInput
378380
startAssignment: DateTime!
379381
startConference: DateTime!
@@ -424,6 +426,7 @@ input ConferenceOrderByWithRelationInput {
424426
postalName: SortOrder
425427
postalStreet: SortOrder
426428
postalZip: SortOrder
429+
registrationDeadlineGracePeriodMinutes: SortOrder
427430
singleParticipants: SingleParticipantOrderByRelationAggregateInput
428431
startAssignment: SortOrder
429432
startConference: SortOrder
@@ -628,6 +631,7 @@ enum ConferenceScalarFieldEnum {
628631
postalName
629632
postalStreet
630633
postalZip
634+
registrationDeadlineGracePeriodMinutes
631635
startAssignment
632636
startConference
633637
state
@@ -850,6 +854,7 @@ input ConferenceUpdateDataInput {
850854
postalName: String
851855
postalStreet: String
852856
postalZip: String
857+
registrationDeadlineGracePeriodMinutes: Int
853858
startAssignment: DateTime
854859
startConference: DateTime
855860
state: ConferenceState
@@ -896,6 +901,7 @@ input ConferenceUpdateInput {
896901
postalName: NullableStringFieldUpdateOperationsInput
897902
postalStreet: NullableStringFieldUpdateOperationsInput
898903
postalZip: NullableStringFieldUpdateOperationsInput
904+
registrationDeadlineGracePeriodMinutes: IntFieldUpdateOperationsInput
899905
singleParticipants: SingleParticipantUpdateManyWithoutConferenceNestedInput
900906
startAssignment: DateTimeFieldUpdateOperationsInput
901907
startConference: DateTimeFieldUpdateOperationsInput
@@ -937,6 +943,7 @@ input ConferenceUpdateManyMutationInput {
937943
postalName: NullableStringFieldUpdateOperationsInput
938944
postalStreet: NullableStringFieldUpdateOperationsInput
939945
postalZip: NullableStringFieldUpdateOperationsInput
946+
registrationDeadlineGracePeriodMinutes: IntFieldUpdateOperationsInput
940947
startAssignment: DateTimeFieldUpdateOperationsInput
941948
startConference: DateTimeFieldUpdateOperationsInput
942949
state: EnumConferenceStateFieldUpdateOperationsInput
@@ -987,6 +994,7 @@ input ConferenceWhereInput {
987994
postalName: StringNullableFilter
988995
postalStreet: StringNullableFilter
989996
postalZip: StringNullableFilter
997+
registrationDeadlineGracePeriodMinutes: IntFilter
990998
singleParticipants: SingleParticipantListRelationFilter
991999
startAssignment: DateTimeFilter
9921000
startConference: DateTimeFilter
@@ -1040,6 +1048,7 @@ input ConferenceWhereUniqueInput {
10401048
postalName: StringNullableFilter
10411049
postalStreet: StringNullableFilter
10421050
postalZip: StringNullableFilter
1051+
registrationDeadlineGracePeriodMinutes: IntFilter
10431052
singleParticipants: SingleParticipantListRelationFilter
10441053
startAssignment: DateTimeFilter
10451054
startConference: DateTimeFilter

src/api/resolvers/modules/conference/conference.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import {
3636
findUniqueConferenceQueryObject,
3737
updateOneConferenceMutationObject,
3838
ConferenceCertificateContentFieldObject,
39+
ConferenceRegistrationDeadlineGracePeriodMinutesFieldObject,
3940
ConferenceContractContentFieldObject
4041
} from '$db/generated/graphql/Conference';
4142
import { toDataURL } from '$api/services/fileToDataURL';
@@ -59,6 +60,9 @@ builder.prismaObject('Conference', {
5960
imageDataURL: t.field(ConferenceImageDataURLFieldObject),
6061
state: t.field(ConferenceStateFieldObject),
6162
startAssignment: t.field(ConferenceStartAssignmentFieldObject),
63+
registrationDeadlineGracePeriodMinutes: t.field(
64+
ConferenceRegistrationDeadlineGracePeriodMinutesFieldObject
65+
),
6266
startConference: t.field(ConferenceStartConferenceFieldObject),
6367
endConference: t.field(ConferenceEndConferenceFieldObject),
6468
unlockPayments: t.field(ConferenceUnlockPaymentsFieldObject),
@@ -346,6 +350,7 @@ builder.mutationFields((t) => {
346350
}),
347351
state: t.field({ type: ConferenceState, required: false }),
348352
startAssignment: t.field({ type: 'DateTime', required: false }),
353+
registrationDeadlineGracePeriodMinutes: t.int({ required: false }),
349354
startConference: t.field({ type: 'DateTime', required: false }),
350355
endConference: t.field({ type: 'DateTime', required: false }),
351356
unlockPayments: t.boolean({
@@ -459,6 +464,8 @@ builder.mutationFields((t) => {
459464
info: args.data.info ?? undefined,
460465
state: args.data.state ?? undefined,
461466
startAssignment: args.data.startAssignment ?? undefined,
467+
registrationDeadlineGracePeriodMinutes:
468+
args.data.registrationDeadlineGracePeriodMinutes ?? undefined,
462469
startConference: args.data.startConference ?? undefined,
463470
endConference: args.data.endConference ?? undefined,
464471
unlockPayments:

src/api/resolvers/modules/delegation.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { GraphQLError } from 'graphql';
2323
import { m } from '$lib/paraglide/messages';
2424
import formatNames from '$lib/services/formatNames';
2525
import { applicationFormSchema } from '$lib/schemata/applicationForm';
26+
import dayjs from 'dayjs';
2627

2728
builder.prismaObject('Delegation', {
2829
fields: (t) => ({
@@ -207,7 +208,11 @@ builder.mutationFields((t) => {
207208
throw new GraphQLError(m.missingInformation());
208209
}
209210

210-
if (Date.now() > delegation.conference.startAssignment.getTime()) {
211+
if (
212+
dayjs(delegation.conference.startAssignment)
213+
.add(delegation.conference.registrationDeadlineGracePeriodMinutes, 'minute')
214+
.isBefore(dayjs())
215+
) {
211216
throw new GraphQLError(m.applicationTimeframeClosed());
212217
}
213218
}

src/api/resolvers/modules/singleParticipant.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { db } from '$db/db';
2323
import { GraphQLError } from 'graphql';
2424
import { m } from '$lib/paraglide/messages';
2525
import { applicationFormSchema } from '$lib/schemata/applicationForm';
26+
import dayjs from 'dayjs';
2627

2728
builder.prismaObject('SingleParticipant', {
2829
fields: (t) => ({
@@ -284,7 +285,11 @@ builder.mutationFields((t) => {
284285
throw new GraphQLError(m.missingInformation());
285286
}
286287

287-
if (Date.now() > singleParticipant.conference.startAssignment.getTime()) {
288+
if (
289+
dayjs(singleParticipant.conference.startAssignment)
290+
.add(singleParticipant.conference.registrationDeadlineGracePeriodMinutes, 'minute')
291+
.isBefore(dayjs())
292+
) {
288293
throw new GraphQLError(m.applicationTimeframeClosed());
289294
}
290295
}

src/lib/components/ConferenceCard/ConferenceCard.svelte

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@
4545
day: 'numeric'
4646
};
4747
48+
const dateTimeOptions: Intl.DateTimeFormatOptions = {
49+
year: 'numeric',
50+
month: 'long',
51+
day: 'numeric',
52+
hour: '2-digit',
53+
minute: '2-digit'
54+
};
55+
4856
const registrationInfoText = () => {
4957
switch (registrationStatus) {
5058
case 'WAITING_LIST':
@@ -59,7 +67,7 @@
5967
break;
6068
case 'OPEN':
6169
return m.registrationOpen({
62-
date: `${new Date(conference.startAssignment as unknown as string)?.toLocaleDateString(getLocale(), dateOptions) ?? ''}`
70+
date: `${new Date(conference.startAssignment as unknown as string)?.toLocaleString(getLocale(), dateTimeOptions) ?? ''}`
6371
});
6472
case 'CLOSED':
6573
return m.registrationClosed();

0 commit comments

Comments
 (0)