feat(api): 建立 assets 的 Server Actions 防腐层与 Zod 校验
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
'use server';
|
||||
|
||||
import { db } from '@/db';
|
||||
import { assets, assetTypeEnum } from '@/db/schema';
|
||||
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<typeof createAssetSchema>) {
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user