---
# System prepended metadata

title: お特便予約API
tags: [API仕様]

---

###### tags: `API仕様`

# お特便予約API

## URI（demo環境）
↓自分自身の予約をしたい時
POST https://bff-wn5zp5rybq-an.a.run.app/ride-advance/reserve
↓別の人の予約をしたい時（オペレータ向け）
POST https://bff-wn5zp5rybq-an.a.run.app/admin/ride-advance/reserve 

## URI（熱海環境）
↓自分自身の予約をしたい時
POST https://bff-z5ltmpxiqa-an.a.run.app/ride-advance/reserve
↓別の人の予約をしたい時（オペレータ向け）
POST https://bff-z5ltmpxiqa-an.a.run.app/admin/ride-advance/reserve 

## リクエストボディ(JSON)
```typescript
{
  advanceReservationTimetableId: string; 
  origin: {
    location: {latitude: number; longitude: number}; // 経度緯度
    areaId? : string // <-マルチエリアの場合必要
  };
  destination: {
    location: {latitude: number; longitude: number};
    areaId? : string // <-マルチエリアの場合必要
  };
  headcount: number;
  payment: {method: 'cash'}; // ひとまず現金払いのはこれ
  datetime: {
    at: number; // unixtime(秒)
    acceptableWaitingSeconds: number; // 待てる時間の幅(秒数。この幅の間に相乗りが入る)
  };
  uid?: string; // オペレータ以上の権限を持つ人が別の人の予約をする場合、その人のUIDが必要
};
```

## レスポンスボディ (JSON)
```typescript
{
  id: string;
  tefId: string;
  tefSessionId?: string;
  owner: string;
  userName: string;
  origin: TransportPlace;
  destination: TransportPlace;
  headcount: number;
  createdAt: number;
  shared: boolean;
  vehicleId?: string | null;
  requestedTime: {
    earlier: number;
    later: number;
  };
  departureTime: {
    earlier: number | null;
    later: number | null;
  };
  arrivalTime: {
    earlier: number | null;
    later: number | null;
  };
  encodedRoutePolyline?: string;
  boardingState: BoardingState;
  vehicleAssignmentState: VehicleAssignmentState;
  scheduledTransport?: {
    id: string;
    timeId: string;
    groupOid: string;
  };
  charterDistance: number;
  payment: {
    method: PaymentMethod;
    state: 'unpaid' | 'paid' | 'failed';
    totalFare: number;
    purchasedAt?: number;
  };
};
```

## 呼び出し前のユーザ登録(なくても動くが、ユーザ名はできればあった方がよい)
APIを呼び出すには、先にユーザ登録がされている必要がある
アプリで作成したユーザの場合、このユーザ登録がされる
アプリを使わずにユーザを登録するには、firebase authenticationで電話番号認証をしてから、ユーザ登録APIを呼び出す必要がある（初回のみ）
デモ　POST https://bff-wn5zp5rybq-an.a.run.app/user
熱海　POST https://bff-z5ltmpxiqa-an.a.run.app/user
RequestBody {name: string}
上記のURIに、登録したいユーザー名をRequestBodyに入れてPOSTすると、ユーザが登録される

## 電話番号認証
手動でやる場合、このサイトのような手順で処理する必要がある
https://firebase.google.com/docs/auth/web/phone-auth?hl=ja
ただ、途中の電話番号入力・コード入力・reCAPTCHA表示などUI周りの実装に時間がかかるため
Webアプリの場合は、こちらのfirebaseUIを使うと実装が楽になる
https://firebase.google.com/docs/auth/web/firebaseui?hl=ja

## API認証
authorizationヘッダーにトークンをつけて送る必要がある
「Authorization: Bearer <FirebaseのToken>」
FirebaseのTokenは、firebaseにログインしてから、以下のようなメソッドで呼び出す必要がある。
https://firebase.google.com/docs/auth/admin/verify-id-tokens?hl=ja#retrieve_id_tokens_on_clients