From fbec5a674eb4ef81ae73dc326d6a0f7a20aa46e5 Mon Sep 17 00:00:00 2001 From: Caleb Bae Date: Sun, 22 Feb 2026 19:11:11 -0600 Subject: [PATCH 1/3] encode the track name url --- client/src/pages/AddSelf.tsx | 2 +- client/src/pages/admin/QrCode.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/pages/AddSelf.tsx b/client/src/pages/AddSelf.tsx index 9277185..a9b66e9 100644 --- a/client/src/pages/AddSelf.tsx +++ b/client/src/pages/AddSelf.tsx @@ -33,7 +33,7 @@ const AddSelf = () => { let correctCode; if (tr !== '') { console.log(tr); - const res = await postRequest(`/qr/check/${tr}`, '', { + const res = await postRequest(`/qr/check/${encodeURIComponent(tr)}`, '', { code: paramCode, }); if (res.status !== 200) { diff --git a/client/src/pages/admin/QrCode.tsx b/client/src/pages/admin/QrCode.tsx index ddbd812..04c899b 100644 --- a/client/src/pages/admin/QrCode.tsx +++ b/client/src/pages/admin/QrCode.tsx @@ -27,7 +27,7 @@ const QrCode = () => { cd = res.data?.qr_code as string; } else { - const res = await getRequest(`/admin/qr/${tr}`, 'admin'); + const res = await getRequest(`/admin/qr/${encodeURIComponent(tr)}`, 'admin'); if (res.status !== 200) { errorAlert(res); return; @@ -62,7 +62,7 @@ const QrCode = () => { } cd = res.data?.qr_code as string; } else { - const res = await postRequest(`/admin/qr/${track}`, 'admin', {}); + const res = await postRequest(`/admin/qr/${encodeURIComponent(track)}`, 'admin', {}); if (res.status !== 200) { errorAlert(res); return; @@ -78,7 +78,7 @@ const QrCode = () => { // Create QR code const origin = window.location.origin.toString(); const track = searchParams.get('track') ?? ''; - const url = `${origin}/add-self?code=${code}&track=${track.replace(/\s/g, '%20')}`; + const url = `${origin}/add-self?code=${code}&track=${encodeURIComponent(track)}`; const qrCode = qr(url); From 607efa01eef9e078cdbbf145747a12bf7c9b958e Mon Sep 17 00:00:00 2001 From: Caleb Bae Date: Sun, 22 Feb 2026 19:42:48 -0600 Subject: [PATCH 2/3] Fix track names with dots breaking MongoDB queries --- server/database/judge.go | 28 ++++++++++++++++++---------- server/database/options.go | 8 ++++++-- server/database/project.go | 21 +++++++++++++++------ 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/server/database/judge.go b/server/database/judge.go index 4818ebb..7aa77cd 100644 --- a/server/database/judge.go +++ b/server/database/judge.go @@ -181,19 +181,27 @@ func UpdateAfterSeen(db *mongo.Database, ctx context.Context, judge *models.Judg return errors.New("error updating judge: " + err.Error()) } - incData := gin.H{} if judge.Track != "" { - incData["track_seen."+judge.Track] = 1 + project, findErr := FindProject(db, ctx, &seenProject.ProjectId) + if findErr != nil { + return errors.New("error finding project: " + findErr.Error()) + } + if project.TrackSeen == nil { + project.TrackSeen = make(map[string]int64) + } + project.TrackSeen[judge.Track] += 1 + _, err = db.Collection("projects").UpdateOne( + ctx, + gin.H{"_id": seenProject.ProjectId}, + gin.H{"$set": gin.H{"track_seen": project.TrackSeen, "last_activity": util.Now()}}, + ) } else { - incData["seen"] = 1 + _, err = db.Collection("projects").UpdateOne( + ctx, + gin.H{"_id": seenProject.ProjectId}, + gin.H{"$inc": gin.H{"seen": 1}, "$set": gin.H{"last_activity": util.Now()}}, + ) } - - // Update the project's seen count - _, err = db.Collection("projects").UpdateOne( - ctx, - gin.H{"_id": seenProject.ProjectId}, - gin.H{"$inc": incData, "$set": gin.H{"last_activity": util.Now()}}, - ) if err != nil { return errors.New("error updating project: " + err.Error()) } diff --git a/server/database/options.go b/server/database/options.go index 1378dea..9c729c1 100644 --- a/server/database/options.go +++ b/server/database/options.go @@ -174,8 +174,12 @@ func UpdateQRCode(db *mongo.Database, ctx context.Context, qrCode string) error // UpdateTrackQRCode updates the QR code for a track in the database func UpdateTrackQRCode(db *mongo.Database, ctx context.Context, track string, qrCode string) error { - key := "track_qr_codes." + track - _, err := db.Collection("options").UpdateOne(ctx, gin.H{}, gin.H{"$set": gin.H{key: qrCode}}) + options, err := GetOptions(db, ctx) + if err != nil { + return err + } + options.TrackQRCodes[track] = qrCode + _, err = db.Collection("options").UpdateOne(ctx, gin.H{}, gin.H{"$set": gin.H{"track_qr_codes": options.TrackQRCodes}}) return err } diff --git a/server/database/project.go b/server/database/project.go index e027715..b698148 100644 --- a/server/database/project.go +++ b/server/database/project.go @@ -319,13 +319,22 @@ func UpdateProjectStars(db *mongo.Database, ctx context.Context, projId primitiv // UpdateProjectTrackStars updates the starred count of a project in a specific track, incrementing or decrementing it func UpdateProjectTrackStars(db *mongo.Database, ctx context.Context, projId primitive.ObjectID, track string, increment bool) error { - change := -1 - if increment { - change = 1 + project, err := FindProject(db, ctx, &projId) + if err != nil { + return err } - track_str := "track_stars." + track - - _, err := db.Collection("projects").UpdateOne(ctx, gin.H{"_id": projId}, gin.H{"$inc": gin.H{track_str: change}}) + if project == nil { + return errors.New("project not found") + } + change := int64(1) + if !increment { + change = -1 + } + if project.TrackStars == nil { + project.TrackStars = make(map[string]int64) + } + project.TrackStars[track] += change + _, err = db.Collection("projects").UpdateOne(ctx, gin.H{"_id": projId}, gin.H{"$set": gin.H{"track_stars": project.TrackStars}}) return err } From 796f0759e3355fb8153af5058f6f1c549f9d7f86 Mon Sep 17 00:00:00 2001 From: Caleb Bae Date: Fri, 6 Mar 2026 14:20:27 -0600 Subject: [PATCH 3/3] extract helper, add transaction, remove unused func --- server/database/judge.go | 32 +++++++++++++++++++------------- server/database/options.go | 14 ++++++++------ server/database/project.go | 21 --------------------- 3 files changed, 27 insertions(+), 40 deletions(-) diff --git a/server/database/judge.go b/server/database/judge.go index 7aa77cd..205e313 100644 --- a/server/database/judge.go +++ b/server/database/judge.go @@ -182,19 +182,7 @@ func UpdateAfterSeen(db *mongo.Database, ctx context.Context, judge *models.Judg } if judge.Track != "" { - project, findErr := FindProject(db, ctx, &seenProject.ProjectId) - if findErr != nil { - return errors.New("error finding project: " + findErr.Error()) - } - if project.TrackSeen == nil { - project.TrackSeen = make(map[string]int64) - } - project.TrackSeen[judge.Track] += 1 - _, err = db.Collection("projects").UpdateOne( - ctx, - gin.H{"_id": seenProject.ProjectId}, - gin.H{"$set": gin.H{"track_seen": project.TrackSeen, "last_activity": util.Now()}}, - ) + err = IncrementTrackSeen(db, ctx, seenProject.ProjectId, judge.Track) } else { _, err = db.Collection("projects").UpdateOne( ctx, @@ -461,3 +449,21 @@ func DeleteSeenProject(db *mongo.Database, ctx context.Context, projectId *primi ) return err } + +// IncrementTrackSeen increments the track_seen count for a project in a specific track +func IncrementTrackSeen(db *mongo.Database, ctx context.Context, projectId primitive.ObjectID, track string) error { + project, err := FindProject(db, ctx, &projectId) + if err != nil { + return errors.New("error finding project: " + err.Error()) + } + if project.TrackSeen == nil { + project.TrackSeen = make(map[string]int64) + } + project.TrackSeen[track] += 1 + _, err = db.Collection("projects").UpdateOne( + ctx, + gin.H{"_id": projectId}, + gin.H{"$set": gin.H{"track_seen": project.TrackSeen, "last_activity": util.Now()}}, + ) + return err +} diff --git a/server/database/options.go b/server/database/options.go index 9c729c1..39cbca6 100644 --- a/server/database/options.go +++ b/server/database/options.go @@ -174,13 +174,15 @@ func UpdateQRCode(db *mongo.Database, ctx context.Context, qrCode string) error // UpdateTrackQRCode updates the QR code for a track in the database func UpdateTrackQRCode(db *mongo.Database, ctx context.Context, track string, qrCode string) error { - options, err := GetOptions(db, ctx) - if err != nil { + return WithTransaction(db, func(sc mongo.SessionContext) error { + options, err := GetOptions(db, sc) + if err != nil { + return err + } + options.TrackQRCodes[track] = qrCode + _, err = db.Collection("options").UpdateOne(sc, gin.H{}, gin.H{"$set": gin.H{"track_qr_codes": options.TrackQRCodes}}) return err - } - options.TrackQRCodes[track] = qrCode - _, err = db.Collection("options").UpdateOne(ctx, gin.H{}, gin.H{"$set": gin.H{"track_qr_codes": options.TrackQRCodes}}) - return err + }) } // UpdateDeliberation updates the deliberation in the database diff --git a/server/database/project.go b/server/database/project.go index b698148..8388a7d 100644 --- a/server/database/project.go +++ b/server/database/project.go @@ -317,27 +317,6 @@ func UpdateProjectStars(db *mongo.Database, ctx context.Context, projId primitiv return err } -// UpdateProjectTrackStars updates the starred count of a project in a specific track, incrementing or decrementing it -func UpdateProjectTrackStars(db *mongo.Database, ctx context.Context, projId primitive.ObjectID, track string, increment bool) error { - project, err := FindProject(db, ctx, &projId) - if err != nil { - return err - } - if project == nil { - return errors.New("project not found") - } - change := int64(1) - if !increment { - change = -1 - } - if project.TrackStars == nil { - project.TrackStars = make(map[string]int64) - } - project.TrackStars[track] += change - _, err = db.Collection("projects").UpdateOne(ctx, gin.H{"_id": projId}, gin.H{"$set": gin.H{"track_stars": project.TrackStars}}) - return err -} - // UpdateProjectScores updates the scores of the projects given the diff func UpdateProjectScores(db *mongo.Database, ctx context.Context, scoreDiff *map[primitive.ObjectID]int) error { models := make([]mongo.WriteModel, 0, len(*scoreDiff))