Preskočiť na obsah

Changelog

Changelog

Vybrané najdôležitejšie zmeny z posledných verzií. Pre úplné verzie API a pravidlá pre spätne nekompatibilné zmeny (Breaking-Change-Policy) si pozrite Verziovanie API & LTS pravidlá.

Podrobné zmeny jednotlivých endpointov: Špecifikácia OpenAPI a interaktívna API referencia.


2026-08 · Keyset kurzor teraz na všetkých zoznamových endpointoch

  • Oprava: Oprava kurzora pre GET /v1/codes a GET /v1/dpp (pozri nižšie) je teraz nasadená na všetky ostatné zoznamy s pagináciou pomocou kurzora: GET /v1/qr-codes/:id/comments, /v1/workspaces, /v1/gs1/identifiers, /v1/members, /v1/audit-logs, /v1/admin/orgs, /v1/admin/users a /v1/webhooks/:id/deliveries. Všetky doteraz stránkovali iba na základe created_at; riadky s identickou časovou pečiatkou (záznamy auditu z dávkovej operácie, opakované pokusy webhookov, importy členov) sa mohli na nasledujúcej stránke stratiť. Kľúčom na triedenie je teraz všade n-tica (created_at, id).
  • Zmena API: V týchto zoznamoch je meta.pagination.next_cursor odteraz taktiež nepriehľadná hodnota (base64url) namiesto čistej časovej pečiatky; nečitateľné kurzory vracajú 400, staré kurzory s časovou pečiatkou budú prechodne naďalej akceptované. Výnimkou je GET /v1/webhooks/:id/deliveries: tam zostáva next_cursor ID posledného doručenia (neznáme ID → prvá stránka). Klienti, ktorí vracajú next_cursor nezmenený — Dashboard, CLI, SDKs, MCP —, nemusia nič meniť.
  • Dopad: Nie je potrebná žiadna migrácia. Ak vám pri prechádzaní v niektorom z týchto zoznamov (napr. audit log alebo log doručení v Dashboarde) chýbali položky: Nikdy nezmizli — zoznamy ich odteraz zobrazujú kompletne.

2026-08 · Časové pečiatky po úprave a vymazaní opäť v súlade s OpenAPI

  • Oprava: Po PATCH /v1/codes/{id} sa updated_at vracal vo formáte SQLite bez časového pásma (2026-08-17 09:00:00), hoci špecifikácia OpenAPI sľubuje format: date-time a vytvorenie (POST) poskytuje časovú pečiatku ISO (2026-08-17T09:00:00.000Z). To isté platilo pre deleted_at/updated_at pri soft-delete, ako aj pre cesty úpravy/vymazania API kľúčov, organizácií, workspacov, členov, komentárov a webhookov, a navyše pre last_used_at API kľúčov a last_triggered_at webhookov. Všetky zapisovacie cesty teraz ukladajú čas podľa ISO 8601 (UTC, T a Z).
  • Dopad: Klienti, ktorí parsujú updated_at pomocou new Date(...) (SDKs, CLI, Dashboard), čítali formát s medzerou ako miestny čas — CLI zobrazovalo pri raz upravených kódoch čas posunutý o lokálny offset (Viedeň: −2 h). Toto je opravené. Okrem toho migrácia dát normalizuje už uložené hodnoty v starom formáte na ISO, aby triedenie a porovnávanie v zmiešaných záznamoch fungovalo správne. Žiadna zmena v názvoch polí ani v štruktúre odpovede.
  • Pozadie: Rovnaká trieda chýb ako pri dvoch opravách nižšie (expirácia API kľúča, cutoff re-scanu): funkcia datetime('now') v SQLite zapisuje YYYY-MM-DD HH:MM:SS, zatiaľ čo všetci ostatní zapisovatelia používajú ISO 8601. Test v zdrojovom kóde (guard test) v budúcnosti zabráni novému výskytu tejto chyby.

2026-08 · Stránkovanie zoznamov už nestráca batch kódy

  • Oprava: GET /v1/codes a GET /v1/dpp stránkovali iba na základe created_at. Kódy z POST /v1/codes/batch, POST /v1/dpp/batch a CSV/XLSX importu však zdieľajú jednu časovú pečiatku — akonáhle bol batch väčší ako limit (predvolene 20), druhá stránka už nevrátila zostávajúce riadky s rovnakou časovou pečiatkou. Kódy existovali a boli dostupné cez GET /v1/codes/:id, ale v zozname (Dashboard, CLI qr3 list, SDKs, MCP) sa nikdy neobjavili. Kurzor je teraz keyset nad (created_at, id).
  • Zmena API: meta.pagination.next_cursor je odteraz nepriehľadná hodnota (base64url) namiesto čistej časovej pečiatky. Tí, ktorí vracajú kurzor nezmenený ako ?cursor= — tak ako to robí Dashboard, CLI, všetky SDKs a MCP server — nemusia nič meniť. Staré kurzory s časovou pečiatkou budú prechodne naďalej akceptované; nečitateľné kurzory teraz vrátia 400 namiesto tichého vrátenia prvej stránky.
  • Dopad: Ak ste po batch importe videli v zozname menej kódov, než ich bolo vytvorených: Kódy sa nikdy nestratili — zoznam ich odteraz zobrazuje kompletne. Nie je potrebná žiadna migrácia.

2026-08 · Bezpečnostné re-scany opäť bežia v 24-hodinovom cykle

  • Oprava: Periodické opätovné skenovanie cieľových URL a odkazov na vstupnej stránke (Google Web Risk) vynechávalo kódy, ktorých posledný sken bol v rovnaký kalendárny deň ako 24-hodinový cutoff — v závislosti od času sa opätovný sken oneskoril až o ďalší deň. Cutoff sa teraz počíta v rovnakom ISO formáte, v akom sú uložené časové pečiatky skenov.
  • Dopad: Cieľová URL, ktorá je po poslednom skene vyhodnotená ako nebezpečná, opäť vedie k automatickému pozastaveniu kódu v rámci zdokumentovaného 24-hodinového okna. Žiadna zmena API alebo formátu odpovede.

2026-08 · API kľúče vypršia presne v čase expirácie

  • Oprava: API kľúč, ktorého expires_at bol v rovnaký deň, bol akceptovaný až do polnoci UTC. Expirácia sa teraz porovnáva ako časová pečiatka namiesto reťazca — expirovaný kľúč okamžite vráti 401.
  • Pozadie: expires_at sa ukladá ako ISO časová pečiatka (2026-08-14T09:00:00Z), porovnávacia strana poskytovala formát s medzerou (2026-08-14 09:00:00). Porovnanie surových reťazcov preto fungovalo správne iba vtedy, ak sa líšil už samotný dátum.
  • Dopad: Nie je potrebná žiadna migrácia, formát odpovede z GET /v1/api-keys zostáva nezmenený. Nečitateľné hodnoty expirácie sa teraz považujú za expirované namiesto platných.

2026-08 · API referencia: Správa tenantov zdokumentovaná

  • OpenAPI: Špecifikácia — a tým pádom aj interaktívna referencia — teraz dokumentuje organizácie (vrátane GET /v1/organizations/usage), workspacy, členov & roly a auditovacie logy.
  • Billing: Prehľad programov (GET /v1/billing/plans) je verejný; checkout (POST /v1/billing/checkout) a zákaznícky portál Stripe (GET /v1/billing/portal) sú označené ako endpointy pre administrátorov organizácie.
  • Export skenov: Štatistiky skenov (GET /v1/codes/{id}/scans) a export surových dát (…/scans.csv, …/scans.xlsx) sú plne zdokumentované — vrátane upozornenia týkajúceho sa GDPR: ip_hash nie je nikdy súčasťou exportu.
  • Spracovanie chýb: Novo zdokumentovaná je aj odpoveď 400 pri validácii požiadavky: telo (body) obsahuje surovú chybu Zod, nie dokument problému podľa RFC-7807 — napriek tomu je však odosielaný s Content-Type application/problem+json.

2026-08 · Kopírovanie verejných odkazov na súbory

  • Dashboard: Verejné súbory na stránke s podrobnosťami o kóde majú teraz tlačidlo, ktoré skopíruje ich verejný odkaz do schránky – dá sa použiť priamo ako cieľová URL adresa QR kódu, ak má naskenovanie okamžite otvoriť konkrétny dokument namiesto landing page so zoznamom súborov.
  • API: Súborové endpointy (/v1/files) navyše vracajú public_url. Toto pole je nastavené len pre súbory s visibility: public – súkromné súbory nedostanú verejnú adresu.
  • Správanie: Odkaz nevyžaduje prihlásenie a otvorí súbor priamo v prehliadači. Nahradenie súboru ho ponechá nezmenený, takže kód vytlačený na ňom zostáva platný. Podrobnosti: Súbory & dátové hárky.

2026-07 · Tímové roly: Editor bez možnosti mazania & Admin fakturácia

  • Novinka: Rola člena Editor (bez mazania) — vytvára a upravuje QR kódy, súbory a Digital Product Passports, ale nemôže nič mazať ani vytvárať API kľúče. Všetky deštruktívne endpointy overujú rolu na strane servera (403).
  • Fakturácia: Upgrady programov a zákaznícky portál Stripe (POST /v1/billing/checkout, GET /v1/billing/portal) sú teraz vyhradené pre administrátorov organizácie — všetky ostatné roly vidia prehľad programov len na čítanie.
  • Dashboard: Akcie, ktoré vlastná rola neumožňuje, sú skryté: Čitateľ napríklad nevidí tlačidlá na vytváranie, úpravu alebo mazanie; zoznamy, sťahovania a štatistiky zostávajú viditeľné. Podrobnosti: Tím & roly.

2026-06 · Externé odkazy na landing page kódu

  • Landing page: Landing page kódu hostovaná na qr3 môže teraz zobrazovať externé, vlastné hostované odkazy ({ label, url }) – navyše k nahraným súborom alebo namiesto nich, napríklad pre dátové hárky na vašom vlastnom webe.
  • API: POST/PATCH /v1/codes akceptujú pole links (0–20 položiek, http(s), ≤ 2048 znakov). Každá URL adresa je kontrolovaná pomocou Google Web Risk; nebezpečná URL vráti 422. Prázdne pole vymaže všetky odkazy.
  • Dashboard: Pridávanie, triedenie a odstraňovanie odkazov na stránke s podrobnosťami o kóde.
  • Bezpečnosť: Vykreslené odkazy zostávajú zabezpečené proti XSS (escaped, iba http(s)) a stránka si zachováva hlavičku noindex.

2026-04 · Analytika pre jednotlivé QR kódy v Dashboarde

  • Dashboard: Tlačidlo analytiky v zozname QR kódov teraz otvára stránku so štatistikami príslušného QR kódu na adrese /dashboard/codes/{id}.
  • Routing: Alias /dashboard/codes naďalej presmerováva na /dashboard, ale už nezachytáva detailné cesty ako /dashboard/codes/{id}.
  • API: Stránka s podrobnosťami načítava QR kód priamo cez GET /v1/codes/:id; vďaka tomu už nezávisí od limitov stránkovania zoznamu.
  • Testy: Regresné testy pokrývajú presmerovanie aliasu a priame načítanie kódu.

2026-04 · Dialógové okno na mazanie QR kódov v Dashboarde

  • Dashboard: Ikona koša v zozname QR kódov teraz otvára vlastný React dialóg namiesto natívneho vyskakovacieho okna prehliadača.
  • Spätná väzba: Po vymazaní sa zobrazí toast správa o úspechu alebo chybe.
  • Testy: packages/dashboard/tests/dashboard.test.ts zabraňuje regresiám pre confirm() v procese mazania QR kódu.

2026-04 · Testovanie skrátených odkazov pre dynamické QR kódy v Dashboarde

  • Dashboard: Shortcodes v zozname QR kódov sú teraz priamo klikateľné ako externé presmerovacie odkazy. Ikona externého odkazu vedľa napr. wu3qaa otvorí https://qr3.app/{shortCode} na novej karte.
  • i18n: Doplnené texty tooltipov pre nemčinu a angličtinu.
  • Testy: packages/dashboard/tests/dashboard.test.ts chráni href odkazu, správanie novej karty, noopener noreferrer a ikonu pred regresiami.

2026-04 · Smerovanie Redirect-Workera pre dynamické QR kódy

  • Oprava: Dynamické QR kódy na https://qr3.app/{shortCode} sú opäť spracovávané Redirect-Workerom. Produkčná cesta teraz využíva qr3.app/*, pretože Cloudflare Worker cesty nepodporujú parametre cesty :code.
  • Zabezpečenie: Nezhodujúce sa cesty sa prepúšťajú na pôvodnú landing origin adresu, aby bežné stránky ako /de/pricing neboli blokované Redirect-Workerom.
  • Testy: packages/redirect/tests/unit/redirect.test.ts overuje wildcard cestu, spracovanie shortcode a prepúšťanie na origin.

2026-04 · Prehľad skenovania DPP vo workspace (Q3.4.2)

  • Novinka: GET /v1/workspace/stats/dpp?days=30 — agreguje všetky dpp_scans pre workspace daného API kľúča (active_dpps, scans_by_day, top_dpps s názvom produktu/kategóriou).
  • Dashboard: Karta na domovskej stránke (/dashboard) s 30-dňovým stĺpcovým grafom + top zoznamami — paralelne ku kartám QR kódov.
  • Verejné: Marketingový skrátený odkaz GET /dpp/dpp_<id> (jeden segment) pre live ukážky, paralelne k /dpp/{gtin}/{serial}.

2026-04 · Analytika skenovania DPP (Q3.4.1)

  • Novinka: GET /v1/dpp/:id/stats?days=30 — agregované skeny verejného GS1 resolvera pre jedno DPP. Polia: total_scans, period_scans, scans_by_day, top_countries, top_devices, top_representations.
  • Novinka: Tabuľka dpp_scans (migrácia 0011) — oddelená od scans (Redirect-Worker). IP adresy sú hashované pomocou denne rotujúcej soli (salt), surové IP adresy sa nikdy nedostanú do D1.
  • Dashboard: Mini grafová karta (SVG, bez knižnice na grafy) na /dashboard/dpp/:dppId s 30-dňovými stĺpcami + top 3 prehľadmi. Prázdny stav (empty state), akonáhle je DPP aktívny, ale ešte nemal žiadne skeny.

2026-04 · Simulátor súladu s predpismi EÚ v reálnom čase (Q3.3.7)

  • Novinka: POST /v1/dpp/:id/validate-update — simuluje čiastočné aktualizácie bezstavovo (stateless) (status, zoznam trhov, …) bez perzistencie. Odpoveď obsahuje eu_compliance + preview.changed_fields.
  • Dashboard: Karta simulátora v detaile DPP (/dashboard/dpp/:dppId) — čipy pre DE/AT/FR/IT/ES/NL + vlastné, rozbaľovací zoznam stavov, Preview EU impact / Save changes / Reset. Neblokujúce cez Remix useFetcher.
  • Zabezpečenie: Vyčlenené pomocné funkcie simulátora (readUpdatePatchFromForm, marketCountriesKey) + 18 nových unit testov; oprava chyby: osamotený ne-ISO vstup už nevymaže zoznam trhov.

2026-04 · Náhľad súladu s predpismi EÚ v reálnom čase vo formulári na vytvorenie (Q3.3.6)

  • Zmena: POST /v1/dpp/validate navyše vracia eu_compliance — rovnaký validátor ako GET /v1/dpp/:id/eu-compliance, bezstavovo pred uložením.
  • Dashboard: Náhľad pod existujúcim validačným panelom + nový Save-Guard banner pred odosielacími tlačidlami, ak sú otvorené chyby/varovania (i18n pluralizácia DE/EN).

EU validátor + textilné UI (Q3.3.4 + Q3.3.5)

  • Novinka: Validátor súladu s predpismi EÚ s 5 textilnými pravidlami (TEXTILE_AGEC_REQUIRED, TEXTILE_MICROPLASTICS_CONSISTENCY, TEXTILE_SVHC_THRESHOLD, TEXTILE_GREENWASHING, TEXTILE_ESPR_READY).
  • Novinka: GET /v1/dpp/:id/eu-compliance s compliant / espr_ready / issues[] / summary.
  • Dashboard: Sekcia súladu s predpismi EÚ v detaile DPP (súhrnné dlaždice, zoskupené karty problémov, odznak ESPR-Ready v hlavičke).

Textil-DPP-Schema (Q3.3.1–Q3.3.3)

  • Novinka: Kategória textile s povinným reťazcom AGEC (tkanie/pletenie → farbenie/potlač → konfekcia), pre každé vlákno origin_country + recycled_pct, svhc_substances[], ESPR-Opt-in (PEF, životnosť, Recyclability).
  • Novinka: Základné pole market_countries: string[] (ISO 3166-1 alpha-2) vo všetkých kategóriách DPP — riadi špecifické francúzske pravidlá AGEC a povinné francúzske upozornenie pre spotrebiteľov.
  • Novinka: Spotrebiteľská HTML šablóna s varovným boxom AGEC pre mikroplasty, 3-stupňovým reťazcom pôvodu (vlajkové pilulky), zoznamom SVHC, sekciou Durability a Recyclability.
  • Migrácia: 0010_dpp_market_countries (D1).

DPP-Bulk-Import (Q3.2.1–Q3.2.5)

  • Novinka: POST /v1/dpp/import akceptuje CSV a XLSX (kompatibilné s Workerom cez SheetJS xlsx, ~283 KB gzip balík).
  • Škálovanie: limit na základe programu (Free 100 → Enterprise 10k) + dávkovanie db.batch() po 100 + 5 MB limit pre body.
  • Novinka: Chybový report ako CSV v poli errors_csv v odpovedi 201; GET /v1/dpp/import/templates/:category?format=csv|xlsx poskytuje hotové šablóny pre batérie a textil.
  • Dashboard: Nahrávanie pretiahnutím (Drag-and-Drop) na /dashboard/dpp/import s proxy šablónou a priamym stiahnutím CSV.

Spätne kompatibilné zmeny (Non-Breaking) — rozšírenia LTS

Všetky vyššie uvedené zmeny sú aditívne:

  • Existujúci klienti POST /v1/dpp/validate ignorujú nové pole eu_compliance bez akýchkoľvek zmien.
  • Existujúce procesy pre battery zostávajú nezmenené.
  • market_countries je voliteľné a predvolene nastavené na [].

Pozrite si Verziovanie API pre pravidlá pre spätne nekompatibilné zmeny (Breaking-Change-Policy).