From 29c6277e18a1477e77883d7e136fdb649de75fad Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Fri, 9 Nov 2018 14:52:12 +0100 Subject: [PATCH] upd(system): - rename repository APIs to remove stutter - use sqlx/types.JSONText to remove coalesceJson --- system/repository/user.go | 44 +++++++++++++++++++-------------------- system/repository/util.go | 11 ---------- system/service/user.go | 18 ++++++++-------- system/types/user.go | 28 ++++++++++++------------- 4 files changed, 44 insertions(+), 57 deletions(-) diff --git a/system/repository/user.go b/system/repository/user.go index 0e7116ed3..2b197730d 100644 --- a/system/repository/user.go +++ b/system/repository/user.go @@ -12,16 +12,17 @@ type ( UserRepository interface { With(ctx context.Context, db *factory.DB) UserRepository - FindUserByEmail(email string) (*types.User, error) - FindUserByUsername(username string) (*types.User, error) - FindUserByID(id uint64) (*types.User, error) - FindUserBySatosaID(id string) (*types.User, error) - FindUsers(filter *types.UserFilter) ([]*types.User, error) - CreateUser(mod *types.User) (*types.User, error) - UpdateUser(mod *types.User) (*types.User, error) - SuspendUserByID(id uint64) error - UnsuspendUserByID(id uint64) error - DeleteUserByID(id uint64) error + FindByEmail(email string) (*types.User, error) + FindByUsername(username string) (*types.User, error) + FindByID(id uint64) (*types.User, error) + FindBySatosaID(id string) (*types.User, error) + Find(filter *types.UserFilter) ([]*types.User, error) + + Create(mod *types.User) (*types.User, error) + Update(mod *types.User) (*types.User, error) + SuspendByID(id uint64) error + UnsuspendByID(id uint64) error + DeleteByID(id uint64) error } user struct { @@ -47,35 +48,35 @@ func (r *user) With(ctx context.Context, db *factory.DB) UserRepository { return &user{repository: r.repository.With(ctx, db)} } -func (r *user) FindUserByUsername(username string) (*types.User, error) { +func (r *user) FindByUsername(username string) (*types.User, error) { sql := sqlUserSelect + " AND username = ?" mod := &types.User{} return mod, isFound(r.db().Get(mod, sql, username), mod.ID > 0, ErrUserNotFound) } -func (r *user) FindUserBySatosaID(satosaID string) (*types.User, error) { +func (r *user) FindBySatosaID(satosaID string) (*types.User, error) { sql := sqlUserSelect + " AND satosa_id = ?" mod := &types.User{} return mod, isFound(r.db().Get(mod, sql, satosaID), mod.ID > 0, ErrUserNotFound) } -func (r *user) FindUserByEmail(email string) (*types.User, error) { +func (r *user) FindByEmail(email string) (*types.User, error) { sql := sqlUserSelect + " AND email = ?" mod := &types.User{} return mod, isFound(r.db().Get(mod, sql, email), mod.ID > 0, ErrUserNotFound) } -func (r *user) FindUserByID(id uint64) (*types.User, error) { +func (r *user) FindByID(id uint64) (*types.User, error) { sql := sqlUserSelect + " AND id = ?" mod := &types.User{} return mod, isFound(r.db().Get(mod, sql, id), mod.ID > 0, ErrUserNotFound) } -func (r *user) FindUsers(filter *types.UserFilter) ([]*types.User, error) { +func (r *user) Find(filter *types.UserFilter) ([]*types.User, error) { rval := make([]*types.User, 0) params := make([]interface{}, 0) sql := sqlUserSelect @@ -92,28 +93,25 @@ func (r *user) FindUsers(filter *types.UserFilter) ([]*types.User, error) { return rval, r.db().Select(&rval, sql, params...) } -func (r *user) CreateUser(mod *types.User) (*types.User, error) { +func (r *user) Create(mod *types.User) (*types.User, error) { mod.ID = factory.Sonyflake.NextID() mod.CreatedAt = time.Now() - mod.Meta = coalesceJson(mod.Meta, []byte("{}")) return mod, r.db().Insert("users", mod) } -func (r *user) UpdateUser(mod *types.User) (*types.User, error) { +func (r *user) Update(mod *types.User) (*types.User, error) { mod.UpdatedAt = timeNowPtr() - mod.Meta = coalesceJson(mod.Meta, []byte("{}")) - return mod, r.db().Replace("users", mod) } -func (r *user) SuspendUserByID(id uint64) error { +func (r *user) SuspendByID(id uint64) error { return r.updateColumnByID("users", "suspend_at", time.Now(), id) } -func (r *user) UnsuspendUserByID(id uint64) error { +func (r *user) UnsuspendByID(id uint64) error { return r.updateColumnByID("users", "suspend_at", nil, id) } -func (r *user) DeleteUserByID(id uint64) error { +func (r *user) DeleteByID(id uint64) error { return r.updateColumnByID("users", "deleted_at", time.Now(), id) } diff --git a/system/repository/util.go b/system/repository/util.go index 0e80f2d4d..320f0f153 100644 --- a/system/repository/util.go +++ b/system/repository/util.go @@ -1,7 +1,6 @@ package repository import ( - "encoding/json" "fmt" "time" ) @@ -32,13 +31,3 @@ func timeNowPtr() *time.Time { n := time.Now() return &n } - -func coalesceJson(vals ...json.RawMessage) json.RawMessage { - for _, val := range vals { - if val != nil { - return val - } - } - - return nil -} diff --git a/system/service/user.go b/system/service/user.go index 6a84d9f73..f236c7175 100644 --- a/system/service/user.go +++ b/system/service/user.go @@ -54,7 +54,7 @@ func (svc *user) With(ctx context.Context) UserService { } func (svc *user) ValidateCredentials(username, password string) (*types.User, error) { - user, err := svc.user.FindUserByUsername(username) + user, err := svc.user.FindByUsername(username) if err != nil { return nil, err } @@ -71,11 +71,11 @@ func (svc *user) ValidateCredentials(username, password string) (*types.User, er } func (svc *user) FindByID(id uint64) (*types.User, error) { - return svc.user.FindUserByID(id) + return svc.user.FindByID(id) } func (svc *user) Find(filter *types.UserFilter) (types.UserSet, error) { - return svc.user.FindUsers(filter) + return svc.user.Find(filter) } // Finds if user with a specific satosa id exists and returns it otherwise it creates a fresh one @@ -86,20 +86,20 @@ func (svc *user) FindOrCreate(user *types.User) (out *types.User, err error) { return errors.Errorf("Invalid UUID value (%v) for SATOSA ID", user.SatosaID) } - out, err = svc.user.FindUserBySatosaID(user.SatosaID) + out, err = svc.user.FindBySatosaID(user.SatosaID) if err == repository.ErrUserNotFound { - out, err = svc.user.CreateUser(user) + out, err = svc.user.Create(user) return err } if err != nil { - // FindUserBySatosaID error + // FindBySatosaID error return err } // @todo need to be more selective with fields we update... - out, err = svc.user.UpdateUser(out) + out, err = svc.user.Update(out) if err != nil { return err } @@ -111,7 +111,7 @@ func (svc *user) FindOrCreate(user *types.User) (out *types.User, err error) { func (svc *user) Create(input *types.User) (out *types.User, err error) { return out, svc.db.Transaction(func() error { // Encrypt user password - if out, err = svc.user.CreateUser(input); err != nil { + if out, err = svc.user.Create(input); err != nil { return err } return nil @@ -119,7 +119,7 @@ func (svc *user) Create(input *types.User) (out *types.User, err error) { } func (svc *user) Update(mod *types.User) (*types.User, error) { - return svc.user.UpdateUser(mod) + return svc.user.Update(mod) } func (svc *user) canLogin(u *types.User) bool { diff --git a/system/types/user.go b/system/types/user.go index afb4056ee..98700e40b 100644 --- a/system/types/user.go +++ b/system/types/user.go @@ -1,28 +1,28 @@ package types import ( - "encoding/json" "time" + "github.com/jmoiron/sqlx/types" "golang.org/x/crypto/bcrypt" ) type ( User struct { - ID uint64 `json:"id" db:"id"` - Username string `json:"username" db:"username"` - Email string `json:"email" db:"email"` - Name string `json:"name" db:"name"` - Handle string `json:"handle" db:"handle"` - SatosaID string `json:"-" db:"satosa_id"` - Meta json.RawMessage `json:"-" db:"meta"` - OrganisationID uint64 `json:"organisationId" db:"rel_organisation"` - Password []byte `json:"-" db:"password"` + ID uint64 `json:"id" db:"id"` + Username string `json:"username" db:"username"` + Email string `json:"email" db:"email"` + Name string `json:"name" db:"name"` + Handle string `json:"handle" db:"handle"` + SatosaID string `json:"-" db:"satosa_id"` + Meta types.JSONText `json:"-" db:"meta"` + OrganisationID uint64 `json:"organisationId" db:"rel_organisation"` + Password []byte `json:"-" db:"password"` - CreatedAt time.Time `json:"createdAt,omitempty" db:"created_at"` - UpdatedAt *time.Time `json:"updatedAt,omitempty" db:"updated_at"` - SuspendedAt *time.Time `json:"suspendedAt,omitempty" db:"suspended_at"` - DeletedAt *time.Time `json:"deletedAt,omitempty" db:"deleted_at"` + CreatedAt time.Time `json:"createdAt,omitempty" db:"created_at"` + UpdatedAt *time.Time `json:"updatedAt,omitempty" db:"updated_at"` + SuspendedAt *time.Time `json:"suspendedAt,omitempty" db:"suspended_at"` + DeletedAt *time.Time `json:"deletedAt,omitempty" db:"deleted_at"` } UserFilter struct {