go17/book/api/book.go
2024-11-23 12:11:44 +08:00

201 lines
4.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package api
import (
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"gitlab.com/go-course-project/go17/book/config"
"gitlab.com/go-course-project/go17/book/controller"
"gitlab.com/go-course-project/go17/book/model"
"gitlab.com/go-course-project/go17/book/response"
"gorm.io/gorm"
)
// 构造函数, 用户初始化这个结构体
func NewBookHandler() *BookApiHandler {
return &BookApiHandler{
db: config.Get().MySQL.DB(),
svc: controller.NewBookController(),
}
}
// 面向对象
// BookApiHandler 他来实现接口的功能
type BookApiHandler struct {
db *gorm.DB
svc *controller.BookController
}
// 提供注册功能, 提供一个Group
// book := server.Group("/api/books")
func (h *BookApiHandler) Registry(r *gin.Engine) {
book := r.Group("/api/books")
book.POST("", h.CreateBook)
book.GET("", h.ListBook)
book.GET("/:isbn", h.GetBook)
book.PUT("/:isbn", h.UpdateBook)
book.DELETE("/:isbn", h.DeleteBook)
}
// 配置业务路有, Book类型的资源的 一套简单的CRUD
// 创建Book -> Book
// POST, Body
func (h *BookApiHandler) CreateBook(ctx *gin.Context) {
// 获取Book用户传达的参数
req := new(model.BookSpec)
if err := ctx.ShouldBindJSON(req); err != nil {
response.Failed(ctx, err)
return
}
ins, err := h.svc.CreateBook(ctx.Request.Context(), req)
if err != nil {
response.Failed(ctx, err)
return
}
response.Success(ctx, ins)
}
// 查询Book列表 -> []*Book
// SELECT * FROM `books`
func (h *BookApiHandler) ListBook(ctx *gin.Context) {
var books []model.Book
if err := h.db.Find(&books).Error; err != nil {
response.Failed(ctx, err)
return
}
ctx.JSON(http.StatusOK, books)
}
// 查询Book详情
func (h *BookApiHandler) GetBook(ctx *gin.Context) {
strId := ctx.Param("isbn")
id, err := strconv.ParseInt(strId, 10, 64)
if err != nil {
response.Failed(ctx, err)
return
}
// 传递HTTP请求的上下文
ins, err := h.svc.GetBook(ctx.Request.Context(), &controller.GetBookRequest{
Isbn: id,
})
if err != nil {
response.Failed(ctx, err)
return
}
ctx.JSON(http.StatusOK, ins)
}
// 更新Book
func (h *BookApiHandler) UpdateBook(ctx *gin.Context) {
var ins model.Book
id := ctx.Param("isbn")
if err := h.db.Where("isbn = ?", id).Take(&ins).Error; err != nil {
response.Failed(ctx, err)
return
}
ctx.JSON(http.StatusOK, ins)
}
// 删除Book
func (h *BookApiHandler) DeleteBook(ctx *gin.Context) {
id := ctx.Param("isbn")
if err := h.db.Where("isbn = ?", id).Delete(model.Book{}).Error; err != nil {
response.Failed(ctx, err)
return
}
}
func Registry(r *gin.Engine) {
// // 配置业务路有, Book类型的资源的 一套简单的CRUD
// // 创建Book -> Book
// // POST, Body
// book := server.Group("/api/books")
// book.POST("", func(ctx *gin.Context) {
// // 获取Book用户传达的参数
// ins := new(Book)
// if err := ctx.ShouldBindJSON(ins); err != nil {
// Failed(ctx, err)
// return
// }
// // book, save
// if err := db.Save(ins).Error; err != nil {
// Failed(ctx, err)
// return
// }
// ctx.JSON(http.StatusOK, ins)
// })
// // 查询Book列表 -> []*Book
// // SELECT * FROM `books`
// book.GET("", func(ctx *gin.Context) {
// var books []Book
// if err := db.Find(&books).Error; err != nil {
// Failed(ctx, err)
// return
// }
// ctx.JSON(http.StatusOK, books)
// })
// // 查询Book详情
// book.GET("/:isbn", func(ctx *gin.Context) {
// var ins Book
// id := ctx.Param("isbn")
// if err := db.Where("isbn = ?", id).Take(&ins).Error; err != nil {
// Failed(ctx, fmt.Errorf("Book not found"))
// return
// }
// ctx.JSON(http.StatusOK, ins)
// })
// // 更新Book
// book.PUT("/:isbn", func(ctx *gin.Context) {
// id := ctx.Param("isbn")
// // 获取用户参数, 读取用户的更新参数
// req := BookSpec{}
// if err := ctx.ShouldBindJSON(&req); err != nil {
// Failed(ctx, err)
// return
// }
// // gorm更新是如果字段为零值 就不更新该字段, is_sale 没办法更新为false
// // 如果越到零值,也需要更新,则需要转化为 指针类型
// if err := db.Where("isbn = ?", id).Model(&Book{}).Updates(req).Error; err != nil {
// Failed(ctx, err)
// return
// }
// // 针对有零值的字段独立更新
// // if err := db.Where("isbn = ?", id).Model(&Book{}).Update("is_sale", req.IsSale).Error; err != nil {
// // Failed(ctx, err)
// // return
// // }
// // // ......
// // 再次查询出来
// var ins Book
// if err := db.Where("isbn = ?", id).Take(&ins).Error; err != nil {
// Failed(ctx, fmt.Errorf("Book not found"))
// return
// }
// // 查询出更新后的数据
// ctx.JSON(http.StatusOK, ins)
// })
//
// // 删除Book
//
// book.DELETE("/:isbn", func(ctx *gin.Context) {
// id := ctx.Param("isbn")
// if err := db.Where("isbn = ?", id).Delete(&Book{}).Error; err != nil {
// Failed(ctx, err)
// return
// }
// })
}