@@ -192,6 +192,104 @@ 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.FrontendUser , error ) {
196+ var dbUser models.User
197+ var user models.FrontendUser
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.FrontendUser ) 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+ result = gr .GormClient .WithContext (ctx ).Model (dbUser ).Updates (map [string ]interface {}{"full_name" : user .FullName , "username" : user .Username , "email" : user .Email , "role" : user .Role })
237+ if result .Error != nil {
238+ return result .Error
239+ }
240+ // Update User Permissions
241+ var existingPermissions []models.UserPermission
242+ if err := gr .GormClient .WithContext (ctx ).
243+ Where ("user_id = ?" , user .ID ).
244+ Find (& existingPermissions ).Error ; err != nil {
245+ return err
246+ }
247+ for targetUserId , permissions := range user .Permissions {
248+ for permission , value := range permissions {
249+ if ! value {
250+ continue
251+ }
252+ // Check if the permission already exists
253+ exists := false
254+ for _ , existingPermission := range existingPermissions {
255+ if existingPermission .TargetUserID .String () == targetUserId && string (existingPermission .Permission ) == permission {
256+ exists = true
257+ break
258+ }
259+ }
260+ if ! exists {
261+ // Add new permission
262+ p := models.UserPermission {
263+ UserID : user .ID ,
264+ TargetUserID : uuid .Must (uuid .Parse (targetUserId )),
265+ Permission : pkg .Permission (permission ),
266+ }
267+ err := gr .GormClient .WithContext (ctx ).Create (& p ).Error
268+ if err != nil {
269+ return err
270+ }
271+ }
272+ }
273+ }
274+
275+ // Remove permissions that are no longer in user.Permissions
276+ for _ , existingPermission := range existingPermissions {
277+ targetUserId := existingPermission .TargetUserID .String ()
278+ permission := string (existingPermission .Permission )
279+
280+ // Check if the permission still exists in the new user.Permissions
281+ if _ , exists := user .Permissions [targetUserId ]; ! exists || ! user.Permissions [targetUserId ][permission ] {
282+ // Permission no longer exists, so delete it
283+ err := gr .GormClient .WithContext (ctx ).Delete (& existingPermission ).Error
284+ if err != nil {
285+ return err
286+ }
287+ }
288+ }
289+
290+ return nil
291+ }
292+
195293//</editor-fold>
196294
197295////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
0 commit comments