upd(system): rename tables, fix tests
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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
2
system/db/schema/mysql/new.sh
Executable file
@@ -0,0 +1,2 @@
|
||||
#!/bin/bash
|
||||
touch $(date +%Y%m%d%H%M%S).up.sql
|
||||
67
system/repository/main_test.go
Normal file
67
system/repository/main_test.go
Normal 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
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user