@@ -2,7 +2,6 @@ package database
22
33import (
44 "UnlockEdv2/src/models"
5- "context"
65 "fmt"
76 "strings"
87
@@ -41,27 +40,66 @@ func (db *DB) GetClassesForFacility(args *models.QueryContext) ([]models.Program
4140 return content , nil
4241}
4342
44- func (db * DB ) CreateProgramClass (content * models.ProgramClass ) (* models.ProgramClass , error ) {
45- err := Validate ().Struct (content )
43+ func (db * DB ) CreateProgramClass (content * models.ProgramClass , conflictReq * models.ConflictCheckRequest ) (* models.ProgramClass , []models.RoomConflict , error ) {
44+ if err := Validate ().Struct (content ); err != nil {
45+ return nil , nil , newCreateDBError (err , "create program classes validation error" )
46+ }
47+
48+ if conflictReq == nil {
49+ if err := db .Create (& content ).Error ; err != nil {
50+ return nil , nil , newCreateDBError (err , "program classes" )
51+ }
52+ return content , nil , nil
53+ }
54+
55+ tx := db .Begin ()
56+ if tx .Error != nil {
57+ return nil , nil , NewDBError (tx .Error , "unable to start transaction" )
58+ }
59+
60+ conflicts , err := LockRoomAndCheckConflicts (tx , conflictReq )
4661 if err != nil {
47- return nil , newCreateDBError (err , "create program classes validation error" )
62+ tx .Rollback ()
63+ return nil , nil , err
4864 }
49- if err := db .Create (& content ).Error ; err != nil {
50- return nil , newCreateDBError (err , "program classes" )
65+ if len (conflicts ) > 0 {
66+ tx .Rollback ()
67+ return nil , conflicts , nil
5168 }
52- return content , nil
69+
70+ if err := tx .Create (& content ).Error ; err != nil {
71+ tx .Rollback ()
72+ return nil , nil , newCreateDBError (err , "program classes" )
73+ }
74+
75+ if err := tx .Commit ().Error ; err != nil {
76+ return nil , nil , NewDBError (err , "unable to commit transaction" )
77+ }
78+ return content , nil , nil
5379}
5480
55- func (db * DB ) UpdateProgramClass (content * models.ProgramClass , id int ) (* models.ProgramClass , error ) {
81+ func (db * DB ) UpdateProgramClass (content * models.ProgramClass , id int , conflictReq * models. ConflictCheckRequest ) (* models.ProgramClass , []models. RoomConflict , error ) {
5682 var allChanges []models.ChangeLogEntry
5783 existing := & models.ProgramClass {}
5884 if err := db .Preload ("Events" ).First (existing , "id = ?" , id ).Error ; err != nil {
59- return nil , newNotFoundDBError (err , "program classes" )
85+ return nil , nil , newNotFoundDBError (err , "program classes" )
6086 }
6187
6288 trans := db .Begin ()
6389 if trans .Error != nil {
64- return nil , NewDBError (trans .Error , "unable to start the database transaction" )
90+ return nil , nil , NewDBError (trans .Error , "unable to start the database transaction" )
91+ }
92+
93+ if conflictReq != nil {
94+ conflicts , err := LockRoomAndCheckConflicts (trans , conflictReq )
95+ if err != nil {
96+ trans .Rollback ()
97+ return nil , nil , err
98+ }
99+ if len (conflicts ) > 0 {
100+ trans .Rollback ()
101+ return nil , conflicts , nil
102+ }
65103 }
66104
67105 ignoredFieldNames := []string {"create_user_id" , "update_user_id" , "enrollments" , "facility" , "facilities" , "events" , "facility_program" , "program_id" , "start_dt" , "end_dt" , "program" , "enrolled" }
@@ -83,29 +121,29 @@ func (db *DB) UpdateProgramClass(content *models.ProgramClass, id int) (*models.
83121 models .UpdateStruct (existing , content )
84122 if err := trans .Session (& gorm.Session {FullSaveAssociations : false }).Updates (& existing ).Error ; err != nil {
85123 trans .Rollback ()
86- return nil , newUpdateDBError (err , "program classes" )
124+ return nil , nil , newUpdateDBError (err , "program classes" )
87125 }
88126
89127 if needsRoomUpdate {
90128 if err := trans .Model (& models.ProgramClassEvent {}).Where ("id = ?" , eventID ).Update ("room_id" , newRoomID ).Error ; err != nil {
91129 trans .Rollback ()
92- return nil , newUpdateDBError (err , "program class event room" )
130+ return nil , nil , newUpdateDBError (err , "program class event room" )
93131 }
94132 existing .Events [0 ].RoomID = newRoomID
95133 }
96134
97135 if len (allChanges ) > 0 {
98136 if err := trans .Create (& allChanges ).Error ; err != nil {
99137 trans .Rollback ()
100- return nil , newCreateDBError (err , "change_log_entries" )
138+ return nil , nil , newCreateDBError (err , "change_log_entries" )
101139 }
102140 }
103141
104142 if err := trans .Commit ().Error ; err != nil {
105- return nil , NewDBError (err , "unable to commit the database transaction" )
143+ return nil , nil , NewDBError (err , "unable to commit the database transaction" )
106144 }
107145
108- return existing , nil
146+ return existing , nil , nil
109147}
110148
111149func (db * DB ) GetTotalEnrollmentsByClassID (id int ) (int64 , error ) {
0 commit comments