//go:build unit package auth import ( "context" "errors" "git.sr.ht/~gabrielgio/img/pkg/database/repository" ) type ( User struct { ID uint Username string Name string Password []byte IsAdmin bool Path string } Users map[uint]*User UserRepository struct { icount uint users Users } ) var _ repository.UserRepository = &UserRepository{} var _ repository.AuthRepository = &UserRepository{} func NewUserRepository() *UserRepository { return &UserRepository{ users: make(map[uint]*User), } } func (u *User) ToModel() *repository.User { return &repository.User{ ID: u.ID, Username: u.Username, Name: u.Name, IsAdmin: u.IsAdmin, Path: u.Path, } } func (u Users) ToModels() []*repository.User { users := make([]*repository.User, 0, len(u)) for _, i := range u { users = append(users, i.ToModel()) } return users } func (u *UserRepository) Get(ctx context.Context, id uint) (*repository.User, error) { if user, ok := u.users[id]; ok { return user.ToModel(), nil } return nil, errors.New("Not Found") } func (u *UserRepository) List(_ context.Context) ([]*repository.User, error) { return u.users.ToModels(), nil } func (u *UserRepository) Create(_ context.Context, createUser *repository.CreateUser) (uint, error) { id := u.furtherID() u.users[id] = &User{ ID: id, Name: createUser.Name, Username: createUser.Username, Path: createUser.Path, Password: createUser.Password, } return id, nil } func (u *UserRepository) Update(_ context.Context, id uint, updateUser *repository.UpdateUser) error { user, ok := u.users[id] if !ok { return errors.New("Invalid ID") } user.Name = updateUser.Name user.Username = updateUser.Username if updateUser.Password != "" { user.Password = []byte(updateUser.Password) } return nil } func (u *UserRepository) Any(_ context.Context) (bool, error) { return len(u.users) > 0, nil } func (u *UserRepository) GetIDByUsername(ctx context.Context, username string) (uint, error) { for id, u := range u.users { if u.Username == username { return id, nil } } return 0, errors.New("Not Found") } func (u *UserRepository) GetPassword(ctx context.Context, id uint) ([]byte, error) { if user, ok := u.users[id]; ok { return []byte(user.Password), nil } return nil, errors.New("Not Found") } func (u *UserRepository) furtherID() uint { u.icount++ return u.icount }