From cd93836b8e1f3dd2c4a125433d2a0d4a9b773483 Mon Sep 17 00:00:00 2001 From: rot1024 Date: Fri, 8 Mar 2024 23:03:40 +0900 Subject: [PATCH] feat(account): add MultiUser repo --- .../accountusecase/accountrepo/multiuser.go | 102 ++++++++++++++---- account/accountusecase/accountrepo/user.go | 16 +-- 2 files changed, 94 insertions(+), 24 deletions(-) diff --git a/account/accountusecase/accountrepo/multiuser.go b/account/accountusecase/accountrepo/multiuser.go index 57191974..a04ab40f 100644 --- a/account/accountusecase/accountrepo/multiuser.go +++ b/account/accountusecase/accountrepo/multiuser.go @@ -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 { @@ -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]) } -*/ diff --git a/account/accountusecase/accountrepo/user.go b/account/accountusecase/accountrepo/user.go index 3e547508..97d841c0 100644 --- a/account/accountusecase/accountrepo/user.go +++ b/account/accountusecase/accountrepo/user.go @@ -11,12 +11,7 @@ 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) @@ -24,3 +19,12 @@ type User interface { 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) +}