- 상품 카탈로그(products/) 신설: 공개 필드(name·pointPrice·이미지)와 재고(total/reserved/safety)를 한 문서로 관리, 목록·상세는 60초 인메모리 캐시로 서빙 - 주문 생성 시 포인트 예약(order_reserve)과 재고 예약을 단일 트랜잭션으로 원자 처리, 주문 ID를 uid_클라이언트멱등키로 고정해 더블탭·재시도 중복 생성 차단 - 주문 상태 머신(reserved→confirmed→preparing→shipped→delivered / cancelled / refunded) 전이 검증과 전이별 capture·release·refund 역거래 원장 기록 - reward HTTP 함수 신설: 지갑·원장 조회, 상품 목록·상세, 교환 자격, 주문 생성·목록·상세·취소 API - 관리자 라우트 추가: 상품 등록·수정, 재고 조정(가용재고 음수 방지), 주문 상태 변경, 포인트 지급·회수 - Firestore 보안규칙(지갑 본인 read, 상품·주문은 API 전용)과 orders 복합 인덱스(uid+createdAt, status+createdAt) 추가 - 상품 4종 시드(seed:rewards)와 상세 이미지 업로드(upload:reward-assets) 스크립트 추가
40 lines
1.3 KiB
JSON
40 lines
1.3 KiB
JSON
{
|
|
"name": "functions",
|
|
"scripts": {
|
|
"lint": "eslint --ext .js,.ts .",
|
|
"build": "tsc",
|
|
"build:watch": "tsc --watch",
|
|
"serve": "npm run build && firebase emulators:start --only auth,functions,firestore,database,storage",
|
|
"shell": "npm run build && firebase functions:shell",
|
|
"start": "npm run shell",
|
|
"deploy": "firebase deploy --only functions",
|
|
"logs": "firebase functions:log",
|
|
"test": "firebase emulators:exec --only firestore,database,auth \"vitest run\"",
|
|
"test:watch": "vitest",
|
|
"tools:sheet": "npx tsx scripts/chat-tools-sheet.ts",
|
|
"seed:rewards": "npx tsx scripts/seed-reward-products.ts",
|
|
"upload:reward-assets": "npx tsx scripts/upload-reward-product-assets.ts"
|
|
},
|
|
"engines": {
|
|
"node": "24"
|
|
},
|
|
"main": "lib/index.js",
|
|
"dependencies": {
|
|
"@anthropic-ai/sdk": "^0.104.1",
|
|
"@google/genai": "^2.8.0",
|
|
"firebase-admin": "^13.6.0",
|
|
"firebase-functions": "^7.0.0"
|
|
},
|
|
"devDependencies": {
|
|
"@typescript-eslint/eslint-plugin": "^5.12.0",
|
|
"@typescript-eslint/parser": "^5.12.0",
|
|
"eslint": "^8.9.0",
|
|
"eslint-config-google": "^0.14.0",
|
|
"eslint-plugin-import": "^2.25.4",
|
|
"firebase-functions-test": "^3.4.1",
|
|
"typescript": "^5.7.3",
|
|
"vitest": "^4.1.4"
|
|
},
|
|
"private": true
|
|
}
|