Opakovani do logu nepise a ticket se rodi s poslanym stavem

Overeno proti serveru: tri shodne POSTy udelaly jednu udalost s pocitadlem 3,
ale krok se do logu porad zapsal trikrat. Zadani bylo, ze opakovani ma byt
informace, ne dalsi radek.

- Krok muze rict quiet a jeho radek se do logu ticketu nezapise.
- Ticket vznika uz s poslanym stavem. Predtim se zalozil s vychozim "Novy"
  a hned se prepsal, takze v logu stalo "stav Novy -> completed" u ticketu,
  ktery v tom stavu nikdy nebyl. Odtud i to "Novy" ve widgetu.
- Zaznam zmen: celkovy pocet behu se pocita od zavedeni historie po dnech,
  puvodni citac se den ode dne nedelil a rozpocitat ho zpetne neni z ceho.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
JiriUhlir
2026-08-17 17:14:20 +02:00
co-authored by Claude Opus 5
parent f1e8253169
commit fc0c2ff6c7
3 changed files with 39 additions and 5 deletions
+24 -2
View File
@@ -44,6 +44,14 @@ export interface StepOutcome {
summary: string;
detail?: string | null;
outputs: Record<string, unknown>;
/**
* true = do logu ticketu se radek nezapise.
*
* Pro prijem stejne zpravy podesate: nic se nestalo, takze v logu nema co
* byt. Pocet opakovani je videt u prichozi udalosti, coz je jedno cislo
* misto osmdesati radku.
*/
quiet?: boolean;
/** Vyplnene, kdyz krok zalozil nebo nasel ticket. Dalsi kroky ho pak maji. */
ticketId?: string;
}
@@ -154,6 +162,12 @@ const handlers: Record<string, Handler> = {
fields,
create: {
subject: subject || inputs.externalId || 'Bez předmětu',
/*
* Stav uz pri zalozeni. Bez toho ticket vznikl s vychozim "Nový"
* a hned se prepsal, takze v logu stalo "stav Nový -> completed"
* u ticketu, ktery v nem nikdy nebyl.
*/
...(inputs.status?.trim() ? { status: inputs.status.trim() } : {}),
body: inputs.body ?? '',
typeId: inputs.typeId?.trim() || null,
priority: priorities.includes(inputs.priority as TicketPriority)
@@ -189,14 +203,20 @@ const handlers: Record<string, Handler> = {
const closed = boolInput(inputs.closed);
let note = '';
if (wanted || closed !== undefined) {
/*
* Pri zalozeni uz stav sedi, nastavoval by se podruhe. Menit ho ma smysl
* jen u ticketu, ktery uz existoval - nebo kdyz se meni priznak vyrizeni.
*/
const needsStatus = !result.created && wanted !== undefined && wanted !== result.ticket.status;
if (needsStatus || closed !== undefined) {
updateTicketStatus(
result.ticket.id,
wanted || result.ticket.status,
[context.tenantId],
closed,
);
note = wanted ? `, stav ${wanted}` : '';
note = needsStatus ? `, stav ${wanted}` : '';
if (closed !== undefined) note += closed ? ', vyřízený' : ', nevyřízený';
}
@@ -209,6 +229,8 @@ const handlers: Record<string, Handler> = {
ok: true,
summary: `bez změny, ${result.ticket.id} už tuhle zprávu dostal (${result.event.repeats}x)`,
detail: null,
// Do logu ne. Pocet je videt u prichozi udalosti.
quiet: true,
ticketId: result.ticket.id,
outputs: {
ticketId: result.ticket.id,
+6 -1
View File
@@ -61,6 +61,8 @@ export interface StepResult {
kind: 'action' | 'condition';
label: string;
ok: boolean;
/** true = do logu ticketu se nezapisuje. Nic se nestalo, viz StepOutcome. */
quiet?: boolean;
/**
* false = opakovat nema smysl.
*
@@ -152,7 +154,8 @@ export async function runFlow(
// Log ticketu dostane cely prubeh naraz, ne po jednom zapisu.
if (options.ticketId && results.length > 0) {
appendTrace(options.ticketId, results.map(toTrace));
const worthLogging = results.filter((step) => step.quiet !== true);
if (worthLogging.length > 0) appendTrace(options.ticketId, worthLogging.map(toTrace));
}
const failed = results.find((step) => !step.ok);
@@ -215,6 +218,8 @@ async function runAction(
ok: outcome.ok,
summary: outcome.summary,
detail: outcome.detail ?? null,
// Krok muze rict, ze se nic nestalo a do logu ticketu nepatri.
quiet: outcome.quiet === true,
// Vnitrni krok selhava na spatnem nastaveni, ne na vypadku. Opakovani
// by jen pettkrat zopakovalo tutéz chybu.
retryable: false,