Skip to content

Commit 195fa4e

Browse files
committed
fix: pod search bug with others
1 parent 31c177e commit 195fa4e

File tree

7 files changed

+48
-25
lines changed

7 files changed

+48
-25
lines changed

backend/src/database/class_enrollments.go

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func (db *DB) GetEnrollmentsForClass(page, perPage, classId int) (int64, []model
3636
if err := tx.Count(&total).Error; err != nil {
3737
return 0, nil, newNotFoundDBError(err, "program class enrollments")
3838
}
39-
if err := tx.Find(&content).Limit(page).Offset(calcOffset(page, perPage)).Error; err != nil {
39+
if err := tx.Limit(perPage).Offset(calcOffset(page, perPage)).Find(&content).Error; err != nil {
4040
return 0, nil, newNotFoundDBError(err, "program class enrollments")
4141
}
4242
return total, content, nil
@@ -110,43 +110,60 @@ func (db *DB) DeleteProgramClassEnrollments(id int) error {
110110
}
111111

112112
func (db *DB) GraduateEnrollments(adminEmail string, userIds []int, classId int) error {
113-
enrollment := models.ProgramClassEnrollment{}
114113
// begin transaction
115114
tx := db.Begin()
116115

117-
// preload necessary relationships
116+
// fetch ALL enrollments for the users being graduated
117+
var enrollments []models.ProgramClassEnrollment
118118
err := tx.Model(&models.ProgramClassEnrollment{}).
119119
Preload("User.Facility").
120120
Preload("Class.Program.ProgramCreditTypes").
121121
Preload("Class.FacilityProg").
122-
First(&enrollment, "class_id = ?", classId).Error
122+
Where("class_id = ? AND user_id IN (?)", classId, userIds).
123+
Find(&enrollments).Error
123124
if err != nil {
124125
tx.Rollback()
125126
return newNotFoundDBError(err, "class enrollment")
126127
}
128+
if len(enrollments) == 0 {
129+
tx.Rollback()
130+
return newNotFoundDBError(fmt.Errorf("no enrollments found"), "class enrollment")
131+
}
127132

133+
// build map for quick lookup by user ID
134+
enrollmentMap := make(map[uint]models.ProgramClassEnrollment)
135+
for _, e := range enrollments {
136+
enrollmentMap[e.UserID] = e
137+
}
138+
139+
// use the first enrollment for shared class data (program, credit types, etc.)
140+
firstEnrollment := enrollments[0]
128141
creditType := ""
129-
for i, ct := range enrollment.Class.Program.ProgramCreditTypes {
130-
if i == len(enrollment.Class.Program.ProgramCreditTypes)-1 {
142+
for i, ct := range firstEnrollment.Class.Program.ProgramCreditTypes {
143+
if i == len(firstEnrollment.Class.Program.ProgramCreditTypes)-1 {
131144
creditType += string(ct.CreditType)
132145
} else {
133146
creditType += fmt.Sprintf("%s,", ct.CreditType)
134147
}
135148
}
136149

137150
completions := make([]models.ProgramCompletion, 0, len(userIds))
138-
for i := range userIds {
151+
for _, uid := range userIds {
152+
enrollment, exists := enrollmentMap[uint(uid)]
153+
if !exists {
154+
continue // skip users not found in enrollments
155+
}
139156
completions = append(completions, models.ProgramCompletion{
140157
ProgramClassID: uint(classId),
141158
FacilityName: enrollment.User.Facility.Name,
142-
ProgramName: enrollment.Class.Program.Name,
143-
ProgramOwner: enrollment.Class.FacilityProg.ProgramOwner,
144-
ProgramID: enrollment.Class.ProgramID,
159+
ProgramName: firstEnrollment.Class.Program.Name,
160+
ProgramOwner: firstEnrollment.Class.FacilityProg.ProgramOwner,
161+
ProgramID: firstEnrollment.Class.ProgramID,
145162
AdminEmail: adminEmail,
146-
ProgramClassStartDt: enrollment.Class.StartDt,
163+
ProgramClassStartDt: firstEnrollment.Class.StartDt,
147164
CreditType: creditType,
148-
ProgramClassName: enrollment.Class.Name,
149-
UserID: uint(userIds[i]),
165+
ProgramClassName: firstEnrollment.Class.Name,
166+
UserID: uint(uid),
150167
EnrolledOnDt: enrollment.CreatedAt,
151168
})
152169
}

backend/src/database/class_events.go

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,6 @@ func (db *DB) CreateOverrideEvents(ctx *models.QueryContext, overrideEvents []*m
180180
return newCreateDBError(err, "program_class_event_overrides")
181181
}
182182
if overrideEvent.IsCancelled && len(overrideEvents) < 2 { //only add log for cancelled event
183-
if err != nil {
184-
trans.Rollback()
185-
return NewDBError(err, "unable to parse override date")
186-
}
187183
changeLogEntry.FieldName = "event_cancelled"
188184
changeLogEntry.OldValue = models.StringPtr("")
189185
changeLogEntry.ParentRefID = overrideEvent.ClassID
@@ -199,14 +195,14 @@ func (db *DB) CreateOverrideEvents(ctx *models.QueryContext, overrideEvents []*m
199195
changeLogEntry.NewValue = eventSummary
200196
} else if overrideEvent.IsCancelled { //not logging the cancelled one from rescheduling action
201197
linkedOverrideID = &overrideEvent.ID
202-
if err != nil {
203-
trans.Rollback()
204-
return NewDBError(err, "unable to parse override date")
205-
}
206198
changeLogEntry.OldValue = &overrideEvent.OverrideRrule
207199
}
208200
if overrideEvent.IsCancelled || isOverrideUpdate { //delete attendance
209201
eventDate, err = overrideEvent.GetFormattedOverrideDate("2006-01-02")
202+
if err != nil {
203+
trans.Rollback()
204+
return NewDBError(err, "unable to parse override date")
205+
}
210206
if err := deleteEventAttedanceByDate(trans, overrideEvent.EventID, *eventDate); err != nil {
211207
trans.Rollback()
212208
return err

backend/src/database/events_attendance.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,9 @@ func (db *DB) GetMissingAttendance(classID int, args *models.QueryContext) (int,
376376
// count enrolled students on this specific date
377377
enrolledCountOnDate := 0
378378
for _, student := range students {
379+
if student.EnrolledAt == nil {
380+
continue // skip students without enrollment date (enrolled in Scheduled class)
381+
}
379382
if !student.EnrolledAt.After(eventDate.StartTime) && // enrolled before or on this date
380383
(student.EnrollmentEndedAt == nil || student.EnrollmentEndedAt.After(eventDate.StartTime.AddDate(0, 0, -1))) { // not ended before this date
381384
enrolledCountOnDate++

backend/src/database/program_classes.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,14 @@ func (db *DB) GetClassByID(id int) (*models.ProgramClass, error) {
3030

3131
func (db *DB) GetClassesForFacility(args *models.QueryContext) ([]models.ProgramClass, error) {
3232
content := []models.ProgramClass{}
33-
tx := db.WithContext(args.Ctx).Find(&content, "facility_id = ?", args.FacilityID)
33+
tx := db.WithContext(args.Ctx).Model(&models.ProgramClass{}).Where("facility_id = ?", args.FacilityID)
3434
if args.Search != "" {
3535
tx = tx.Where("LOWER(name) LIKE ?", args.SearchQuery())
3636
}
37-
if err := tx.Count(&args.Total).Limit(args.PerPage).Offset(args.CalcOffset()).Error; err != nil {
37+
if err := tx.Count(&args.Total).Error; err != nil {
38+
return nil, newGetRecordsDBError(err, "program classes")
39+
}
40+
if err := tx.Limit(args.PerPage).Offset(args.CalcOffset()).Find(&content).Error; err != nil {
3841
return nil, newGetRecordsDBError(err, "program classes")
3942
}
4043
return content, nil
@@ -187,6 +190,9 @@ func (db *DB) GetProgramClassDetailsByID(id int, args *models.QueryContext) ([]m
187190
Where(`ps.program_id = ?
188191
and ps.facility_id = ?`, id, args.FacilityID).
189192
Group("ps.id,fac.name")
193+
if args.Search != "" {
194+
query = query.Where("LOWER(ps.name) LIKE ? OR LOWER(ps.description) LIKE ?", args.SearchQuery(), args.SearchQuery())
195+
}
190196
if err := query.Count(&args.Total).Error; err != nil {
191197
return nil, newGetRecordsDBError(err, "programs")
192198
}

backend/src/database/programs.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ func (db *DB) UpdateProgram(program *models.Program, facilityIds []int) (*models
133133
}
134134
allChanges = append(allChanges, creditTypeLogEntries...)
135135
if err := trans.Omit("Facilities", "CreatedAt").Select("IsActive", "Name", "Description", "FundingType", "UpdateUserID").Updates(&updatePrg).Error; err != nil {
136+
trans.Rollback()
136137
return nil, newUpdateDBError(err, "programs")
137138
}
138139

backend/src/handlers/programs_handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ func (srv *Server) handleUpdateProgram(w http.ResponseWriter, r *http.Request, l
196196

197197
updated, updateErr := srv.WithUserContext(r).UpdateProgram(&theProg, programForm.Facilities)
198198
if updateErr != nil {
199-
return newDatabaseServiceError(err)
199+
return newDatabaseServiceError(updateErr)
200200
}
201201
return writeJsonResponse(w, http.StatusOK, updated)
202202
}

frontend/src/Pages/ProgramOverviewDashboard.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export default function ProgramOverviewDashboard() {
8181
mutate: mutateClasses,
8282
isLoading
8383
} = useSWR<ServerResponseMany<Class>, Error>(
84-
`/api/programs/${program_id}/classes?page=${page}&per_page=${perPage}&order_by=${sortQuery}`
84+
`/api/programs/${program_id}/classes?page=${page}&per_page=${perPage}&order_by=${sortQuery}&search=${searchTerm}`
8585
);
8686

8787
useEffect(() => {

0 commit comments

Comments
 (0)