brandapp-ui
BrandApp Control Center
brandapp-ui - Control
createReoptEavClientcreateReoptTermsClient
brandapp-sdk EAV 레코드를 opt-ui DataTable로 렌더하는 Surface. sdk.eav는 clientSecret이 필요한 서버 전용이라 서버 라우트가 records().list()를 프록시하고, columns 미지정 시 레코드 values 키로 컬럼을 자동 추론합니다.
| 레코드 | 세그먼트 | 유입 | 상태 | 생성일 |
|---|---|---|---|---|
| 봄 컬렉션 런칭 | 캠페인 | 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(entityId).list()를 프록시하면 Surface는 그 endpoint를 fetch해 DataTable로 렌더합니다.
// app/api/records/route.ts
import { createReoptSDK } from "@reopt-ai/brandapp-sdk";
const sdk = createReoptSDK({
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({ data: [] });
const page = await sdk.eav.records(entityId).list({ page: 1, pageSize: 50 });
return Response.json(page); // { data: EavRecord[], total, page, pageSize }
}recordsEndpoint를 fetch하며, columns 미지정 시 레코드 values 키로 컬럼을 자동 추론합니다.