Skip to content

fix(interactions): resolve alias slug trong api.user-interactions #47

Closed

Description

@mrgoonie

Vấn đề

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.
  • Đây là hạn chế đã ghi trong PR fix(skills): canonical skill identity from source repo and path (#25) #43 phần "Known limitations" và trong ledger plans/reports/live-verify-260922-0843-issue-25-24.md.

Đề xuất

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.

Activity

  1. clark-cant commented on Sep 22, 2026

    @clark-cant

    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.

  2. self-assigned this
    on Oct 19, 2026
  3. added and removed on Oct 19, 2026
  4. added a commit that references this issue on Oct 20, 2026
    1d5c887
  5. mrgoonie commented on Oct 20, 2026

    @mrgoonie
    ContributorAuthor

    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.

  6. added
    shippedMerged/deployed
    and removed on Oct 20, 2026
  7. added a commit that references this issue on Oct 20, 2026
    fbd0333
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingshippedMerged/deployed

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions