refactor(auth): delegate access control to be-system

Remove Agent Desk users, roles, login sessions, tokens, and local permission persistence. Expose the backend as an embeddable ai-agent module with host-provided subject lookup and operation authorization callbacks, and complete the frontend/backend repository split.
This commit is contained in:
t
2026-08-21 00:41:07 +08:00
parent 3d47227fbd
commit 2bbf42b741
447 changed files with 1901 additions and 8920 deletions
+6 -6
View File
@@ -1,10 +1,10 @@
package builders
import (
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"agent-desk/internal/pkg/utils"
"agent-desk/internal/services"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/utils"
"code.tczkiot.com/wlw/ai-agent/internal/services"
)
func BuildAgentProfileList(items []models.AgentProfile) []response.AgentProfileResponse {
@@ -26,7 +26,7 @@ func BuildAgentProfileList(items []models.AgentProfile) []response.AgentProfileR
users := services.UserService.FindByIds(userIDs)
teams := services.AgentTeamService.FindByIds(teamIDs)
userMap := make(map[int64]*models.User, len(users))
userMap := make(map[int64]*services.ExternalUser, len(users))
for i := range users {
userMap[users[i].ID] = &users[i]
}
@@ -51,7 +51,7 @@ func BuildAgentProfileResponse(item *models.AgentProfile) *response.AgentProfile
return doBuildAgentProfileResponse(item, user, team)
}
func doBuildAgentProfileResponse(item *models.AgentProfile, user *models.User, team *models.AgentTeam) *response.AgentProfileResponse {
func doBuildAgentProfileResponse(item *models.AgentProfile, user *services.ExternalUser, team *models.AgentTeam) *response.AgentProfileResponse {
if item == nil {
return nil
}
+2 -2
View File
@@ -1,8 +1,8 @@
package builders
import (
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
)
func BuildAgentRevision(item *models.AgentRevision) response.AgentRevisionResponse {
+2 -2
View File
@@ -3,8 +3,8 @@ package builders
import (
"time"
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
)
func BuildAgentRun(item *models.AgentRun) response.AgentRunResponse {
@@ -1,8 +1,8 @@
package builders
import (
"agent-desk/internal/pkg/dto/response"
"agent-desk/internal/services"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/services"
"time"
)
+5 -5
View File
@@ -4,11 +4,11 @@ import (
"encoding/json"
"time"
"agent-desk/internal/ai/workflow/dsl"
workflowregistry "agent-desk/internal/ai/workflow/registry"
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"agent-desk/internal/services"
"code.tczkiot.com/wlw/ai-agent/internal/ai/workflow/dsl"
workflowregistry "code.tczkiot.com/wlw/ai-agent/internal/ai/workflow/registry"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/services"
)
func BuildAIWorkflow(item *models.AIWorkflow) response.AIWorkflowResponse {
@@ -5,9 +5,9 @@ import (
"testing"
"time"
"agent-desk/internal/ai/workflow/dsl"
workflowregistry "agent-desk/internal/ai/workflow/registry"
"agent-desk/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/ai/workflow/dsl"
workflowregistry "code.tczkiot.com/wlw/ai-agent/internal/ai/workflow/registry"
"code.tczkiot.com/wlw/ai-agent/internal/models"
)
func TestBuildAIWorkflowNodeSpecsIncludesVariableContracts(t *testing.T) {
+3 -3
View File
@@ -1,9 +1,9 @@
package builders
import (
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"agent-desk/internal/services/storage"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/services/storage"
"log/slog"
)
+2 -2
View File
@@ -1,8 +1,8 @@
package builders
import (
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
"time"
)
+6 -6
View File
@@ -3,12 +3,12 @@ package builders
import (
"strings"
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"agent-desk/internal/pkg/enums"
"agent-desk/internal/pkg/i18nx"
"agent-desk/internal/pkg/utils"
"agent-desk/internal/services"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/enums"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/i18nx"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/utils"
"code.tczkiot.com/wlw/ai-agent/internal/services"
"github.com/mlogclub/simple/sqls"
)
@@ -5,9 +5,9 @@ import (
"strings"
"testing"
"agent-desk/internal/models"
"agent-desk/internal/pkg/enums"
"agent-desk/internal/pkg/i18nx"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/enums"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/i18nx"
)
func TestLocalizeConversationSummary(t *testing.T) {
+4 -4
View File
@@ -1,10 +1,10 @@
package builders
import (
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"agent-desk/internal/pkg/utils"
"agent-desk/internal/services"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/utils"
"code.tczkiot.com/wlw/ai-agent/internal/services"
"time"
)
@@ -1,9 +1,9 @@
package builders
import (
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"agent-desk/internal/pkg/utils"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/utils"
"time"
)
+3 -3
View File
@@ -1,9 +1,9 @@
package builders
import (
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"agent-desk/internal/pkg/enums"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/enums"
"encoding/json"
)
+4 -4
View File
@@ -1,10 +1,10 @@
package builders
import (
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"agent-desk/internal/pkg/i18nx"
"agent-desk/internal/pkg/utils"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/i18nx"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/utils"
"regexp"
"strings"
)
@@ -3,8 +3,8 @@ package builders
import (
"testing"
"agent-desk/internal/models"
"agent-desk/internal/pkg/i18nx"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/i18nx"
)
func TestBuildNotificationListReturnsEmptySlice(t *testing.T) {
+2 -2
View File
@@ -1,8 +1,8 @@
package builders
import (
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
)
func BuildQuickReplyResponse(item *models.QuickReply) *response.QuickReplyResponse {
+3 -3
View File
@@ -3,9 +3,9 @@ package builders
import (
"encoding/json"
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"agent-desk/internal/pkg/enums"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/enums"
)
func BuildSkillDefinitionResponse(item *models.SkillDefinition) response.SkillDefinitionResponse {
+2 -2
View File
@@ -1,8 +1,8 @@
package builders
import (
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
"time"
)
+7 -7
View File
@@ -4,20 +4,20 @@ import (
"encoding/json"
"strings"
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"agent-desk/internal/pkg/utils"
"agent-desk/internal/services"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/response"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/utils"
"code.tczkiot.com/wlw/ai-agent/internal/services"
)
type TicketBuildContext struct {
TagsByTicketID map[int64][]models.Tag
Users map[int64]*models.User
Users map[int64]*services.ExternalUser
Customers map[int64]*models.Customer
}
type TicketDetailBuildContext struct {
Users map[int64]*models.User
Users map[int64]*services.ExternalUser
}
func BuildTicket(item *models.Ticket) *response.TicketResponse {
@@ -180,7 +180,7 @@ func BuildTicketViewList(list []models.TicketView) []response.TicketViewResponse
return results
}
func buildTicketUserDisplayName(user *models.User) string {
func buildTicketUserDisplayName(user *services.ExternalUser) string {
if user == nil {
return ""
}
+5 -4
View File
@@ -4,8 +4,9 @@ import (
"testing"
"time"
"agent-desk/internal/models"
"agent-desk/internal/pkg/enums"
"code.tczkiot.com/wlw/ai-agent/internal/models"
"code.tczkiot.com/wlw/ai-agent/internal/pkg/enums"
"code.tczkiot.com/wlw/ai-agent/internal/services"
)
func TestBuildLightweightTicket(t *testing.T) {
@@ -32,7 +33,7 @@ func TestBuildLightweightTicket(t *testing.T) {
TagsByTicketID: map[int64][]models.Tag{
12: {{ID: 8, Name: "登录", Status: enums.StatusOk}},
},
Users: map[int64]*models.User{
Users: map[int64]*services.ExternalUser{
5: {ID: 5, Username: "agent", Nickname: "客服"},
},
Customers: map[int64]*models.Customer{
@@ -101,7 +102,7 @@ func TestBuildTicketProgress(t *testing.T) {
CreatedAt: now,
}
ctx := &TicketDetailBuildContext{
Users: map[int64]*models.User{
Users: map[int64]*services.ExternalUser{
3: {ID: 3, Username: "agent", Nickname: "客服"},
},
}
-68
View File
@@ -1,68 +0,0 @@
package builders
import (
"agent-desk/internal/models"
"agent-desk/internal/pkg/dto/response"
"agent-desk/internal/pkg/utils"
"agent-desk/internal/services"
)
type UserBuildOptions struct {
Roles bool
Permissions bool
}
func BuildUserList(items []models.User, options UserBuildOptions) []response.UserResponse {
results := make([]response.UserResponse, 0, len(items))
for _, item := range items {
results = append(results, *BuildUserResponse(&item, options))
}
return results
}
func BuildUserResponse(item *models.User, options UserBuildOptions) *response.UserResponse {
if item == nil {
return nil
}
ret := &response.UserResponse{
ID: item.ID,
Username: item.Username,
Nickname: item.Nickname,
Avatar: item.Avatar,
Status: item.Status,
LastLoginAt: utils.FormatTimePtr(item.LastLoginAt),
LastLoginIP: item.LastLoginIP,
}
if item.Mobile != nil {
ret.Mobile = *item.Mobile
}
if item.Email != nil {
ret.Email = *item.Email
}
if options.Roles {
ret.Roles = buildAssignedRoles(item.ID)
}
if options.Permissions {
permissionCodes, _ := services.AuthService.GetUserPermissions(item.ID)
ret.Permissions = permissionCodes
}
return ret
}
func buildAssignedRoles(userID int64) []response.RoleResponse {
roles, _ := services.AuthService.GetUserRoles(userID)
results := make([]response.RoleResponse, 0, len(roles))
for _, role := range roles {
results = append(results, response.RoleResponse{
ID: role.ID,
Name: role.Name,
Code: role.Code,
Status: role.Status,
IsSystem: role.IsSystem,
SortNo: role.SortNo,
})
}
return results
}