tb/main #1

Open
terrabytten wants to merge 17 commits from tb/main into main
7 changed files with 37 additions and 21 deletions
Showing only changes of commit 34218e7306 - Show all commits

2
.gitignore vendored
View file

@ -3,7 +3,7 @@
.envrc .envrc
.direnv .direnv
cmd/server/server cmd/server/server
cmd/server/app.log
# postgres # postgres
postgres.db postgres.db
postgres.log postgres.log

View file

@ -21,6 +21,9 @@ The goal of this project is to be a crowd sourced resource to find out if a prod
- create mobile and desktop front ends - create mobile and desktop front ends
- moderation tooling? - moderation tooling?
## Tip
Paste this to log the SQL queries in stdout.
ctx = ksql.InjectLogger(ctx, ksql.Logger)
## How to start database ## How to start database

View file

@ -1,7 +1,6 @@
package application package application
import ( import (
"fmt"
"net/http" "net/http"
"vegan-barcode/internal/models" "vegan-barcode/internal/models"
@ -25,6 +24,7 @@ func (a *Application) GetClaimsHandler(c *gin.Context) {
c.JSON(http.StatusOK, productClaims) c.JSON(http.StatusOK, productClaims)
} }
// PostClaimHandler takes the parameters and body form
func (a *Application) PostClaimHandler(c *gin.Context) { func (a *Application) PostClaimHandler(c *gin.Context) {
system := c.Param("system") system := c.Param("system")
barcode := c.Param("barcode") barcode := c.Param("barcode")
@ -32,12 +32,12 @@ func (a *Application) PostClaimHandler(c *gin.Context) {
var requestBody models.UserClaimForm var requestBody models.UserClaimForm
err := c.BindJSON(&requestBody) err := c.BindJSON(&requestBody)
if err != nil { if err != nil {
c.JSON(http.StatusBadRequest, fmt.Errorf("improperly formatted request: %w", err)) c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return return
} }
log.Debugf("requestbody: %v", requestBody) log.Debugf("requestbody: %v", requestBody)
claim, err := a.CreateClaim(system, barcode, requestBody) claim, err := a.CreateUserClaim(system, barcode, requestBody)
if err != nil { if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return return

View file

@ -23,18 +23,13 @@ func (a *Application) GetClaims(system string, barcode string) (*models.ProductC
return &models.ProductClaims{Id: product.Id, Claims: claims}, nil return &models.ProductClaims{Id: product.Id, Claims: claims}, nil
} }
func (a *Application) CreateClaim(system string, barcode string, form models.UserClaimForm) (*database.UserClaim, error) { // CreateUserClaim gets the product ID or creates a new entry if not found,
product, err := a.db.FindProductByBarcode(system, barcode) // then calls InsertUserClaim to create the claim object and put it in the database.
func (a *Application) CreateUserClaim(system string, barcode string, form models.UserClaimForm) (*database.UserClaim, error) {
product, err := a.db.FindOrCreateProduct(system, barcode)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// no product, create new
if product == nil {
product, err = a.db.CreateProduct(system, barcode)
if err != nil {
return nil, err
}
}
return a.db.CreateUserClaim(product.Id, form) return a.db.InsertUserClaim(product.Id, form)
} }

View file

@ -59,7 +59,7 @@ func (d *Database) FindClaimsByProductID(product_id int) (claims []models.Claim,
return return
} }
// exists only for testing // Testing function
func (database *Database) FindUserClaimById(claim_id int) (*UserClaim, error) { func (database *Database) FindUserClaimById(claim_id int) (*UserClaim, error) {
ctx := context.Background() ctx := context.Background()
@ -73,7 +73,8 @@ func (database *Database) FindUserClaimById(claim_id int) (*UserClaim, error) {
return &claim, err return &claim, err
} }
func (d *Database) CreateUserClaim(product_id int, form models.UserClaimForm) (*UserClaim, error) { // InsertUserClaim puts creates a new user claim database object and inserts in DB.
func (d *Database) InsertUserClaim(product_id int, form models.UserClaimForm) (*UserClaim, error) {
ctx := context.Background() ctx := context.Background()
var uc = UserClaim{ var uc = UserClaim{
Product_id: product_id, Product_id: product_id,
@ -81,7 +82,7 @@ func (d *Database) CreateUserClaim(product_id int, form models.UserClaimForm) (*
Evidence: form.Evidence, Evidence: form.Evidence,
Claims: form.Claims, Claims: form.Claims,
Counterclaims: form.Counterclaims, Counterclaims: form.Counterclaims,
// TODO: Add created by Created_by: form.Created_by,
} }
err := d.db.Insert(ctx, UserClaimsTable, &uc) err := d.db.Insert(ctx, UserClaimsTable, &uc)

View file

@ -51,7 +51,8 @@ func (database *Database) createTables(ctx context.Context) {
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
system TEXT, system TEXT,
barcode TEXT, barcode TEXT,
created_at TIMESTAMPTZ created_at TIMESTAMPTZ,
UNIQUE (system, barcode)
); );
`) `)
if err != nil { if err != nil {

View file

@ -9,10 +9,26 @@ import (
"github.com/vingarcia/ksql" "github.com/vingarcia/ksql"
) )
func (d *Database) FindOrCreateProduct(system string, barcode string) (*Product, error) {
product, err := d.FindProductByBarcode(system, barcode)
if err != nil {
return nil, err
}
// If the product doesn't exist yet, create it
if product == nil {
product, err = d.CreateProduct(system, barcode)
if err != nil {
return nil, err
}
}
return product, nil
}
// FindProductByBarcode will return nil with no error if the product doesn't exist.
func (d *Database) FindProductByBarcode(system string, barcode string) (*Product, error) { func (d *Database) FindProductByBarcode(system string, barcode string) (*Product, error) {
ctx := context.Background() ctx := context.Background()
ctx = ksql.InjectLogger(ctx, ksql.Logger)
var product Product var product Product
err := d.db.QueryOne(ctx, &product, "FROM products WHERE system = $1 AND barcode = $2", system, barcode) err := d.db.QueryOne(ctx, &product, "FROM products WHERE system = $1 AND barcode = $2", system, barcode)
@ -27,7 +43,7 @@ func (d *Database) FindProductByBarcode(system string, barcode string) (*Product
return &product, nil return &product, nil
} }
// Doesnt handle checking if product exists. // CreateProduct simply makes an entry in the products table. Prefer FindOrCreateProduct
func (d *Database) CreateProduct(system string, barcode string) (*Product, error) { func (d *Database) CreateProduct(system string, barcode string) (*Product, error) {
ctx := context.Background() ctx := context.Background()
var product = Product{ var product = Product{
@ -36,7 +52,7 @@ func (d *Database) CreateProduct(system string, barcode string) (*Product, error
Created_at: time.Now(), Created_at: time.Now(),
} }
log.Debugf("made new product: %v", product) log.Debugf("successfully created new product: %v", product)
if err := d.db.Insert(ctx, ProductsTable, &product); err != nil { if err := d.db.Insert(ctx, ProductsTable, &product); err != nil {
return nil, fmt.Errorf("failed to insert new product: %w", err) return nil, fmt.Errorf("failed to insert new product: %w", err)