BrandApp Control Center
brandapp-ui - Control
createReoptEavClientcreateReoptTermsClient
EAV record table surface wiring a server-side sdk.eav proxy to opt-ui DataTable with auto-inferred columns.
| 레코드 | 세그먼트 | 유입 | 상태 | 생성일 |
|---|---|---|---|---|
| 봄 컬렉션 런칭 | 캠페인 | 127 | 활성 | 2026-03-12 |
| 친구 초대 이벤트 | 리퍼럴 | 84 | 활성 | 2026-03-09 |
| 얼리버드 할인 | 프로모션 | 213 | 보관 | 2026-02-28 |
| 신규 가입 웰컴 | 온보딩 | 56 | 초안 | 2026-03-15 |
| VIP 사전 예약 | 로열티 | 31 | 활성 | 2026-03-01 |
| 재입고 알림 | 리텐션 | 98 | 초안 | 2026-03-14 |
Server route (required)
sdk.eav는 clientSecret이 필요한 서버 전용 클라이언트입니다. 서버 라우트가 records.list(entityId)를 프록시하면 Surface는 그 endpoint를 fetch해 DataTable로 렌더합니다.
// app/api/records/route.ts
import "server-only";
import { createLazySDK } from "@reopt-ai/brandapp-sdk";
import type { ReoptRecordsResponse } from "@/components/reopt-record-table";
const sdk = createLazySDK(() => ({
clientId: process.env.BRANDAPP_CLIENT_ID!,
clientSecret: process.env.BRANDAPP_CLIENT_SECRET!,
brandappId: process.env.BRANDAPP_ID!,
}));
export async function GET(req: Request) {
const entityId = new URL(req.url).searchParams.get("entityId");
if (!entityId) return Response.json({ records: [] });
// 응답: { records, total, page, limit } — Surface의 ReoptRecordsResponse 계약
const body: ReoptRecordsResponse = await sdk.eav.records.list(entityId, {
page: 1,
limit: 50,
});
return Response.json(body);
}recordsEndpoint를 fetch하며, columns 미지정 시 레코드 values 키로 컬럼을 자동 추론합니다.