3d47227fbd
Remove embedded frontend and workflow editor assets, add standalone API deployment configuration, and retain the current backend service updates.
161 lines
4.1 KiB
Go
161 lines
4.1 KiB
Go
package api
|
|
|
|
import (
|
|
"agent-desk/internal/pkg/config"
|
|
"agent-desk/internal/pkg/dto/request"
|
|
"agent-desk/internal/pkg/dto/response"
|
|
"agent-desk/internal/pkg/httpx"
|
|
"agent-desk/internal/pkg/httpx/params"
|
|
"agent-desk/internal/services"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func Login(ctx *gin.Context) {
|
|
cfg := config.Current()
|
|
req := request.LoginRequest{}
|
|
if err := params.ReadJSON(ctx, &req); err != nil {
|
|
httpx.WriteJSON(ctx, err)
|
|
return
|
|
}
|
|
|
|
ret, err := services.AuthService.Login(req, cfg.Auth, ctx.ClientIP(), ctx.GetHeader("User-Agent"))
|
|
if err != nil {
|
|
httpx.WriteJSON(ctx, err)
|
|
return
|
|
}
|
|
httpx.WriteJSON(ctx, ret)
|
|
}
|
|
|
|
func PublicConfig(ctx *gin.Context) {
|
|
cfg := config.Current()
|
|
httpx.WriteJSON(ctx, &response.PublicConfigResponse{
|
|
Language: cfg.LanguageOrDefault(),
|
|
WxWorkEnabled: cfg.WxWork.Enabled,
|
|
OIDCEnabled: cfg.OIDC.Enabled,
|
|
})
|
|
}
|
|
|
|
func WxWorkLogin(ctx *gin.Context) {
|
|
loginURL, err := services.WxWorkLoginService.BuildWxWorkLoginURL(ctx.Query("next"))
|
|
if err != nil {
|
|
redirectToFrontend(ctx, "/login?wxworkError="+url.QueryEscape(wxWorkErrorMessage(err.Error())))
|
|
return
|
|
}
|
|
ctx.Redirect(http.StatusFound, loginURL)
|
|
}
|
|
|
|
func WxWorkQRLogin(ctx *gin.Context) {
|
|
loginURL, err := services.WxWorkLoginService.BuildWxWorkQRCodeLoginURL(ctx.Query("next"))
|
|
if err != nil {
|
|
redirectToFrontend(ctx, "/login?wxworkError="+url.QueryEscape(wxWorkErrorMessage(err.Error())))
|
|
return
|
|
}
|
|
ctx.Redirect(http.StatusFound, loginURL)
|
|
}
|
|
|
|
func WxWorkCallback(ctx *gin.Context) {
|
|
cfg := config.Current()
|
|
ticket, next, err := services.WxWorkLoginService.LoginByWxWork(
|
|
ctx.Query("code"),
|
|
ctx.Query("state"),
|
|
cfg.Auth,
|
|
ctx.ClientIP(),
|
|
ctx.GetHeader("User-Agent"),
|
|
)
|
|
if err != nil {
|
|
redirectToFrontend(ctx, "/login?wxworkError="+url.QueryEscape(wxWorkErrorMessage(err.Error())))
|
|
return
|
|
}
|
|
redirectToFrontend(ctx, "/dashboard/login/wxwork/callback?ticket="+url.QueryEscape(ticket)+"&next="+url.QueryEscape(next))
|
|
}
|
|
|
|
func WxWorkExchange(ctx *gin.Context) {
|
|
req := request.WxWorkExchangeRequest{}
|
|
if err := params.ReadJSON(ctx, &req); err != nil {
|
|
httpx.WriteJSON(ctx, err)
|
|
return
|
|
}
|
|
ret, err := services.WxWorkLoginService.ExchangeWxWorkLoginTicket(req.Ticket)
|
|
if err != nil {
|
|
httpx.WriteJSON(ctx, err)
|
|
return
|
|
}
|
|
httpx.WriteJSON(ctx, ret)
|
|
}
|
|
|
|
func OIDCLogin(ctx *gin.Context) {
|
|
loginURL, err := services.OIDCLoginService.BuildOIDCLoginURL(ctx.Query("next"))
|
|
if err != nil {
|
|
redirectToFrontend(ctx, "/dashboard/login?oidcError="+url.QueryEscape(loginErrorMessage(err.Error())))
|
|
return
|
|
}
|
|
ctx.Redirect(http.StatusFound, loginURL)
|
|
}
|
|
|
|
func OIDCCallback(ctx *gin.Context) {
|
|
cfg := config.Current()
|
|
ticket, next, err := services.OIDCLoginService.LoginByOIDC(
|
|
ctx.Request.Context(),
|
|
ctx.Query("code"),
|
|
ctx.Query("state"),
|
|
cfg.Auth,
|
|
ctx.ClientIP(),
|
|
ctx.GetHeader("User-Agent"),
|
|
)
|
|
if err != nil {
|
|
redirectToFrontend(ctx, "/dashboard/login?oidcError="+url.QueryEscape(loginErrorMessage(err.Error())))
|
|
return
|
|
}
|
|
redirectToFrontend(ctx, "/dashboard/login/oidc/callback?ticket="+url.QueryEscape(ticket)+"&next="+url.QueryEscape(next))
|
|
}
|
|
|
|
func OIDCExchange(ctx *gin.Context) {
|
|
req := request.OIDCExchangeRequest{}
|
|
if err := params.ReadJSON(ctx, &req); err != nil {
|
|
httpx.WriteJSON(ctx, err)
|
|
return
|
|
}
|
|
ret, err := services.OIDCLoginService.ExchangeOIDCLoginTicket(req.Ticket)
|
|
if err != nil {
|
|
httpx.WriteJSON(ctx, err)
|
|
return
|
|
}
|
|
httpx.WriteJSON(ctx, ret)
|
|
}
|
|
|
|
func Logout(ctx *gin.Context) {
|
|
if err := services.AuthService.Logout(ctx.GetHeader("Authorization")); err != nil {
|
|
httpx.WriteJSON(ctx, err)
|
|
return
|
|
}
|
|
httpx.WriteJSON(ctx, nil)
|
|
}
|
|
|
|
func Profile(ctx *gin.Context) {
|
|
ret, err := services.AuthService.CurrentProfile(ctx)
|
|
if err != nil {
|
|
httpx.WriteJSON(ctx, err)
|
|
return
|
|
}
|
|
httpx.WriteJSON(ctx, ret)
|
|
}
|
|
|
|
func wxWorkErrorMessage(message string) string {
|
|
return loginErrorMessage(message)
|
|
}
|
|
|
|
func loginErrorMessage(message string) string {
|
|
if idx := strings.Index(message, ": "); idx >= 0 {
|
|
message = message[idx+2:]
|
|
}
|
|
return message
|
|
}
|
|
|
|
func redirectToFrontend(ctx *gin.Context, path string) {
|
|
ctx.Redirect(http.StatusFound, config.Current().Server.FrontendBaseURL()+path)
|
|
}
|