add comments, make errors more consistent
This commit is contained in:
parent
e762fc2abd
commit
34218e7306
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue