mirror of
https://github.com/datarhei/core.git
synced 2025-10-06 00:17:07 +08:00
128 lines
2.6 KiB
Go
128 lines
2.6 KiB
Go
package store
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
func (s *store) addIdentity(cmd CommandAddIdentity) error {
|
|
s.lock.Lock()
|
|
defer s.lock.Unlock()
|
|
|
|
err := s.data.Users.userlist.Add(cmd.Identity)
|
|
if err != nil {
|
|
return fmt.Errorf("the identity with the name '%s' already exists%w", cmd.Identity.Name, ErrBadRequest)
|
|
}
|
|
|
|
now := time.Now()
|
|
|
|
s.data.Users.UpdatedAt = now
|
|
|
|
cmd.Identity.CreatedAt = now
|
|
cmd.Identity.UpdatedAt = now
|
|
s.data.Users.Users[cmd.Identity.Name] = cmd.Identity
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *store) updateIdentity(cmd CommandUpdateIdentity) error {
|
|
s.lock.Lock()
|
|
defer s.lock.Unlock()
|
|
|
|
if cmd.Name == "$anon" {
|
|
return fmt.Errorf("the identity with the name '%s' can't be updated%w", cmd.Name, ErrBadRequest)
|
|
}
|
|
|
|
oldUser, err := s.data.Users.userlist.Get(cmd.Name)
|
|
if err != nil {
|
|
return fmt.Errorf("the identity with the name '%s' doesn't exist%w", cmd.Name, ErrNotFound)
|
|
}
|
|
|
|
o, ok := s.data.Users.Users[oldUser.Name]
|
|
if !ok {
|
|
return fmt.Errorf("the identity with the name '%s' doesn't exist%w", cmd.Name, ErrNotFound)
|
|
}
|
|
|
|
err = s.data.Users.userlist.Update(cmd.Name, cmd.Identity)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
user, err := s.data.Users.userlist.Get(cmd.Identity.Name)
|
|
if err != nil {
|
|
return fmt.Errorf("the identity with the name '%s' doesn't exist%w", cmd.Identity.Name, ErrNotFound)
|
|
}
|
|
|
|
now := time.Now()
|
|
|
|
user.CreatedAt = o.CreatedAt
|
|
user.UpdatedAt = now
|
|
|
|
s.data.Users.UpdatedAt = now
|
|
delete(s.data.Users.Users, oldUser.Name)
|
|
s.data.Users.Users[user.Name] = user
|
|
|
|
s.data.Policies.UpdatedAt = now
|
|
policies := s.data.Policies.Policies[oldUser.Name]
|
|
delete(s.data.Policies.Policies, oldUser.Name)
|
|
s.data.Policies.Policies[user.Name] = policies
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *store) removeIdentity(cmd CommandRemoveIdentity) error {
|
|
s.lock.Lock()
|
|
defer s.lock.Unlock()
|
|
|
|
user, err := s.data.Users.userlist.Get(cmd.Name)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
s.data.Users.userlist.Delete(user.Name)
|
|
|
|
delete(s.data.Users.Users, user.Name)
|
|
s.data.Users.UpdatedAt = time.Now()
|
|
delete(s.data.Policies.Policies, user.Name)
|
|
s.data.Policies.UpdatedAt = time.Now()
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *store) IAMIdentityList() Users {
|
|
s.lock.RLock()
|
|
defer s.lock.RUnlock()
|
|
|
|
u := Users{
|
|
UpdatedAt: s.data.Users.UpdatedAt,
|
|
}
|
|
|
|
for _, user := range s.data.Users.Users {
|
|
u.Users = append(u.Users, user)
|
|
}
|
|
|
|
return u
|
|
}
|
|
|
|
func (s *store) IAMIdentityGet(name string) Users {
|
|
s.lock.RLock()
|
|
defer s.lock.RUnlock()
|
|
|
|
u := Users{
|
|
UpdatedAt: s.data.Users.UpdatedAt,
|
|
}
|
|
|
|
user, err := s.data.Users.userlist.Get(name)
|
|
if err != nil {
|
|
return u
|
|
}
|
|
|
|
u.UpdatedAt = user.UpdatedAt
|
|
|
|
if user, ok := s.data.Users.Users[user.Name]; ok {
|
|
u.Users = append(u.Users, user)
|
|
}
|
|
|
|
return u
|
|
}
|