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 }