feat: tiered costs feature + admin tier management + tag selection
Build & Push Docker Image / build (push) Successful in 6m52s
Build & Push Docker Image / build (push) Successful in 6m52s
- costs: nullable notes (fix create without notes), drop renewalDate (schema + API + UI), gate POST/PATCH/DELETE to admin + costs feature - feature middleware: admin-aware hasFeature + getEntitlements union; /auth/me and login return resolved entitlements - users: tier enum (free/premium/enterprise) in create/update/list, admin UI tier select + tier badge - tags: GET /tags/all, TagInput autocomplete in new/edit tool forms, feature suggestions on focus, query invalidation on create/update - openapi: nullable ToolUpdate urls, ToolUpdate tier fields, listAllTags - Dockerfile: push-force to drop renewal_date column
This commit is contained in:
@@ -253,6 +253,17 @@ router.get("/features/all", async (_req, res): Promise<void> => {
|
||||
res.json([...featureSet].sort());
|
||||
});
|
||||
|
||||
router.get("/tags/all", async (_req, res): Promise<void> => {
|
||||
const tools = await db.select({ tags: toolsTable.tags }).from(toolsTable);
|
||||
const tagSet = new Set<string>();
|
||||
for (const t of tools) {
|
||||
for (const tag of t.tags ?? []) {
|
||||
if (tag && tag.trim()) tagSet.add(tag.trim());
|
||||
}
|
||||
}
|
||||
res.json([...tagSet].sort());
|
||||
});
|
||||
|
||||
// ── Similar Tools ──────────────────────────────────────────
|
||||
|
||||
function computeSimilarityScore(
|
||||
|
||||
Reference in New Issue
Block a user