Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
77 lines
2.6 KiB
Go
77 lines
2.6 KiB
Go
package dto
|
|
|
|
import "github.com/Tencent/WeKnora/internal/types"
|
|
|
|
// AuthLoginResponse is the HTTP-safe login / switch-tenant response shape.
|
|
type AuthLoginResponse struct {
|
|
Success bool `json:"success"`
|
|
Message string `json:"message,omitempty"`
|
|
User *types.User `json:"user,omitempty"`
|
|
ActiveTenant *TenantResponse `json:"active_tenant,omitempty"`
|
|
Memberships []types.Membership `json:"memberships"`
|
|
Token string `json:"token,omitempty"`
|
|
RefreshToken string `json:"refresh_token,omitempty"`
|
|
}
|
|
|
|
// AuthOIDCCallbackResponse is the HTTP-safe OIDC callback payload shape.
|
|
type AuthOIDCCallbackResponse struct {
|
|
Success bool `json:"success"`
|
|
Message string `json:"message,omitempty"`
|
|
User *types.User `json:"user,omitempty"`
|
|
Tenant *TenantResponse `json:"tenant,omitempty"`
|
|
Memberships []types.Membership `json:"memberships"`
|
|
Token string `json:"token,omitempty"`
|
|
RefreshToken string `json:"refresh_token,omitempty"`
|
|
IsNewUser bool `json:"is_new_user,omitempty"`
|
|
}
|
|
|
|
// NewAuthLoginResponse converts a service-layer login response for HTTP output.
|
|
func NewAuthLoginResponse(resp *types.LoginResponse) *AuthLoginResponse {
|
|
if resp == nil {
|
|
return nil
|
|
}
|
|
var role types.TenantRole
|
|
if resp.ActiveTenant != nil {
|
|
role = membershipRoleForTenant(resp.Memberships, resp.ActiveTenant.ID)
|
|
}
|
|
return &AuthLoginResponse{
|
|
Success: resp.Success,
|
|
Message: resp.Message,
|
|
User: resp.User,
|
|
ActiveTenant: NewTenantResponseWithRole(resp.ActiveTenant, role),
|
|
Memberships: resp.Memberships,
|
|
Token: resp.Token,
|
|
RefreshToken: resp.RefreshToken,
|
|
}
|
|
}
|
|
|
|
// NewAuthOIDCCallbackResponse converts an OIDC callback response for HTTP output.
|
|
func NewAuthOIDCCallbackResponse(resp *types.OIDCCallbackResponse) *AuthOIDCCallbackResponse {
|
|
if resp == nil {
|
|
return nil
|
|
}
|
|
var role types.TenantRole
|
|
if resp.Tenant != nil {
|
|
role = membershipRoleForTenant(resp.Memberships, resp.Tenant.ID)
|
|
}
|
|
return &AuthOIDCCallbackResponse{
|
|
Success: resp.Success,
|
|
Message: resp.Message,
|
|
User: resp.User,
|
|
Tenant: NewTenantResponseWithRole(resp.Tenant, role),
|
|
Memberships: resp.Memberships,
|
|
Token: resp.Token,
|
|
RefreshToken: resp.RefreshToken,
|
|
IsNewUser: resp.IsNewUser,
|
|
}
|
|
}
|
|
|
|
func membershipRoleForTenant(memberships []types.Membership, tenantID uint64) types.TenantRole {
|
|
for _, m := range memberships {
|
|
if m.TenantID == tenantID && m.Role.IsValid() {
|
|
return m.Role
|
|
}
|
|
}
|
|
return ""
|
|
}
|