package admin import ( "context" authv1 "service.xpcool.com/api/admin/admin/login" menuv1 "service.xpcool.com/api/admin/system/menu" "service.xpcool.com/internal/model/dto" auth "service.xpcool.com/internal/service/admin/admin/login" menu "service.xpcool.com/internal/service/admin/system/menu" ) // ProfileController 暴露当前登录管理员的资料端点 // (login-only, no X-Permission required). Bind behind AdminAuthOnly. type ProfileController struct{} // NewProfile 创建资料控制器。 func NewProfile() *ProfileController { return &ProfileController{} } // Info 返回当前管理员资料。 func (c *ProfileController) Info(ctx context.Context, req *authv1.InfoReq) (res *authv1.InfoRes, err error) { info, err := auth.AdminAuth().Info(ctx, adminID(ctx)) if err != nil { return nil, err } return &authv1.InfoRes{AdminID: info.AdminID, Username: info.Username, Nickname: info.Nickname, Roles: info.Roles}, nil } // Codes 返回当前管理员的按钮级权限码。 func (c *ProfileController) Codes(ctx context.Context, req *authv1.CodesReq) (res *authv1.CodesRes, err error) { codes, err := auth.AdminAuth().Codes(ctx, adminID(ctx)) if err != nil { return nil, err } return &authv1.CodesRes{Codes: codes}, nil } // Routes 返回当前管理员的可见菜单树(vben 路由)。 func (c *ProfileController) Routes(ctx context.Context, req *menuv1.MenuRoutesReq) (res *menuv1.MenuRoutesRes, err error) { routes, err := menu.AdminMenu().Routes(ctx, adminID(ctx)) if err != nil { return nil, err } out := make([]*menuv1.RouteItem, 0, len(routes)) for _, r := range routes { out = append(out, toV1Route(r)) } return &menuv1.MenuRoutesRes{Routes: out}, nil } // toV1Route 将 dto 路由树转换为 API 层结构。 func toV1Route(r *dto.RouteItem) *menuv1.RouteItem { item := &menuv1.RouteItem{ Name: r.Name, Path: r.Path, Component: r.Component, Meta: menuv1.RouteMeta{ Title: r.Meta.Title, Icon: r.Meta.Icon, Order: r.Meta.Order, Authority: r.Meta.Authority, HideInMenu: r.Meta.HideInMenu, }, } for _, c := range r.Children { item.Children = append(item.Children, toV1Route(c)) } return item }