add create product endpoint

This commit is contained in:
katefort 2025-04-21 19:13:58 -05:00
parent 43c183c29a
commit 561b8841fc
7 changed files with 104 additions and 23 deletions

View file

@ -2,12 +2,13 @@ package application
import (
"net/http"
"vegan-barcode/internal/models"
"github.com/gin-gonic/gin"
)
func (a *Application) GetClaimsHandler(c *gin.Context) {
system := c.DefaultQuery("system", "upc")
system := c.Query("system")
barcode := c.Query("barcode")
productClaims, err := a.GetClaims(system, barcode)
@ -17,3 +18,13 @@ func (a *Application) GetClaimsHandler(c *gin.Context) {
}
c.JSON(http.StatusOK, productClaims)
}
func (a *Application) PostClaimHandler(c *gin.Context) {
system := c.Query("system")
barcode := c.Query("barcode")
var requestBody models.UserClaimForm
c.BindJSON(&requestBody)
a.CreateClaim(system, barcode, requestBody)
}

View file

@ -1,6 +1,7 @@
package application
import (
"errors"
"vegan-barcode/internal/models"
)
@ -9,6 +10,9 @@ func (a *Application) GetClaims(system string, barcode string) (*models.ProductC
if err != nil {
return nil, err
}
if id == -1 {
return nil, errors.New("Product not found")
}
claims, err := a.db.FindClaimsByProductID(id)
if err != nil {
@ -17,3 +21,20 @@ func (a *Application) GetClaims(system string, barcode string) (*models.ProductC
return &models.ProductClaims{Id: id, Claims: claims}, nil
}
func (a *Application) CreateClaim(system string, barcode string, form models.UserClaimForm) {
id, err := a.db.FindProductIDByBarcode(system, barcode)
if err != nil {
return nil, err
}
// no product, create new
if id == -1 {
product, err := a.db.CreateProduct()
if err != nil {
return nil, err
}
id = product.ID
}
claim, err := a.db.CreateUserClaim(id, form)
}

View file

@ -5,10 +5,10 @@ import (
"vegan-barcode/internal/models"
)
func (database *Database) FindClaimsByProductID(product_id int) (claims []models.Claim, err error) {
func (d *Database) FindClaimsByProductID(product_id int) (claims []models.Claim, err error) {
ctx := context.Background()
err = database.db.Query(ctx, claims, `
err = d.db.Query(ctx, claims, `
SELECT
cluster,
id,
@ -55,3 +55,21 @@ func (database *Database) FindClaimsByProductID(product_id int) (claims []models
}
return
}
func (d *Database) CreateUserClaim(id int, form models.UserClaimForm) (*UserClaim, error) {
ctx := context.Background()
var uc = UserClaim{
Id: id,
Evidence_type: form.Evidence_type,
Evidence: form.Evidence,
Claims: form.Claims,
Counterclaims: form.Counterclaims,
}
err := d.db.Insert(ctx, UserClaimsTable, uc)
if err != nil {
return nil, err
}
return &uc, nil
}

View file

@ -63,8 +63,8 @@ func (database *Database) createTables(ctx context.Context) {
product_id INTEGER,
evidence_type INTEGER,
evidence JSONB,
claim INTEGER,
counter_claim INTEGER,
claims INTEGER[],
counterclaims INTEGER[],
created_at TIMESTAMPTZ,
created_by TEXT,
@ -82,8 +82,8 @@ func (database *Database) createTables(ctx context.Context) {
product_id INTEGER,
worker_type INTEGER,
evidence JSONB,
claim INTEGER,
counter_claim INTEGER,
claims INTEGER[],
counterclaims INTEGER[],
created_at TIMESTAMPTZ,
CONSTRAINT fk_product_id FOREIGN KEY(product_id) REFERENCES products(id)

View file

@ -13,22 +13,22 @@ type Product struct {
}
type AutomatedClaim struct {
id int `ksql:"id"`
product_id int `ksql:"product_id"`
worker_type models.WorkerType `ksql:"worker_type"`
evidence struct{} `ksql:"evidence,json"`
claim models.ClaimType `ksql:"claim"`
counter_claim models.ClaimType `ksql:"counter_claim"`
created_at time.Time `ksql:"created_at,timeNowUTC"`
Id int `ksql:"id"`
Product_id int `ksql:"product_id"`
Worker_type models.WorkerType `ksql:"worker_type"`
Evidence struct{} `ksql:"evidence,json"`
Claims []models.ClaimType `ksql:"claims"`
Counterclaims []models.ClaimType `ksql:"counterclaims"`
Created_at time.Time `ksql:"created_at,timeNowUTC"`
}
type UserClaim struct {
id int `ksql:"id"`
product_id int `ksql:"product_id"`
evidence_type models.EvidenceType `ksql:"evidence_type"`
evidence struct{} `ksql:"evidence,json"`
claim models.ClaimType `ksql:"claim"`
counter_claim models.ClaimType `ksql:"counter_claim"`
created_at time.Time `ksql:"created_at,timeNowUTC"`
created_by string `ksql:"created_by"`
Id int `ksql:"id"`
Product_id int `ksql:"product_id"`
Evidence_type models.EvidenceType `ksql:"evidence_type"`
Evidence struct{} `ksql:"evidence,json"`
Claims []models.ClaimType `ksql:"claims"`
Counterclaims []models.ClaimType `ksql:"counterclaims"`
Created_at time.Time `ksql:"created_at,timeNowUTC"`
Created_by string `ksql:"created_by"`
}

View file

@ -1,14 +1,37 @@
package database
import "context"
import (
"context"
"time"
"github.com/vingarcia/ksql"
)
func (d *Database) FindProductIDByBarcode(system string, barcode string) (id int, err error) {
ctx := context.Background()
err = d.db.QueryOne(ctx, &id, "SELECT id FROM products WHERE system = ? AND barcode = ?", system, barcode)
if err == ksql.ErrRecordNotFound {
return -1, nil
}
if err != nil {
return -1, err
}
return
}
func (d *Database) CreateProduct(system string, barcode string) (*Product, error) {
ctx := context.Background()
var product = Product{
System: system,
Barcode: barcode,
Created_at: time.Now(),
}
if err := d.db.Insert(ctx, ProductsTable, &product); err != nil {
return nil, err
}
return &product, nil
}

View file

@ -59,3 +59,11 @@ type ProductClaims struct {
Id int
Claims []Claim
}
type UserClaimForm struct {
Evidence_type EvidenceType
Evidence struct{}
Claims []ClaimType
Counterclaims []ClaimType
Created_by string
}