---
# System prepended metadata

title: 食品ロス対策SNS(仮称) 仕様書（第1版）

---

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