Files
2026-05-21 19:52:45 +08:00

146 lines
4.5 KiB
Go

package v1
import (
"strconv"
"github.com/labstack/echo/v4"
"github.com/chaitin/panda-wiki/config"
"github.com/chaitin/panda-wiki/consts"
"github.com/chaitin/panda-wiki/domain"
"github.com/chaitin/panda-wiki/handler"
"github.com/chaitin/panda-wiki/log"
"github.com/chaitin/panda-wiki/middleware"
"github.com/chaitin/panda-wiki/usecase"
)
type AppHandler struct {
*handler.BaseHandler
logger *log.Logger
auth middleware.AuthMiddleware
usecase *usecase.AppUsecase
modelUsecase *usecase.ModelUsecase
conversationUsecase *usecase.ConversationUsecase
config *config.Config
}
func NewAppHandler(e *echo.Echo, baseHandler *handler.BaseHandler, logger *log.Logger, auth middleware.AuthMiddleware, usecase *usecase.AppUsecase, modelUsecase *usecase.ModelUsecase, conversationUsecase *usecase.ConversationUsecase, config *config.Config) *AppHandler {
h := &AppHandler{
BaseHandler: baseHandler,
logger: logger.WithModule("handler.v1.app"),
auth: auth,
usecase: usecase,
modelUsecase: modelUsecase,
conversationUsecase: conversationUsecase,
config: config,
}
group := e.Group("/api/v1/app", h.auth.Authorize)
group.GET("/detail", h.GetAppDetail, h.auth.ValidateKBUserPerm(consts.UserKBPermissionDocManage))
group.PUT("", h.UpdateApp, h.auth.ValidateKBUserPerm(consts.UserKBPermissionFullControl))
group.DELETE("", h.DeleteApp, h.auth.ValidateKBUserPerm(consts.UserKBPermissionFullControl))
return h
}
// GetAppDetail get app detail
//
// @Summary Get app detail
// @Description Get app detail
// @Tags app
// @Accept json
// @Produce json
// @Security bearerAuth
// @Param kb_id query string true "kb id"
// @Param type query string true "app type"
// @Success 200 {object} domain.PWResponse{data=domain.AppDetailResp}
// @Router /api/v1/app/detail [get]
func (h *AppHandler) GetAppDetail(c echo.Context) error {
kbID := c.QueryParam("kb_id")
if kbID == "" {
return h.NewResponseWithError(c, "kb id is required", nil)
}
appType := c.QueryParam("type")
if appType == "" {
return h.NewResponseWithError(c, "type is required", nil)
}
appTypeInt, err := strconv.ParseInt(appType, 10, 64)
if err != nil {
return h.NewResponseWithError(c, "invalid app type", err)
}
ctx := c.Request().Context()
app, err := h.usecase.GetAppDetailByKBIDAndAppType(ctx, kbID, domain.AppType(appTypeInt))
if err != nil {
return h.NewResponseWithError(c, "get app detail failed", err)
}
if authInfo := domain.GetAuthInfoFromCtx(ctx); authInfo != nil && authInfo.Permission == consts.UserKBPermissionDocManage {
app = h.usecase.SanitizeAppDetailForDocManage(app)
}
return h.NewResponseWithData(c, app)
}
// UpdateApp update app
//
// @Summary Update app
// @Description Update app
// @Tags app
// @Accept json
// @Produce json
// @Security bearerAuth
// @Param id query string true "id"
// @Param app body domain.UpdateAppReq true "app"
// @Success 200 {object} domain.Response
// @Router /api/v1/app [put]
func (h *AppHandler) UpdateApp(c echo.Context) error {
id := c.QueryParam("id")
if id == "" {
return h.NewResponseWithError(c, "id is required", nil)
}
appRequest := domain.UpdateAppReq{}
if err := c.Bind(&appRequest); err != nil {
return h.NewResponseWithError(c, "invalid request", err)
}
ctx := c.Request().Context()
if err := h.usecase.ValidateUpdateApp(ctx, id, &appRequest); err != nil {
h.logger.Error("UpdateApp", log.Any("req:", appRequest.Settings), log.Any("err:", err))
return h.NewResponseWithErrCode(c, domain.ErrCodePermissionDenied)
}
if err := h.usecase.UpdateApp(ctx, id, &appRequest); err != nil {
return h.NewResponseWithError(c, "update app failed", err)
}
return h.NewResponseWithData(c, nil)
}
// DeleteApp delete app
//
// @Summary Delete app
// @Description Delete app
// @Tags app
// @Accept json
// @Security bearerAuth
// @Param kb_id query string true "kb id"
// @Param id query string true "app id"
// @Success 200 {object} domain.Response
// @Router /api/v1/app [delete]
func (h *AppHandler) DeleteApp(c echo.Context) error {
id := c.QueryParam("id")
if id == "" {
return h.NewResponseWithError(c, "id is required", nil)
}
kbID := c.QueryParam("kb_id")
if kbID == "" {
return h.NewResponseWithError(c, "kb id is required", nil)
}
if err := h.usecase.DeleteApp(c.Request().Context(), id, kbID); err != nil {
return h.NewResponseWithError(c, "delete app failed", err)
}
return h.NewResponseWithData(c, nil)
}