diff --git a/internal/application/handlers.go b/internal/application/handlers.go index 31bc986..fd95bc3 100644 --- a/internal/application/handlers.go +++ b/internal/application/handlers.go @@ -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) +} diff --git a/internal/application/services.go b/internal/application/services.go index ed0b596..e5d9424 100644 --- a/internal/application/services.go +++ b/internal/application/services.go @@ -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) +} diff --git a/internal/database/claims.go b/internal/database/claims.go index b568596..c00ee43 100644 --- a/internal/database/claims.go +++ b/internal/database/claims.go @@ -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 +} diff --git a/internal/database/database.go b/internal/database/database.go index c605b11..1c818a6 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -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) diff --git a/internal/database/models.go b/internal/database/models.go index 27af2de..e5cdc0a 100644 --- a/internal/database/models.go +++ b/internal/database/models.go @@ -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"` } diff --git a/internal/database/products.go b/internal/database/products.go index b6191d7..8ffd943 100644 --- a/internal/database/products.go +++ b/internal/database/products.go @@ -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 +} diff --git a/internal/models/models.go b/internal/models/models.go index 9cf290b..79eb1e1 100644 --- a/internal/models/models.go +++ b/internal/models/models.go @@ -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 +}