Skip to content

Commit

Permalink
feat(account): add MultiUser repo
Browse files Browse the repository at this point in the history
  • Loading branch information
rot1024 committed Mar 8, 2024
1 parent 890210a commit cd93836
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 24 deletions.
102 changes: 84 additions & 18 deletions account/accountusecase/accountrepo/multiuser.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
package accountrepo

/* TODO
import (
"context"
"errors"

"github.com/reearth/reearthx/account/accountdomain/user"
"github.com/reearth/reearthx/rerror"
)

type MultiUser []User

func NewMultiUser(users ...User) MultiUser {
Expand All @@ -10,45 +17,104 @@ func NewMultiUser(users ...User) MultiUser {
var _ User = MultiUser{}

func (u MultiUser) FindByID(ctx context.Context, id user.ID) (*user.User, error) {
for _, user := range u {
if res, err := user.FindByID(ctx, id); err != nil && !errors.Is(err, rerror.ErrNotFound) {
return u.findOne(func(r User) (*user.User, error) {
return r.FindByID(ctx, id)
})
}

func (u MultiUser) FindByIDs(ctx context.Context, ids user.IDList) (user.List, error) {
res := user.List{}
for _, r := range u {
if r, err := r.FindByIDs(ctx, ids); err != nil {
return nil, err
} else if res != nil {
return res, nil
} else {
res = append(res, r...)
}
}
return nil, nil
return res, nil
}

func (u MultiUser) FindByIDs(context.Context, user.IDList) (user.List, error) {
func (u MultiUser) FindBySub(ctx context.Context, sub string) (*user.User, error) {
return u.findOne(func(r User) (*user.User, error) {
return r.FindBySub(ctx, sub)
})
}

func (u MultiUser) FindBySub(context.Context, string) (*user.User, error) {
func (u MultiUser) FindByEmail(ctx context.Context, email string) (*user.User, error) {
return u.findOne(func(r User) (*user.User, error) {
return r.FindByEmail(ctx, email)
})
}

func (u MultiUser) FindByEmail(context.Context, string) (*user.User, error) {
func (u MultiUser) FindByName(ctx context.Context, name string) (*user.User, error) {
return u.findOne(func(r User) (*user.User, error) {
return r.FindByName(ctx, name)
})
}

func (u MultiUser) FindByName(context.Context, string) (*user.User, error) {
func (u MultiUser) FindByNameOrEmail(ctx context.Context, nameOrEmail string) (*user.User, error) {
return u.findOne(func(r User) (*user.User, error) {
return r.FindByNameOrEmail(ctx, nameOrEmail)
})
}

func (u MultiUser) FindByVerification(ctx context.Context, v string) (*user.User, error) {
return u.first2(func(r User) (*user.User, error) {
return r.FindByVerification(ctx, v)
})
}

func (u MultiUser) FindByNameOrEmail(context.Context, string) (*user.User, error) {
func (u MultiUser) FindByPasswordResetRequest(ctx context.Context, p string) (*user.User, error) {
return u.first2(func(r User) (*user.User, error) {
return r.FindByPasswordResetRequest(ctx, p)
})
}

func (u MultiUser) FindBySubOrCreate(ctx context.Context, v *user.User, s string) (*user.User, error) {
return u.first2(func(r User) (*user.User, error) {
return r.FindBySubOrCreate(ctx, v, s)
})
}

func (u MultiUser) FindByVerification(context.Context, string) (*user.User, error) {
func (u MultiUser) Create(ctx context.Context, user *user.User) error {
return u.first(func(r User) error {
return r.Create(ctx, user)
})
}

func (u MultiUser) Save(ctx context.Context, user *user.User) error {
return u.first(func(r User) error {
return r.Save(ctx, user)
})
}

func (u MultiUser) FindByPasswordResetRequest(context.Context, string) (*user.User, error) {
func (u MultiUser) Remove(ctx context.Context, id user.ID) error {
return u.first(func(r User) error {
return r.Remove(ctx, id)
})
}

func (u MultiUser) findOne(f func(User) (*user.User, error)) (*user.User, error) {
for _, r := range u {
if res, err := f(r); err != nil && !errors.Is(err, rerror.ErrNotFound) {
return nil, err
} else if res != nil {
return res, nil
}
}
return nil, nil
}

func (u MultiUser) FindBySubOrCreate(context.Context, *user.User, string) (*user.User, error) {
func (u MultiUser) first(f func(User) error) error {
if len(u) == 0 {
return errors.New("no repo")
}
return f(u[0])
}

func (u MultiUser) first2(f func(User) (*user.User, error)) (*user.User, error) {
if len(u) == 0 {
return nil, errors.New("no repo")
}
return f(u[0])
}
*/
16 changes: 10 additions & 6 deletions account/accountusecase/accountrepo/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,20 @@ import (
var ErrDuplicatedUser = rerror.NewE(i18n.T("duplicated user"))

type User interface {
FindByID(context.Context, user.ID) (*user.User, error)
FindByIDs(context.Context, user.IDList) (user.List, error)
FindBySub(context.Context, string) (*user.User, error)
FindByEmail(context.Context, string) (*user.User, error)
FindByName(context.Context, string) (*user.User, error)
FindByNameOrEmail(context.Context, string) (*user.User, error)
UserQuery
FindByVerification(context.Context, string) (*user.User, error)
FindByPasswordResetRequest(context.Context, string) (*user.User, error)
FindBySubOrCreate(context.Context, *user.User, string) (*user.User, error)
Create(context.Context, *user.User) error
Save(context.Context, *user.User) error
Remove(context.Context, user.ID) error
}

type UserQuery interface {
FindByID(context.Context, user.ID) (*user.User, error)
FindByIDs(context.Context, user.IDList) (user.List, error)
FindBySub(context.Context, string) (*user.User, error)
FindByEmail(context.Context, string) (*user.User, error)
FindByName(context.Context, string) (*user.User, error)
FindByNameOrEmail(context.Context, string) (*user.User, error)
}

0 comments on commit cd93836

Please sign in to comment.