@@ -192,6 +192,110 @@ func (gr *GormRepository) GetUsers(ctx context.Context) ([]models.User, error) {
192192 return sanitizedUsers , result .Error
193193}
194194
195+ func (gr * GormRepository ) GetUser (ctx context.Context , userID uuid.UUID ) (* models.User , error ) {
196+ var dbUser models.User
197+ var user models.User
198+ result := gr .GormClient .WithContext (ctx ).First (& dbUser , userID )
199+ if result .Error != nil {
200+ return nil , result .Error
201+ }
202+
203+ user .ID = dbUser .ID
204+ user .FullName = dbUser .FullName
205+ user .Email = dbUser .Email
206+ user .Username = dbUser .Username
207+ user .Role = dbUser .Role
208+
209+ // Populate ACLs for the user
210+ var acls []models.UserPermission
211+ if err := gr .GormClient .WithContext (ctx ).
212+ Where ("user_id = ?" , user .ID ).
213+ Find (& acls ).Error ; err != nil {
214+ return nil , err
215+ }
216+ user .Permissions = make (map [string ]map [string ]bool )
217+
218+ for _ , acl := range acls {
219+ if _ , exists := user .Permissions [acl .TargetUserID .String ()]; ! exists {
220+ user .Permissions [acl .TargetUserID .String ()] = make (map [string ]bool )
221+ }
222+ user .Permissions [acl .TargetUserID .String ()][string (acl .Permission )] = true
223+ }
224+
225+ return & user , nil
226+ }
227+
228+ func (gr * GormRepository ) UpdateUserAndPermissions (ctx context.Context , user models.User ) error {
229+ // Lookup user from the db
230+ var dbUser models.User
231+ result := gr .GormClient .WithContext (ctx ).First (& dbUser , user .ID )
232+ if result .Error != nil {
233+ return result .Error
234+ }
235+ // Update fields on User
236+ updates := map [string ]interface {}{
237+ "full_name" : user .FullName ,
238+ "username" : user .Username ,
239+ "email" : user .Email ,
240+ "role" : user .Role ,
241+ }
242+ result = gr .GormClient .WithContext (ctx ).Model (dbUser ).Updates (updates )
243+ if result .Error != nil {
244+ return result .Error
245+ }
246+ // Update User Permissions
247+ var existingPermissions []models.UserPermission
248+ if err := gr .GormClient .WithContext (ctx ).
249+ Where ("user_id = ?" , user .ID ).
250+ Find (& existingPermissions ).Error ; err != nil {
251+ return err
252+ }
253+ for targetUserId , permissions := range user .Permissions {
254+ for permission , value := range permissions {
255+ if ! value {
256+ continue
257+ }
258+ // Check if the permission already exists
259+ exists := false
260+ for _ , existingPermission := range existingPermissions {
261+ if existingPermission .TargetUserID .String () == targetUserId && string (existingPermission .Permission ) == permission {
262+ exists = true
263+ break
264+ }
265+ }
266+ if ! exists {
267+ // Add new permission
268+ p := models.UserPermission {
269+ UserID : user .ID ,
270+ TargetUserID : uuid .Must (uuid .Parse (targetUserId )),
271+ Permission : pkg .Permission (permission ),
272+ }
273+ err := gr .GormClient .WithContext (ctx ).Create (& p ).Error
274+ if err != nil {
275+ return err
276+ }
277+ }
278+ }
279+ }
280+
281+ // Remove permissions that are no longer in user.Permissions
282+ for _ , existingPermission := range existingPermissions {
283+ targetUserId := existingPermission .TargetUserID .String ()
284+ permission := string (existingPermission .Permission )
285+
286+ // Check if the permission still exists in the new user.Permissions
287+ if _ , exists := user .Permissions [targetUserId ]; ! exists || ! user.Permissions [targetUserId ][permission ] {
288+ // Permission no longer exists, so delete it
289+ err := gr .GormClient .WithContext (ctx ).Delete (& existingPermission ).Error
290+ if err != nil {
291+ return err
292+ }
293+ }
294+ }
295+
296+ return nil
297+ }
298+
195299//</editor-fold>
196300
197301////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
0 commit comments