tb/main #1

Open
terrabytten wants to merge 17 commits from tb/main into main
6 changed files with 44 additions and 28 deletions
Showing only changes of commit fa4561d90b - Show all commits

View file

@ -1,7 +1,7 @@
package main
import "vegan-barcode/internal/api"
import "vegan-barcode/internal/application"
func main() {
api.Start()
application.Start()
}

View file

@ -7,9 +7,13 @@ import (
"github.com/gin-gonic/gin"
)
func (a *Application) TestHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "Hello World!"})
}
func (a *Application) GetClaimsHandler(c *gin.Context) {
system := c.Query("system")
barcode := c.Query("barcode")
system := c.Param("system")
barcode := c.Param("barcode")
productClaims, err := a.GetClaims(system, barcode)
if err != nil {
@ -20,11 +24,21 @@ func (a *Application) GetClaimsHandler(c *gin.Context) {
}
func (a *Application) PostClaimHandler(c *gin.Context) {
system := c.Query("system")
barcode := c.Query("barcode")
system := c.Param("system")
barcode := c.Param("barcode")
var requestBody models.UserClaimForm
c.BindJSON(&requestBody)
err := c.BindJSON(&requestBody)
if err != nil {
c.JSON(http.StatusBadRequest, nil)
return
}
a.CreateClaim(system, barcode, requestBody)
claim, err := a.CreateClaim(system, barcode, requestBody)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, claim)
}

View file

@ -8,10 +8,10 @@ func (application *Application) bindRoutes() {
router := gin.Default()
router.Group("/claims")
{
router.GET("/:barcode", application.GetClaimsHandler)
}
router.GET("/", application.TestHandler)
router.GET("/claims/:system/:barcode", application.GetClaimsHandler)
router.POST("/claims/:system/:barcode", application.PostClaimHandler)
router.Run("localhost:8080")
}

View file

@ -2,39 +2,39 @@ package application
import (
"errors"
"vegan-barcode/internal/database"
"vegan-barcode/internal/models"
)
func (a *Application) GetClaims(system string, barcode string) (*models.ProductClaims, error) {
id, err := a.db.FindProductIDByBarcode(system, barcode)
product, err := a.db.FindProductByBarcode(system, barcode)
if err != nil {
return nil, err
}
if id == -1 {
if product == nil {
return nil, errors.New("Product not found")
}
claims, err := a.db.FindClaimsByProductID(id)
claims, err := a.db.FindClaimsByProductID(product.Id)
if err != nil {
return nil, err
}
return &models.ProductClaims{Id: id, Claims: claims}, nil
return &models.ProductClaims{Id: product.Id, Claims: claims}, nil
}
func (a *Application) CreateClaim(system string, barcode string, form models.UserClaimForm) {
id, err := a.db.FindProductIDByBarcode(system, barcode)
func (a *Application) CreateClaim(system string, barcode string, form models.UserClaimForm) (*database.UserClaim, error) {
product, err := a.db.FindProductByBarcode(system, barcode)
if err != nil {
return nil, err
}
// no product, create new
if id == -1 {
product, err := a.db.CreateProduct()
if product == nil {
product, err = a.db.CreateProduct(system, barcode)
if err != nil {
return nil, err
}
id = product.ID
}
claim, err := a.db.CreateUserClaim(id, form)
return a.db.CreateUserClaim(product.Id, form)
}

View file

@ -7,18 +7,20 @@ import (
"github.com/vingarcia/ksql"
)
func (d *Database) FindProductIDByBarcode(system string, barcode string) (id int, err error) {
func (d *Database) FindProductByBarcode(system string, barcode string) (*Product, error) {
ctx := context.Background()
ctx = ksql.InjectLogger(ctx, ksql.Logger)
err = d.db.QueryOne(ctx, &id, "SELECT id FROM products WHERE system = ? AND barcode = ?", system, barcode)
var product Product
err := d.db.QueryOne(ctx, &product, "FROM products WHERE system = $1 AND barcode = $2", system, barcode)
if err == ksql.ErrRecordNotFound {
return -1, nil
return nil, nil
}
if err != nil {
return -1, err
return nil, err
}
return
return &product, nil
}
func (d *Database) CreateProduct(system string, barcode string) (*Product, error) {

View file

@ -31,7 +31,7 @@ const (
type EvidenceType int
const (
ManufactureWebsite EvidenceType = iota
ManufacturerWebsite EvidenceType = iota
IngredientsList
)