Merge pull request #1239 from trheyi/main
Enhance member model and team management with is_owner field
This commit is contained in:
commit
0e8248297d
6 changed files with 186 additions and 168 deletions
284
data/bindata.go
284
data/bindata.go
File diff suppressed because one or more lines are too long
|
|
@ -157,18 +157,18 @@ var (
|
||||||
|
|
||||||
// DefaultMemberFields contains basic member fields
|
// DefaultMemberFields contains basic member fields
|
||||||
DefaultMemberFields = []interface{}{
|
DefaultMemberFields = []interface{}{
|
||||||
"member_id", "team_id", "user_id", "member_type", "display_name", "bio", "avatar", "email", "role_id", "status",
|
"member_id", "team_id", "user_id", "member_type", "display_name", "bio", "avatar", "email", "role_id", "is_owner", "status",
|
||||||
"invitation_id", "invited_by", "invited_at", "joined_at", "invitation_token", "invitation_expires_at",
|
"invitation_id", "invited_by", "invited_at", "joined_at", "invitation_token", "invitation_expires_at",
|
||||||
"last_active_at", "login_count", "created_at", "updated_at",
|
"last_active_at", "login_count", "created_at", "updated_at",
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultMemberDetailFields contains all member fields including robot config and permissions
|
// DefaultMemberDetailFields contains all member fields including robot config
|
||||||
DefaultMemberDetailFields = []interface{}{
|
DefaultMemberDetailFields = []interface{}{
|
||||||
"member_id", "team_id", "user_id", "member_type", "display_name", "bio", "avatar", "email", "role_id", "status",
|
"member_id", "team_id", "user_id", "member_type", "display_name", "bio", "avatar", "email", "role_id", "is_owner", "status",
|
||||||
"system_prompt", "manager_id", "robot_config", "agents", "mcp_servers",
|
"system_prompt", "manager_id", "robot_config", "agents", "mcp_servers",
|
||||||
"language_model", "cost_limit", "autonomous_mode", "last_robot_activity", "robot_status",
|
"language_model", "cost_limit", "autonomous_mode", "last_robot_activity", "robot_status",
|
||||||
"invitation_id", "invited_by", "invited_at", "joined_at", "invitation_token",
|
"invitation_id", "invited_by", "invited_at", "joined_at", "invitation_token",
|
||||||
"invitation_expires_at", "permissions", "restrictions", "last_active_at",
|
"invitation_expires_at", "last_active_at",
|
||||||
"login_count", "notes", "metadata", "created_at", "updated_at",
|
"login_count", "notes", "metadata", "created_at", "updated_at",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -364,7 +364,7 @@ func (u *DefaultUser) CreateRobotMember(ctx context.Context, teamID string, robo
|
||||||
robotFields := []string{
|
robotFields := []string{
|
||||||
"role_id", "system_prompt", "manager_id", "robot_config", "agents", "mcp_servers",
|
"role_id", "system_prompt", "manager_id", "robot_config", "agents", "mcp_servers",
|
||||||
"language_model", "cost_limit", "autonomous_mode", "robot_status",
|
"language_model", "cost_limit", "autonomous_mode", "robot_status",
|
||||||
"permissions", "restrictions", "notes", "metadata",
|
"notes", "metadata",
|
||||||
"__yao_created_by", "__yao_updated_by", "__yao_team_id", "__yao_tenant_id",
|
"__yao_created_by", "__yao_updated_by", "__yao_team_id", "__yao_tenant_id",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package user_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
@ -954,9 +955,28 @@ func TestTeamCreateMembershipVerification(t *testing.T) {
|
||||||
t.Logf("Created team: %s (ID: %s, Owner: %s)",
|
t.Logf("Created team: %s (ID: %s, Owner: %s)",
|
||||||
createdTeam["name"], getTeamID(createdTeam), createdTeam["owner_id"])
|
createdTeam["name"], getTeamID(createdTeam), createdTeam["owner_id"])
|
||||||
|
|
||||||
// TODO: Add verification of team membership once member endpoints are implemented
|
// Verify that creator is automatically added as owner member
|
||||||
// This test currently verifies team creation works correctly
|
teamID := getTeamID(createdTeam)
|
||||||
// Future enhancement: verify that creator is automatically added as owner member
|
provider := testutils.GetUserProvider(t)
|
||||||
|
|
||||||
|
member, err := provider.GetMember(context.Background(), teamID, tokenInfo.UserID)
|
||||||
|
if err == nil {
|
||||||
|
// Verify member exists and has correct properties
|
||||||
|
assert.Equal(t, teamID, member["team_id"], "Member should belong to created team")
|
||||||
|
assert.Equal(t, tokenInfo.UserID, member["user_id"], "Member should have correct user_id")
|
||||||
|
assert.Equal(t, "active", member["status"], "Member should be active")
|
||||||
|
|
||||||
|
// Verify is_owner field is set to true
|
||||||
|
isOwner := member["is_owner"]
|
||||||
|
assert.NotNil(t, isOwner, "is_owner field should be present")
|
||||||
|
// Handle different boolean representations from database
|
||||||
|
assert.True(t, isOwner == true || isOwner == int64(1) || isOwner == 1,
|
||||||
|
"is_owner should be true for team creator, got: %v (type: %T)", isOwner, isOwner)
|
||||||
|
|
||||||
|
t.Logf("Verified creator is automatically added as owner member with is_owner=true")
|
||||||
|
} else {
|
||||||
|
t.Logf("Could not verify member (may not be implemented yet): %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
t.Logf("Team creation with automatic owner membership test passed")
|
t.Logf("Team creation with automatic owner membership test passed")
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -837,6 +837,7 @@ func teamCreate(ctx context.Context, userID string, teamData maps.MapStrAny) (st
|
||||||
"user_id": userID,
|
"user_id": userID,
|
||||||
"member_type": "user",
|
"member_type": "user",
|
||||||
"role_id": ownerRoleID,
|
"role_id": ownerRoleID,
|
||||||
|
"is_owner": true,
|
||||||
"status": "active",
|
"status": "active",
|
||||||
"joined_at": time.Now(),
|
"joined_at": time.Now(),
|
||||||
"created_at": time.Now(),
|
"created_at": time.Now(),
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,15 @@
|
||||||
"nullable": false,
|
"nullable": false,
|
||||||
"index": true
|
"index": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "is_owner",
|
||||||
|
"type": "boolean",
|
||||||
|
"label": "Is Owner",
|
||||||
|
"comment": "Whether this member is the team owner (redundant field for query performance and UI display)",
|
||||||
|
"default": false,
|
||||||
|
"index": true,
|
||||||
|
"nullable": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "status",
|
"name": "status",
|
||||||
"type": "enum",
|
"type": "enum",
|
||||||
|
|
@ -282,24 +291,6 @@
|
||||||
"nullable": true
|
"nullable": true
|
||||||
},
|
},
|
||||||
|
|
||||||
// ============================================================================
|
|
||||||
// Permission Overrides
|
|
||||||
// ============================================================================
|
|
||||||
{
|
|
||||||
"name": "permissions",
|
|
||||||
"type": "json",
|
|
||||||
"label": "Permissions",
|
|
||||||
"comment": "Custom permissions override for this user in this team",
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "restrictions",
|
|
||||||
"type": "json",
|
|
||||||
"label": "Restrictions",
|
|
||||||
"comment": "Additional restrictions for this user in this team",
|
|
||||||
"nullable": true
|
|
||||||
},
|
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// Activity Tracking
|
// Activity Tracking
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
@ -357,6 +348,12 @@
|
||||||
"type": "index",
|
"type": "index",
|
||||||
"comment": "Index for finding members by type, role and status within team"
|
"comment": "Index for finding members by type, role and status within team"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "idx_team_owner",
|
||||||
|
"columns": ["team_id", "is_owner"],
|
||||||
|
"type": "index",
|
||||||
|
"comment": "Index for quickly finding team owner"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "idx_user_teams",
|
"name": "idx_user_teams",
|
||||||
"columns": ["user_id", "member_type", "status", "role_id"],
|
"columns": ["user_id", "member_type", "status", "role_id"],
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue