chore: commit all changes

This commit is contained in:
2026-02-26 13:26:18 -05:00
parent fd8edb1f21
commit 74fee52c4e
26 changed files with 4705 additions and 1108 deletions

View File

@@ -0,0 +1,63 @@
import { and, desc, eq } from 'drizzle-orm';
import type { WatchlistItem } from '@/lib/types';
import { db } from '@/lib/server/db';
import { watchlistItem } from '@/lib/server/db/schema';
type WatchlistRow = typeof watchlistItem.$inferSelect;
function toWatchlistItem(row: WatchlistRow): WatchlistItem {
return {
id: row.id,
user_id: row.user_id,
ticker: row.ticker,
company_name: row.company_name,
sector: row.sector,
created_at: row.created_at
};
}
export async function listWatchlistItems(userId: string) {
const rows = await db
.select()
.from(watchlistItem)
.where(eq(watchlistItem.user_id, userId))
.orderBy(desc(watchlistItem.created_at));
return rows.map(toWatchlistItem);
}
export async function upsertWatchlistItemRecord(input: {
userId: string;
ticker: string;
companyName: string;
sector?: string;
}) {
const [row] = await db
.insert(watchlistItem)
.values({
user_id: input.userId,
ticker: input.ticker,
company_name: input.companyName,
sector: input.sector?.trim() ? input.sector.trim() : null,
created_at: new Date().toISOString()
})
.onConflictDoUpdate({
target: [watchlistItem.user_id, watchlistItem.ticker],
set: {
company_name: input.companyName,
sector: input.sector?.trim() ? input.sector.trim() : null
}
})
.returning();
return toWatchlistItem(row);
}
export async function deleteWatchlistItemRecord(userId: string, id: number) {
const removed = await db
.delete(watchlistItem)
.where(and(eq(watchlistItem.user_id, userId), eq(watchlistItem.id, id)))
.returning({ id: watchlistItem.id });
return removed.length > 0;
}