From 1d5c88764be17cd3405a4bc581d969185e472794 Mon Sep 17 00:00:00 2001
From: Duy Nguyen
Date: Mon, 19 Oct 2026 19:24:23 +0700
Subject: [PATCH 1/9] fix(web): resolve alias slugs on interactions, review,
rate, vote and usage routes
Closes #47
Co-Authored-By: Claude Sonnet 5.5
---
apps/web/app/lib/db/skill-aliases.ts | 32 ++++-
.../app/routes/api.alias-slug-routes.test.ts | 129 ++++++++++++++++++
apps/web/app/routes/api.skill-rate.ts | 7 +-
apps/web/app/routes/api.skill-review.ts | 15 +-
apps/web/app/routes/api.skill-vote.ts | 7 +-
apps/web/app/routes/api.usage-report.ts | 10 +-
apps/web/app/routes/api.user-interactions.ts | 23 ++--
7 files changed, 182 insertions(+), 41 deletions(-)
create mode 100644 apps/web/app/routes/api.alias-slug-routes.test.ts
diff --git a/apps/web/app/lib/db/skill-aliases.ts b/apps/web/app/lib/db/skill-aliases.ts
index 716717e..f3fec16 100644
--- a/apps/web/app/lib/db/skill-aliases.ts
+++ b/apps/web/app/lib/db/skill-aliases.ts
@@ -1,4 +1,4 @@
-import { and, eq } from "drizzle-orm";
+import { and, eq, inArray } from "drizzle-orm";
import { skills, skillAliases } from "./schema";
import type { Database } from "./index";
@@ -56,6 +56,36 @@ export async function resolveSkillBySlug(
return target ?? null;
}
+/**
+ * Batch form of {@link resolveSkillBySlug} for ids only: maps every requested slug
+ * (canonical or alias) to its skill id. A canonical hit wins over an alias, and
+ * unknown slugs are omitted.
+ */
+export async function resolveSkillIdsBySlugs(
+ db: Database,
+ slugs: string[],
+): Promise
+ {error && (
+
+ {error}
+
+ )}
+