xpeditis2.0/apps/frontend/src/lib/api/trade-assistant.ts

135 lines
4.2 KiB
TypeScript

import { del, get, patch, post } from './client';
export interface TradeQuota {
day: string;
resetsAt: string;
used: number;
plan: string;
/** `-1` quand l'offre est illimitée (Platinium). */
limit: number;
unlimited: boolean;
/** `-1` quand l'offre est illimitée : ne rien décompter dans ce cas. */
remaining: number;
available: boolean;
supportEmail: string;
}
/** Page du wiki citee sous une reponse. */
export interface TradeSource {
title: string;
section: string;
href: string;
}
/** Capacité invoquée par l'assistant pour produire une réponse. */
export interface TradeAction {
name: string;
ok: boolean;
}
export interface TradeMessage {
id: string;
role: 'user' | 'assistant';
content: string;
sources: TradeSource[];
actions: TradeAction[];
createdAt: string;
}
export interface TradeConversation {
id: string;
title: string;
createdAt: string;
updatedAt: string;
messageCount: number;
}
export interface TradeReply {
mode: 'ai' | 'guided' | 'unavailable';
conversationId?: string;
conversationTitle?: string;
messages?: TradeMessage[];
answer?: string;
sources?: TradeSource[];
actions?: TradeAction[];
quota: TradeQuota;
}
/**
* Page proposée au wiki par l'assistant.
*
* Le wiki publié vit dans les fichiers de traduction et ne bouge qu'au build.
* Celles-ci s'écrivent en cours de route, quand une question révèle un trou
* dans la documentation — mais elles n'entrent dans le wiki qu'après validation
* par un administrateur.
*/
export interface WikiContribution {
id: string;
/** Sujet du wiki auquel la page se rattache, ex. `douanes`. */
topic: string;
title: string;
section: string;
body: string;
href: string;
updatedAt: string;
}
export type WikiContributionStatus = 'pending' | 'published' | 'rejected';
/** La même page, vue depuis la file de relecture : statut et décision compris. */
export interface WikiContributionReview extends Omit<WikiContribution, 'href'> {
version: number;
locale: string;
status: WikiContributionStatus;
/** `null` tant que la page n'est pas publiée : le lien pointerait vers du vide. */
href: string | null;
reviewedBy: string | null;
reviewedAt: string | null;
reviewNote: string | null;
createdAt: string;
}
export interface WikiReviewQueue {
/** Nombre de pages qui attendent une décision. */
pending: number;
contributions: WikiContributionReview[];
}
export const getTradeQuota = () => get<TradeQuota>('/api/v1/trade-assistant/quota');
export const getWikiContributions = (language: string) =>
get<WikiContribution[]>(`/api/v1/trade-assistant/wiki?language=${language}`);
/* -------------------------------------------------------------------------- */
/* Relecture (administration) */
/* -------------------------------------------------------------------------- */
export const getWikiReviewQueue = (status?: WikiContributionStatus) =>
get<WikiReviewQueue>(`/api/v1/admin/wiki-contributions${status ? `?status=${status}` : ''}`);
export const publishWikiContribution = (
id: string,
edits: { expectedVersion: number; section?: string; body?: string }
) => post<WikiContributionReview>(`/api/v1/admin/wiki-contributions/${id}/publish`, edits);
export const rejectWikiContribution = (id: string, expectedVersion: number, note?: string) =>
post<WikiContributionReview>(`/api/v1/admin/wiki-contributions/${id}/reject`, {
expectedVersion,
note,
});
export const getTradeConversations = () =>
get<TradeConversation[]>('/api/v1/trade-assistant/conversations');
export const getTradeMessages = (conversationId: string) =>
get<TradeMessage[]>(`/api/v1/trade-assistant/conversations/${conversationId}`);
export const renameTradeConversation = (conversationId: string, title: string) =>
patch<void>(`/api/v1/trade-assistant/conversations/${conversationId}`, { title });
export const deleteTradeConversation = (conversationId: string) =>
del<void>(`/api/v1/trade-assistant/conversations/${conversationId}`);
export const askTradeQuestion = (question: string, language: string, conversationId?: string) =>
post<TradeReply>('/api/v1/trade-assistant/questions', { question, language, conversationId });