swadhinbiswas Improve template repository discovery and filtering · 2/19/2026
f00b5bc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import type { APIRoute } from "astro";
import type { NodePgDatabase } from "drizzle-orm/node-postgres";
import { and, desc, eq, inArray, like, or } from "drizzle-orm";
import { getDatabase, schema } from "@/db";
import { repositories, repositoryCollaborators, users } from "@/db/schema";
import { getUserFromRequest } from "@/lib/auth";
import { success } from "@/lib/api";
import { withErrorHandler } from "@/lib/errors";
export const GET: APIRoute = withErrorHandler(async ({ request, url }) => {
const db = getDatabase() as NodePgDatabase<typeof schema>;
const tokenPayload = await getUserFromRequest(request);
const conditions: any[] = [eq(repositories.isTemplate, true)];
const visibilityFilter = url.searchParams.get("visibility");
const ownerFilter = url.searchParams.get("owner");
const searchQuery = url.searchParams.get("q");
if (!tokenPayload) {
conditions.push(eq(repositories.visibility, "public"));
} else if (!tokenPayload.isAdmin) {
const collaboratorRows = await db.query.repositoryCollaborators.findMany({
where: eq(repositoryCollaborators.userId, tokenPayload.userId),
columns: { repositoryId: true },
});
const collaboratorRepoIds = collaboratorRows.map((row) => row.repositoryId);
const accessClauses = [
eq(repositories.visibility, "public"),
eq(repositories.visibility, "internal"),
eq(repositories.ownerId, tokenPayload.userId),
];
if (collaboratorRepoIds.length > 0) {
accessClauses.push(inArray(repositories.id, collaboratorRepoIds));
}
const visibilityOrOwner = or(
...accessClauses
);
if (visibilityOrOwner) {
conditions.push(visibilityOrOwner);
}
}
if (visibilityFilter && ["public", "private", "internal"].includes(visibilityFilter)) {
conditions.push(eq(repositories.visibility, visibilityFilter as "public" | "private" | "internal"));
}
if (ownerFilter) {
const ownerUser = await db.query.users.findFirst({
where: eq(users.username, ownerFilter),
columns: { id: true },
});
if (!ownerUser) return success({ templates: [] });
conditions.push(eq(repositories.ownerId, ownerUser.id));
}
if (searchQuery) {
const search = `%${searchQuery}%`;
const nameOrDesc = or(
like(repositories.name, search),
like(repositories.description, search)
);
if (nameOrDesc) conditions.push(nameOrDesc);
}
const templates = await db.query.repositories.findMany({
where: and(...conditions),
orderBy: [desc(repositories.updatedAt)],
with: {
owner: {
columns: {
id: true,
username: true,
displayName: true,
avatarUrl: true,
},
},
},
});
const data = templates.map((repo) => ({
id: repo.id,
name: repo.name,
fullName: `${repo.owner.username}/${repo.name}`,
description: repo.description,
visibility: repo.visibility,
defaultBranch: repo.defaultBranch,
language: repo.language,
updatedAt: repo.updatedAt,
owner: repo.owner,
}));
return success({ templates: data });
});