From 34218e730602c05134de4838c0e382e644010911 Mon Sep 17 00:00:00 2001 From: katefort Date: Wed, 23 Apr 2025 16:23:59 -0500 Subject: [PATCH] add comments, make errors more consistent --- .gitignore | 2 +- README.md | 3 +++ internal/application/handlers.go | 6 +++--- internal/application/services.go | 15 +++++---------- internal/database/claims.go | 7 ++++--- internal/database/database.go | 3 ++- internal/database/products.go | 22 +++++++++++++++++++--- 7 files changed, 37 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index ea63aaa..434c14b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ .envrc .direnv cmd/server/server - +cmd/server/app.log # postgres postgres.db postgres.log diff --git a/README.md b/README.md index 69fafe3..86efcab 100644 --- a/README.md +++ b/README.md @@ -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 - moderation tooling? +## Tip +Paste this to log the SQL queries in stdout. +ctx = ksql.InjectLogger(ctx, ksql.Logger) ## How to start database diff --git a/internal/application/handlers.go b/internal/application/handlers.go index 46b4bf5..aaa1a54 100644 --- a/internal/application/handlers.go +++ b/internal/application/handlers.go @@ -1,7 +1,6 @@ package application import ( - "fmt" "net/http" "vegan-barcode/internal/models" @@ -25,6 +24,7 @@ func (a *Application) GetClaimsHandler(c *gin.Context) { c.JSON(http.StatusOK, productClaims) } +// PostClaimHandler takes the parameters and body form func (a *Application) PostClaimHandler(c *gin.Context) { system := c.Param("system") barcode := c.Param("barcode") @@ -32,12 +32,12 @@ func (a *Application) PostClaimHandler(c *gin.Context) { var requestBody models.UserClaimForm err := c.BindJSON(&requestBody) if err != nil { - c.JSON(http.StatusBadRequest, fmt.Errorf("improperly formatted request: %w", err)) + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } log.Debugf("requestbody: %v", requestBody) - claim, err := a.CreateClaim(system, barcode, requestBody) + claim, err := a.CreateUserClaim(system, barcode, requestBody) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return diff --git a/internal/application/services.go b/internal/application/services.go index 9120055..8177447 100644 --- a/internal/application/services.go +++ b/internal/application/services.go @@ -23,18 +23,13 @@ func (a *Application) GetClaims(system string, barcode string) (*models.ProductC return &models.ProductClaims{Id: product.Id, Claims: claims}, nil } -func (a *Application) CreateClaim(system string, barcode string, form models.UserClaimForm) (*database.UserClaim, error) { - product, err := a.db.FindProductByBarcode(system, barcode) +// CreateUserClaim gets the product ID or creates a new entry if not found, +// 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 { 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) } diff --git a/internal/database/claims.go b/internal/database/claims.go index 033ea4b..73532b8 100644 --- a/internal/database/claims.go +++ b/internal/database/claims.go @@ -59,7 +59,7 @@ func (d *Database) FindClaimsByProductID(product_id int) (claims []models.Claim, return } -// exists only for testing +// Testing function func (database *Database) FindUserClaimById(claim_id int) (*UserClaim, error) { ctx := context.Background() @@ -73,7 +73,8 @@ func (database *Database) FindUserClaimById(claim_id int) (*UserClaim, error) { 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() var uc = UserClaim{ Product_id: product_id, @@ -81,7 +82,7 @@ func (d *Database) CreateUserClaim(product_id int, form models.UserClaimForm) (* Evidence: form.Evidence, Claims: form.Claims, Counterclaims: form.Counterclaims, - // TODO: Add created by + Created_by: form.Created_by, } err := d.db.Insert(ctx, UserClaimsTable, &uc) diff --git a/internal/database/database.go b/internal/database/database.go index 71555d8..42604f3 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -51,7 +51,8 @@ func (database *Database) createTables(ctx context.Context) { id BIGSERIAL PRIMARY KEY, system TEXT, barcode TEXT, - created_at TIMESTAMPTZ + created_at TIMESTAMPTZ, + UNIQUE (system, barcode) ); `) if err != nil { diff --git a/internal/database/products.go b/internal/database/products.go index 1eb3e5c..77f5ad0 100644 --- a/internal/database/products.go +++ b/internal/database/products.go @@ -9,10 +9,26 @@ import ( "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) { ctx := context.Background() - ctx = ksql.InjectLogger(ctx, ksql.Logger) var product Product 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 } -// 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) { ctx := context.Background() var product = Product{ @@ -36,7 +52,7 @@ func (d *Database) CreateProduct(system string, barcode string) (*Product, error 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 { return nil, fmt.Errorf("failed to insert new product: %w", err)