Files
Veyra/web/admin/src/lib/candidates.ts
T

10 lines
2.1 KiB
TypeScript

import {request} from "./auth"
export type CandidateContent={symbol:string;exchange:string;name:string;strategy_code:string;title:string;thesis:string;evidence:{source_url:string;locator:string;summary:string}[];counter_evidence:string;invalidation:string;reference_plan:{entry_low:string;entry_high:string;stop_loss:string;target_price:string}}
export type Candidate={ai_analysis?:{status:string;primary_model:string;review_model:string;updated_at:string;analysis?:{summary:string;risks:string;missing_information:string[]};review?:{summary:string;risks:string;missing_information:string[]}};screening?:{candidate_revision_id:string;strategy_version_id:string;strategy_name:string;strategy_revision:number;bar_date:string;source_adapter:string;source_version:number;input_hash:string};id:string;candidate_id:string;revision:number;version:number;status:string;data_mode:"simulation";content:CandidateContent;observed_at:string;valid_until:string;published_at:string|null;is_latest:boolean;is_active_publication:boolean;reviews?:{id:string;decision:string;reason:string;input_version:number;created_at:string}[]}
export type Draft={content:CandidateContent;observed_at:string;valid_until:string}
export const states:Record<string,string>={DRAFT:"草稿",PENDING_REVIEW:"待审核",PUBLISHED:"已发布",RETURNED:"已退回",WITHDRAWN:"已撤回"}
export function getCandidates(signal?:AbortSignal,status=""){return request<Candidate[]>(`/api/admin/v1/candidates${status?`?status=${encodeURIComponent(status)}`:""}`,{signal})}
export function getCandidate(id:string,signal?:AbortSignal){return request<Candidate>(`/api/admin/v1/candidates/${id}`,{signal})}
export function saveDraft(input:Draft,source?:Candidate){return request<Candidate>(source?`/api/admin/v1/candidates/${source.id}/revisions`:"/api/admin/v1/candidates",{method:"POST",body:JSON.stringify({...input,...(source?{expected_version:source.version}:{})})})}
export function actOnCandidate(candidate:Candidate,action:string,reason:string){return request<Candidate>(`/api/admin/v1/candidates/${candidate.id}/${action}`,{method:"POST",body:JSON.stringify({expected_version:candidate.version,reason})})}