Files
moteva/server/internal/errorx/error.go
T
root 789f51b29e feat(server): add brand kit management and project binding
Add a brand kit domain with memory and postgres stores, a BrandKitService
for CRUD and resolution, and REST endpoints to list, upsert, and delete
brand kits. Projects can bind a brand kit whose resolved context and
reference images feed into the agent's long-term memory and design prompts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 20:58:55 +08:00

76 lines
4.4 KiB
Go

package errorx
import (
"context"
"errors"
"net/http"
"img_infinite_canvas/internal/domain/brandkit"
"img_infinite_canvas/internal/domain/design"
authmodule "img_infinite_canvas/internal/modules/auth"
sharingmodule "img_infinite_canvas/internal/modules/sharing"
)
type CodeError struct {
Code int `json:"code"`
Message string `json:"message"`
}
func (e *CodeError) Error() string {
return e.Message
}
func NewCodeError(code int, message string) error {
return &CodeError{Code: code, Message: message}
}
func Handle(ctx context.Context, err error) (int, any) {
var codeErr *CodeError
switch {
case errors.As(err, &codeErr):
return codeErr.Code, map[string]any{"error": codeErr.Message, "code": codeErr.Code}
case errors.Is(err, design.ErrNotFound):
return http.StatusNotFound, map[string]any{"error": design.ErrNotFound.Error(), "code": http.StatusNotFound}
case errors.Is(err, design.ErrInvalidInput):
return http.StatusBadRequest, map[string]any{"error": err.Error(), "code": http.StatusBadRequest}
case errors.Is(err, design.ErrConflict):
return http.StatusConflict, map[string]any{"error": err.Error(), "code": http.StatusConflict}
case errors.Is(err, brandkit.ErrNotFound):
return http.StatusNotFound, map[string]any{"error": brandkit.ErrNotFound.Error(), "errorCode": "brand_kit.not_found", "code": http.StatusNotFound}
case errors.Is(err, brandkit.ErrInvalidInput):
return http.StatusBadRequest, map[string]any{"error": err.Error(), "errorCode": "brand_kit.invalid_input", "code": http.StatusBadRequest}
case errors.Is(err, brandkit.ErrConflict):
return http.StatusConflict, map[string]any{"error": err.Error(), "errorCode": "brand_kit.conflict", "code": http.StatusConflict}
case errors.Is(err, authmodule.ErrCodeInvalid):
return http.StatusUnauthorized, map[string]any{"error": err.Error(), "errorCode": "auth.code_invalid", "code": http.StatusUnauthorized}
case errors.Is(err, authmodule.ErrCodeExpired):
return http.StatusUnauthorized, map[string]any{"error": err.Error(), "errorCode": "auth.code_expired", "code": http.StatusUnauthorized}
case errors.Is(err, authmodule.ErrInvalidCredentials):
return http.StatusUnauthorized, map[string]any{"error": err.Error(), "errorCode": "auth.invalid_credentials", "code": http.StatusUnauthorized}
case errors.Is(err, authmodule.ErrInvalidRegion):
return http.StatusBadRequest, map[string]any{"error": err.Error(), "errorCode": "auth.invalid_region", "code": http.StatusBadRequest}
case errors.Is(err, authmodule.ErrHumanVerificationRequired):
return http.StatusBadRequest, map[string]any{"error": err.Error(), "errorCode": "auth.human_verification_required", "code": http.StatusBadRequest}
case errors.Is(err, authmodule.ErrHumanVerificationInvalid):
return http.StatusBadRequest, map[string]any{"error": err.Error(), "errorCode": "auth.human_verification_failed", "code": http.StatusBadRequest}
case errors.Is(err, authmodule.ErrProviderNotReady):
return http.StatusBadRequest, map[string]any{"error": err.Error(), "errorCode": "auth.provider_not_ready", "code": http.StatusBadRequest}
case errors.Is(err, sharingmodule.ErrLoginRequired):
return http.StatusUnauthorized, map[string]any{"error": err.Error(), "errorCode": "share.login_required", "code": http.StatusUnauthorized}
case errors.Is(err, sharingmodule.ErrSelfInvite):
return http.StatusConflict, map[string]any{"error": err.Error(), "errorCode": "share.self_invite", "code": http.StatusConflict}
case errors.Is(err, sharingmodule.ErrMemberExists):
return http.StatusConflict, map[string]any{"error": err.Error(), "errorCode": "share.member_exists", "code": http.StatusConflict}
case errors.Is(err, sharingmodule.ErrForbidden):
return http.StatusForbidden, map[string]any{"error": err.Error(), "errorCode": "share.forbidden", "code": http.StatusForbidden}
case errors.Is(err, sharingmodule.ErrNotFound):
return http.StatusNotFound, map[string]any{"error": sharingmodule.ErrNotFound.Error(), "errorCode": "share.not_found", "code": http.StatusNotFound}
case errors.Is(err, sharingmodule.ErrInvalidInput):
return http.StatusBadRequest, map[string]any{"error": err.Error(), "errorCode": "share.invalid_input", "code": http.StatusBadRequest}
case errors.Is(err, context.Canceled):
return http.StatusRequestTimeout, map[string]any{"error": "request canceled", "code": http.StatusRequestTimeout}
default:
return http.StatusInternalServerError, map[string]any{"error": err.Error(), "code": http.StatusInternalServerError}
}
}