'use server'; import { db } from '@/db'; import { assets, assetTypeEnum } from '@/db/schema'; import { eq } from 'drizzle-orm'; import { revalidatePath } from 'next/cache'; import { z } from 'zod'; const createAssetSchema = z.object({ symbol: z.string().min(1, 'Symbol is required'), type: z.enum(['STOCK', 'CRYPTO', 'CASH']), baseCurrency: z.string().min(2).max(10), }); export async function createAsset(params: z.infer) { const validation = createAssetSchema.safeParse(params); if (!validation.success) { return { success: false, error: validation.error.issues[0].message }; } try { const [asset] = await db.insert(assets).values(params).returning(); return { success: true, data: asset }; } catch (error: unknown) { if ( error && typeof error === 'object' && 'code' in error && (error as { code: string }).code === '23505' ) { return { success: false, error: 'Asset with this symbol already exists' }; } throw error; } } export async function getAssets() { return db.select().from(assets); } const updatePriceSchema = z.object({ assetId: z.string().min(1, 'Asset ID is required'), newPrice: z.string().min(1, 'Price is required'), }); export async function updateAssetPrice(params: z.infer) { const validation = updatePriceSchema.safeParse(params); if (!validation.success) { return { success: false, error: validation.error.issues[0].message }; } try { await db.update(assets).set({ latestPrice: params.newPrice }).where(eq(assets.id, params.assetId)); revalidatePath('/dashboard'); return { success: true }; } catch (error: unknown) { throw error; } }