upd(system):
- rename repository APIs to remove stutter - use sqlx/types.JSONText to remove coalesceJson
This commit is contained in:
+21
-23
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user