Files
sponge/internal/handler/userExample_logic.go.exp
2025-06-21 15:54:40 +08:00

307 lines
11 KiB
Plaintext

package handler
import (
"context"
"errors"
"math"
"strings"
"time"
"github.com/go-dev-frame/sponge/pkg/copier"
"github.com/go-dev-frame/sponge/pkg/sgorm/query"
"github.com/go-dev-frame/sponge/pkg/gin/middleware"
"github.com/go-dev-frame/sponge/pkg/logger"
serverNameExampleV1 "github.com/go-dev-frame/sponge/api/serverNameExample/v1"
"github.com/go-dev-frame/sponge/internal/cache"
"github.com/go-dev-frame/sponge/internal/dao"
"github.com/go-dev-frame/sponge/internal/database"
"github.com/go-dev-frame/sponge/internal/ecode"
"github.com/go-dev-frame/sponge/internal/model"
)
var _ serverNameExampleV1.UserExampleLogicer = (*userExamplePbHandler)(nil)
var _ time.Time
type userExamplePbHandler struct {
userExampleDao dao.UserExampleDao
}
// NewUserExamplePbHandler create a handler
func NewUserExamplePbHandler() serverNameExampleV1.UserExampleLogicer {
return &userExamplePbHandler{
userExampleDao: dao.NewUserExampleDao(
database.GetDB(), // todo show db driver name here
cache.NewUserExampleCache(database.GetCacheType()),
),
}
}
// Create a new userExample
func (h *userExamplePbHandler) Create(ctx context.Context, req *serverNameExampleV1.CreateUserExampleRequest) (*serverNameExampleV1.CreateUserExampleReply, error) {
err := req.Validate()
if err != nil {
logger.Warn("req.Validate error", logger.Err(err), logger.Any("req", req), middleware.CtxRequestIDField(ctx))
return nil, ecode.InvalidParams.Err()
}
userExample := &model.UserExample{}
err = copier.Copy(userExample, req)
if err != nil {
return nil, ecode.ErrCreateUserExample.Err()
}
// Note: if copier.Copy cannot assign a value to a field, add it here
err = h.userExampleDao.Create(ctx, userExample)
if err != nil {
logger.Error("Create error", logger.Err(err), logger.Any("userExample", userExample), middleware.CtxRequestIDField(ctx))
return nil, ecode.InternalServerError.Err()
}
return &serverNameExampleV1.CreateUserExampleReply{Id: userExample.ID}, nil
}
// DeleteByID delete a userExample by id
func (h *userExamplePbHandler) DeleteByID(ctx context.Context, req *serverNameExampleV1.DeleteUserExampleByIDRequest) (*serverNameExampleV1.DeleteUserExampleByIDReply, error) {
err := req.Validate()
if err != nil {
logger.Warn("req.Validate error", logger.Err(err), logger.Any("req", req), middleware.CtxRequestIDField(ctx))
return nil, ecode.InvalidParams.Err()
}
err = h.userExampleDao.DeleteByID(ctx, req.Id)
if err != nil {
logger.Warn("DeleteByID error", logger.Err(err), middleware.CtxRequestIDField(ctx))
return nil, ecode.InternalServerError.Err()
}
return &serverNameExampleV1.DeleteUserExampleByIDReply{}, nil
}
// UpdateByID update a userExample by id
func (h *userExamplePbHandler) UpdateByID(ctx context.Context, req *serverNameExampleV1.UpdateUserExampleByIDRequest) (*serverNameExampleV1.UpdateUserExampleByIDReply, error) {
err := req.Validate()
if err != nil {
logger.Warn("req.Validate error", logger.Err(err), logger.Any("req", req), middleware.CtxRequestIDField(ctx))
return nil, ecode.InvalidParams.Err()
}
userExample := &model.UserExample{}
err = copier.Copy(userExample, req)
if err != nil {
return nil, ecode.ErrUpdateByIDUserExample.Err()
}
// Note: if copier.Copy cannot assign a value to a field, add it here
userExample.ID = req.Id
err = h.userExampleDao.UpdateByID(ctx, userExample)
if err != nil {
logger.Error("UpdateByID error", logger.Err(err), logger.Any("userExample", userExample), middleware.CtxRequestIDField(ctx))
return nil, ecode.InternalServerError.Err()
}
return &serverNameExampleV1.UpdateUserExampleByIDReply{}, nil
}
// GetByID get a userExample by id
func (h *userExamplePbHandler) GetByID(ctx context.Context, req *serverNameExampleV1.GetUserExampleByIDRequest) (*serverNameExampleV1.GetUserExampleByIDReply, error) {
err := req.Validate()
if err != nil {
logger.Warn("req.Validate error", logger.Err(err), logger.Any("req", req), middleware.CtxRequestIDField(ctx))
return nil, ecode.InvalidParams.Err()
}
record, err := h.userExampleDao.GetByID(ctx, req.Id)
if err != nil {
if errors.Is(err, database.ErrRecordNotFound) {
logger.Warn("GetByID error", logger.Err(err), logger.Any("id", req.Id), middleware.CtxRequestIDField(ctx))
return nil, ecode.NotFound.Err()
}
logger.Error("GetByID error", logger.Err(err), logger.Any("id", req.Id), middleware.CtxRequestIDField(ctx))
return nil, ecode.InternalServerError.Err()
}
data, err := convertUserExamplePb(record)
if err != nil {
logger.Warn("convertUserExample error", logger.Err(err), logger.Any("userExample", record), middleware.CtxRequestIDField(ctx))
return nil, ecode.ErrGetByIDUserExample.Err()
}
return &serverNameExampleV1.GetUserExampleByIDReply{
UserExample: data,
}, nil
}
// List get a paginated list of userExamples by custom conditions
func (h *userExamplePbHandler) List(ctx context.Context, req *serverNameExampleV1.ListUserExampleRequest) (*serverNameExampleV1.ListUserExampleReply, error) {
err := req.Validate()
if err != nil {
logger.Warn("req.Validate error", logger.Err(err), logger.Any("req", req), middleware.CtxRequestIDField(ctx))
return nil, ecode.InvalidParams.Err()
}
params := &query.Params{}
err = copier.Copy(params, req.Params)
if err != nil {
return nil, ecode.ErrListUserExample.Err()
}
// Note: if copier.Copy cannot assign a value to a field, add it here
records, total, err := h.userExampleDao.GetByColumns(ctx, params)
if err != nil {
if strings.Contains(err.Error(), "query params error:") {
logger.Warn("GetByColumns error", logger.Err(err), logger.Any("params", params), middleware.CtxRequestIDField(ctx))
return nil, ecode.InvalidParams.Err()
}
logger.Error("GetByColumns error", logger.Err(err), logger.Any("params", params), middleware.CtxRequestIDField(ctx))
return nil, ecode.InternalServerError.Err()
}
userExamples := []*serverNameExampleV1.UserExample{}
for _, record := range records {
data, err := convertUserExamplePb(record)
if err != nil {
logger.Warn("convertUserExample error", logger.Err(err), logger.Any("id", record.ID), middleware.CtxRequestIDField(ctx))
continue
}
userExamples = append(userExamples, data)
}
return &serverNameExampleV1.ListUserExampleReply{
Total: total,
UserExamples: userExamples,
}, nil
}
// DeleteByIDs batch delete userExample by ids
func (h *userExamplePbHandler) DeleteByIDs(ctx context.Context, req *serverNameExampleV1.DeleteUserExampleByIDsRequest) (*serverNameExampleV1.DeleteUserExampleByIDsReply, error) {
err := req.Validate()
if err != nil {
logger.Warn("req.Validate error", logger.Err(err), logger.Any("req", req), middleware.CtxRequestIDField(ctx))
return nil, ecode.InvalidParams.Err()
}
err = h.userExampleDao.DeleteByIDs(ctx, req.Ids)
if err != nil {
logger.Warn("DeleteByIDs error", logger.Err(err), middleware.CtxRequestIDField(ctx))
return nil, ecode.InternalServerError.Err()
}
return &serverNameExampleV1.DeleteUserExampleByIDsReply{}, nil
}
// GetByCondition get a userExample by custom condition
func (h *userExamplePbHandler) GetByCondition(ctx context.Context, req *serverNameExampleV1.GetUserExampleByConditionRequest) (*serverNameExampleV1.GetUserExampleByConditionReply, error) {
err := req.Validate()
if err != nil {
logger.Warn("req.Validate error", logger.Err(err), logger.Any("req", req), middleware.CtxRequestIDField(ctx))
return nil, ecode.InvalidParams.Err()
}
conditions := &query.Conditions{}
for _, v := range req.Conditions.GetColumns() {
column := query.Column{}
_ = copier.Copy(&column, v)
conditions.Columns = append(conditions.Columns, column)
}
err = conditions.CheckValid()
if err != nil {
logger.Warn("Parameters error", logger.Err(err), logger.Any("conditions", conditions), middleware.CtxRequestIDField(ctx))
return nil, ecode.InvalidParams.Err()
}
record, err := h.userExampleDao.GetByCondition(ctx, conditions)
if err != nil {
if errors.Is(err, database.ErrRecordNotFound) {
logger.Warn("GetByID error", logger.Err(err), logger.Any("req", req), middleware.CtxRequestIDField(ctx))
return nil, ecode.NotFound.Err()
}
logger.Error("GetByID error", logger.Err(err), logger.Any("req", req), middleware.CtxRequestIDField(ctx))
return nil, ecode.InternalServerError.Err()
}
data, err := convertUserExamplePb(record)
if err != nil {
logger.Warn("convertUserExample error", logger.Err(err), logger.Any("userExample", record), middleware.CtxRequestIDField(ctx))
return nil, ecode.ErrGetByIDUserExample.Err()
}
return &serverNameExampleV1.GetUserExampleByConditionReply{
UserExample: data,
}, nil
}
// ListByIDs batch get userExample by ids
func (h *userExamplePbHandler) ListByIDs(ctx context.Context, req *serverNameExampleV1.ListUserExampleByIDsRequest) (*serverNameExampleV1.ListUserExampleByIDsReply, error) {
err := req.Validate()
if err != nil {
logger.Warn("req.Validate error", logger.Err(err), logger.Any("req", req), middleware.CtxRequestIDField(ctx))
return nil, ecode.InvalidParams.Err()
}
userExampleMap, err := h.userExampleDao.GetByIDs(ctx, req.Ids)
if err != nil {
logger.Error("GetByIDs error", logger.Err(err), logger.Any("ids", req.Ids), middleware.CtxRequestIDField(ctx))
return nil, ecode.InternalServerError.Err()
}
userExamples := []*serverNameExampleV1.UserExample{}
for _, id := range req.Ids {
if v, ok := userExampleMap[id]; ok {
record, err := convertUserExamplePb(v)
if err != nil {
logger.Warn("convertUserExample error", logger.Err(err), logger.Any("userExample", v), middleware.CtxRequestIDField(ctx))
return nil, ecode.InternalServerError.Err()
}
userExamples = append(userExamples, record)
}
}
return &serverNameExampleV1.ListUserExampleByIDsReply{
UserExamples: userExamples,
}, nil
}
// ListByLastID get a paginated list of userExamples by last id
func (h *userExamplePbHandler) ListByLastID(ctx context.Context, req *serverNameExampleV1.ListUserExampleByLastIDRequest) (*serverNameExampleV1.ListUserExampleByLastIDReply, error) {
err := req.Validate()
if err != nil {
logger.Warn("req.Validate error", logger.Err(err), logger.Any("req", req), middleware.CtxRequestIDField(ctx))
return nil, ecode.InvalidParams.Err()
}
if req.LastID == 0 {
req.LastID = math.MaxInt32
}
records, err := h.userExampleDao.GetByLastID(ctx, req.LastID, int(req.Limit), req.Sort)
if err != nil {
logger.Error("GetByColumns error", logger.Err(err), logger.Any("req", req), middleware.CtxRequestIDField(ctx))
return nil, ecode.InternalServerError.Err()
}
userExamples := []*serverNameExampleV1.UserExample{}
for _, record := range records {
data, err := convertUserExamplePb(record)
if err != nil {
logger.Warn("convertUserExample error", logger.Err(err), logger.Any("id", record.ID), middleware.CtxRequestIDField(ctx))
continue
}
userExamples = append(userExamples, data)
}
return &serverNameExampleV1.ListUserExampleByLastIDReply{
UserExamples: userExamples,
}, nil
}
func convertUserExamplePb(record *model.UserExample) (*serverNameExampleV1.UserExample, error) {
value := &serverNameExampleV1.UserExample{}
err := copier.Copy(value, record)
if err != nil {
return nil, err
}
// Note: if copier.Copy cannot assign a value to a field, add it here
return value, nil
}