バグ #588 » api_function_specifications.md
関数・APIエンドポイント詳細仕様書
1. 認証関連
1.1 関数仕様
AUTH-001: registerUser
項目 | 内容 |
---|---|
ID | AUTH-001 |
名称 | ユーザー登録 |
説明 | 新規ユーザーアカウントを作成する |
入力値 | UserRegistrationData: { email: string, password: string, userType: 'landlord' | 'tenant', phone?: string, preferredLanguage?: string } |
出力値 | Promise<User: { id: string, email: string, userType: string, createdAt: Date }> |
処理内容 | 1. 入力データバリデーション 2. メールアドレス重複チェック 3. パスワードハッシュ化 4. ユーザーレコード作成 5. 認証トークン生成 6. 確認メール送信 |
AUTH-002: authenticateUser
項目 | 内容 |
---|---|
ID | AUTH-002 |
名称 | ユーザー認証 |
説明 | ログイン認証を行いトークンを発行する |
入力値 | email: string, password: string |
出力値 | Promise<AuthResult: { user: User, accessToken: string, refreshToken: string }> |
処理内容 | 1. ユーザー存在確認 2. パスワード照合 3. アカウント状態確認 4. JWTトークン生成 5. ログイン履歴記録 |
AUTH-003: generateToken
項目 | 内容 |
---|---|
ID | AUTH-003 |
名称 | JWTトークン生成 |
説明 | ユーザー認証用のJWTトークンを生成する |
入力値 | userId: string, role: UserRole, expiresIn?: string |
出力値 | string |
処理内容 | 1. ペイロード構築 2. 秘密鍵での署名 3. 有効期限設定 4. トークン返却 |
1.2 APIエンドポイント仕様
API-001: /api/auth/register
項目 | 内容 |
---|---|
API ID | API-001 |
エンドポイント | /api/auth/register |
メソッド | POST |
説明 | 新規ユーザー登録 |
入力値 | json<br>{<br> "email": "user@example.com",<br> "password": "password123",<br> "userType": "tenant",<br> "phone": "+81-90-1234-5678",<br> "preferredLanguage": "ja"<br>} |
出力値 | json<br>{<br> "success": true,<br> "data": {<br> "user": {<br> "id": "uuid",<br> "email": "user@example.com",<br> "userType": "tenant"<br> },<br> "accessToken": "jwt_token",<br> "refreshToken": "refresh_token"<br> }<br>} |
処理内容 | 1. リクエストボディ検証 2. AUTH-001関数呼び出し 3. レスポンス整形 4. HTTPステータス設定 |
API-002: /api/auth/login
項目 | 内容 |
---|---|
API ID | API-002 |
エンドポイント | /api/auth/login |
メソッド | POST |
説明 | ユーザーログイン |
入力値 | json<br>{<br> "email": "user@example.com",<br> "password": "password123"<br>} |
出力値 | json<br>{<br> "success": true,<br> "data": {<br> "user": {<br> "id": "uuid",<br> "email": "user@example.com",<br> "userType": "tenant"<br> },<br> "accessToken": "jwt_token",<br> "refreshToken": "refresh_token"<br> }<br>} |
処理内容 | 1. ログイン情報検証 2. AUTH-002関数呼び出し 3. セッション管理 4. セキュリティログ記録 |
2. 物件管理関連
2.1 関数仕様
PROP-001: createProperty
項目 | 内容 |
---|---|
ID | PROP-001 |
名称 | 物件作成 |
説明 | 新規物件情報を登録する |
入力値 | typescript<br>PropertyData: {<br> title: string,<br> description: string,<br> propertyType: string,<br> rentAmount: number,<br> address: Address,<br> amenities: string[],<br> images?: File[]<br>} |
出力値 | Promise<Property> |
処理内容 | 1. 物件データ検証 2. 住所ジオコーディング 3. 物件レコード作成 4. 設備情報登録 5. 画像処理・保存 6. 検索インデックス更新 |
PROP-004: getProperty
項目 | 内容 |
---|---|
ID | PROP-004 |
名称 | 物件取得 |
説明 | 指定されたIDの物件情報を取得する |
入力値 | id: string, language?: string |
出力値 | Promise<Property | null> |
処理内容 | 1. 物件ID検証 2. データベースクエリ実行 3. 多言語対応処理 4. 関連データ結合 5. 閲覧履歴記録 |
2.2 APIエンドポイント仕様
API-012: /api/properties
項目 | 内容 |
---|---|
API ID | API-012 |
エンドポイント | /api/properties |
メソッド | POST |
説明 | 物件新規登録 |
入力値 | json<br>{<br> "title": "築浅1K アパート",<br> "description": "駅徒歩5分の好立地",<br> "propertyType": "apartment",<br> "rentAmount": 55000,<br> "address": {<br> "prefecture": "群馬県",<br> "city": "前橋市",<br> "detail": "○○町1-2-3"<br> },<br> "amenities": ["wifi", "aircon"]<br>} |
出力値 | json<br>{<br> "success": true,<br> "data": {<br> "id": "property_uuid",<br> "title": "築浅1K アパート",<br> "rentAmount": 55000,<br> "status": "draft",<br> "createdAt": "2025-06-19T10:00:00Z"<br> }<br>} |
処理内容 | 1. 認証チェック(大家のみ) 2. PROP-001関数呼び出し 3. 物件ID返却 4. 作成ログ記録 |
API-013: /api/properties/:id
項目 | 内容 |
---|---|
API ID | API-013 |
エンドポイント | /api/properties/:id |
メソッド | GET |
説明 | 物件詳細取得 |
入力値 | パスパラメータ: id: string クエリパラメータ: lang?: string
|
出力値 | json<br>{<br> "success": true,<br> "data": {<br> "id": "property_uuid",<br> "title": "築浅1K アパート",<br> "description": "駅徒歩5分の好立地",<br> "rentAmount": 55000,<br> "address": {...},<br> "images": [...],<br> "amenities": [...],<br> "nearbyFacilities": [...]<br> }<br>} |
処理内容 | 1. 物件ID検証 2. PROP-004関数呼び出し 3. 周辺施設情報取得 4. 閲覧回数更新 |
3. 検索関連
3.1 関数仕様
SEARCH-001: searchProperties
項目 | 内容 |
---|---|
ID | SEARCH-001 |
名称 | 物件検索 |
説明 | 指定された条件で物件を検索する |
入力値 | typescript<br>SearchCriteria: {<br> prefecture?: string,<br> minRent?: number,<br> maxRent?: number,<br> roomType?: string,<br> keyword?: string,<br> location?: { lat: number, lng: number, radius: number },<br> page?: number,<br> limit?: number<br>} |
出力値 | typescript<br>Promise<SearchResult: {<br> properties: Property[],<br> total: number,<br> page: number,<br> hasNext: boolean<br>}> |
処理内容 | 1. 検索条件検証 2. SQLクエリ構築 3. インデックス活用検索 4. 結果ソート・ページング 5. キャッシュ保存 6. 検索履歴記録 |
3.2 APIエンドポイント仕様
API-011: /api/properties
項目 | 内容 |
---|---|
API ID | API-011 |
エンドポイント | /api/properties |
メソッド | GET |
説明 | 物件検索 |
入力値 | クエリパラメータ:prefecture=群馬県&minRent=30000&maxRent=80000&page=1&limit=20
|
出力値 | json<br>{<br> "success": true,<br> "data": {<br> "properties": [...],<br> "pagination": {<br> "total": 150,<br> "page": 1,<br> "limit": 20,<br> "hasNext": true<br> }<br> }<br>} |
処理内容 | 1. クエリパラメータ解析 2. SEARCH-001関数呼び出し 3. 結果整形 4. キャッシュヘッダー設定 |
4. AI Chat関連
4.1 関数仕様
AI-001: processUserMessage
項目 | 内容 |
---|---|
ID | AI-001 |
名称 | ユーザーメッセージ処理 |
説明 | ユーザーからのメッセージを解析してAI応答を生成する |
入力値 | typescript<br>{<br> message: string,<br> userId: string,<br> sessionId: string,<br> language: string,<br> context?: ChatContext<br>} |
出力値 | typescript<br>Promise<AIResponse: {<br> response: string,<br> intent: string,<br> confidence: number,<br> suggestedActions?: Action[]<br>}> |
処理内容 | 1. メッセージ前処理 2. 意図解析実行 3. コンテキスト分析 4. 適切な応答生成 5. 多言語変換 6. 履歴保存 |
AI-004: searchFAQ
項目 | 内容 |
---|---|
ID | AI-004 |
名称 | FAQ検索 |
説明 | ユーザーの質問に関連するFAQを検索する |
入力値 | query: string, language: string, category?: string |
出力値 | typescript<br>Promise<FAQResult[]> = {<br> id: string,<br> question: string,<br> answer: string,<br> confidence: number<br>}[] |
処理内容 | 1. クエリ正規化 2. 全文検索実行 3. 類似度計算 4. 結果ランキング 5. 言語フィルタリング |
4.2 APIエンドポイント仕様
API-036: /api/chat/message
項目 | 内容 |
---|---|
API ID | API-036 |
エンドポイント | /api/chat/message |
メソッド | POST |
説明 | チャットメッセージ送信 |
入力値 | json<br>{<br> "message": "前橋駅周辺の1K物件を探しています",<br> "sessionId": "session_uuid",<br> "language": "ja"<br>} |
出力値 | json<br>{<br> "success": true,<br> "data": {<br> "response": "前橋駅周辺の1K物件を検索いたします。ご予算はいくらぐらいをお考えでしょうか?",<br> "intent": "property_search",<br> "suggestedActions": [<br> {<br> "type": "search_properties",<br> "label": "物件を検索",<br> "params": { "station": "前橋駅", "layout": "1K" }<br> }<br> ]<br> }<br>} |
処理内容 | 1. ユーザー認証確認 2. AI-001関数呼び出し 3. 応答データ整形 4. リアルタイム通知 |
API-039: /api/line/webhook
項目 | 内容 |
---|---|
API ID | API-039 |
エンドポイント | /api/line/webhook |
メソッド | POST |
説明 | LINE Bot Webhook処理 |
入力値 | LINE Messaging APIの標準形式 |
出力値 | HTTP 200 OK |
処理内容 | 1. 署名検証 2. イベント種別判定 3. メッセージ処理 4. LINE応答送信 5. ユーザー情報同期 |
5. 外部連携関連
5.1 関数仕様
EXT-001: scrapeJimoty
項目 | 内容 |
---|---|
ID | EXT-001 |
名称 | ジモティスクレイピング |
説明 | ジモティから物件情報を取得する |
入力値 | url: string |
出力値 | Promise<PropertyData> |
処理内容 | 1. URL検証 2. ページ取得 3. DOM解析 4. データ抽出 5. 正規化処理 6. 画像ダウンロード |
EXT-004: processPDF
項目 | 内容 |
---|---|
ID | EXT-004 |
名称 | PDF解析処理 |
説明 | マイソクPDFから物件情報を抽出する |
入力値 | pdfBuffer: Buffer |
出力値 | Promise<PropertyData> |
処理内容 | 1. PDF検証 2. OCR処理 3. テキスト抽出 4. パターンマッチング 5. データ構造化 6. 信頼度計算 |
5.2 APIエンドポイント仕様
API-019: /api/properties/external/import
項目 | 内容 |
---|---|
API ID | API-019 |
エンドポイント | /api/properties/external/import |
メソッド | POST |
説明 | 外部サイトから物件情報取込 |
入力値 | json<br>{<br> "url": "https://jmty.jp/gunma/est-ret/article-xxxxx",<br> "source": "jimoty"<br>} |
出力値 | json<br>{<br> "success": true,<br> "data": {<br> "propertyId": "imported_uuid",<br> "status": "imported",<br> "extractedData": {<br> "title": "...",<br> "rent": 50000,<br> "confidence": 0.95<br> }<br> }<br>} |
処理内容 | 1. URL・ソース検証 2. 対応する関数呼び出し 3. データ検証・保存 4. インポートログ記録 |
API-020: /api/properties/pdf/import
項目 | 内容 |
---|---|
API ID | API-020 |
エンドポイント | /api/properties/pdf/import |
メソッド | POST |
説明 | PDFから物件情報取込 |
入力値 | マルチパート形式でPDFファイル |
出力値 | json<br>{<br> "success": true,<br> "data": {<br> "propertyId": "extracted_uuid",<br> "extractedData": {<br> "title": "...",<br> "rent": 60000,<br> "confidence": 0.88<br> },<br> "requiresReview": true<br> }<br>} |
処理内容 | 1. ファイル形式検証 2. EXT-004関数呼び出し 3. 信頼度評価 4. レビュー要否判定 5. 一時保存処理 |
6. 地図・位置情報関連
6.1 関数仕様
MAP-001: geocodeAddress
項目 | 内容 |
---|---|
ID | MAP-001 |
名称 | 住所ジオコーディング |
説明 | 住所から緯度経度を取得する |
入力値 | address: string |
出力値 | typescript<br>Promise<Coordinates: {<br> lat: number,<br> lng: number,<br> accuracy: string<br>}> |
処理内容 | 1. 住所正規化 2. Google Maps API呼び出し 3. 結果検証 4. 精度評価 5. キャッシュ保存 |
MAP-006: searchPlaces
項目 | 内容 |
---|---|
ID | MAP-006 |
名称 | 施設検索 |
説明 | 指定位置周辺の施設を検索する |
入力値 | typescript<br>{<br> query: string,<br> location: { lat: number, lng: number },<br> radius: number,<br> type?: PlaceType<br>} |
出力値 | typescript<br>Promise<Place[]> = {<br> id: string,<br> name: string,<br> type: string,<br> distance: number,<br> rating?: number<br>}[] |
処理内容 | 1. 検索パラメータ検証 2. Places API呼び出し 3. 距離計算 4. 結果フィルタリング 5. ソート処理 |
6.2 APIエンドポイント仕様
API-045: /api/geocode
項目 | 内容 |
---|---|
API ID | API-045 |
エンドポイント | /api/geocode |
メソッド | GET |
説明 | 住所から座標取得 |
入力値 | クエリパラメータ: address=群馬県前橋市○○町1-2-3
|
出力値 | json<br>{<br> "success": true,<br> "data": {<br> "lat": 36.391203,<br> "lng": 139.060435,<br> "accuracy": "ROOFTOP",<br> "formattedAddress": "〒371-0000 群馬県前橋市○○町1丁目2−3"<br> }<br>} |
処理内容 | 1. 住所パラメータ検証 2. MAP-001関数呼び出し 3. 結果キャッシュ確認 4. レスポンス整形 |
API-048: /api/places/search
項目 | 内容 |
---|---|
API ID | API-048 |
エンドポイント | /api/places/search |
メソッド | GET |
説明 | 周辺施設検索 |
入力値 | クエリパラメータ:lat=36.391203&lng=139.060435&radius=1000&type=convenience_store
|
出力値 | json<br>{<br> "success": true,<br> "data": {<br> "places": [<br> {<br> "id": "place_id",<br> "name": "セブンイレブン前橋○○店",<br> "type": "convenience_store",<br> "distance": 150,<br> "rating": 4.2<br> }<br> ],<br> "total": 5<br> }<br>} |
処理内容 | 1. 位置・範囲パラメータ検証 2. MAP-006関数呼び出し 3. 結果距離順ソート 4. ページネーション適用 |
7. 通知関連
7.1 関数仕様
NOTIFY-001: sendEmail
項目 | 内容 |
---|---|
ID | NOTIFY-001 |
名称 | メール送信 |
説明 | 指定されたアドレスにメールを送信する |
入力値 | typescript<br>{<br> to: string,<br> subject: string,<br> body: string,<br> template?: string,<br> variables?: Record<string, any><br>} |
出力値 | Promise<void> |
処理内容 | 1. メールアドレス検証 2. テンプレート処理 3. SMTP送信 4. 送信履歴記録 5. エラーハンドリング |
NOTIFY-006: getUnreadCount
項目 | 内容 |
---|---|
ID | NOTIFY-006 |
名称 | 未読数取得 |
説明 | ユーザーの未読通知数を取得する |
入力値 | userId: string |
出力値 | Promise<number> |
処理内容 | 1. ユーザーID検証 2. 未読通知カウント 3. キャッシュ確認 4. 結果返却 |
7.2 APIエンドポイント仕様
API-042: /api/notifications
項目 | 内容 |
---|---|
API ID | API-042 |
エンドポイント | /api/notifications |
メソッド | GET |
説明 | 通知一覧取得 |
入力値 | クエリパラメータ: page=1&limit=20&unreadOnly=false
|
出力値 | json<br>{<br> "success": true,<br> "data": {<br> "notifications": [<br> {<br> "id": "notification_uuid",<br> "title": "新しい問い合わせ",<br> "message": "○○様から問い合わせが届きました",<br> "type": "inquiry",<br> "isRead": false,<br> "createdAt": "2025-06-19T10:00:00Z"<br> }<br> ],<br> "unreadCount": 3,<br> "pagination": {...}<br> }<br>} |
処理内容 | 1. ユーザー認証確認 2. ページネーション処理 3. 通知一覧取得 4. NOTIFY-006で未読数取得 |
API-044: /api/notifications/unread-count
項目 | 内容 |
---|---|
API ID | API-044 |
エンドポイント | /api/notifications/unread-count |
メソッド | GET |
説明 | 未読通知数取得 |
入力値 | 認証ヘッダーのみ |
出力値 | json<br>{<br> "success": true,<br> "data": {<br> "unreadCount": 5<br> }<br>} |
処理内容 | 1. 認証トークン検証 2. NOTIFY-006関数呼び出し 3. キャッシュ活用 4. リアルタイム更新対応 |
8. エラーハンドリング
8.1 共通エラーレスポンス形式
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "入力データが不正です",
"details": {
"field": "email",
"reason": "無効なメールアドレス形式です"
}
}
}
8.2 HTTPステータスコード
コード | 概要 | 使用例 |
---|---|---|
200 | 成功 | データ取得成功 |
201 | 作成成功 | 新規登録成功 |
400 | リクエストエラー | バリデーションエラー |
401 | 認証エラー | トークン無効 |
403 | 権限エラー | アクセス権限なし |
404 | 未存在 | リソースが見つからない |
429 | レート制限 | API呼び出し制限超過 |
500 | サーバーエラー | 内部処理エラー |