add(system): Team.FindByMemberID (#3)

* add(system): Team.FindByMemberID

* add(system): Users.Find with Team data

* upd(system): error formating
This commit is contained in:
Mitja Z
2018-11-25 15:55:44 +01:00
committed by Tit Petric
parent be3d010196
commit 3616afd22a
7 changed files with 155 additions and 23 deletions
+7 -7
View File
@@ -23,7 +23,7 @@ func TestOrganisation(t *testing.T) {
{
oa, err := rpo.CreateOrganisation(org)
assert(t, err == nil, "CreateOrganisation error: %v", err)
assert(t, err == nil, "CreateOrganisation error: %+v", err)
assert(t, oa.Name == org.Name, "Changes were not stored")
}
@@ -31,34 +31,34 @@ func TestOrganisation(t *testing.T) {
org.Name = "Test organisation v2"
oa, err := rpo.UpdateOrganisation(org)
assert(t, err == nil, "UpdateOrganisation error: %v", err)
assert(t, err == nil, "UpdateOrganisation error: %+v", err)
assert(t, oa.Name == org.Name, "Changes were not stored")
}
{
oa, err := rpo.FindOrganisationByID(org.ID)
assert(t, err == nil, "FindOrganisationByID error: %v", err)
assert(t, err == nil, "FindOrganisationByID error: %+v", err)
assert(t, oa.Name == org.Name, "Changes were not stored")
}
{
oa, err := rpo.FindOrganisations(&types.OrganisationFilter{Query: org.Name})
assert(t, err == nil, "FindOrganisations error: %v", err)
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)
assert(t, err == nil, "ArchiveOrganisationByID error: %+v", err)
}
{
err := rpo.UnarchiveOrganisationByID(org.ID)
assert(t, err == nil, "UnarchiveOrganisationByID error: %v", err)
assert(t, err == nil, "UnarchiveOrganisationByID error: %+v", err)
}
{
err := rpo.DeleteOrganisationByID(org.ID)
assert(t, err == nil, "DeleteOrganisationByID error: %v", err)
assert(t, err == nil, "DeleteOrganisationByID error: %+v", err)
}
}
+31 -2
View File
@@ -14,14 +14,19 @@ type (
With(ctx context.Context, db *factory.DB) TeamRepository
FindByID(id uint64) (*types.Team, error)
FindByMemberID(userID uint64) ([]*types.Team, error)
Find(filter *types.TeamFilter) ([]*types.Team, error)
Create(mod *types.Team) (*types.Team, error)
Update(mod *types.Team) (*types.Team, error)
ArchiveByID(id uint64) error
UnarchiveByID(id uint64) error
DeleteByID(id uint64) error
MergeByID(id, targetTeamID uint64) error
MoveByID(id, targetOrganisationID uint64) error
MemberAddByID(id, userID uint64) error
MemberRemoveByID(id, userID uint64) error
}
@@ -60,6 +65,30 @@ func (r *team) FindByID(id uint64) (*types.Team, error) {
return mod, isFound(r.db().Get(mod, sql, id), mod.ID > 0, ErrTeamNotFound)
}
func (r *team) FindByMemberID(userID uint64) ([]*types.Team, error) {
ids := make([]uint64, 0)
params := make([]interface{}, 0)
sql := "SELECT DISTINCT rel_team FROM " + r.members + " "
sql += "WHERE rel_user = ?"
params = append(params, userID)
if err := r.db().Select(&ids, sql, params...); err != nil {
return nil, err
}
rval := make([]*types.Team, 0)
for _, id := range ids {
mod, err := r.FindByID(id)
if err != nil {
return nil, err
}
rval = append(rval, mod)
}
return rval, nil
}
func (r *team) Find(filter *types.TeamFilter) ([]*types.Team, error) {
rval := make([]*types.Team, 0)
params := make([]interface{}, 0)
@@ -114,7 +143,7 @@ func (r *team) MoveByID(id, targetOrganisationID uint64) error {
func (r *team) MemberAddByID(id, userID uint64) error {
mod := &types.TeamMember{
TeamID: id,
UserId: userID,
UserID: userID,
}
return r.db().Replace(r.members, mod)
}
@@ -122,7 +151,7 @@ func (r *team) MemberAddByID(id, userID uint64) error {
func (r *team) MemberRemoveByID(id, userID uint64) error {
mod := &types.TeamMember{
TeamID: id,
UserId: userID,
UserID: userID,
}
return r.db().Delete(r.members, mod, "rel_team", "rel_user")
}
+23 -11
View File
@@ -25,7 +25,7 @@ func TestTeam(t *testing.T) {
{
u1, err := userRepo.Create(user)
assert(t, err == nil, "User.Create error: %v", err)
assert(t, err == nil, "User.Create error: %+v", err)
assert(t, user.ID == u1.ID, "Changes were not stored")
}
@@ -36,56 +36,68 @@ func TestTeam(t *testing.T) {
{
t1, err := teamRepo.Create(team)
assert(t, err == nil, "Team.Create error: %v", err)
assert(t, err == nil, "Team.Create error: %+v", err)
assert(t, team.Name == t1.Name, "Changes were not stored")
}
{
team.Name = "Test team v2"
t1, err := teamRepo.Update(team)
assert(t, err == nil, "Team.Update error: %v", err)
assert(t, err == nil, "Team.Update error: %+v", err)
assert(t, team.Name == t1.Name, "Changes were not stored")
}
{
t1, err := teamRepo.FindByID(team.ID)
assert(t, err == nil, "Team.FindByID error: %v", err)
assert(t, err == nil, "Team.FindByID error: %+v", err)
assert(t, team.Name == t1.Name, "Changes were not stored")
}
{
aa, err := teamRepo.Find(&types.TeamFilter{Query: team.Name})
assert(t, err == nil, "Team.Find error: %v", err)
assert(t, err == nil, "Team.Find error: %+v", err)
assert(t, len(aa) > 0, "No results found")
}
{
err := teamRepo.ArchiveByID(team.ID)
assert(t, err == nil, "Team.ArchiveByID error: %v", err)
assert(t, err == nil, "Team.ArchiveByID error: %+v", err)
}
{
err := teamRepo.UnarchiveByID(team.ID)
assert(t, err == nil, "Team.UnarchiveByID error: %v", err)
assert(t, err == nil, "Team.UnarchiveByID error: %+v", err)
}
{
err := teamRepo.MemberAddByID(team.ID, user.ID)
assert(t, err == nil, "Team.MemberAddByID error: %v", err)
assert(t, err == nil, "Team.MemberAddByID error: %+v", err)
}
{
teams, err := teamRepo.FindByMemberID(user.ID)
assert(t, err == nil, "Team.FindByMemberID error: %+v", err)
assert(t, len(teams) > 0, "No results found")
}
{
teams, err := teamRepo.FindByMemberID(0)
assert(t, err == nil, "Team.FindByMemberID error: %+v", err)
assert(t, len(teams) == 0, "Results found")
}
{
err := teamRepo.MemberRemoveByID(team.ID, user.ID)
assert(t, err == nil, "Team.MemberRemoveByID error: %v", err)
assert(t, err == nil, "Team.MemberRemoveByID error: %+v", err)
}
{
err := teamRepo.DeleteByID(team.ID)
assert(t, err == nil, "Team.DeleteByID error: %v", err)
assert(t, err == nil, "Team.DeleteByID error: %+v", err)
}
{
err := userRepo.DeleteByID(user.ID)
assert(t, err == nil, "User.DeleteByID error: %v", err)
assert(t, err == nil, "User.DeleteByID error: %+v", err)
}
}
+36 -2
View File
@@ -5,8 +5,9 @@ import (
"fmt"
"time"
"github.com/crusttech/crust/system/types"
"github.com/titpetric/factory"
"github.com/crusttech/crust/system/types"
)
type (
@@ -98,7 +99,14 @@ func (r *user) Find(filter *types.UserFilter) ([]*types.User, error) {
sql += " ORDER BY username ASC"
return rval, r.db().Select(&rval, sql, params...)
if err := r.db().Select(&rval, sql, params...); err != nil {
return nil, err
}
if err := r.prepareAll(rval, "teams"); err != nil {
return nil, err
}
return rval, nil
}
func (r *user) Create(mod *types.User) (*types.User, error) {
@@ -123,3 +131,29 @@ func (r *user) UnsuspendByID(id uint64) error {
func (r *user) DeleteByID(id uint64) error {
return r.updateColumnByID(r.users, "deleted_at", time.Now(), id)
}
func (r *user) prepareAll(users []*types.User, fields ...string) error {
for _, user := range users {
if err := r.prepare(user, fields...); err != nil {
return err
}
}
return nil
}
func (r *user) prepare(user *types.User, fields ...string) (err error) {
api := Team(r.Context(), r.db())
for _, field := range fields {
switch field {
case "teams":
if user.ID > 0 {
teams, err := api.FindByMemberID(user.ID)
if err != nil {
return err
}
user.Teams = teams
}
}
}
return
}
+55
View File
@@ -0,0 +1,55 @@
package repository
import (
"context"
"github.com/titpetric/factory"
"testing"
"github.com/crusttech/crust/system/types"
)
func TestUser(t *testing.T) {
if testing.Short() {
t.Skip("skipping test in short mode.")
return
}
userRepo := User(context.Background(), factory.Database.MustGet())
user := &types.User{
Name: "John Doe",
Username: "johndoe",
SatosaID: "1234",
}
user.GeneratePassword("johndoe")
{
u1, err := userRepo.Create(user)
assert(t, err == nil, "User.Create error: %+v", err)
assert(t, user.ID == u1.ID, "Changes were not stored")
}
teamRepo := Team(context.Background(), factory.Database.MustGet())
team := &types.Team{
Name: "Test team v1",
}
{
t1, err := teamRepo.Create(team)
assert(t, err == nil, "Team.Create error: %+v", err)
assert(t, team.Name == t1.Name, "Changes were not stored")
}
{
err := teamRepo.MemberAddByID(team.ID, user.ID)
assert(t, err == nil, "Team.MemberAddByID error: %+v", err)
}
{
users, err := userRepo.Find(&types.UserFilter{Query: ""})
assert(t, err == nil, "User.Find error: %+v", err)
assert(t, len(users) > 0, "No user results found")
assert(t, len(users[0].Teams) > 0, "No team results found")
}
}
+1 -1
View File
@@ -3,7 +3,7 @@ package types
type (
TeamMember struct {
TeamID uint64 `db:"rel_team"`
UserId uint64 `db:"rel_user"`
UserID uint64 `db:"rel_user"`
}
TeamMemberFilter struct {
+2
View File
@@ -28,6 +28,8 @@ type (
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"`
Teams []*Team `json:"page,omitempty"`
}
UserFilter struct {