Skip to content

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/codes u GET /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/users u /v1/webhooks/:id/deliveries. Kollha kienu qed jagħmlu paginazzjoni abbażi ta’ created_at biss; 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_cursor minn issa ‘l quddiem huwa wkoll valur opak (base64url) minflok timestamp sempliċi; cursors li ma jistgħux jinqraw jirritornaw 400, filwaqt li cursors qodma tat-timestamp se jibqgħu jiġu aċċettati b’mod temporanju. Eċċezzjoni GET /v1/webhooks/:id/deliveries: hemmhekk next_cursor jibqa’ l-ID tal-aħħar kunsinna (ID mhux magħrufa → l-ewwel paġna). Klijenti li jirritornaw next_cursor mingħ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_at kien 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ħed format: date-time u l-ħolqien (POST) jipprovdi t-timestamp tal-ISO (2026-08-17T09:00:00.000Z). L-istess kien japplika għal deleted_at/updated_at waqt soft-delete kif ukoll għall-mogħdijiet ta’ editjar/tħassir ta’ API-Keys, organizzazzjonijiet, Workspaces, membri, kummenti u webhooks, kif ukoll għal last_used_at ta’ API-Keys u last_triggered_at ta’ webhooks. Il-mogħdijiet kollha tal-kitba issa jittimbraw ISO 8601 (UTC, T u Z).
  • Impatt: Klijenti li janalizzaw updated_at b’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 jikteb YYYY-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/codes u GET /v1/dpp kienu qed jagħmlu paginazzjoni biss permezz ta’ created_at. Madankollu, il-kodiċijiet minn POST /v1/codes/batch, POST /v1/dpp/batch u l-importazzjoni ta’ CSV/XLSX jaqsmu timestamp wieħed — malli l-lott ikun akbar minn limit (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, CLI qr3 list, SDKs, MCP). Il-cursor issa huwa keyset fuq (created_at, id).
  • Bidla fl-API: meta.pagination.next_cursor minn 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 jirritornaw 400 minflok 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_at tiegħ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 immedjatament 401.
  • Sfond: expires_at jiġ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-keys jibqa’ 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_hash qatt ma huwa inkluż fl-esportazzjoni.
  • Imġiba tal-iżbalji: Id-dokumentazzjoni l-ġdida tinkludi wkoll ir-rispons 400 tal-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-Type application/problem+json.
  • 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 wkoll public_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.
  • 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/codes jaċċettaw array links (0–20 entrata, http(s), ≤ 2048 karattru). Kull URL jiġi vverifikat b’Google Web Risk; URL mhux sikur jirritorna 422. 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-header noindex tagħ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/codes ikompli 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.ts jipprevjeni rigressjonijiet fuq confirm() fil-fluss tat-tħassir tal-QR-Code.
  • 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ż. wu3qaa tiftaħ 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.ts jipproteġi l-href tal-link, l-imġiba tat-tab il-ġdida, noopener noreferrer u 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ża qr3.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/pricing ma jiġux imblukkati mir-Redirect-Worker.
  • Tests: packages/redirect/tests/unit/redirect.test.ts jivverifika 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_scans kollha tal-workspace tal-API-Key (active_dpps, scans_by_day, top_dpps b’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 (migrazzjoni 0011) — separata minn scans (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/:dppId b’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 fih eu_compliance + preview.changed_fields.
  • Dashboard: Karta tas-simulatur fid-dettall tad-DPP (/dashboard/dpp/:dppId) — chips għal DE/AT/FR/IT/ES/NL + Custom, dropdown tal-istatus, Preview EU impact / Save changes / Reset. Mhux imblukkanti (non-blocking) permezz ta’ Remix useFetcher.
  • 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/validate jipprovdi wkoll eu_compliance — l-istess validatur bħal GET /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-compliance b’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 textile b’katina ta’ obbligu AGEC (Insiġ/Knitting → Żebgħa/Stampar → Konfezzjoni), għal kull fibra origin_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/import jaċċetta CSV u XLSX (kompatibbli mal-Workers permezz ta’ SheetJS xlsx, ~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_csv tar-rispons 201; GET /v1/dpp/import/templates/:category?format=csv|xlsx jipprovdi mudelli lesti għall-batteriji u t-tessuti.
  • Dashboard: Upload b’Drag-and-Drop taħt /dashboard/dpp/import bi 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/validate jinjoraw il-qasam il-ġdid eu_compliance mingħajr ebda bidla.
  • Flussi eżistenti ta’ battery mhumiex mibdula.
  • market_countries huwa fakultattiv u b’mod awtomatiku huwa [].

Ara l-Verżjonar tal-API għall-politika dwar bidliet li jinterrompu s-servizz (breaking changes).