139 lines
3.2 KiB
TypeScript
139 lines
3.2 KiB
TypeScript
import { Elysia, t } from "elysia"
|
|
import { db } from "@/lib/db/index"
|
|
import { savedFilters } from "@/lib/db/schema"
|
|
import { eq, and, desc } from "drizzle-orm"
|
|
import { requireAuth } from "@/lib/auth/guard"
|
|
|
|
export const savedFilterRoutes = new Elysia({ prefix: "/saved-filters" })
|
|
|
|
// Get user's saved filters
|
|
.get("/", async ({ request, set }) => {
|
|
const guard = await requireAuth(request.headers)
|
|
if (!guard.ok) {
|
|
set.status = guard.status
|
|
return { error: guard.error }
|
|
}
|
|
|
|
const filters = await db
|
|
.select()
|
|
.from(savedFilters)
|
|
.where(eq(savedFilters.userId, guard.user.id))
|
|
.orderBy(desc(savedFilters.updatedAt))
|
|
|
|
return filters
|
|
})
|
|
|
|
// Create a saved filter
|
|
.post(
|
|
"/",
|
|
async ({ body, request, set }) => {
|
|
const guard = await requireAuth(request.headers)
|
|
if (!guard.ok) {
|
|
set.status = guard.status
|
|
return { error: guard.error }
|
|
}
|
|
|
|
const { name, filters: filterData } = body
|
|
|
|
const [saved] = await db
|
|
.insert(savedFilters)
|
|
.values({
|
|
userId: guard.user.id,
|
|
name,
|
|
filters: filterData,
|
|
})
|
|
.returning()
|
|
|
|
return saved
|
|
},
|
|
{
|
|
body: t.Object({
|
|
name: t.String(),
|
|
filters: t.Record(t.String(), t.Any()),
|
|
}),
|
|
},
|
|
)
|
|
|
|
// Update a saved filter
|
|
.patch(
|
|
"/:id",
|
|
async ({ params, body, request, set }) => {
|
|
const guard = await requireAuth(request.headers)
|
|
if (!guard.ok) {
|
|
set.status = guard.status
|
|
return { error: guard.error }
|
|
}
|
|
|
|
const { name, filters: filterData } = body
|
|
|
|
// Verify ownership
|
|
const [existing] = await db
|
|
.select()
|
|
.from(savedFilters)
|
|
.where(
|
|
and(
|
|
eq(savedFilters.id, params.id),
|
|
eq(savedFilters.userId, guard.user.id),
|
|
),
|
|
)
|
|
.limit(1)
|
|
|
|
if (!existing) {
|
|
set.status = 404
|
|
return { error: "Saved filter not found" }
|
|
}
|
|
|
|
const [updated] = await db
|
|
.update(savedFilters)
|
|
.set({
|
|
...(name && { name }),
|
|
...(filterData && { filters: filterData }),
|
|
})
|
|
.where(eq(savedFilters.id, params.id))
|
|
.returning()
|
|
|
|
return updated
|
|
},
|
|
{
|
|
params: t.Object({ id: t.String() }),
|
|
body: t.Object({
|
|
name: t.Optional(t.String()),
|
|
filters: t.Optional(t.Record(t.String(), t.Any())),
|
|
}),
|
|
},
|
|
)
|
|
|
|
// Delete a saved filter
|
|
.delete(
|
|
"/:id",
|
|
async ({ params, request, set }) => {
|
|
const guard = await requireAuth(request.headers)
|
|
if (!guard.ok) {
|
|
set.status = guard.status
|
|
return { error: guard.error }
|
|
}
|
|
|
|
const [existing] = await db
|
|
.select()
|
|
.from(savedFilters)
|
|
.where(
|
|
and(
|
|
eq(savedFilters.id, params.id),
|
|
eq(savedFilters.userId, guard.user.id),
|
|
),
|
|
)
|
|
.limit(1)
|
|
|
|
if (!existing) {
|
|
set.status = 404
|
|
return { error: "Saved filter not found" }
|
|
}
|
|
|
|
await db.delete(savedFilters).where(eq(savedFilters.id, params.id))
|
|
|
|
return { success: true }
|
|
},
|
|
{
|
|
params: t.Object({ id: t.String() }),
|
|
},
|
|
) |