Merge pull request #1186 from trheyi/main
Enhance team retrieval functionality and improve user team handling
This commit is contained in:
commit
faae63d4d5
4 changed files with 69 additions and 91 deletions
|
|
@ -251,12 +251,12 @@ func (u *DefaultUser) GetTeamsByOwner(ctx context.Context, ownerID string) ([]ma
|
||||||
return u.GetTeams(ctx, param)
|
return u.GetTeams(ctx, param)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTeamsByMember retrieves teams by member_id
|
// GetTeamsByMember retrieves teams by member_id (includes role information and owner status)
|
||||||
func (u *DefaultUser) GetTeamsByMember(ctx context.Context, memberID string) ([]maps.MapStr, error) {
|
func (u *DefaultUser) GetTeamsByMember(ctx context.Context, memberID string) ([]maps.MapStr, error) {
|
||||||
|
|
||||||
// Set default select fields if not provided
|
// Query member records to get team_id and role_id
|
||||||
param := model.QueryParam{
|
param := model.QueryParam{
|
||||||
Select: []interface{}{"team_id", "user_id", "member_type"},
|
Select: []interface{}{"team_id", "user_id", "member_type", "role_id"},
|
||||||
Wheres: []model.QueryWhere{
|
Wheres: []model.QueryWhere{
|
||||||
{Column: "user_id", Value: memberID},
|
{Column: "user_id", Value: memberID},
|
||||||
{Column: "member_type", Value: "user"},
|
{Column: "member_type", Value: "user"},
|
||||||
|
|
@ -264,10 +264,6 @@ func (u *DefaultUser) GetTeamsByMember(ctx context.Context, memberID string) ([]
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
if param.Select == nil {
|
|
||||||
param.Select = u.memberFields
|
|
||||||
}
|
|
||||||
|
|
||||||
m := model.Select(u.memberModel)
|
m := model.Select(u.memberModel)
|
||||||
members, err := m.Get(param)
|
members, err := m.Get(param)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -278,10 +274,17 @@ func (u *DefaultUser) GetTeamsByMember(ctx context.Context, memberID string) ([]
|
||||||
return []maps.MapStr{}, nil
|
return []maps.MapStr{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get team ids
|
// Build team_id to role_id mapping
|
||||||
|
teamRoleMap := make(map[string]string)
|
||||||
teamIDs := []string{}
|
teamIDs := []string{}
|
||||||
for _, member := range members {
|
for _, member := range members {
|
||||||
teamIDs = append(teamIDs, member["team_id"].(string))
|
teamID := member["team_id"].(string)
|
||||||
|
roleID := ""
|
||||||
|
if role, ok := member["role_id"]; ok && role != nil {
|
||||||
|
roleID = fmt.Sprintf("%v", role)
|
||||||
|
}
|
||||||
|
teamRoleMap[teamID] = roleID
|
||||||
|
teamIDs = append(teamIDs, teamID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get teams
|
// Get teams
|
||||||
|
|
@ -295,6 +298,21 @@ func (u *DefaultUser) GetTeamsByMember(ctx context.Context, memberID string) ([]
|
||||||
return nil, fmt.Errorf(ErrFailedToGetTeam, err)
|
return nil, fmt.Errorf(ErrFailedToGetTeam, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Append role_id and is_owner to each team
|
||||||
|
for i := range teams {
|
||||||
|
teamID := teams[i]["team_id"].(string)
|
||||||
|
if roleID, exists := teamRoleMap[teamID]; exists {
|
||||||
|
teams[i]["role_id"] = roleID
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if user is the owner of this team
|
||||||
|
ownerID := ""
|
||||||
|
if owner, ok := teams[i]["owner_id"]; ok && owner != nil {
|
||||||
|
ownerID = fmt.Sprintf("%v", owner)
|
||||||
|
}
|
||||||
|
teams[i]["is_owner"] = (ownerID == memberID)
|
||||||
|
}
|
||||||
|
|
||||||
return teams, nil
|
return teams, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -216,7 +216,7 @@ func LoginByUserID(userid string, ip string) (*LoginResponse, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Count User Teams
|
// Count User Teams
|
||||||
numTeams, err := countUserTeams(ctx, userid)
|
numTeams, err := getUserTeamsCount(ctx, userid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package user
|
package user
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
@ -14,7 +13,6 @@ import (
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/yaoapp/gou/session"
|
"github.com/yaoapp/gou/session"
|
||||||
"github.com/yaoapp/kun/log"
|
"github.com/yaoapp/kun/log"
|
||||||
"github.com/yaoapp/kun/maps"
|
|
||||||
"github.com/yaoapp/yao/openapi/oauth"
|
"github.com/yaoapp/yao/openapi/oauth"
|
||||||
"github.com/yaoapp/yao/openapi/response"
|
"github.com/yaoapp/yao/openapi/response"
|
||||||
"github.com/yaoapp/yao/openapi/utils"
|
"github.com/yaoapp/yao/openapi/utils"
|
||||||
|
|
@ -460,24 +458,6 @@ func getUserInfo(providerID, state string) (string, error) {
|
||||||
return value.(string), nil
|
return value.(string), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// getUserTeams gets the user teams
|
|
||||||
func getUserTeams(ctx context.Context, userID string) ([]maps.MapStr, error) {
|
|
||||||
userProvider, err := oauth.OAuth.GetUserProvider()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return userProvider.GetTeamsByMember(ctx, userID)
|
|
||||||
}
|
|
||||||
|
|
||||||
// countUserTeams counts the number of teams a user is a member of
|
|
||||||
func countUserTeams(ctx context.Context, userID string) (int64, error) {
|
|
||||||
userProvider, err := oauth.OAuth.GetUserProvider()
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return userProvider.CountTeamsByMember(ctx, userID)
|
|
||||||
}
|
|
||||||
|
|
||||||
// removeUserInfo removes the user info from cache
|
// removeUserInfo removes the user info from cache
|
||||||
func removeUserInfo(providerID, state string) error {
|
func removeUserInfo(providerID, state string) error {
|
||||||
key := userInfoKey(providerID, state)
|
key := userInfoKey(providerID, state)
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
|
@ -45,7 +44,7 @@ func GinTeamConfig(c *gin.Context) {
|
||||||
response.RespondWithSuccess(c, http.StatusOK, config)
|
response.RespondWithSuccess(c, http.StatusOK, config)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GinTeamList handles GET /teams - Get user teams
|
// GinTeamList handles GET /teams - Get user teams (all teams where user is a member)
|
||||||
func GinTeamList(c *gin.Context) {
|
func GinTeamList(c *gin.Context) {
|
||||||
// Get authorized user info
|
// Get authorized user info
|
||||||
authInfo := oauth.GetAuthorizedInfo(c)
|
authInfo := oauth.GetAuthorizedInfo(c)
|
||||||
|
|
@ -58,63 +57,8 @@ func GinTeamList(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse pagination parameters
|
// Call business logic to get user teams with roles
|
||||||
page := 1
|
teams, err := getUserTeams(c.Request.Context(), authInfo.UserID)
|
||||||
pagesize := 20
|
|
||||||
|
|
||||||
if p := c.Query("page"); p != "" {
|
|
||||||
if parsed, err := strconv.Atoi(p); err == nil && parsed > 0 {
|
|
||||||
page = parsed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ps := c.Query("pagesize"); ps != "" {
|
|
||||||
if parsed, err := strconv.Atoi(ps); err == nil && parsed > 0 && parsed <= 100 {
|
|
||||||
pagesize = parsed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get user provider instance
|
|
||||||
provider, err := getUserProvider()
|
|
||||||
if err != nil {
|
|
||||||
log.Error("Failed to get user provider: %v", err)
|
|
||||||
errorResp := &response.ErrorResponse{
|
|
||||||
Code: response.ErrServerError.Code,
|
|
||||||
ErrorDescription: "Failed to initialize user provider",
|
|
||||||
}
|
|
||||||
response.RespondWithError(c, response.StatusInternalServerError, errorResp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build query parameters
|
|
||||||
param := model.QueryParam{
|
|
||||||
Wheres: []model.QueryWhere{
|
|
||||||
{Column: "owner_id", Value: authInfo.UserID},
|
|
||||||
},
|
|
||||||
Orders: []model.QueryOrder{
|
|
||||||
{Column: "created_at", Option: "desc"},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add status filter if provided
|
|
||||||
if status := c.Query("status"); status != "" {
|
|
||||||
param.Wheres = append(param.Wheres, model.QueryWhere{
|
|
||||||
Column: "status",
|
|
||||||
Value: status,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add name search if provided
|
|
||||||
if name := c.Query("name"); name != "" {
|
|
||||||
param.Wheres = append(param.Wheres, model.QueryWhere{
|
|
||||||
Column: "name",
|
|
||||||
Value: "%" + name + "%",
|
|
||||||
OP: "like",
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get paginated teams
|
|
||||||
result, err := provider.PaginateTeams(c.Request.Context(), param, page, pagesize)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Failed to get user teams: %v", err)
|
log.Error("Failed to get user teams: %v", err)
|
||||||
errorResp := &response.ErrorResponse{
|
errorResp := &response.ErrorResponse{
|
||||||
|
|
@ -125,8 +69,8 @@ func GinTeamList(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the paginated result directly (consistent with other modules)
|
// Return teams list directly (no pagination)
|
||||||
response.RespondWithSuccess(c, http.StatusOK, result)
|
response.RespondWithSuccess(c, http.StatusOK, teams)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GinTeamGet handles GET /teams/:id - Get user team details
|
// GinTeamGet handles GET /teams/:id - Get user team details
|
||||||
|
|
@ -839,3 +783,39 @@ func mapToTeamDetailResponse(data maps.MapStr) TeamDetailResponse {
|
||||||
|
|
||||||
return team
|
return team
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Business Logic Functions for Team Membership
|
||||||
|
|
||||||
|
// getUserTeams gets all teams where the user is a member (includes role information)
|
||||||
|
func getUserTeams(ctx context.Context, userID string) ([]maps.MapStr, error) {
|
||||||
|
// Get user provider instance
|
||||||
|
provider, err := getUserProvider()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to get user provider: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get teams with role information
|
||||||
|
teams, err := provider.GetTeamsByMember(ctx, userID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to retrieve user teams: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return teams, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// getUserTeamsCount counts the number of teams a user is a member of
|
||||||
|
func getUserTeamsCount(ctx context.Context, userID string) (int64, error) {
|
||||||
|
// Get user provider instance
|
||||||
|
provider, err := getUserProvider()
|
||||||
|
if err != nil {
|
||||||
|
return 0, fmt.Errorf("failed to get user provider: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count teams
|
||||||
|
count, err := provider.CountTeamsByMember(ctx, userID)
|
||||||
|
if err != nil {
|
||||||
|
return 0, fmt.Errorf("failed to count user teams: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return count, nil
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue