Skip to content

Pakeitimų žurnalas

Pakeitimų žurnalas

Atrinkti svarbiausi pastarųjų leidimų akcentai. Norėdami sužinoti apie pilnas API versijas ir esminių pakeitimų politiką (Breaking-Change-Policy), žr. API versijavimas ir LTS politika.

Išsamūs atskirų galinių taškų (endpoints) pakeitimai: OpenAPI specifikacija ir interaktyvi API nuoroda.


2026-08 · Keyset žymeklis (cursor) dabar visuose sąrašų galiniuose taškuose

  • Ištaisyta: Žymeklio (cursor) pataisymas, skirtas GET /v1/codes ir GET /v1/dpp (žr. žemiau), dabar pritaikytas visiems likusiems pagal žymeklį puslapiuojamiems sąrašams: GET /v1/qr-codes/:id/comments, /v1/workspaces, /v1/gs1/identifiers, /v1/members, /v1/audit-logs, /v1/admin/orgs, /v1/admin/users ir /v1/webhooks/:id/deliveries. Visi jie buvo puslapiuojami tik pagal created_at; eilutės su identiška laiko žyma (grupinių operacijų audito įrašai, pakartotiniai webhook bandymai, narių importavimas) kitame puslapyje galėjo būti prarastos. Rūšiavimo raktas dabar visur yra kortežas (created_at, id).
  • API pakeitimas: Šiuose sąrašuose meta.pagination.next_cursor nuo šiol taip pat yra nepermatoma reikšmė (base64url), o ne tiesioginė laiko žyma; neįskaitomi žymekliai grąžina 400, o seni laiko žymos žymekliai laikinai bus priimami toliau. Išimtis GET /v1/webhooks/:id/deliveries: čia next_cursor lieka paskutinio pristatymo ID (nežinomas ID → pirmas puslapis). Klientams, kurie grąžina next_cursor nepakeistą — Valdymo skydas, CLI, SDKs, MCP —, nieko keisti nereikia.
  • Poveikis: Migracija nereikalinga. Jei kuriame nors iš šių sąrašų (pvz., audito žurnale arba pristatymo žurnale Valdymo skyde) vartydami puslapius pasigedote įrašų: jie niekur nebuvo dingę — nuo šiol sąrašai juos rodo visus.

2026-08 · Laiko žymos po redagavimo ir trynimo vėl atitinka OpenAPI

  • Ištaisyta: Atlikus PATCH /v1/codes/{id}, updated_at buvo grąžinama SQLite formatu be laiko juostos (2026-08-17 09:00:00), nors OpenAPI specifikacija numato format: date-time, o sukūrimas (POST) pateikia ISO laiko žymą (2026-08-17T09:00:00.000Z). Tas pats galiojo deleted_at/updated_at švelnaus trynimo (Soft-Delete) atveju, taip pat API raktų, organizacijų, darbo sričių (Workspaces), narių, komentarų ir webhook redagavimo bei trynimo keliams, be to, API raktų laukui last_used_at ir webhook laukui last_triggered_at. Visi rašymo keliai dabar žymi laiką ISO 8601 formatu (UTC, T ir Z).
  • Poveikis: Klientai, kurie analizuoja updated_at naudodami new Date(...) (SDKs, CLI, Valdymo skydas), tarpų formatą skaitė kaip vietos laiką — CLI rodė bent kartą redaguotų kodų laiką, pastumtą per vietinį poslinkį (Viena: −2 h). Tai ištaisyta. Be to, duomenų migracija normalizuoja jau išsaugotas senojo formato vertes į ISO, kad rūšiavimas ir palyginimai mišriuose rinkiniuose būtų teisingi. Jokių laukų pavadinimų ar atsakymo struktūros pakeitimų.
  • Kontekstas: Tokia pati klaidų klasė kaip ir du toliau pateikti pataisymai (API raktų galiojimo pabaiga, pakartotinio skenavimo riba): SQLite datetime('now') įrašo YYYY-MM-DD HH:MM:SS, o visi kiti rašymo keliai – ISO 8601. Ateityje naujiems atvejams užkirs kelią pirminio kodo apsaugos testas.

2026-08 · Sąrašų puslapiavimas nebepraranda grupinių kodų

  • Ištaisyta: GET /v1/codes ir GET /v1/dpp puslapiavo tik pagal created_at. Tačiau kodai iš POST /v1/codes/batch, POST /v1/dpp/batch ir CSV/XLSX importo dalijasi viena laiko žyma — kai tik grupė buvo didesnė nei limit (numatytoji reikšmė 20), antrasis puslapis nebegrąžindavo likusių tos pačios laiko žymos eilučių. Kodai egzistavo ir buvo pasiekiami per GET /v1/codes/:id, tačiau sąraše (Valdymo skydas, CLI qr3 list, SDK, MCP) niekada nepasirodydavo. Dabar žymeklis yra raktų rinkinys (keyset) pagal (created_at, id).
  • API pakeitimas: nuo šiol meta.pagination.next_cursor yra nepermatoma (opaque) reikšmė (base64url), o ne tiesioginė laiko žyma. Tiems, kurie grąžina nepakeistą žymeklį kaip ?cursor= — kaip daro Valdymo skydas, CLI, visi SDK ir MCP serveris — nieko keisti nereikia. Senieji laiko žymos žymekliai laikinai bus priimami toliau; neįskaitomi žymekliai dabar grąžina 400, užuot tyliai pateikę pirmąjį puslapį.
  • Poveikis: Jei po grupinio importavimo sąraše matėte mažiau kodų, nei buvo sukurta: kodai niekur nebuvo dingę — nuo šiol sąrašas juos rodo visus. Migracija nereikalinga.

2026-08 · Saugumo pakartotinis skenavimas vėl vyksta kas 24 valandas

  • Ištaisyta: Periodinis tikslinių URL adresų ir nukreipimo puslapių nuorodų pakartotinis skenavimas (Google Web Risk) praleisdavo kodus, kurių paskutinis skenavimas buvo tą pačią kalendorinę dieną kaip ir 24 valandų riba — priklausomai nuo paros laiko, pakartotinis skenavimas vėluodavo iki papildomos paros. Riba dabar skaičiuojama tuo pačiu ISO formatu, kuriuo saugomos skenavimo laiko žymos.
  • Poveikis: Tikslinis URL adresas, kuris po paskutinio skenavimo klasifikuojamas kaip nesaugus, vėl sukelia automatinį kodo pristabdymą per dokumentuotą 24 valandų langą. API ar atsakymo formato pakeitimų nėra.

2026-08 · API raktai nustoja galioti pasibaigus jų galiojimo laikui

  • Ištaisyta: API raktas, kurio expires_at buvo tą pačią dieną, buvo priimamas iki vidurnakčio UTC. Galiojimo pabaiga dabar lyginama kaip laiko žyma, o ne kaip simbolių eilutė – pasibaigusio galiojimo raktas iškart grąžina 401.
  • Kontekstas: expires_at saugomas kaip ISO laiko žyma (2026-08-14T09:00:00Z), o palyginamoji pusė pateikdavo formatą su tarpu (2026-08-14 09:00:00). Todėl tiesioginis simbolių eilučių palyginimas buvo teisingas tik tol, kol skyrėsi pati data.
  • Poveikis: Migracija nereikalinga, GET /v1/api-keys atsakymo formatas lieka nepakitęs. Neįskaitomos galiojimo pabaigos reikšmės dabar laikomos pasibaigusiomis, o ne galiojančiomis.

2026-08 · API nuoroda: Tenant valdymas dokumentuotas

  • OpenAPI: Specifikacija — o kartu ir interaktyvi nuoroda — dabar dokumentuoja organizacijas (įsk. GET /v1/organizations/usage), darbo sritis (Workspaces), narius ir roles bei audito žurnalus (Audit-Logs).
  • Billing: Planų apžvalga (GET /v1/billing/plans) yra vieša; Checkout (POST /v1/billing/checkout) ir Stripe klientų portalas (GET /v1/billing/portal) yra nurodyti kaip galiniai taškai organizacijos administratoriams.
  • Nuskaitymų eksportas: Nuskaitymų statistika (GET /v1/codes/{id}/scans) ir neapdorotų duomenų eksportas (…/scans.csv, …/scans.xlsx) yra visiškai dokumentuoti — įskaitant BDAR pranešimą: ip_hash niekada neįtraukiamas į eksportą.
  • Klaidų elgsena: Taip pat naujai dokumentuotas užklausos patvirtinimo 400 atsakymas: pranešimo turinys (body) yra neapdorota Zod klaida, o ne RFC-7807 problemos dokumentas — vis dėlto jis pateikiamas su Content-Type application/problem+json.

2026-08 · Viešųjų failų nuorodų kopijavimas

  • Valdymo skydelis: Vieši failai kodo išsamios informacijos puslapyje dabar turi mygtuką, kuris nukopijuoja jų viešąją nuorodą į iškarpinę. Ją galima iškart naudoti kaip QR kodo tikslo URL, kai nuskaičius kodą turi atsidaryti konkretus dokumentas, o ne nukreipimo puslapis su failų sąrašu.
  • API: Failų galiniai taškai (/v1/files) papildomai grąžina public_url. Šis laukas užpildomas tik failams su visibility: public – privatūs failai viešo adreso negauna.
  • Elgsena: Nuoroda veikia be prisijungimo ir atidaro failą tiesiai naršyklėje. Failą pakeitus funkcija Pakeisti, nuoroda nesikeičia, todėl su ja atspausdintas kodas lieka galioti. Išsamiau: Failai ir duomenų lapai.

2026-07 · Komandos vaidmenys: bendradarbiai be šalinimo teisės ir administratoriaus atsiskaitymas

  • Nauja: nario vaidmuo Bendradarbis (be šalinimo) — kuria ir redaguoja QR kodus, failus bei Digital Product Passports, tačiau negali nieko šalinti ar kurti API raktų. Visi destruktyvūs programinės sąsajos taškai tikrina vaidmenį serverio pusėje (403).
  • Atsiskaitymas: plano keitimas ir Stripe klientų portalas (POST /v1/billing/checkout, GET /v1/billing/portal) dabar yra prieinami tik organizacijos administratoriams — visiems kitiems vaidmenims rodoma tik skaitoma plano apžvalga.
  • Dashboard: veiksmai, kurių neleidžia naudotojo vaidmuo, yra paslepiami: pavyzdžiui, Žiūrovas nemato kūrimo, redagavimo ar šalinimo mygtukų, tačiau sąrašai, atsisiuntimai ir statistika lieka matomi. Išsamiau: Komanda ir vaidmenys.

2026-06 · Išorinės nuorodos kodo nukreipimo puslapyje

  • Nukreipimo puslapis: qr3 talpinamas kodo nukreipimo puslapis dabar gali pateikti išorines, savarankiškai talpinamas nuorodas ({ label, url }) kartu su įkeltais failais arba vietoj jų – pavyzdžiui, techninių duomenų lapams jūsų pačių svetainėje.
  • API: POST/PATCH /v1/codes priima masyvą links (0–20 įrašų, http(s), ≤ 2048 simbolių). Kiekvienas URL tikrinamas naudojant „Google Web Risk“; nesaugus URL grąžina 422. Tuščias masyvas pašalina visas nuorodas.
  • Valdymo skydelis: Pridėkite, pertvarkykite ir pašalinkite nuorodas kodo informacijos puslapyje.
  • Sauga: Atvaizduotos nuorodos lieka apsaugotos nuo XSS (su kaitos ženklais, tik http(s)), o puslapis išsaugo savo noindex antraštę.

2026-04 · Valdymo skydelio analitika kiekvienam QR kodui

  • Valdymo skydelis: Analitikos mygtukas QR kodų sąraše dabar atidaro atitinkamo QR kodo statistikos puslapį adresu /dashboard/codes/{id}.
  • Routing: Alternatyvus adresas (alias) /dashboard/codes ir toliau nukreipia į /dashboard, tačiau nebeperima detalių maršrutų, tokių kaip /dashboard/codes/{id}.
  • API: Detalusis puslapis įkelia QR kodą tiesiogiai per GET /v1/codes/:id; dėl to jis nebėra priklausomas nuo sąrašo puslapiavimo (pagination) ribojimų.
  • Testai: Regresijos testai apima alternatyvaus adreso nukreipimą (alias redirect) ir tiesioginį kodo įkėlimą.

2026-04 · QR kodų trynimo dialogas valdymo skydelyje

  • Valdymo skydelis: Šiukšliadėžės piktograma QR kodų sąraše dabar atidaro atskirą React dialogą, o ne naršyklės iššokantį langą (popup).
  • Feedback: Ištrynus pasirodo iškylantysis pranešimas (toast) apie sėkmę arba klaidą.
  • Testai: packages/dashboard/tests/dashboard.test.ts apsaugo nuo regresijų naudojant confirm() QR kodo trynimo sraute.

2026-04 · Trumpųjų nuorodų testas dinaminiams QR kodams valdymo skydelyje

  • Valdymo skydelis: Trumpieji kodai (shortcodes) QR kodų sąraše dabar yra tiesiogiai spustelėjami als išorinės nukreipimo nuorodos. Išorinės nuorodos piktograma šalia, pvz., wu3qaa, atidaro https://qr3.app/{shortCode} naujame skirtuke.
  • i18n: Pridėti patarimų (tooltip) tekstai vokiečių ir anglų kalbomis.
  • Testai: packages/dashboard/tests/dashboard.test.ts apsaugo nuorodos „href“, naujo skirtuko elgseną, noopener noreferrer ir piktogramą nuo regresijų.

2026-04 · Nukreipimo Worker maršrutas dinaminiams QR kodams

  • Ištaisyta: Dinaminius QR kodus adresu https://qr3.app/{shortCode} vėl apdoroja nukreipimo Worker. Gamybinis (production) maršrutas dabar naudoja qr3.app/*, nes Cloudflare Worker maršrutai nepalaiko :code kelio parametrų.
  • Sustiprinimas: Neatitinkantys keliai perduodami į pradinę svetainę (landing origin), kad nukreipimo Worker neblokuotų įprastų puslapių, tokių kaip /de/pricing.
  • Testai: packages/redirect/tests/unit/redirect.test.ts tikrina pakaitos simbolio (wildcard) maršrutą, trumpojo kodo apdorojimą ir pradinės svetainės praleidimą (origin pass-through).

2026-04 · Darbo srities DPP nuskaitymų apžvalga (Q3.4.2)

  • Nauja: GET /v1/workspace/stats/dpp?days=30 — agreguoja visus API rakto darbo srities (workspace) dpp_scans (active_dpps, scans_by_day, top_dpps su produkto pavadinimu / kategorija).
  • Valdymo skydelis: Kortelė pradiniame puslapyje (/dashboard) su 30 dienų stulpeline diagrama + populiariausių sąrašais — lygiagrečiai su QR kodo kortelėmis.
  • Public: Rinkodaros trumpoji nuoroda GET /dpp/dpp_<id> (vienas segmentas) tiesioginėms demonstracijoms, lygiagrečiai su /dpp/{gtin}/{serial}.

2026-04 · DPP nuskaitymų analitika (Q3.4.1)

  • Nauja: GET /v1/dpp/:id/stats?days=30 — agreguoti viešojo GS1 atpažintuvo (resolver) nuskaitymai vienam DPP. Laukai: total_scans, period_scans, scans_by_day, top_countries, top_devices, top_representations.
  • Nauja: Lentelė dpp_scans (migracija 0011) — atskirta nuo scans (nukreipimo Worker). IP adresai maišomi (hashed) naudojant kasdien keičiamą druską (salt), neapdoroti IP adresai niekada nepasiekia D1.
  • Valdymo skydelis: Mini diagramos kortelė (SVG, nenaudojant diagramų bibliotekos) adresu /dashboard/dpp/:dppId su 30 dienų stulpeliais + 3 populiariausių pasiskirstymais. Tuščia būsena (empty-state), kai tik DPP yra paskelbtas, bet dar neturėjo nuskaitymų.

2026-04 · Tiesioginis ES atitikties simuliatorius (Q3.3.7)

  • Nauja: POST /v1/dpp/:id/validate-update — simuliuoja dalinius atnaujinimus be būsenos išsaugojimo (stateless) (būsena, rinkų sąrašas, …) be išliekamumo. Atsakyme yra eu_compliance + preview.changed_fields.
  • Valdymo skydelis: Simuliatoriaus kortelė detaliame DPP puslapyje (/dashboard/dpp/:dppId) — žymos (chips) skirtos DE/AT/FR/IT/ES/NL + pasirinktinėms, būsenos išskleidžiamasis sąrašas, Preview EU impact / Save changes / Reset. Neblokuojantis veikimas per Remix useFetcher.
  • Sustiprinimas: Iškelti simuliatoriaus pagalbiniai įrankiai (helpers) (readUpdatePatchFromForm, marketCountriesKey) + 18 naujų vienetų testų (unit tests); klaidų pataisymas: vienišas ne ISO įvesties laukas nebeištrina rinkų sąrašo.

2026-04 · Tiesioginė ES atitikties peržiūra kūrimo formoje (Q3.3.6)

  • Pakeista: POST /v1/dpp/validate papildomai pateikia eu_compliance — tas pats tikrintuvas (validator) kaip ir GET /v1/dpp/:id/eu-compliance, veikiantis be būsenos išsaugojimo (stateless) prieš išsaugant.
  • Valdymo skydelis: Peržiūra po esamu patvirtinimo skydeliu + naujas apsauginis išsaugojimo skydelis (Save-Guard-Banner) prieš pateikimo mygtukus, jei yra klaidų / įspėjimų (i18n daugiskaitos formos DE/EN).

2026-04 · ES tikrintuvas + tekstilės vartotojo sąsaja (Q3.3.4 + Q3.3.5)

  • Nauja: ES atitikties tikrintuvas (EU-Compliance-Validator) su 5 tekstilės taisyklėmis (TEXTILE_AGEC_REQUIRED, TEXTILE_MICROPLASTICS_CONSISTENCY, TEXTILE_SVHC_THRESHOLD, TEXTILE_GREENWASHING, TEXTILE_ESPR_READY).
  • Nauja: GET /v1/dpp/:id/eu-compliance su compliant / espr_ready / issues[] / summary.
  • Valdymo skydelis: ES atitikties skiltis detaliame DPP puslapyje (suvestinės kortelės, sugrupuotos problemų kortelės, ESPR-Ready ženklelis antraštėje).

2026-04 · Tekstilės DPP schema (Q3.3.1–Q3.3.3)

  • Nauja: Kategorija textile su privaloma AGEC grandine (audimas / mezgimas → dažymas / spausdinimas → siuvimas / konfekcija), kiekvienam pluoštui origin_country + recycled_pct, svhc_substances[], ESPR-Opt-in (PEF, tarnavimo laikas, Recyclability).
  • Nauja: Bazinis laukas market_countries: string[] (ISO 3166-1 alpha-2) visose DPP kategorijose — valdo Prancūzijai būdingas AGEC taisykles ir privalomą prancūzišką pastabą vartotojui.
  • Nauja: Vartotojo HTML šablonas su AGEC mikroplastiko įspėjamuoju laukeliu, 3 pakopų kilmės grandine (vėliavėlių žymekliais), SVHC sąrašu, Durability ir Recyclability skiltimis.
  • Migracija: 0010_dpp_market_countries (D1).

2026-04 · Masinis DPP importas (Q3.2.1–Q3.2.5)

  • Nauja: POST /v1/dpp/import priima CSV ir XLSX (suderinama su Worker per SheetJS xlsx, ~283 KB gzip paketas).
  • Skaliuojama: planu pagrįstas limitas (Free 100 → Enterprise 10k) + suskaidytas db.batch() po 100 + 5 MB užklausos kūno (body) limitas.
  • Nauja: Klaidų ataskaita kaip CSV atsakymo 201 lauke errors_csv; GET /v1/dpp/import/templates/:category?format=csv|xlsx pateikia paruoštus šablonus baterijoms ir tekstilei.
  • Valdymo skydelis: Failų vilkimo ir nuleidimo (drag-and-drop) įkėlimas adresu /dashboard/dpp/import su šablonų tarpiniu serveriu (proxy) ir tiesioginiu CSV atsisiuntimu.

Neesminiai pakeitimai (Non-Breaking) — LTS išplėtimai

Visi aukščiau išvardyti pakeitimai yra papildomi:

  • Esami POST /v1/dpp/validate klientai ignoruoja naują eu_compliance lauką be jokių pakeitimų.
  • Esami battery srautai lieka nepakeisti.
  • market_countries yra neprivalomas ir jo numatytoji reikšmė yra [].

Žr. API versijavimas dėl esminių pakeitimų politikos (Breaking-Change-Policy).