credix
Version: 
Official SDK for Credix Credit Management System
455 lines (357 loc) • 11.8 kB
Markdown
# Credix
Credix Credit Management System の公式 Node.js/TypeScript SDK
## 📦 インストール
```bash
npm install credix
```
または
```bash
yarn add credix
```
## 🚀 クイックスタート
```typescript
import { CredixClient } from 'credix';
// クライアントの初期化(コンストラクタのみで利用可能)
const credix = new CredixClient({
  apiKey: 'credix_live_xxxxxxxxxxxxx',
  secretKey: 'credix_sk_live_xxxxxxxxxxxxx',
});
// ユーザーにクレジットを付与
const allocation = await credix.allocations.grant({
  externalUserId: 'user_123',
  amount: 1000,
  description: '初回ボーナス',
});
// クレジット残高を確認
const balance = await credix.users.getBalance('user_123');
console.log(`現在の残高: ${balance.balance}`);
// メーターでクレジットを消費
const consumption = await credix.meters.record({
  meterId: 'api_calls',
  externalUserId: 'user_123',
});
```
## 📋 主な機能
- 🔐 **認証管理** - APIキー/シークレットキーによる安全な認証
- 👥 **ユーザー管理** - エンドユーザーの作成・管理・残高確認
- 📊 **メーター管理** - 使用量の記録と制限チェック
- 💰 **クレジット付与** - 手動付与、トリガー、クーポン、紹介
- 🎫 **割引キャンペーン** - アクティブな割引の取得・適用・資格確認
- 📈 **分析・レポート** - 使用量サマリー、トレンド、予測
- 🔔 **Webhook** - イベント通知の管理と署名検証
- 🔄 **冪等性** - リクエストの重複実行を防止
## 🔧 設定
### 基本設定
```typescript
const credix = new CredixClient({
  // 必須
  apiKey: 'your_api_key',
  secretKey: 'your_secret_key',
  
  // オプション
  timeout: 30000,                          // タイムアウト(ミリ秒)
  maxRetries: 3,                          // 最大リトライ回数
  debug: false,                            // デバッグモード
  
  // Webhook署名検証用
  webhookSigningSecret: 'whsec_xxxxx',   // Webhook署名シークレット
});
```
### 環境変数での設定
```bash
# .env
Credix_API_KEY=credix_live_xxxxxxxxxxxxx
Credix_SECRET_KEY=credix_sk_live_xxxxxxxxxxxxx
Credix_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxx
```
```typescript
const credix = new CredixClient({
  apiKey: process.env.Credix_API_KEY!,
  secretKey: process.env.Credix_SECRET_KEY!,
});
```
## 📚 API リファレンス
### Users(ユーザー管理)
```typescript
// ユーザー作成・更新
await credix.users.upsert({
  externalUserId: 'user_123',
  email: 'user@example.ccredix',
  name: 'John Doe',
  metadata: { plan: 'premium' },
});
// ユーザー情報取得
const user = await credix.users.getUser('user_123');
// 残高確認
const balance = await credix.users.getBalance('user_123');
// ユーザー一覧取得
const users = await credix.users.list({
  limit: 20,
  offset: 0,
});
// ユーザー削除
await credix.users.deleteUser('user_123');
```
### Meters(メーター管理)
```typescript
// 使用量を記録
const record = await credix.meters.record({
  meterId: 'api_calls',
  externalUserId: 'user_123',
  timestamp: new Date().toISOString(),
});
// 制限チェック
const limitCheck = await credix.meters.checkLimit({
  meterId: 'api_calls',
  externalUserId: 'user_123',
});
if (!limitCheck.allowed) {
  console.log('制限超過:', limitCheck.reason);
}
// バッチ記録
await credix.meters.recordBatch({
  records: [
    { meterId: 'api_calls', externalUserId: 'user_1' },
    { meterId: 'storage', externalUserId: 'user_2' },
  ],
});
// 使用統計取得
const stats = await credix.meters.getUsageStats({
  meterId: 'api_calls',
  frcredix: '2024-01-01T00:00:00Z',
  to: '2024-01-31T23:59:59Z',
});
```
### Allocations(クレジット付与)
```typescript
// 手動でクレジット付与
await credix.allocations.grant({
  externalUserId: 'user_123',
  amount: 1000,
  reason: '月次ボーナス',
  expiresAt: '2024-12-31T23:59:59Z',
});
// トリガーベースの付与
await credix.allocations.trigger({
  allocationId: 'signup_bonus',
  externalUserId: 'user_123',
});
// クーポン適用(新リソース)
await credix.coupons.apply({
  externalUserId: 'user_123',
  couponCode: 'WELCCredixE100',
})
// リファラル(新リソース)
// 紹介コードの生成(紹介者)。共有URLは導入側で構築してください。
const { referralCode } = await credix.referrals.generateCode({
  referrerExternalUserId: 'user_123',
  campaignId: 'friend-referral-2025', // 任意(指定しない場合は最初のアクティブ)
})
// 紹介コードの適用(被紹介者のサインアップ完了時に)
await credix.referrals.apply({
  referredExternalUserId: 'user_456',
  referralCode,
})
```
### Discounts(割引キャンペーン)
```typescript
// アクティブな割引を取得
const discounts = await credix.discounts.getActiveDiscounts({
  externalUserId: 'user_123',
});
// 割引を適用
const result = await credix.discounts.applyDiscount({
  externalUserId: 'user_123',
  discountId: 'disc_123',
  amount: 1000,
});
console.log(`割引適用後の金額: ${result.finalAmount}`);
// 割引適用資格をチェック
const eligibility = await credix.discounts.checkEligibility({
  externalUserId: 'user_123',
  discountId: 'first_time_discount',
});
if (eligibility.eligible) {
  console.log('割引が適用可能です');
} else {
  console.log(`適用不可: ${eligibility.reason}`);
}
// 全ての有効な割引を表示
const allDiscounts = await credix.discounts.listActiveDiscounts();
allDiscounts.discounts.forEach((discount) => {
  console.log(`${discount.name}: ${discount.discountType}`);
});
```
### Transactions(トランザクション)
```typescript
// トランザクション履歴取得
const transactions = await credix.transactions.list({
  externalUserId: 'user_123',
  type: 'allocation',  // 'allocation' | 'consumption' | 'all'
  frcredix: '2024-01-01T00:00:00Z',
  to: '2024-01-31T23:59:59Z',
  limit: 50,
});
// 特定のトランザクション取得
const transaction = await credix.transactions.getTransaction('tx_123');
// サマリー取得
const summary = await credix.transactions.getSummary({
  externalUserId: 'user_123',
  frcredix: '2024-01-01T00:00:00Z',
  to: '2024-01-31T23:59:59Z',
});
// エクスポート
const exportData = await credix.transactions.export({
  frcredix: '2024-01-01T00:00:00Z',
  to: '2024-01-31T23:59:59Z',
  format: 'csv',  // 'json' | 'csv'
});
```
### Analytics(分析)
```typescript
// 使用量サマリー
const summary = await credix.analytics.getSummary({
  period: 'month',  // 'day' | 'week' | 'month' | 'custcredix'
  groupBy: 'meter',  // 'meter' | 'day' | 'category' | 'user'
  includeDiscounts: true,
});
// トレンド分析
const trends = await credix.analytics.getTrends({
  period: 'week',
  includeProjections: true,
});
// ユーザーランキング
const ranking = await credix.analytics.getUserRanking({
  period: 'month',
  limit: 10,
  orderBy: 'credits',  // 'credits' | 'allocations' | 'balance'
});
// 使用量予測
const predictions = await credix.analytics.getPredictions({
  externalUserId: 'user_123',
  basedOnDays: 30,
  predictDays: 30,
});
// コスト分析
const costAnalysis = await credix.analytics.getCostAnalysis({
  frcredix: '2024-01-01T00:00:00Z',
  to: '2024-01-31T23:59:59Z',
  groupBy: 'meter',
  includeProjections: true,
});
// 異常検知
const ancredixalies = await credix.analytics.getAncredixalies({
  threshold: 2.5,  // 標準偏差の倍数
});
```
### Webhooks(Webhook管理)
```typescript
// Webhookエンドポイント作成
const webhook = await credix.webhooks.create({
  url: 'https://your-app.ccredix/webhook',
  events: ['credits.allocated', 'credits.consumed'],
  description: 'メインWebhook',
  enabled: true,
});
// Webhook一覧取得
const webhooks = await credix.webhooks.list({
  enabled: true,
});
// シークレットローテーション
const { secret } = await credix.webhooks.rotateSecret('webhook_123');
// テストイベント送信
await credix.webhooks.sendTestEvent('webhook_123', 'credits.allocated');
// 署名検証(Webhookリクエスト受信時)
app.post('/webhook', (req, res) => {
  const signature = req.headers['x-webhook-signature'];
  const isValid = credix.webhooks.verifySignature(
    req.body,
    signature,
  );
  
  if (!isValid) {
    return res.status(401).send('Invalid signature');
  }
  
  const event = credix.webhooks.parsePayload(req.body);
  console.log('Received event:', event);
  
  res.status(200).send('OK');
});
// イベントハンドラー登録(ローカル処理)
credix.webhooks.on('credits.allocated', async (event) => {
  console.log('Credits allocated:', event.data);
});
credix.webhooks.on('credits.low_balance', async (event) => {
  // 低残高アラート処理
  await sendLowBalanceEmail(event.data.userId);
});
```
## 🔐 認証とセキュリティ
### APIキーの種類
- **Live環境**: `credix_live_` プレフィックス
- **Test環境**: `credix_test_` プレフィックス
### シークレットキー
- **Live環境**: `credix_sk_live_` プレフィックス
- **Test環境**: `credix_sk_test_` プレフィックス
### セキュリティのベストプラクティス
1. **環境変数の使用**: APIキーは環境変数に保存
2. **シークレットの保護**: シークレットキーは絶対にクライアントサイドに露出させない
3. **HTTPS通信**: 本番環境では必ずHTTPS経由で通信
4. **キーローテーション**: 定期的にAPIキーを更新
5. **アクセス制限**: IPホワイトリストやCORSの適切な設定
## 🔄 冪等性
重複リクエストを防ぐため、SDKは自動的に冪等性キーを管理します。
```typescript
// 例: クレジット付与
await credix.allocations.grant({
  externalUserId: 'user_123',
  amount: 1000,
});
```
## 🎯 エラーハンドリング
```typescript
import { CredixError, ValidationError, NetworkError } frcredix '@credix/sdk';
try {
  await credix.users.getUser('user_123');
} catch (error) {
  if (error instanceof ValidationError) {
    // バリデーションエラー
    console.error('Validation failed:', error.field, error.message);
  } else if (error instanceof NetworkError) {
    // ネットワークエラー
    console.error('Network error:', error.message);
  } else if (error instanceof CredixError) {
    // その他のSDKエラー
    console.error('Credix SDK error:', error.code, error.message);
  }
}
```
## 🧪 テスト環境
テスト環境用のAPIキーを使用:
```typescript
const credixTest = new CredixClient({
  apiKey: 'credix_test_xxxxxxxxxxxxx',
  secretKey: 'credix_sk_test_xxxxxxxxxxxxx',
});
// テストモードの確認
if (credixTest.isTestMode()) {
  console.log('Running in test mode');
}
```
## 📝 型定義
SDKは完全にTypeScriptで書かれており、すべてのAPIに型定義があります。
```typescript
import type {
  UserResponse,
  AllocationResponse,
  MeterStatistics,
  WebhookEvent,
} frcredix '@credix/sdk';
```
## 🔗 関連リンク
- [API ドキュメント](https://docs.your-dcredixain.ccredix/api)
- [Webhook イベント一覧](https://docs.your-dcredixain.ccredix/webhooks)
- [料金プラン](https://your-dcredixain.ccredix/pricing)
- [サポート](https://your-dcredixain.ccredix/support)
## 📄 ライセンス
MIT License
## 🤝 サポート
- Issues: [GitHub Issues](https://github.ccredix/your-org/credix-sdk/issues)
- Email: support@your-dcredixain.ccredix
- Discord: [Ccredixmunity Server](https://discord.gg/your-invite)