3
0

upd(system):

- rename repository APIs to remove stutter
- use sqlx/types.JSONText to remove coalesceJson
This commit is contained in:
Tit Petric
2018-11-09 14:52:12 +01:00
parent f7917d151d
commit 29c6277e18
4 changed files with 44 additions and 57 deletions
+21 -23
View File
@@ -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)
}
-11
View File
@@ -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
}
+9 -9
View File
@@ -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 {
+14 -14
View File
@@ -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 {