@@ -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
112112func (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 }
0 commit comments