# 食品ロス対策SNS(仮称) 仕様書(第1版) ([第2版](https://hackmd.io/@kazkazuprogram/HkmBZ4X7w)) --- ## 概要 - 地域密着型のSNS - 食品事業者がロスした食品を投稿 ## 代表的な機能 ### ユーザ登録 - メールアドレス - ユーザー名 - 大文字 - 小文字 - 数字 - ハイフン(-)、アンダーバー(_) - パスワード(ここらへんfirebase使う…?) - 表示名(日本語等なんでも可) - 事業者 or 顧客を選択 - 事業者の場合 - 店舗の場所 - 業種 - 顧客の場合 - よく行く場所 - 自宅、勤務先、帰り道等、複数登録できる ### ログイン処理 - メールアドレス - パスワードを入力してログイン - 事業者 or 顧客を選択 - (Googleログイン(余力があれば)) ### フォロー(顧客側) - 指定の事業者ユーザーをフォローする - その事業者が投稿すると通知し、必ずタイムラインに表示する ### タイムライン(顧客側) - 事前に設定した場所の近くの事業者 - フォローしている事業者 - の、以下の情報を表示する - 表示名 - アイコン - 余った品目 - 数量 - 価格 - コメント(理由含む) - 投稿時間 ### 投稿機能(事業者) - 余った品目 - 数量 - 価格 - コメント(理由含む) #### 投稿削除機能(事業者側) - 当システムに由来しない理由(客が来た等)によってロス食品がなくなった場合に、投稿を削除できる (当システム上の取引によってロス食品がなくなった場合、投稿は自動削除される) ### プロフィール画面 - 店名 - 説明文 - サイトURL - 営業時間 - 電話番号 - 住所 - 地図 - アイコン - Gravatarから引っ張る…? ### リプライ(顧客、事業者) - 品目 - 数量 - 時間 - コメント ### 検索(地域) - Googleマップ上に店の情報を乗っける ## APIドキュメント ### ユーザー処理系 ユーザー処理に関するAPI #### ユーザー登録 `/api/v1/user/register` ユーザー登録をする ユーザー登録後、ログインが必要 - POST - パラメーター ``` { "mailaddr": "<メールアドレス>", "username": "<ユーザー名>", "displayname": "<表示名>", "password": "パスワード", "type": "[shop,user]" // 事業者or個人 } ``` - レスポンス ``` { "status": "<status>", // OK,NG "message": "<失敗したときのメッセージ(日本語)>" } ``` - 結果例 - ユーザー名が既に存在する場合、拒否される - 指定のメールアドレスを持ったユーザーが既に存在する場合、拒否される #### ログイン `/api/v1/user/login` ログインする 成功するとトークンがCookieに書き込まれる - POST - パラメーター ``` { "username": "<ユーザー名>", "password": "<パスワード>" } ``` - レスポンス ``` { "status": "<status>", // OK,NG "message": "<失敗したときのメッセージ(日本語)>", } ``` - 結果例 - パズワードが間違っている場合、拒否される #### ユーザー情報の変更 `/api/v1/user/changeinfo` ユーザー情報を変更する - POST - パラメーター ``` { "username": "<ユーザー名>", "displayname": "<表示名(変更しない場合空白)>", "avatar": "<ユーザーアイコン(変更しない場合空白)>" } ``` - レスポンス ``` { "status": "<status>", // OK,NG "message": "<失敗したときのメッセージ(日本語)>", } ``` - 結果例 - 以下の場合、不正なリクエストとして拒否される - アイコンがbase64でデコードできない場合 - アイコンが画像形式でない場合 #### 他のユーザーの情報を取得 `/api/v1/user/getinfo` 他のユーザーの情報を取得する このAPIは未登録のクライアントにも許可される - POST - パラメーター ``` { "username": "<取得したいユーザー名>" } ``` - レスポンス ``` { "displayname": "表示名", "avatar": "<アイコン>", "type": "[shop,user]" } ``` ### 投稿関係 #### 投稿機能 `/api/v1/post/post` 投稿する このAPIは事業者ユーザーにのみ許可される - POST - パラメーター ``` 考え中 ``` - レスポンス ``` 考え中 ``` #### 投稿機能 `/api/v1/post/delete` 投稿を削除する このAPIは事業者ユーザーにのみ許可される - POST - パラメーター ``` 考え中 ``` - レスポンス ``` 考え中 ``` #### タイムライン取得 `/api/v1/post/get_timeline` ユーザーのタイムラインを取得する このAPIは事業者ユーザーにのみ許可される - GET - ヘッダー ``` { "username": "<ユーザー名>", "X-TL-QUANTITY": "<タイムラインの数(デフォルト:50)>" } ``` - レスポンス ``` { "status": "<OK,NG>", "message": "<失敗時のメッセージ(日本語)>" "data": { 0: { "postid": "<投稿ID>" "username": "<ユーザー名>", "displayname": "<表示名>", "avatar": "<アイコン>", "item": { "itemname": "<品目名>", "quantity": "<数量>", "price": "<価格>", "comment": "<コメント>", } } }, 1: { : }, : } } ``` #### リプライ `/api/v1/post/reply` 返信する - POST - パラメーター ``` { "username": "<ユーザー名>", "postid": "<返信したい投稿ID>", "data": { "quantity": "<数量>", "time": "<取引予定時刻>", "comment": "<コメント>" } } ``` - レスポンス ``` { "status": "[OK,NG]", "message": "<失敗時のメッセージ>", "replyid": "<投稿された返信ID>" } ``` #### 検索 `/api/v1/post/search` 検索する このAPIは未登録のクライアントにも許可される - POST - パラメーター ``` { "type": "<検索方法>", "query": "<検索クエリ>" } ``` - レスポンス ``` // タイムラインAPIと同じ ``` - 検索方法 - `keyword` - キーワードで検索する(「玉ねぎ」「居酒屋」等) - `place` - 場所で検索する(座標を指定する)