add cover url route

This commit is contained in:
Tyrel Souza 2024-06-19 23:04:59 -04:00
parent 231fce5077
commit 4b3467b8b8
No known key found for this signature in database
GPG Key ID: F3614B02ACBE438E
6 changed files with 65 additions and 4 deletions

View File

@ -3,7 +3,7 @@ FROM debian:latest
# Update the package list and install MySQL client # Update the package list and install MySQL client
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
mariadb-client \ mariadb-client ca-certificates \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
# Copy the preorder binary from the local directory into the container # Copy the preorder binary from the local directory into the container

View File

@ -24,6 +24,21 @@ func FindOrder(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"data": order}) c.JSON(http.StatusOK, gin.H{"data": order})
} }
func FindOrderCover(c *gin.Context) {
var order Order
if err := config.DB.Where("id = ?", c.Param("id")).First(&order).Error; err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Record not found!"})
}
cover, err := order.fetchCoverImageURL()
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"cover_url": cover})
}
func CreateOrder(c *gin.Context) { func CreateOrder(c *gin.Context) {
var input CreateOrderInput var input CreateOrderInput
if err := c.ShouldBindJSON(&input); err != nil { if err := c.ShouldBindJSON(&input); err != nil {

View File

@ -1,11 +1,17 @@
package orders package orders
import ( import (
"encoding/json"
"io"
"net/http"
"preorder/authors" "preorder/authors"
"preorder/formats" "preorder/formats"
"strconv"
"time" "time"
) )
const googleBooksAPI = "https://www.googleapis.com/books/v1/volumes?q=isbn:"
type Order struct { type Order struct {
ID uint `json:"id" gorm:"primary_key"` ID uint `json:"id" gorm:"primary_key"`
Title string `json:"title"` Title string `json:"title"`
@ -30,14 +36,38 @@ type UpdateOrderInput struct {
Title string `json:"title"` Title string `json:"title"`
} }
func NewOrder(id uint, title string, author uint, format uint, isbn_13 uint, release_date time.Time) Order { func NewOrder(id uint, title string, author uint, format uint, isbn13 uint, releaseDate time.Time) Order {
order := Order{ order := Order{
ID: id, ID: id,
Title: title, Title: title,
AuthorID: author, AuthorID: author,
FormatID: format, FormatID: format,
ISBN13: isbn_13, ISBN13: isbn13,
ReleaseDate: release_date, ReleaseDate: releaseDate,
} }
return order return order
} }
func (o *Order) fetchCoverImageURL() (string, error) {
resp, err := http.Get(googleBooksAPI + strconv.Itoa(int(o.ISBN13)))
if err != nil {
return "", err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
var googleBooksResponse GoogleBooksResponse
if err := json.Unmarshal(body, &googleBooksResponse); err != nil {
return "", err
}
if len(googleBooksResponse.Items) > 0 {
return googleBooksResponse.Items[0].VolumeInfo.ImageLinks.Thumbnail, nil
}
return "", nil
}

View File

@ -4,6 +4,7 @@ import "github.com/gin-gonic/gin"
func ApplyOrderRouter(router *gin.Engine) *gin.Engine { func ApplyOrderRouter(router *gin.Engine) *gin.Engine {
router.GET("/orders", FindOrders) router.GET("/orders", FindOrders)
router.GET("/orders/:id/cover", FindOrderCover)
router.POST("/orders", CreateOrder) router.POST("/orders", CreateOrder)
router.GET("/orders/:id", FindOrder) router.GET("/orders/:id", FindOrder)
router.PATCH("/orders/:id", UpdateOrder) router.PATCH("/orders/:id", UpdateOrder)

11
orders/types.go Normal file
View File

@ -0,0 +1,11 @@
package orders
type GoogleBooksResponse struct {
Items []struct {
VolumeInfo struct {
ImageLinks struct {
Thumbnail string `json:"thumbnail"`
} `json:"imageLinks"`
} `json:"volumeInfo"`
} `json:"items"`
}

View File

@ -1,3 +1,7 @@
### ###
GET http://localhost:8123/orders GET http://localhost:8123/orders
Content-Type: application/json Content-Type: application/json
###
GET http://localhost:8123/orders/1/cover
Content-Type: application/json