feat: harden growth report orchestration
This commit is contained in:
@@ -59,8 +59,11 @@ func (b *PostgreSQLBuilder) Build(ctx context.Context, merchantID int64, termina
|
||||
if err := b.pool.QueryRow(ctx, `SELECT category_title FROM merchants WHERE id=$1`, merchantID).Scan(&category); err != nil {
|
||||
return Analysis{}, fmt.Errorf("loading merchant category: %w", err)
|
||||
}
|
||||
rows, err := b.pool.Query(ctx, `SELECT (ps.created_at AT TIME ZONE 'Asia/Tehran')::date,count(*),count(*) FILTER(WHERE ps.status IN ('Paid','Verified')),coalesce(sum(ps.amount_rial) FILTER(WHERE ps.status IN ('Paid','Verified')),0)
|
||||
FROM payment_sessions ps WHERE ps.merchant_id=$1 AND ($2='' OR ps.terminal_id=(SELECT id FROM terminals WHERE merchant_id=$1 AND source_key=$2)) GROUP BY 1 ORDER BY 1`, merchantID, terminalID)
|
||||
rows, err := b.pool.Query(ctx, `WITH bounds AS (SELECT min(created_at AT TIME ZONE 'Asia/Tehran')::date first_day,max(created_at AT TIME ZONE 'Asia/Tehran')::date last_day FROM payment_sessions),
|
||||
days AS (SELECT generate_series(first_day,last_day,interval '1 day')::date local_date FROM bounds), scoped AS (
|
||||
SELECT (ps.created_at AT TIME ZONE 'Asia/Tehran')::date local_date,count(*) sessions,count(*) FILTER(WHERE ps.status IN ('Paid','Verified')) paid_sessions,coalesce(sum(ps.amount_rial) FILTER(WHERE ps.status IN ('Paid','Verified')),0) paid_amount
|
||||
FROM payment_sessions ps WHERE ps.merchant_id=$1 AND ($2='' OR ps.terminal_id=(SELECT id FROM terminals WHERE merchant_id=$1 AND source_key=$2)) GROUP BY 1)
|
||||
SELECT d.local_date,coalesce(s.sessions,0),coalesce(s.paid_sessions,0),coalesce(s.paid_amount,0) FROM days d LEFT JOIN scoped s USING(local_date) ORDER BY d.local_date`, merchantID, terminalID)
|
||||
if err != nil {
|
||||
return Analysis{}, fmt.Errorf("loading growth history: %w", err)
|
||||
}
|
||||
@@ -151,7 +154,7 @@ func (b *PostgreSQLBuilder) loadPeer(ctx context.Context, merchantID int64, term
|
||||
func convertFallback(items []growth.CampaignBrief) AICopy {
|
||||
result := AICopy{Briefs: make([]CampaignBrief, 0, len(items))}
|
||||
for _, item := range items {
|
||||
result.Briefs = append(result.Briefs, CampaignBrief{Headline: item.HeadlineFA, Interpretation: item.GuidanceFA, OfferSuggestion: item.OfferFA, PreparationAction: item.PreparationFA, Limitation: item.LimitationFA, EvidenceIDs: item.EvidenceIDs})
|
||||
result.Briefs = append(result.Briefs, CampaignBrief{Headline: item.HeadlineFA, Interpretation: item.GuidanceFA, OfferSuggestion: item.OfferFA, MessageSuggestion: item.MessageFA, PreparationAction: item.PreparationFA, Limitation: item.LimitationFA, EvidenceIDs: item.EvidenceIDs})
|
||||
}
|
||||
return result
|
||||
}
|
||||
@@ -166,6 +169,9 @@ func (t EvidenceTools) Execute(_ context.Context, name string, arguments json.Ra
|
||||
if err := json.Unmarshal(arguments, &args); err != nil {
|
||||
return nil, fmt.Errorf("invalid tool arguments: %w", err)
|
||||
}
|
||||
if len(args.EvidenceID) > 128 {
|
||||
return nil, fmt.Errorf("growth tool: invalid evidence id")
|
||||
}
|
||||
switch name {
|
||||
case "get_growth_context":
|
||||
return json.Marshal(map[string]any{"confidence": t.analysis.Evidence.Forecast.Confidence, "opportunityEvidenceIds": evidenceIDs(t.analysis.Evidence.Opportunities), "riskEvidenceIds": riskEvidenceIDs(t.analysis.Evidence.Risks)})
|
||||
|
||||
Reference in New Issue
Block a user