From ffa2d1b8eda4fd74e8c42e9cdcd83bd42152ed75 Mon Sep 17 00:00:00 2001 From: Tit Petric Date: Sat, 24 Nov 2018 18:57:08 +0000 Subject: [PATCH] upd(system): rename tables, fix tests --- system/db/mysql/statik.go | 2 +- ...1124181811.rename_and_prefix_tables.up.sql | 4 + system/db/schema/mysql/new.sh | 2 + system/repository/main_test.go | 67 ++++++++++++++ system/repository/organisation.go | 20 +++-- system/repository/organisation_test.go | 74 +++++++-------- system/repository/settings.go | 8 +- system/repository/team.go | 20 +++-- system/repository/team_test.go | 89 +++++++++---------- system/repository/user.go | 31 ++++--- 10 files changed, 199 insertions(+), 118 deletions(-) create mode 100644 system/db/schema/mysql/20181124181811.rename_and_prefix_tables.up.sql create mode 100755 system/db/schema/mysql/new.sh create mode 100644 system/repository/main_test.go diff --git a/system/db/mysql/statik.go b/system/db/mysql/statik.go index 3c2fb3089..10372660a 100644 --- a/system/db/mysql/statik.go +++ b/system/db/mysql/statik.go @@ -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() { diff --git a/system/db/schema/mysql/20181124181811.rename_and_prefix_tables.up.sql b/system/db/schema/mysql/20181124181811.rename_and_prefix_tables.up.sql new file mode 100644 index 000000000..c5d6c2810 --- /dev/null +++ b/system/db/schema/mysql/20181124181811.rename_and_prefix_tables.up.sql @@ -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; \ No newline at end of file diff --git a/system/db/schema/mysql/new.sh b/system/db/schema/mysql/new.sh new file mode 100755 index 000000000..5530da8dc --- /dev/null +++ b/system/db/schema/mysql/new.sh @@ -0,0 +1,2 @@ +#!/bin/bash +touch $(date +%Y%m%d%H%M%S).up.sql \ No newline at end of file diff --git a/system/repository/main_test.go b/system/repository/main_test.go new file mode 100644 index 000000000..aa836c679 --- /dev/null +++ b/system/repository/main_test.go @@ -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 +} diff --git a/system/repository/organisation.go b/system/repository/organisation.go index 824d33ed7..a5ed40657 100644 --- a/system/repository/organisation.go +++ b/system/repository/organisation.go @@ -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) } diff --git a/system/repository/organisation_test.go b/system/repository/organisation_test.go index 142e242c3..53e8d1f7e 100644 --- a/system/repository/organisation_test.go +++ b/system/repository/organisation_test.go @@ -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) } } diff --git a/system/repository/settings.go b/system/repository/settings.go index ee9ca7ae5..f408d3cb1 100644 --- a/system/repository/settings.go +++ b/system/repository/settings.go @@ -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 diff --git a/system/repository/team.go b/system/repository/team.go index f27347db2..5c76ec46f 100644 --- a/system/repository/team.go +++ b/system/repository/team.go @@ -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 { diff --git a/system/repository/team_test.go b/system/repository/team_test.go index bcaa22981..69185c7ab 100644 --- a/system/repository/team_test.go +++ b/system/repository/team_test.go @@ -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) + } } diff --git a/system/repository/user.go b/system/repository/user.go index 2b197730d..8122d96c3 100644 --- a/system/repository/user.go +++ b/system/repository/user.go @@ -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) }