vegan-barcode/internal/database/claims.go

94 lines
2.8 KiB
Go

package database
import (
"context"
"fmt"
"vegan-barcode/internal/models"
"github.com/vingarcia/ksql"
)
func (d *Database) FindClaimsByProductID(product_id int) (claims []models.Claim, err error) {
ctx := context.Background()
err = d.db.Query(ctx, &claims, `
SELECT
cluster,
id,
worker_type,
evidence_type,
evidence,
category,
polarity,
created_at,
created_by
FROM (
SELECT
cluster,
id,
worker_type,
evidence_type,
evidence,
category,
polarity,
created_at,
created_by,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY created_at DESC) AS rn
FROM (
(
SELECT 'user' as cluster, id, product_id, null as worker_type, evidence_type, evidence, unnest(claims) as category, true as polarity, created_at, created_by FROM user_claims
UNION ALL
SELECT 'automated' as cluster, id, product_id, worker_type, null as evidence_type, evidence, unnest(claims) as category, true as polarity, created_at, null as created_by FROM automated_claims
)
UNION ALL
(
SELECT 'user' as cluster, id, product_id, null as worker_type, evidence_type, evidence, unnest(counterclaims) as category, false as polarity, created_at, created_by FROM user_claims
UNION ALL
SELECT 'automated' as cluster, id, product_id, worker_type, null as evidence_type, evidence, unnest(counterclaims) as category, false as polarity, created_at, null as created_by FROM automated_claims
)
) AS combined_claims
WHERE product_id = $1
) AS ranked_claims
WHERE rn = 1
ORDER BY created_at;
`, product_id)
if err != nil {
return nil, fmt.Errorf("query failed: %w", err)
}
return
}
// exists only for testing
func (database *Database) FindUserClaimById(claim_id int) (*UserClaim, error) {
ctx := context.Background()
var claim UserClaim
err := database.db.QueryOne(ctx, claim, "FROM user_claims WHERE id = $1", claim_id)
if err == ksql.ErrRecordNotFound {
return nil, err
}
return &claim, err
}
func (d *Database) CreateUserClaim(product_id int, form models.UserClaimForm) (*UserClaim, error) {
ctx := context.Background()
var uc = UserClaim{
Product_id: product_id,
Evidence_type: form.Evidence_type,
Evidence: form.Evidence,
Claims: form.Claims,
Counterclaims: form.Counterclaims,
// TODO: Add created by
}
err := d.db.Insert(ctx, UserClaimsTable, &uc)
if err != nil {
return nil, err
}
return &uc, nil
}