# 食品ロス対策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`
- 場所で検索する(座標を指定する)