89 lines
2.3 KiB
Go
Raw Normal View History

2025-05-11 15:09:56 +08:00
package controllers
import (
"context"
"122.51.31.227/go-course/go18/book/v3/config"
2025-05-11 17:19:48 +08:00
"122.51.31.227/go-course/go18/book/v3/exception"
2025-05-11 15:09:56 +08:00
"122.51.31.227/go-course/go18/book/v3/models"
2025-05-25 16:59:22 +08:00
"122.51.31.227/go-course/go18/skills/ioc"
2025-05-11 17:19:48 +08:00
"gorm.io/gorm"
2025-05-11 15:09:56 +08:00
)
2025-05-25 16:59:22 +08:00
func GetBookService() *BookController {
return ioc.Controller.Get("book_controller").(*BookController)
}
func init() {
ioc.Controller.Registry("book_controller", &BookController{})
}
2025-05-11 15:09:56 +08:00
type BookController struct {
2025-05-25 16:59:22 +08:00
ioc.ObjectImpl
2025-05-11 15:09:56 +08:00
}
2025-05-11 16:23:14 +08:00
func NewGetBookRequest(bookNumber int) *GetBookRequest {
2025-05-11 15:09:56 +08:00
return &GetBookRequest{
BookNumber: bookNumber,
}
}
type GetBookRequest struct {
2025-05-11 16:23:14 +08:00
BookNumber int
2025-05-11 15:09:56 +08:00
// RequestId string
// ...
}
// 核心功能
// ctx: Trace, 支持请求的取消, request_id
// GetBookRequest 为什么要把他封装为1个对象, GetBook(ctx context.Context, BookNumber string), 保证你的接口的签名的兼容性
// BookController.GetBook(, "")
func (c *BookController) GetBook(ctx context.Context, in *GetBookRequest) (*models.Book, error) {
// context.WithValue(ctx, "request_id", 111)
// ctx.Value("request_id")
2025-05-11 16:23:14 +08:00
config.L().Debug().Msgf("get book: %d", in.BookNumber)
2025-05-11 15:09:56 +08:00
bookInstance := &models.Book{}
// 需要从数据库中获取一个对象
if err := config.DB().Where("id = ?", in.BookNumber).Take(bookInstance).Error; err != nil {
2025-05-11 17:19:48 +08:00
if err == gorm.ErrRecordNotFound {
return nil, exception.ErrNotFound("book number: %d not found", in.BookNumber)
}
2025-05-11 15:09:56 +08:00
return nil, err
}
return bookInstance, nil
}
2025-05-11 16:23:14 +08:00
func (c *BookController) CreateBook(ctx context.Context, in *models.BookSpec) (*models.Book, error) {
// 有没有能够检查某个字段是否是必须填
// Gin 集成 validator这个库, 通过 struct tag validate 来表示这个字段是否允许为空
// validate:"required"
// 在数据Bind的时候这个逻辑会自动运行
// if bookSpecInstance.Author == "" {
// ctx.JSON(400, gin.H{"code": 400, "message": err.Error()})
// return
// }
bookInstance := &models.Book{BookSpec: *in}
// 数据入库(Grom), 补充自增Id的值
if err := config.DB().Save(bookInstance).Error; err != nil {
return nil, err
}
return bookInstance, nil
}
2025-05-25 09:57:28 +08:00
func (c *BookController) UpdateBook() {
// update(obj)
// config.DB().Updates()
}
func (c *BookController) update(ctx context.Context, obj models.Book) error {
// obj.UpdateTime = now()
// config.DB().Updates()
return nil
}