3
0

upd(system): rename tables, fix tests

This commit is contained in:
Tit Petric
2018-11-24 18:57:08 +00:00
parent 5a747d746f
commit ffa2d1b8ed
10 changed files with 199 additions and 118 deletions

View File

@@ -8,7 +8,7 @@ import (
)
func Data() string {
return "PK\x03\x04\x14\x00\x08\x00\x00\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00 \x0020180704080000.base.up.sqlUT\x05\x00\x01\x80Cm8CREATE TABLE settings (\n name VARCHAR(200) NOT NULL COMMENT 'Unique set of setting keys',\n value TEXT COMMENT 'Setting value',\n\n PRIMARY KEY (name)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- Keeps all known users, home and external organisation\n-- changes are stored in audit log\nCREATE TABLE users (\n id BIGINT UNSIGNED NOT NULL,\n email TEXT NOT NULL,\n username TEXT NOT NULL,\n password TEXT NOT NULL,\n name TEXT NOT NULL,\n handle TEXT NOT NULL,\n meta JSON NOT NULL,\n satosa_id CHAR(36) NULL,\n\n rel_organisation BIGINT UNSIGNED NOT NULL,\n\n created_at DATETIME NOT NULL DEFAULT NOW(),\n updated_at DATETIME NULL,\n suspended_at DATETIME NULL,\n deleted_at DATETIME NULL, -- user soft delete\n\n PRIMARY KEY (id)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE UNIQUE INDEX uid_satosa ON users (satosa_id);\nPK\x07\x08>\xa7\xd7\x12$\x04\x00\x00$\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x00\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00 \x00migrations.sqlUT\x05\x00\x01\x80Cm8CREATE TABLE IF NOT EXISTS `migrations` (\n `project` varchar(16) NOT NULL COMMENT 'sam, crm, ...',\n `filename` varchar(255) NOT NULL COMMENT 'yyyymmddHHMMSS.sql',\n `statement_index` int(11) NOT NULL COMMENT 'Statement number from SQL file',\n `status` TEXT NOT NULL COMMENT 'ok or full error message',\n PRIMARY KEY (`project`,`filename`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nPK\x07\x08\x0d\xa5T2x\x01\x00\x00x\x01\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x00\x00\x00\x00!(>\xa7\xd7\x12$\x04\x00\x00$\x04\x00\x00\x1a\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x0020180704080000.base.up.sqlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x00\x00\x00\x00!(\x0d\xa5T2x\x01\x00\x00x\x01\x00\x00\x0e\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81u\x04\x00\x00migrations.sqlUT\x05\x00\x01\x80Cm8PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x96\x00\x00\x002\x06\x00\x00\x00\x00"
return "PK\x03\x04\x14\x00\x08\x00\x00\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00 \x0020180704080000.base.up.sqlUT\x05\x00\x01\x80Cm8CREATE TABLE settings (\n name VARCHAR(200) NOT NULL COMMENT 'Unique set of setting keys',\n value TEXT COMMENT 'Setting value',\n\n PRIMARY KEY (name)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- Keeps all known users, home and external organisation\n-- changes are stored in audit log\nCREATE TABLE users (\n id BIGINT UNSIGNED NOT NULL,\n email TEXT NOT NULL,\n username TEXT NOT NULL,\n password TEXT NOT NULL,\n name TEXT NOT NULL,\n handle TEXT NOT NULL,\n meta JSON NOT NULL,\n satosa_id CHAR(36) NULL,\n\n rel_organisation BIGINT UNSIGNED NOT NULL,\n\n created_at DATETIME NOT NULL DEFAULT NOW(),\n updated_at DATETIME NULL,\n suspended_at DATETIME NULL,\n deleted_at DATETIME NULL, -- user soft delete\n\n PRIMARY KEY (id)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nCREATE UNIQUE INDEX uid_satosa ON users (satosa_id);\nPK\x07\x08>\xa7\xd7\x12$\x04\x00\x00$\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x00\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\x00 \x0020181124181811.rename_and_prefix_tables.up.sqlUT\x05\x00\x01\x80Cm8ALTER TABLE teams RENAME TO sys_team;\nALTER TABLE organisations RENAME TO sys_organisation;\nALTER TABLE team_members RENAME TO sys_team_member;\nALTER TABLE users RENAME TO sys_user;PK\x07\x08\xf2\xc4\x87\xe8\xb5\x00\x00\x00\xb5\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x00\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00 \x00migrations.sqlUT\x05\x00\x01\x80Cm8CREATE TABLE IF NOT EXISTS `migrations` (\n `project` varchar(16) NOT NULL COMMENT 'sam, crm, ...',\n `filename` varchar(255) NOT NULL COMMENT 'yyyymmddHHMMSS.sql',\n `statement_index` int(11) NOT NULL COMMENT 'Statement number from SQL file',\n `status` TEXT NOT NULL COMMENT 'ok or full error message',\n PRIMARY KEY (`project`,`filename`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\nPK\x07\x08\x0d\xa5T2x\x01\x00\x00x\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x00\x00\x00\x00!(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00 \x00new.shUT\x05\x00\x01\x80Cm8#!/bin/bash\ntouch $(date +%Y%m%d%H%M%S).up.sqlPK\x07\x08s\xd4N*.\x00\x00\x00.\x00\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x00\x00\x00\x00!(>\xa7\xd7\x12$\x04\x00\x00$\x04\x00\x00\x1a\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x0020180704080000.base.up.sqlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x00\x00\x00\x00!(\xf2\xc4\x87\xe8\xb5\x00\x00\x00\xb5\x00\x00\x00.\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81u\x04\x00\x0020181124181811.rename_and_prefix_tables.up.sqlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x00\x00\x00\x00!(\x0d\xa5T2x\x01\x00\x00x\x01\x00\x00\x0e\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8f\x05\x00\x00migrations.sqlUT\x05\x00\x01\x80Cm8PK\x01\x02\x14\x03\x14\x00\x08\x00\x00\x00\x00\x00!(s\xd4N*.\x00\x00\x00.\x00\x00\x00\x06\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x81L\x07\x00\x00new.shUT\x05\x00\x01\x80Cm8PK\x05\x06\x00\x00\x00\x00\x04\x00\x04\x008\x01\x00\x00\xb7\x07\x00\x00\x00\x00"
}
func init() {

View File

@@ -0,0 +1,4 @@
ALTER TABLE teams RENAME TO sys_team;
ALTER TABLE organisations RENAME TO sys_organisation;
ALTER TABLE team_members RENAME TO sys_team_member;
ALTER TABLE users RENAME TO sys_user;

2
system/db/schema/mysql/new.sh Executable file
View File

@@ -0,0 +1,2 @@
#!/bin/bash
touch $(date +%Y%m%d%H%M%S).up.sql

View File

@@ -0,0 +1,67 @@
package repository
import (
"fmt"
"log"
"os"
"runtime"
"testing"
"github.com/joho/godotenv"
"github.com/namsral/flag"
"github.com/titpetric/factory"
systemMigrate "github.com/crusttech/crust/system/db"
)
func TestMain(m *testing.M) {
// @todo this is a very optimistic initialization, make it more robust
godotenv.Load("../../.env")
prefix := "system"
dsn := ""
p := func(s string) string {
return prefix + "-" + s
}
flag.StringVar(&dsn, p("db-dsn"), "crust:crust@tcp(db1:3306)/crust?collation=utf8mb4_general_ci", "DSN for database connection")
flag.Parse()
if testing.Short() {
return
}
factory.Database.Add("default", dsn)
db := factory.Database.MustGet()
db.Profiler = &factory.Database.ProfilerStdout
// migrate database schema
if err := systemMigrate.Migrate(db); err != nil {
log.Printf("Error running migrations: %+v\n", err)
return
}
// clean up tables
{
for _, name := range []string{"sys_user", "sys_team", "sys_team_member", "sys_organisation", "settings"} {
_, err := db.Exec("truncate " + name)
if err != nil {
panic("Error when clearing " + name + ": " + err.Error())
}
}
}
os.Exit(m.Run())
}
func assert(t *testing.T, ok bool, format string, args ...interface{}) bool {
if !ok {
_, file, line, _ := runtime.Caller(1)
caller := fmt.Sprintf("\nAsserted at:%s:%d", file, line)
t.Fatalf(format+caller, args...)
}
return ok
}

View File

@@ -24,6 +24,9 @@ type (
organisation struct {
*repository
// sql table reference
organisations string
}
)
@@ -39,12 +42,13 @@ func Organisation(ctx context.Context, db *factory.DB) OrganisationRepository {
func (r *organisation) With(ctx context.Context, db *factory.DB) OrganisationRepository {
return &organisation{
repository: r.repository.With(ctx, db),
repository: r.repository.With(ctx, db),
organisations: "sys_organisation",
}
}
func (r *organisation) FindOrganisationByID(id uint64) (*types.Organisation, error) {
sql := "SELECT * FROM organisations WHERE id = ? AND " + sqlOrganisationScope
sql := "SELECT * FROM " + r.organisations + " WHERE id = ? AND " + sqlOrganisationScope
mod := &types.Organisation{}
return mod, isFound(r.db().Get(mod, sql, id), mod.ID > 0, ErrOrganisationNotFound)
@@ -53,7 +57,7 @@ func (r *organisation) FindOrganisationByID(id uint64) (*types.Organisation, err
func (r *organisation) FindOrganisations(filter *types.OrganisationFilter) ([]*types.Organisation, error) {
rval := make([]*types.Organisation, 0)
params := make([]interface{}, 0)
sql := "SELECT * FROM organisations WHERE " + sqlOrganisationScope
sql := "SELECT * FROM " + r.organisations + " WHERE " + sqlOrganisationScope
if filter != nil {
if filter.Query != "" {
@@ -71,23 +75,23 @@ func (r *organisation) CreateOrganisation(mod *types.Organisation) (*types.Organ
mod.ID = factory.Sonyflake.NextID()
mod.CreatedAt = time.Now()
return mod, r.db().Insert("organisations", mod)
return mod, r.db().Insert(r.organisations, mod)
}
func (r *organisation) UpdateOrganisation(mod *types.Organisation) (*types.Organisation, error) {
mod.UpdatedAt = timeNowPtr()
return mod, r.db().Replace("organisations", mod)
return mod, r.db().Replace(r.organisations, mod)
}
func (r *organisation) ArchiveOrganisationByID(id uint64) error {
return r.updateColumnByID("organisations", "archived_at", time.Now(), id)
return r.updateColumnByID(r.organisations, "archived_at", time.Now(), id)
}
func (r *organisation) UnarchiveOrganisationByID(id uint64) error {
return r.updateColumnByID("organisations", "archived_at", nil, id)
return r.updateColumnByID(r.organisations, "archived_at", nil, id)
}
func (r *organisation) DeleteOrganisationByID(id uint64) error {
return r.updateColumnByID("organisations", "deleted_at", time.Now(), id)
return r.updateColumnByID(r.organisations, "deleted_at", time.Now(), id)
}

View File

@@ -7,64 +7,58 @@ import (
"testing"
"github.com/crusttech/crust/sam/types"
"github.com/crusttech/crust/system/types"
)
func TestOrganisation(t *testing.T) {
var err error
if testing.Short() {
t.Skip("skipping test in short mode.")
return
}
rpo := Organisation(context.Background(), factory.Database.MustGet())
org := &types.Organisation{}
var name1, name2 = "Test organisation v1", "Test organisation v2"
var oo []*types.Organisation
org := &types.Organisation{
Name: "Test organisation v1",
}
{
org.Name = name1
org, err = rpo.CreateOrganisation(org)
oa, err := rpo.CreateOrganisation(org)
assert(t, err == nil, "CreateOrganisation error: %v", err)
assert(t, org.Name == name1, "Changes were not stored")
assert(t, oa.Name == org.Name, "Changes were not stored")
}
{
org.Name = name2
{
org.Name = "Test organisation v2"
org, err = rpo.UpdateOrganisation(org)
assert(t, err == nil, "UpdateOrganisation error: %v", err)
assert(t, org.Name == name2, "Changes were not stored")
}
oa, err := rpo.UpdateOrganisation(org)
assert(t, err == nil, "UpdateOrganisation error: %v", err)
assert(t, oa.Name == org.Name, "Changes were not stored")
}
{
org, err = rpo.FindOrganisationByID(org.ID)
assert(t, err == nil, "FindOrganisationByID error: %v", err)
assert(t, org.Name == name2, "Changes were not stored")
}
{
oa, err := rpo.FindOrganisationByID(org.ID)
assert(t, err == nil, "FindOrganisationByID error: %v", err)
assert(t, oa.Name == org.Name, "Changes were not stored")
}
{
oo, err = rpo.FindOrganisations(&types.OrganisationFilter{Query: name2})
assert(t, err == nil, "FindOrganisations error: %v", err)
assert(t, len(oo) != 0, "No results found")
}
{
oa, err := rpo.FindOrganisations(&types.OrganisationFilter{Query: org.Name})
assert(t, err == nil, "FindOrganisations error: %v", err)
assert(t, len(oa) != 0, "No results found")
}
{
err = rpo.ArchiveOrganisationByID(org.ID)
assert(t, err == nil, "ArchiveOrganisationByID error: %v", err)
}
{
err := rpo.ArchiveOrganisationByID(org.ID)
assert(t, err == nil, "ArchiveOrganisationByID error: %v", err)
}
{
err = rpo.UnarchiveOrganisationByID(org.ID)
assert(t, err == nil, "UnarchiveOrganisationByID error: %v", err)
}
{
err := rpo.UnarchiveOrganisationByID(org.ID)
assert(t, err == nil, "UnarchiveOrganisationByID error: %v", err)
}
{
err = rpo.DeleteOrganisationByID(org.ID)
assert(t, err == nil, "DeleteOrganisationByID error: %v", err)
}
{
err := rpo.DeleteOrganisationByID(org.ID)
assert(t, err == nil, "DeleteOrganisationByID error: %v", err)
}
}

View File

@@ -11,6 +11,9 @@ import (
type (
settings struct {
*repository
// sql table reference
settings string
}
Settings interface {
@@ -28,6 +31,7 @@ func NewSettings(ctx context.Context, db *factory.DB) Settings {
func (r *settings) With(ctx context.Context, db *factory.DB) Settings {
return &settings{
repository: r.repository.With(ctx, db),
settings: "settings",
}
}
@@ -35,7 +39,7 @@ func (r *settings) Set(name string, value interface{}) error {
if jsonValue, err := json.Marshal(value); err != nil {
return errors.Wrap(err, "Error marshaling settings value")
} else {
return r.db().Replace("settings", struct {
return r.db().Replace(r.settings, struct {
Key string `db:"name"`
Val json.RawMessage `db:"value"`
}{name, jsonValue})
@@ -43,7 +47,7 @@ func (r *settings) Set(name string, value interface{}) error {
}
func (r *settings) Get(name string, value interface{}) (bool, error) {
sql := "SELECT value FROM settings WHERE name = ?"
sql := "SELECT value FROM " + r.settings + " WHERE name = ?"
var stored json.RawMessage

View File

@@ -26,6 +26,10 @@ type (
team struct {
*repository
// sql table reference
teams string
members string
}
)
@@ -42,11 +46,13 @@ func Team(ctx context.Context, db *factory.DB) TeamRepository {
func (r *team) With(ctx context.Context, db *factory.DB) TeamRepository {
return &team{
repository: r.repository.With(ctx, db),
teams: "sys_team",
members: "sys_team_member",
}
}
func (r *team) FindTeamByID(id uint64) (*types.Team, error) {
sql := "SELECT * FROM teams WHERE id = ? AND " + sqlTeamScope
sql := "SELECT * FROM " + r.teams + " WHERE id = ? AND " + sqlTeamScope
mod := &types.Team{}
return mod, isFound(r.db().Get(mod, sql, id), mod.ID > 0, ErrTeamNotFound)
@@ -56,7 +62,7 @@ func (r *team) FindTeams(filter *types.TeamFilter) ([]*types.Team, error) {
rval := make([]*types.Team, 0)
params := make([]interface{}, 0)
sql := "SELECT * FROM teams WHERE " + sqlTeamScope
sql := "SELECT * FROM " + r.teams + " WHERE " + sqlTeamScope
if filter != nil {
if filter.Query != "" {
@@ -74,25 +80,25 @@ func (r *team) CreateTeam(mod *types.Team) (*types.Team, error) {
mod.ID = factory.Sonyflake.NextID()
mod.CreatedAt = time.Now()
return mod, r.db().Insert("teams", mod)
return mod, r.db().Insert(r.teams, mod)
}
func (r *team) UpdateTeam(mod *types.Team) (*types.Team, error) {
mod.UpdatedAt = timeNowPtr()
return mod, r.db().Replace("teams", mod)
return mod, r.db().Replace(r.teams, mod)
}
func (r *team) ArchiveTeamByID(id uint64) error {
return r.updateColumnByID("teams", "archived_at", time.Now(), id)
return r.updateColumnByID(r.teams, "archived_at", time.Now(), id)
}
func (r *team) UnarchiveTeamByID(id uint64) error {
return r.updateColumnByID("teams", "archived_at", nil, id)
return r.updateColumnByID(r.teams, "archived_at", nil, id)
}
func (r *team) DeleteTeamByID(id uint64) error {
return r.updateColumnByID("teams", "deleted_at", time.Now(), id)
return r.updateColumnByID(r.teams, "deleted_at", time.Now(), id)
}
func (r *team) MergeTeamByID(id, targetTeamID uint64) error {

View File

@@ -7,63 +7,56 @@ import (
"testing"
"github.com/crusttech/crust/sam/types"
"github.com/crusttech/crust/system/types"
)
func TestTeam(t *testing.T) {
var err error
if testing.Short() {
t.Skip("skipping test in short mode.")
return
}
rpo := Team(context.Background(), factory.Database.MustGet())
team := &types.Team{}
var name1, name2 = "Test team v1", "Test team v2"
var aa []*types.Team
{
team.Name = name1
team, err = rpo.CreateTeam(team)
assert(t, err == nil, "CreateTeam error: %v", err)
assert(t, team.Name == name1, "Changes were not stored")
{
team.Name = name2
team, err = rpo.UpdateTeam(team)
assert(t, err == nil, "UpdateTeam error: %v", err)
assert(t, team.Name == name2, "Changes were not stored")
}
{
team, err = rpo.FindTeamByID(team.ID)
assert(t, err == nil, "FindTeamByID error: %v", err)
assert(t, team.Name == name2, "Changes were not stored")
}
{
aa, err = rpo.FindTeams(&types.TeamFilter{Query: name2})
assert(t, err == nil, "FindTeams error: %v", err)
assert(t, len(aa) > 0, "No results found")
}
{
err = rpo.ArchiveTeamByID(team.ID)
assert(t, err == nil, "ArchiveTeamByID error: %v", err)
}
{
err = rpo.UnarchiveTeamByID(team.ID)
assert(t, err == nil, "UnarchiveTeamByID error: %v", err)
}
{
err = rpo.DeleteTeamByID(team.ID)
assert(t, err == nil, "DeleteTeamByID error: %v", err)
}
team := &types.Team{
Name: "Test team v1",
}
{
t1, err := rpo.CreateTeam(team)
assert(t, err == nil, "CreateTeam error: %v", err)
assert(t, team.Name == t1.Name, "Changes were not stored")
}
{
team.Name = "Test team v2"
t1, err := rpo.UpdateTeam(team)
assert(t, err == nil, "UpdateTeam error: %v", err)
assert(t, team.Name == t1.Name, "Changes were not stored")
}
{
t1, err := rpo.FindTeamByID(team.ID)
assert(t, err == nil, "FindTeamByID error: %v", err)
assert(t, team.Name == t1.Name, "Changes were not stored")
}
{
aa, err := rpo.FindTeams(&types.TeamFilter{Query: team.Name})
assert(t, err == nil, "FindTeams error: %v", err)
assert(t, len(aa) > 0, "No results found")
}
{
err := rpo.ArchiveTeamByID(team.ID)
assert(t, err == nil, "ArchiveTeamByID error: %v", err)
}
{
err := rpo.UnarchiveTeamByID(team.ID)
assert(t, err == nil, "UnarchiveTeamByID error: %v", err)
}
{
err := rpo.DeleteTeamByID(team.ID)
assert(t, err == nil, "DeleteTeamByID error: %v", err)
}
}

View File

@@ -2,6 +2,7 @@ package repository
import (
"context"
"fmt"
"time"
"github.com/crusttech/crust/system/types"
@@ -27,6 +28,9 @@ type (
user struct {
*repository
// sql table reference
users string
}
)
@@ -35,7 +39,7 @@ const (
"meta, satosa_id, rel_organisation, " +
"created_at, updated_at, suspended_at, deleted_at"
sqlUserScope = "suspended_at IS NULL AND deleted_at IS NULL"
sqlUserSelect = "SELECT " + sqlUserColumns + " FROM users WHERE " + sqlUserScope
sqlUserSelect = "SELECT " + sqlUserColumns + " FROM %s WHERE " + sqlUserScope
ErrUserNotFound = repositoryError("UserNotFound")
)
@@ -45,32 +49,35 @@ func User(ctx context.Context, db *factory.DB) UserRepository {
}
func (r *user) With(ctx context.Context, db *factory.DB) UserRepository {
return &user{repository: r.repository.With(ctx, db)}
return &user{
repository: r.repository.With(ctx, db),
users: "sys_user",
}
}
func (r *user) FindByUsername(username string) (*types.User, error) {
sql := sqlUserSelect + " AND username = ?"
sql := fmt.Sprintf(sqlUserSelect, r.users) + " AND username = ?"
mod := &types.User{}
return mod, isFound(r.db().Get(mod, sql, username), mod.ID > 0, ErrUserNotFound)
}
func (r *user) FindBySatosaID(satosaID string) (*types.User, error) {
sql := sqlUserSelect + " AND satosa_id = ?"
sql := fmt.Sprintf(sqlUserSelect, r.users) + " AND satosa_id = ?"
mod := &types.User{}
return mod, isFound(r.db().Get(mod, sql, satosaID), mod.ID > 0, ErrUserNotFound)
}
func (r *user) FindByEmail(email string) (*types.User, error) {
sql := sqlUserSelect + " AND email = ?"
sql := fmt.Sprintf(sqlUserSelect, r.users) + " AND email = ?"
mod := &types.User{}
return mod, isFound(r.db().Get(mod, sql, email), mod.ID > 0, ErrUserNotFound)
}
func (r *user) FindByID(id uint64) (*types.User, error) {
sql := sqlUserSelect + " AND id = ?"
sql := fmt.Sprintf(sqlUserSelect, r.users) + " AND id = ?"
mod := &types.User{}
return mod, isFound(r.db().Get(mod, sql, id), mod.ID > 0, ErrUserNotFound)
@@ -79,7 +86,7 @@ func (r *user) FindByID(id uint64) (*types.User, error) {
func (r *user) Find(filter *types.UserFilter) ([]*types.User, error) {
rval := make([]*types.User, 0)
params := make([]interface{}, 0)
sql := sqlUserSelect
sql := fmt.Sprintf(sqlUserSelect, r.users)
if filter != nil {
if filter.Query != "" {
@@ -96,22 +103,22 @@ func (r *user) Find(filter *types.UserFilter) ([]*types.User, error) {
func (r *user) Create(mod *types.User) (*types.User, error) {
mod.ID = factory.Sonyflake.NextID()
mod.CreatedAt = time.Now()
return mod, r.db().Insert("users", mod)
return mod, r.db().Insert(r.users, mod)
}
func (r *user) Update(mod *types.User) (*types.User, error) {
mod.UpdatedAt = timeNowPtr()
return mod, r.db().Replace("users", mod)
return mod, r.db().Replace(r.users, mod)
}
func (r *user) SuspendByID(id uint64) error {
return r.updateColumnByID("users", "suspend_at", time.Now(), id)
return r.updateColumnByID(r.users, "suspend_at", time.Now(), id)
}
func (r *user) UnsuspendByID(id uint64) error {
return r.updateColumnByID("users", "suspend_at", nil, id)
return r.updateColumnByID(r.users, "suspend_at", nil, id)
}
func (r *user) DeleteByID(id uint64) error {
return r.updateColumnByID("users", "deleted_at", time.Now(), id)
return r.updateColumnByID(r.users, "deleted_at", time.Now(), id)
}