Skip to content

Changelog

Muudatuste logi

Viimaste väljalasete kureeritud esiletõstmised. Täielike API versioonide ja katkestavate muudatuste poliitika kohta vaata API versioonihaldus ja LTS-poliitika.

Üksikasjalikud muudatused konkreetsetes otspunktides (endpoints): OpenAPI spetsifikatsioon ja interaktiivne API viide.


2026-08 · Keyset-kursor nüüd kõigil loendi lõpp-punktidel

  • Parandus: Kursori parandus lõpp-punktide GET /v1/codes ja GET /v1/dpp jaoks (vt allpool) on nüüd laiendatud kõigile ülejäänud kursoriga lehekülgedeks jagatud loenditele: GET /v1/qr-codes/:id/comments, /v1/workspaces, /v1/gs1/identifiers, /v1/members, /v1/audit-logs, /v1/admin/orgs, /v1/admin/users ja /v1/webhooks/:id/deliveries. Kõik need lehitsesid ainult välja created_at alusel; identse ajatempliga read (batch-operatsiooni auditisissekanded, veebikonksude korduskatsed, liikmete impordid) võisid järgmisel lehel kaduma minna. Sorteerimisvõtmeks on nüüd igal pool tuupel (created_at, id).
  • API muudatus: Nendes loendites on meta.pagination.next_cursor nüüdsest samuti läbipaistmatu väärtus (base64url) palja ajatempli asemel; loetamatud kursorid tagastavad vastuse 400, vanu ajatempliga kursoreid aktsepteeritakse üleminekuperioodil edasi. Erand on GET /v1/webhooks/:id/deliveries: seal jääb next_cursor viimase kohaletoimetamise ID-ks (tundmatu ID → esimene lehekülg). Kliendid, mis tagastavad väärtuse next_cursor muutmata kujul — Töölaud, CLI, SDK-d, MCP —, ei pea midagi muutma.
  • Mõju: Migratsiooni pole vaja. Kui keegi tundis mõnes neist loenditest (nt auditi logi või kohaletoimetamise logi Töölaual) lehitsemisel puudust mõnest sissekandest: need polnud kunagi kadunud — loendid kuvavad neid nüüdsest täielikult.

2026-08 · Ajatemplid pärast muutmist ja kustutamist taas OpenAPI-ga kooskõlas

  • Parandus: Pärast PATCH /v1/codes/{id} päringut tagastati updated_at SQLite-vormingus ilma ajavööndita (2026-08-17 09:00:00), kuigi OpenAPI-spetsifikatsioon lubab format: date-time ja loomine (POST) tagastab ISO-ajatempli (2026-08-17T09:00:00.000Z). Sama kehtis deleted_at/updated_at kohta pehme kustutamise puhul ning API-võtmete, organisatsioonide, tööruumide (Workspaces), liikmete, kommentaaride ja veebikonksude (Webhooks) muutmise/kustutamise teede puhul, samuti API-võtmete last_used_at ja veebikonksude last_triggered_at puhul. Kõik kirjutusteed kasutavad nüüd ISO 8601 ajatemplit (UTC, T ja Z).
  • Mõju: Kliendid, mis parsivad updated_at väärtust funktsiooniga new Date(...) (SDK-d, CLI, Töölaud), lugesid tühikuga vormingut kui kohalikku aega — CLI näitas korra muudetud koodide puhul aega kohaliku nihke võrra nihutatuna (Viin: −2 h). See on lahendatud. Lisaks normaliseerib andmete migratsioon juba salvestatud vana vorminguga väärtused ISO-vormingusse, et sorteerimine ja võrdlused segatud andmete puhul toimiksid õigesti. Väljade nimesid ega vastuse struktuuri ei muudeta.
  • Taust: Sama veaklass nagu kahel allpool toodud parandusel (API-võtmete aegumine, korduvskannimise piiraeg): SQLite’i datetime('now') kirjutab YYYY-MM-DD HH:MM:SS, kõik ülejäänud kirjutajad ISO 8601. Lähtekoodi kaitsetest (guard-test) hoiab edaspidi ära uued juhtumid.

2026-08 · Loendi pagineerimine ei kaota enam batch-koode

  • Parandus: GET /v1/codes ja GET /v1/dpp pagineerisid varem ainult created_at järgi. Kuid koodid päringutest POST /v1/codes/batch, POST /v1/dpp/batch ja CSV/XLSX-impordist jagavad ühte ajatemplit — niipea kui batch oli suurem kui limit (vaikimisi 20), ei tagastanud teine lehekülg enam sama ajatempliga ülejäänud ridu. Koodid olid olemas ja kättesaadavad päringuga GET /v1/codes/:id, kuid ei ilmunud kunagi loendisse (Töölaud, CLI qr3 list, SDK-d, MCP). Kursor on nüüd võtmekogum (keyset) üle (created_at, id).
  • API muudatus: meta.pagination.next_cursor on nüüdsest läbipaistmatu väärtus (base64url) palja ajatempli asemel. Need, kes edastavad kursori muutmata kujul parameetrina ?cursor= — nagu teevad Töölaud, CLI, kõik SDK-d ja MCP-server —, ei pea midagi muutma. Vanu ajatempli kursoreid aktsepteeritakse üleminekuperioodil edasi; loetamatud kursorid tagastavad nüüd koodi 400, selle asemel et vaikselt esimene lehekülg tagastada.
  • Mõju: Kui nägite pärast batch-importi loendis vähem koode, kui tegelikult loodi: koodid ei olnud kunagi kadunud — loend kuvab neid nüüdsest täielikult. Migreerimine pole vajalik.

2026-08 · Turvalisuse korduvskannimised toimuvad taas 24-tunnise intervalliga

  • Parandus: Siht-URL-ide ja maandumislehtede linkide (Google Web Risk) perioodiline korduvskannimine jättis vahele koodid, mille viimane skannimine toimus samal kalendripäeval kui 24-tunnine piiraeg — olenevalt kellaajast viibis korduvskannimine kuni ühe päeva võrra. Piiraega arvutatakse nüüd samas ISO-vormingus, milles on salvestatud skannimise ajatemplid.
  • Mõju: Siht-URL, mis liigitatakse pärast viimast skannimist ebaturvaliseks, põhjustab taas koodi automaatse peatamise dokumenteeritud 24-tunnise akna jooksul. API või vastuse vormingu muudatusi ei ole.

2026-08 · API-võtmed aeguvad täpselt aegumisajal

  • Parandus: API-võtit, mille expires_at oli samal päeval, aktsepteeriti edasi kuni UTC keskööni. Aegumist võrreldakse nüüd ajatemplina, mitte sõnena — aegunud võti tagastab kohe 401.
  • Taust: expires_at salvestatakse ISO-ajatemplina (2026-08-14T09:00:00Z), kuid võrdluspool andis tühikuga vormingu (2026-08-14 09:00:00). Seetõttu klappis toores sõnevõrdlus ainult siis, kui juba kuupäev oli erinev.
  • Mõju: Migreerimine pole vajalik, päringu GET /v1/api-keys vastuse vorming jääb muutmata. Loetamatuid aegumisväärtusi loetakse nüüd aegunuks, mitte kehtivaks.

2026-08 · API viide: tenandi haldus dokumenteeritud

  • OpenAPI: Spetsifikatsioon — ja seega ka interaktiivne viide — dokumenteerib nüüd organisatsioone (sh GET /v1/organizations/usage), tööruume (Workspaces), liikmeid ja rolle ning auditiloge.
  • Arveldus: Pakettide ülevaade (GET /v1/billing/plans) on avalik; Checkout (POST /v1/billing/checkout) ja Stripe’i kliendiportaal (GET /v1/billing/portal) on määratletud lõpp-punktidena organisatsiooni administraatoritele.
  • Skannimise eksport: Skannimisstatistika (GET /v1/codes/{id}/scans) ja toorandmete eksport (…/scans.csv, …/scans.xlsx) on täielikult dokumenteeritud — sealhulgas GDPR-i märkus: ip_hash ei sisaldu kunagi ekspordis.
  • Vigade käitumine: Uuena on dokumenteeritud ka päringu valideerimise 400-vastus: vastuse keha on töötlemata Zod-viga, mitte RFC-7807 probleemidokument — sellest hoolimata väljastatakse see sisutüübiga application/problem+json.

2026-08 · Avalike faililinkide kopeerimine

  • Dashboard: Koodi detailide lehel olevatel avalikel failidel on nüüd nupp, mis kopeerib nende avaliku lingi lõikelauale – seda saab kohe kasutada QR-koodi siht-URL-ina, kui skannimine peab avama kindla dokumendi failide loendiga maandumislehe asemel.
  • API: Failide lõpp-punktid (/v1/files) tagastavad lisaks välja public_url. Väli on määratud ainult failidel, millel on visibility: public – privaatsed failid avalikku aadressi ei saa.
  • Käitumine: Link ei vaja sisselogimist ja avab faili otse brauseris. Toiming Asenda jätab selle muutmata, nii et selle lingiga trükitud kood jääb kehtima. Üksikasjad: Failid ja andmelehed.

2026-07 · Meeskonna rollid: Kaastööline ilma kustutamisõiguseta ja administraatori arveldus

  • Uus: liikmeroll Kaastööline (kustutamiseta) — loob ja muudab QR-koode, faile ning Digital Product Passports, kuid ei saa midagi kustutada ega API-võtmeid luua. Kõik destruktiivsed lõpp-punktid kontrollivad rolli serveri poolel (403).
  • Arveldus: paketi uuendamised ja Stripe kliendiportaal (POST /v1/billing/checkout, GET /v1/billing/portal) on nüüd reserveeritud organisatsiooni administraatoritele — kõik teised rollid näevad kirjutuskaitstud paketi ülevaadet.
  • Dashboard: toimingud, mida kasutaja roll ei luba, peidetakse: Vaataja ei näe näiteks loomise, muutmise ega kustutamise nuppe; loendid, allalaadimised ja statistika jäävad nähtavaks. Üksikasjad: Meeskond ja rollid.

2026-06 · Välised lingid koodi maandumislehel

  • Maandumisleht: Koodi qr3-majutatud maandumisleht võib nüüd loetleda väliseid, ise majutatud linke ({ label, url }) lisaks üleslaaditud failidele või nende asemel – näiteks andmelehtede jaoks teie enda saidil.
  • API: POST/PATCH /v1/codes aktsepteerivad massiivi links (0–20 kirjet, http(s), ≤ 2048 märki). Iga URL kontrollitakse teenusega Google Web Risk; ebaturvaline URL tagastab 422. Tühi massiiv kustutab kõik lingid.
  • Dashboard: Linkide lisamine, ümberjärjestamine ja eemaldamine koodi üksikasjade lehel.
  • Turvalisus: Renderdatud lingid jäävad XSS-turvaliseks (escape’itud, ainult http(s)) ja leht säilitab oma noindex päise.

2026-04 · Dashboardi analüütika QR-koodi kohta

  • Dashboard: QR-koodide loendis olev analüütika nupp avab nüüd vastava QR-koodi statistikalehe aadressil /dashboard/codes/{id}.
  • Marsruutimine (Routing): Alias /dashboard/codes suunab endiselt aadressile /dashboard, kuid ei püüa enam kinni detailseid marsruute nagu /dashboard/codes/{id}.
  • API: Detailne leht laeb QR-koodi otse päringuga GET /v1/codes/:id; seetõttu ei sõltu see enam loendi lehekülgede jaotuse (pagination) piirangutest.
  • Testid: Regressioonitestid katavad aliase ümbersuunamist ja koodi otsest laadimist.

2026-04 · Dashboardi kustutamise dialoog QR-koodidele

  • Dashboard: QR-koodide loendis olev prügikasti ikoon avab nüüd brauseri algupärase (native) hüpikakna asemel spetsiaalse Reacti dialoogiakna.
  • Tagasiside: Pärast kustutamist kuvatakse edu või vea kohta teavitustekst (toast-teavitus).
  • Testid: packages/dashboard/tests/dashboard.test.ts hoiab ära regressioonid funktsioonile confirm() QR-koodi kustutamise voos.

2026-04 · Dashboardi lühilingi test dünaamilistele QR-koodidele

  • Dashboard: QR-koodide loendis olevad lühikoodid (shortcodes) on nüüd otse klõpsatavad väliste ümbersuunamislinkidena. Välimise lingi ikoon näiteks koodi wu3qaa kõrval avab aadressi https://qr3.app/{shortCode} uuel vahekaardil.
  • i18n: Lisatud saksa- ja ingliskeelsed vihjetekstid (tooltips).
  • Testid: packages/dashboard/tests/dashboard.test.ts kaitseb lingi href-i, uue vahekaardi käitumist, atribuuti noopener noreferrer ja ikooni regressioonide eest.

2026-04 · Suunamise Workeri marsruut dünaamilistele QR-koodidele

  • Parandus: Dünaamilisi QR-koode aadressil https://qr3.app/{shortCode} töötleb uuesti suunamise Worker (Redirect Worker). Tootmismarsruut (production route) kasutab nüüd mustrit qr3.app/*, kuna Cloudflare Workeri marsruudid ei toeta :code teekonnaparameetreid.
  • Tugevdamine: Mittesobivad teed suunatakse edasi maandumislehe algpunkti (landing origin), et suunamise Worker ei blokeeriks tavalisi lehti nagu /de/pricing.
  • Testid: packages/redirect/tests/unit/redirect.test.ts kontrollib metamärgi (wildcard) marsruuti, lühikoodi töötlemist ja algpunkti edasisuunamist (origin pass-through).

2026-04 · Tööruumi (Workspace) DPP skannimiste ülevaade (Q3.4.2)

  • Uus: GET /v1/workspace/stats/dpp?days=30 — koondab kõik API-võtme tööruumi dpp_scans andmed (active_dpps, scans_by_day, top_dpps koos tootenime/kategooriaga).
  • Dashboard: Kaart avalehel (/dashboard) koos 30 päeva tulpdiagrammiga + edetabelid — paralleelselt QR-koodi kaartidega.
  • Avalik: Turunduse lühilink GET /dpp/dpp_<id> (üks segment) reaalajas demode jaoks, paralleelselt teega /dpp/{gtin}/{serial}.

2026-04 · DPP skannimiste analüütika (Q3.4.1)

  • Uus: GET /v1/dpp/:id/stats?days=30 — avaliku GS1 lahendaja (resolver) koondatud skannimised DPP kohta. Väljad: total_scans, period_scans, scans_by_day, top_countries, top_devices, top_representations.
  • Uus: Tabel dpp_scans (migratsioon 0011) — eraldiseisev tabelist scans (suunamise Worker). IP-aadressid räsivad iga päev roteeruva soolaga (salt), toored IP-aadressid ei jõua kunagi andmebaasi D1.
  • Dashboard: Mini-graafiku kaart (SVG, ilma graafikute teegita) aadressil /dashboard/dpp/:dppId koos 30 päeva tulpade + top 3 jaotustega. Tühja oleku (empty state) vaade, kui DPP on avalik, kuid pole veel skannimisi saanud.

2026-04 · Reaalajas EL-i vastavuse simulaator (Q3.3.7)

  • Uus: POST /v1/dpp/:id/validate-update — simuleerib osalisi värskendusi olekuta (stateless) (olek, turgude loend jne) ilma andmete salvestamiseta. Vastus sisaldab välju eu_compliance + preview.changed_fields.
  • Dashboard: Simulaatori kaart DPP detailvaates (/dashboard/dpp/:dppId) — nupud (chips) riikidele DE/AT/FR/IT/ES/NL + kohandatud, oleku rippmenüü, Preview EU impact / Save changes / Reset. Mitteblokeeriv Remixi useFetcher kaudu.
  • Tugevdamine: Eraldatud simulaatori abifunktsioonid (readUpdatePatchFromForm, marketCountriesKey) + 18 uut üksustesti (unit tests); veaparandus: üksik mitte-ISO sisend ei kustuta enam turgude loendit.

2026-04 · Reaalajas EL-i vastavuse eelvaade loomisvormis (Q3.3.6)

  • Muudetud: POST /v1/dpp/validate tagastab lisaks välja eu_compliance — sama validaator mis GET /v1/dpp/:id/eu-compliance, olekuta (stateless) enne salvestamist.
  • Dashboard: Eelvaade olemasoleva valideerimispaneeli all + uus Save-Guard-bänner enne saatmisnuppe (submit), kui esineb lahendamata vigu/hoiatusi (i18n mitmuse vormid DE/EN).

2026-04 · EL-i validaator + tekstiili kasutajaliides (Q3.3.4 + Q3.3.5)

  • Uus: EL-i vastavuse validaator 5 tekstiilireegliga (TEXTILE_AGEC_REQUIRED, TEXTILE_MICROPLASTICS_CONSISTENCY, TEXTILE_SVHC_THRESHOLD, TEXTILE_GREENWASHING, TEXTILE_ESPR_READY).
  • Uus: GET /v1/dpp/:id/eu-compliance koos väljadega compliant / espr_ready / issues[] / summary.
  • Dashboard: EL-i vastavuse jaotis (EU-Compliance-Section) DPP detailvaates (kokkuvõtte kaardid, rühmitatud probleemide kaardid, ESPR-Ready-märk päises).

2026-04 · Tekstiili DPP skeem (Q3.3.1–Q3.3.3)

  • Uus: Kategooria textile koos kohustusliku AGEC-ahelaga (kudumine/silmkoes valmistamine → värvimine/trükkimine → rõivaste valmistamine), kiu kohta origin_country + recycled_pct, svhc_substances[], ESPR-Opt-in (PEF, kasutusiga, ringlussevõetavus).
  • Uus: Baasväli market_countries: string[] (ISO 3166-1 alpha-2) kõikides DPP kategooriates — juhib Prantsusmaa-spetsiifilisi AGEC-reegleid ja prantsuskeelset kohustuslikku tarbijateavet.
  • Uus: Tarbija HTML-mall koos AGEC mikroplasti hoiatuskastiga, 3-astmelise päritoluahelaga (lipu-mullid), SVHC-loendiga ning vastupidavuse (Durability) ja ringlussevõetavuse (Recyclability) jaotisega.
  • Migratsioon: 0010_dpp_market_countries (D1).

2026-04 · DPP hulgisissevedu (Bulk Import) (Q3.2.1–Q3.2.5)

  • Uus: POST /v1/dpp/import toetab CSV- ja XLSX-vormingut (Worker-ühilduv SheetJS xlsx kaudu, ~283 KB gzip-pakett).
  • Skaleeritud: paketipõhine limiit (Free 100 → Enterprise 10k) + osadeks jaotatud db.batch() à 100 + 5 MB päringu keha (body) limiit.
  • Uus: Veaaruanne CSV-vormingus vastuse 201 väljal errors_csv; GET /v1/dpp/import/templates/:category?format=csv|xlsx pakub valmis malle aku ja tekstiili jaoks.
  • Dashboard: Pukseeri (Drag-and-Drop) üleslaadimine aadressil /dashboard/dpp/import koos malli puhverserveri (template proxy) ja vahetu CSV-allalaadimisega.

Mitte-katkestavad (Non-Breaking) — LTS-laiendused

Kõik ülaltoodud muudatused on additiivsed (lisanduvad):

  • Olemasolevad POST /v1/dpp/validate kliendid ignoreerivad uut välja eu_compliance ilma muudatusteta.
  • Olemasolevad battery vood on muutmata.
  • market_countries on valikuline ja selle vaikeväärtus on [].

Katkestavate muudatuste poliitika kohta vaata API versioonihaldus.