135 lines
4.2 KiB
TypeScript
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 });
|