Changelog
Changelog
Punti ewlenin ikkurati mill-aħħar rilaxxi. Għal verżjonijiet sħaħ tal-API u l-politika dwar bidliet li jinterrompu s-servizz (breaking changes), ara l-Verżjonar tal-API u Politika LTS.
Bidliet dettaljati fuq endpoints individwali: Speċifikazzjoni OpenAPI u Referenza tal-API interattiva.
2026-08 · Keyset cursor issa fuq l-endpoints kollha tal-listi
- Fix: Il-fix tal-cursor għal
GET /v1/codesuGET /v1/dpp(ara hawn taħt) issa ġie estiż għal-listi l-oħra kollha b’paginazzjoni tal-cursor:GET /v1/qr-codes/:id/comments,/v1/workspaces,/v1/gs1/identifiers,/v1/members,/v1/audit-logs,/v1/admin/orgs,/v1/admin/usersu/v1/webhooks/:id/deliveries. Kollha kienu qed jagħmlu paginazzjoni abbażi ta’created_atbiss; ringieli b’timestamp identiku (daħliet tal-audit log ta’ operazzjoni f’lott, tentattivi mill-ġdid ta’ webhooks, importazzjonijiet ta’ membri) setgħu jintilfu fuq il-paġna li jmiss. Iċ-ċavetta tal-issortjar issa hija t-tuple(created_at, id)kullimkien. - Bidla fl-API: Fuq dawn il-listi,
meta.pagination.next_cursorminn issa ‘l quddiem huwa wkoll valur opak (base64url) minflok timestamp sempliċi; cursors li ma jistgħux jinqraw jirritornaw400, filwaqt li cursors qodma tat-timestamp se jibqgħu jiġu aċċettati b’mod temporanju. EċċezzjoniGET /v1/webhooks/:id/deliveries: hemmhekknext_cursorjibqa’ l-ID tal-aħħar kunsinna (ID mhux magħrufa → l-ewwel paġna). Klijenti li jirritornawnext_cursormingħajr tibdil — Dashboard, CLI, SDKs, MCP — m’għandhomx bżonn ibiddlu xejn. - Impatt: L-ebda migrazzjoni meħtieġa. Jekk f’waħda minn dawn il-listi (eż. l-audit log jew il-log tal-kunsinni fid-Dashboard) innutajt li kienu nieqsa xi daħliet waqt li kont qed tqalleb il-paġni: dawn qatt ma ntilfu — il-listi issa qed juruhom b’mod sħiħ. — il-listi issa qed juruhom b’mod sħiħ.
2026-08 · Timestamps wara l-editjar u t-tħassir jerġgħu jkunu konformi mal-OpenAPI
- Fix: Wara
PATCH /v1/codes/{id},updated_atkien qed jiġi rritornat fil-format ta’ SQLite mingħajr żona tal-ħin (2026-08-17 09:00:00), għalkemm l-ispeċifikazzjoni tal-OpenAPI twiegħedformat: date-timeu l-ħolqien (POST) jipprovdi t-timestamp tal-ISO (2026-08-17T09:00:00.000Z). L-istess kien japplika għaldeleted_at/updated_atwaqt soft-delete kif ukoll għall-mogħdijiet ta’ editjar/tħassir ta’ API-Keys, organizzazzjonijiet, Workspaces, membri, kummenti u webhooks, kif ukoll għallast_used_atta’ API-Keys ulast_triggered_atta’ webhooks. Il-mogħdijiet kollha tal-kitba issa jittimbraw ISO 8601 (UTC,TuZ). - Impatt: Klijenti li janalizzaw
updated_atb’new Date(...)(SDKs, CLI, Dashboard) kienu qed jaqraw il-format bi spazju bħala ħin lokali — is-CLI kienet qed turi l-ħin imċaqlaq bl-offset lokali għal kodiċijiet li ġew editjati darba (Vjenna: −2 h). Dan ġie rranġat. Barra minn hekk, migrazzjoni tad-dejta tinnormalizza valuri diġà ffrankati fil-format il-qadim għal ISO, sabiex l-issortjar u l-paraguni f’rekords imħallta jkunu korretti. L-ebda bidla fl-ismijiet tal-oqsma jew fl-istruttura tar-rispons. - Sfond: L-istess klassi ta’ żball bħaż-żewġ soluzzjonijiet hawn taħt (skadenza tal-API-Key, re-scan-cutoff): id-
datetime('now')ta’ SQLite jiktebYYYY-MM-DD HH:MM:SS, filwaqt li l-kittieba l-oħra kollha jiktbu ISO 8601. Test ta’ protezzjoni tal-kodiċi sors (guard test) se jipprevjeni okkorrenzi ġodda fil-futur.
2026-08 · Il-paginazzjoni tal-listi ma għadhiex titlef kodiċijiet tal-lott
- Fix:
GET /v1/codesuGET /v1/dppkienu qed jagħmlu paginazzjoni biss permezz ta’created_at. Madankollu, il-kodiċijiet minnPOST /v1/codes/batch,POST /v1/dpp/batchu l-importazzjoni ta’ CSV/XLSX jaqsmu timestamp wieħed — malli l-lott ikun akbar minnlimit(default 20), it-tieni paġna ma kinitx għadha tipprovdi l-bqija tal-linji tal-istess timestamp. Il-kodiċijiet kienu jeżistu u kienu aċċessibbli permezz ta’GET /v1/codes/:id, iżda qatt ma kienu jidhru fil-lista (Dashboard, CLIqr3 list, SDKs, MCP). Il-cursor issa huwa keyset fuq(created_at, id). - Bidla fl-API:
meta.pagination.next_cursorminn issa ‘l quddiem huwa valur opak (base64url) minflok timestamp sempliċi. Dawk li jirritornaw il-cursor mhux mibdul bħala?cursor=— kif jagħmlu d-Dashboard, is-CLI, l-SDKs kollha u s-server tal-MCP — m’għandhomx għalfejn ibiddlu xejn. Cursors qodma tat-timestamp se jkomplu jiġu aċċettati b’mod temporanju; cursors li ma jistgħux jinqraw issa se jirritornaw400minflok ma jagħtu l-ewwel paġna b’mod sieket. - Impatt: Għal dawk li wara importazzjoni ta’ lott raw inqas kodiċijiet fil-lista milli fil-fatt inħolqu: Il-kodiċijiet qatt ma ntilfu — il-lista issa qed turihom kollha. L-ebda migrazzjoni mhi meħtieġa.
2026-08 · Ir-re-scans tas-sigurtà qed jerġgħu jsiru kull 24 siegħa
- Fix: Ir-re-scanning perjodiku ta’ URLs tad-destinazzjoni u links tal-landing page (Google Web Risk) kien qed jaqbeż kodiċijiet li l-aħħar scan tagħhom kien fl-istess jum kalendarju bħall-cutoff ta’ 24 siegħa — skont il-ħin, ir-re-scan kien jiġi ttardjat sa jum ieħor. Il-cutoff issa qed jiġi kkalkulat fl-istess format ISO li fih huma ffrankati t-timestamps tal-iscan.
- Impatt: URL tad-destinazzjoni li tiġi kklassifikata bħala mhux sigura wara l-aħħar scan terġa’ twassal għall-pawża awtomatika tal-kodiċi fi ħdan it-tieqa dokumentata ta’ 24 siegħa. L-ebda bidla fl-API jew fil-format tar-rispons.
2026-08 · L-API-Keys jiskadu fil-ħin tal-iskadenza
- Fix: API-Key li l-
expires_attiegħu kien fl-istess jum kien jibqa’ jiġi aċċettat sa nofsillejl UTC. L-iskadenza issa tiġi mqabbla bħala timestamp minflok bħala string — API-Key skadut jagħti immedjatament401. - Sfond:
expires_atjiġi ffrankat bħala ISO timestamp (2026-08-14T09:00:00Z), filwaqt li n-naħa tal-paragun kienet tipprovdi l-format bi spazju (2026-08-14 09:00:00). Il-paragun dirett tal-istring għalhekk kien ikun korrett biss jekk id-data nnifisha kienet diġà differenti. - Impatt: M’hemm bżonn tal-ebda migrazzjoni, il-format tar-rispons ta’
GET /v1/api-keysjibqa’ ma jinbidelx. Valuri tal-iskadenza li ma jistgħux jinqraw issa jitqiesu bħala skaduti minflok validi.
2026-08 · Referenza tal-API: Ġestjoni tat-Tenant dokumentata
- OpenAPI: L-ispeċifikazzjoni — u għalhekk ir-referenza interattiva — issa tiddokumenta Organizzazzjonijiet (inkluż
GET /v1/organizations/usage), Workspaces, Membri u Rwoli u Audit-Logs. - Billing: Il-ħarsa ġenerali tal-pjanijiet (
GET /v1/billing/plans) hija pubblika; Checkout (POST /v1/billing/checkout) u l-portal tal-klijenti ta’ Stripe (GET /v1/billing/portal) huma indikati bħala endpoints għall-amministraturi tal-organizzazzjoni. - Esportazzjoni tal-iskans: L-istatistika tal-iskans (
GET /v1/codes/{id}/scans) u l-esportazzjoni tad-dejta mhux ipproċessata (…/scans.csv,…/scans.xlsx) huma ddokumentati bis-sħiħ — inkluża n-nota tal-GDPR: L-ip_hashqatt ma huwa inkluż fl-esportazzjoni. - Imġiba tal-iżbalji: Id-dokumentazzjoni l-ġdida tinkludi wkoll ir-rispons
400tal-validazzjoni tat-talba: Il-body huwa l-iżball Zod mhux ipproċessat, mhux dokument ta’ problema RFC-7807 — madankollu, xorta jiġi kkonsenjat taħt il-Content-Typeapplication/problem+json.
2026-08 · Ikkopja l-links pubbliċi tal-fajls
- Dashboard: Il-fajls pubbliċi fuq il-paġna tad-dettalji tal-kodiċi issa għandhom buttuna li tikkopja l-link pubbliku tagħhom fil-clipboard – jista’ jintuża direttament bħala l-URL tad-destinazzjoni ta’ QR-Code meta skennjar għandu jiftaħ dokument speċifiku mill-ewwel minflok il-landing page bil-lista tal-fajls.
- API: L-endpoints tal-fajls (
/v1/files) jipprovdu wkollpublic_url. Il-qasam huwa stabbilit biss għal fajls b’visibility: public– il-fajls privati ma jiksbu l-ebda indirizz pubbliku. - Imġiba: Il-link ma jeħtieġx login u jiftaħ il-fajl direttament fil-browser. Is-sostituzzjoni tal-fajl permezz ta’ Issostitwixxi ma tbiddilx il-link, u għalhekk kodiċi stampat bih jibqa’ validu. Dettalji: Fajls u Skedi tad-Dejta.
2026-07 · Rwoli tat-Tim: Kontributur mingħajr tħassir u fatturazzjoni tal-Amministratur
- Ġdid: Ir-rwol ta’ membru Kontributur (mingħajr tħassir) — joħloq u jeditja QR-Codes, fajls u Digital Product Passports, iżda ma jista’ jħassar xejn u lanqas joħloq API-Keys. L-endpoints distruttivi kollha jivverifikaw ir-rwol fuq is-server (
403). - Fatturazzjoni: It-titjib fil-pjanijiet u l-portal tal-klijenti ta’ Stripe (
POST /v1/billing/checkout,GET /v1/billing/portal) issa huma riżervati għall-Amministraturi tal-organizzazzjoni — ir-rwoli l-oħra kollha jaraw ħarsa ġenerali tal-pjan f’modalità li tista’ tinqara biss. - Dashboard: L-azzjonijiet li mhumiex permessi mir-rwol tal-utent stess jiġu moħbija: Osservatur, pereżempju, ma jarax buttuni biex joħloq, jeditja jew iħassar; il-listi, id-downloads u l-istatistika jibqgħu viżibbli. Dettalji: Tim u Rwoli.
2026-06 · Links esterni fuq il-landing page tal-kodiċi
- Landing page: Il-landing page ta’ kodiċi ospitata minn qr3 issa tista’ telenka links esterni self-hosted (
{ label, url }) flimkien mal-fajls imtellgħa jew minflokhom – pereżempju għal data sheets fuq is-sit tiegħek stess. - API:
POST/PATCH /v1/codesjaċċettaw arraylinks(0–20 entrata,http(s), ≤ 2048 karattru). Kull URL jiġi vverifikat b’Google Web Risk; URL mhux sikur jirritorna422. Array vojt iħassar il-links kollha. - Dashboard: Żid, irranġa mill-ġdid u neħħi links fuq il-paġna tad-dettalji tal-kodiċi.
- Sigurtà: Il-links renderjati jibqgħu siguri mill-XSS (escaped,
http(s)biss) u l-paġna żżomm l-headernoindextagħha.
2026-04 · Analitika tad-Dashboard għal kull QR-Code
- Dashboard: Il-buttuna tal-Analitika fil-lista tal-QR-Codes issa tiftaħ il-paġna tal-istatistika tal-QR-Code rispettiv taħt
/dashboard/codes/{id}. - Routing: L-alias
/dashboard/codesikompli jidderieġi mill-ġdid lejn/dashboard, iżda ma jibqax jinterċetta rotot dettaljati bħal/dashboard/codes/{id}. - API: Il-paġna tad-dettalji tgħabbi l-QR-Code direttament permezz ta’
GET /v1/codes/:id; b’hekk m’għadhiex dipendenti fuq il-limiti tal-paginazzjoni tal-lista. - Tests: It-testijiet ta’ rigressjoni jkopru r-redirect tal-alias u t-tagħbija diretta tal-kodiċi.
2026-04 · Djalogu ta’ Tħassir tad-Dashboard għal QR-Codes
- Dashboard: L-ikona tal-kontenitur tal-iskart fil-lista tal-QR-Codes issa tiftaħ djalogu React apposta minflok popup nattiv tal-browser.
- Feedback: Wara t-tħassir, tidher notifika toast ta’ suċċess jew żball.
- Tests:
packages/dashboard/tests/dashboard.test.tsjipprevjeni rigressjonijiet fuqconfirm()fil-fluss tat-tħassir tal-QR-Code.
2026-04 · Test ta’ Link Qasir tad-Dashboard għal QR-Codes Dinamiċi
- Dashboard: Ix-shortcodes fil-lista tal-QR-Codes issa jistgħu jiġu kklikkjati direttament bħala links esterni ta’ redirect. L-ikona tal-link estern ħdejn eż.
wu3qaatiftaħhttps://qr3.app/{shortCode}f’tab ġdida. - i18n: Miżjuda testi tat-tooltip għall-Ġermaniż u l-Ingliż.
- Tests:
packages/dashboard/tests/dashboard.test.tsjipproteġi l-href tal-link, l-imġiba tat-tab il-ġdida,noopener noreferreru l-ikona kontra rigressjonijiet.
2026-04 · Rotta tar-Redirect-Worker għal QR-Codes Dinamiċi
- Fix: QR-Codes dinamiċi taħt
https://qr3.app/{shortCode}qed jerġgħu jiġu pproċessati mir-Redirect-Worker. Ir-rotta tal-produzzjoni issa tużaqr3.app/*, peress li r-rotot tal-Cloudflare Workers ma jappoġġjawx parametri tal-passaġġ:code. - Tisħiħ: Mogħdijiet li ma jaqblux jiġu mgħoddija lill-landing origin, sabiex paġni normali bħal
/de/pricingma jiġux imblukkati mir-Redirect-Worker. - Tests:
packages/redirect/tests/unit/redirect.test.tsjivverifika r-rotta wildcard, l-ipproċessar tax-shortcode u l-pass-through tal-origin.
2026-04 · Ħarsa Ġenerali tal-Iskanjar tad-DPP tal-Workspace (Q3.4.2)
- Ġdid:
GET /v1/workspace/stats/dpp?days=30— jaggrega d-dpp_scanskollha tal-workspace tal-API-Key (active_dpps,scans_by_day,top_dppsb’isem il-prodott/kategorija). - Dashboard: Karta fuq il-paġna ewlenija (
/dashboard) b’bar chart ta’ 30 jum + listi tal-aqwa — b’mod parallel mal-karti tal-QR-Code. - Pubbliku: Shortlink tal-marketing
GET /dpp/dpp_<id>(segment wieħed) għal live demos, b’mod parallel ma’/dpp/{gtin}/{serial}.
2026-04 · Analitika tal-Iskanjar tad-DPP (Q3.4.1)
- Ġdid:
GET /v1/dpp/:id/stats?days=30— skans aggregati tar-resolver pubbliku tal-GS1 għal kull DPP. Oqsma:total_scans,period_scans,scans_by_day,top_countries,top_devices,top_representations. - Ġdid: Tabella
dpp_scans(migrazzjoni0011) — separata minnscans(Redirect-Worker). L-indirizzi IP jiġu mħaddma b’hash b’salt li jdur kuljum, b’hekk IPs mhux ipproċessati qatt ma jilħqu D1. - Dashboard: Karta b’mini-chart (SVG, l-ebda librerija ta’ charts) fuq
/dashboard/dpp/:dppIdb’bars ta’ 30 jum + analiżi dettaljata tal-aqwa 3. Stat vojt (empty state) malli DPP ikun live iżda jkun għadu ma kellux skans.
2026-04 · Simulatur tal-Konformità tal-UE Live (Q3.3.7)
- Ġdid:
POST /v1/dpp/:id/validate-update— jissimula aġġornamenti parzjali stateless (status, lista tas-suq, …) mingħajr persistenza. Ir-rispons fiheu_compliance+preview.changed_fields. - Dashboard: Karta tas-simulatur fid-dettall tad-DPP (
/dashboard/dpp/:dppId) — chips għalDE/AT/FR/IT/ES/NL+ Custom, dropdown tal-istatus, Preview EU impact / Save changes / Reset. Mhux imblukkanti (non-blocking) permezz ta’ RemixuseFetcher. - Tisħiħ: Helpers tas-simulatur esternalizzati (
readUpdatePatchFromForm,marketCountriesKey) + 18-il unit test ġdid; Bugfix: Input Lone-Non-ISO ma jibqax iħassar il-lista tas-suq.
2026-04 · Preview tal-Konformità tal-UE Live fil-Formola tal-Ħolqien (Q3.3.6)
- Mibdul:
POST /v1/dpp/validatejipprovdi wkolleu_compliance— l-istess validatur bħalGET /v1/dpp/:id/eu-compliance, stateless qabel ma jiġi ffrankat. - Dashboard: Preview taħt il-pannell tal-validazzjoni eżistenti + banner ġdid ta’ protezzjoni tal-iffrankar (Save-Guard-Banner) qabel il-buttuni tal-inviju, jekk ikun hemm żbalji/twissijiet miftuħa (pluralizzazzjoni i18n DE/EN).
2026-04 · Validatur tal-UE + UI tat-Tessuti (Q3.3.4 + Q3.3.5)
- Ġdid: Validatur tal-Konformità tal-UE b’5 regoli tat-tessuti (
TEXTILE_AGEC_REQUIRED,TEXTILE_MICROPLASTICS_CONSISTENCY,TEXTILE_SVHC_THRESHOLD,TEXTILE_GREENWASHING,TEXTILE_ESPR_READY). - Ġdid:
GET /v1/dpp/:id/eu-complianceb’compliant/espr_ready/issues[]/summary. - Dashboard: Sezzjoni tal-Konformità tal-UE fid-dettall tad-DPP (Summary-Tiles, karti tal-kwistjonijiet raggruppati, ESPR-Ready-Badge fl-header).
2026-04 · Skema tad-DPP tat-Tessuti (Q3.3.1–Q3.3.3)
- Ġdid: Kategorija
textileb’katina ta’ obbligu AGEC (Insiġ/Knitting → Żebgħa/Stampar → Konfezzjoni), għal kull fibraorigin_country+recycled_pct,svhc_substances[], ESPR-Opt-in (PEF, ħajja utli, Recyclability). - Ġdid: Qasam bażiku
market_countries: string[](ISO 3166-1 alpha-2) fuq il-kategoriji kollha tad-DPP — jikkontrolla r-regoli AGEC speċifiċi għal Franza u n-nota obbligatorja tal-konsumatur Franċiża. - Ġdid: Mudell HTML tal-konsumatur b’kaxxa ta’ twissija tal-mikroplastiċi AGEC, katina ta’ oriġini bi 3 stadji (pills tal-bnadar), lista SVHC, sezzjoni ta’ Durability u Recyclability.
- Migrazzjoni:
0010_dpp_market_countries(D1).
2026-04 · Importazzjoni bl-Ingrossa (Bulk) tad-DPP (Q3.2.1–Q3.2.5)
- Ġdid:
POST /v1/dpp/importjaċċetta CSV u XLSX (kompatibbli mal-Workers permezz ta’ SheetJSxlsx, ~283 KB gzip Bundle). - Skalat: limitu bbażat fuq il-pjan (Free 100 → Enterprise 10k) + chunked
db.batch()ta’ 100 + limitu tal-body ta’ 5 MB. - Ġdid: Rapport tal-iżbalji bħala CSV fil-qasam
errors_csvtar-rispons 201;GET /v1/dpp/import/templates/:category?format=csv|xlsxjipprovdi mudelli lesti għall-batteriji u t-tessuti. - Dashboard: Upload b’Drag-and-Drop taħt
/dashboard/dpp/importbi proxy tal-mudelli u tniżżil inline ta’ CSV.
Mhux Breaking — Estensjonijiet LTS
Il-bidliet kollha msemmija hawn fuq huma addittivi:
- Klijenti eżistenti ta’
POST /v1/dpp/validatejinjoraw il-qasam il-ġdideu_compliancemingħajr ebda bidla. - Flussi eżistenti ta’
batterymhumiex mibdula. market_countrieshuwa fakultattiv u b’mod awtomatiku huwa[].
Ara l-Verżjonar tal-API għall-politika dwar bidliet li jinterrompu s-servizz (breaking changes).