You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
fix(interactions): resolve alias slug trong api.user-interactions #47
apps/web/app/routes/api.user-interactions.ts (khoảng dòng 26-28) resolve slug do client gửi lên bằng inArray(skills.slug, slugs), tức chỉ khớp canonical slug. Sau #25, một slug cũ vẫn resolve bình thường trên mọi route khác nhờ bảng skill_aliases, nhưng ở đây thì không: client gửi slug cũ sẽ nhận về overlay rỗng (trạng thái favorite/vote biến mất) mà không có lỗi nào.
Bằng chứng
resolveSkillBySlug (apps/web/app/lib/db/skill-aliases.ts) là đường duy nhất có alias: nó tra skills.slug trước, rồi skill_aliases.slug, rồi lấy row theo skill_id.
Các route khác (detail, rate, review, favorite, install, vote, usage report) đều đã đi qua resolveSkillBySlug; chỉ api.user-interactions.ts còn tra thẳng theo skills.slug.
Cho mỗi slug đầu vào đi qua resolveSkillBySlug (hoặc một truy vấn join skill_aliases), rồi tập hợp canonical id để tra interactions. Thêm test: slug cũ trỏ tới skill có favorite/vote vẫn trả đúng overlay.
Mức độ
Thấp về tác động, nhưng là lỗ hổng nhất quán của hợp đồng alias mà #25 đã thiết lập: "mọi slug cũ vẫn resolve" hiện chưa đúng ở route này.
Xác minh độc lập trên main (sau #50, repo pushed 2026-09-22T10:50Z)
Core claim đúng: api.user-interactions.ts tra thẳng inArray(skills.slug, slugs) nên chỉ khớp canonical slug; client gửi slug cũ nhận overlay rỗng (favorites: [], votes: {}) mà không có lỗi nào.
Nhưng phạm vi thực tế rộng hơn issue mô tả — đây không phải lỗ hổng của riêng api.user-interactions.ts. Kiểm tra main, các route sau cũng tra thẳng eq(skills.slug, …) và bỏ qua skill_aliases:
Route
Điểm tra
Hành vi với slug cũ
api.user-interactions.ts
loader — inArray(skills.slug, slugs)
overlay rỗng, im lặng
api.skill-review.ts
loader và action — eq(skills.slug, slug)
404 "Skill not found" (cả đọc lẫn ghi review)
api.skill-rate.ts
action — eq(skills.slug, slug)
404 "Skill not found"
api.skill-vote.ts
action — eq(skills.slug, slug)
404 "Skill not found"
api.usage-report.ts
action — eq(skills.slug, skill_slug)
404 "Skill not found"
Chỉ api.skill-detail.ts, api.skill-favorite.ts, api.skill-install.ts (qua lib/catalog/skill-detail-data.ts → skill-detail-queries.ts) là đi qua resolveSkillBySlug.
Hệ quả: hợp đồng "mọi slug cũ vẫn resolve" mà #43 thiết lập hiện chưa đúng ở 5 route, không phải 1. Và fail mode còn nặng hơn phần "Mức độ" issue ghi: rate/vote/review với slug cũ trả 404 cứng, không chỉ mất overlay như user-interactions.
Đề xuất
Thay vì vá lẻ từng route, thêm một helper dùng chung — ví dụ resolveSkillIds(db, slugs: string[]) gộp canonical (skills.slug) ∪ alias (skill_aliases.slug → skill_id) — rồi cho cả 5 điểm tra dùng nó. resolveSkillBySlug hiện chỉ trả 1 row; các route này cần bản nhiều slug (batch).
Thêm test cho mỗi route: slug cũ trỏ tới skill có favorite/vote/review/usage vẫn trả đúng thay vì rỗng/404.
Nhãn
Gắn bug (không phải enhancement): nhất quán với nghĩa "Something isn't working" — endpoint trả 404/rỗng cho slug hợp lệ cũ. Giữ issue open.
Shipped: fixed by #96 (squash fbd0333, merged 2026-10-20 after 6 isolated review rounds). Deployed to production skillx-web (worker version 27d34bce at fbd0333; current 7d29ff0a at 79f98fb). Smoke 2026-10-20: /, /api/search and registry keys 200.
Activity
clark-cant commentedon Sep 22, 2026
Xác minh độc lập trên
main(sau #50, repo pushed2026-09-22T10:50Z)Core claim đúng:
api.user-interactions.tstra thẳnginArray(skills.slug, slugs)nên chỉ khớp canonical slug; client gửi slug cũ nhận overlay rỗng (favorites: [],votes: {}) mà không có lỗi nào.Nhưng phạm vi thực tế rộng hơn issue mô tả — đây không phải lỗ hổng của riêng
api.user-interactions.ts. Kiểm tramain, các route sau cũng tra thẳngeq(skills.slug, …)và bỏ quaskill_aliases:api.user-interactions.tsinArray(skills.slug, slugs)api.skill-review.tseq(skills.slug, slug)404 "Skill not found"(cả đọc lẫn ghi review)api.skill-rate.tseq(skills.slug, slug)404 "Skill not found"api.skill-vote.tseq(skills.slug, slug)404 "Skill not found"api.usage-report.tseq(skills.slug, skill_slug)404 "Skill not found"Chỉ
api.skill-detail.ts,api.skill-favorite.ts,api.skill-install.ts(qualib/catalog/skill-detail-data.ts→skill-detail-queries.ts) là đi quaresolveSkillBySlug.Hệ quả: hợp đồng "mọi slug cũ vẫn resolve" mà #43 thiết lập hiện chưa đúng ở 5 route, không phải 1. Và fail mode còn nặng hơn phần "Mức độ" issue ghi:
rate/vote/reviewvới slug cũ trả 404 cứng, không chỉ mất overlay nhưuser-interactions.Đề xuất
resolveSkillIds(db, slugs: string[])gộp canonical (skills.slug) ∪ alias (skill_aliases.slug → skill_id) — rồi cho cả 5 điểm tra dùng nó.resolveSkillBySlughiện chỉ trả 1 row; các route này cần bản nhiều slug (batch).Nhãn
Gắn
bug(không phảienhancement): nhất quán với nghĩa "Something isn't working" — endpoint trả 404/rỗng cho slug hợp lệ cũ. Giữ issue open.fix(web): resolve alias slugs on interactions, review, rate, vote and…
mrgoonie commentedon Oct 20, 2026
Shipped: fixed by #96 (squash fbd0333, merged 2026-10-20 after 6 isolated review rounds). Deployed to production skillx-web (worker version 27d34bce at fbd0333; current 7d29ff0a at 79f98fb). Smoke 2026-10-20:
/,/api/searchand registry keys 200.fix: alias slugs, .pi untracking, release scan tuning, API key settin…