# バックエンド実装タスク割
## ロール
- API作成
- DB構築
を各1名ずつ担当。API作成の方は助太刀します。
実装言語:Python,SQLite3
リポジトリ:https://github.com/projects-for-klis/meido-backend
## ディレクトリ構成
- /db
- データベース関連
- Dockerfile
- /api
- pythonのコードをこちらにいれる
- - Dockerfile
- docker-compose.yaml
- .git
- .gitignore
---
## DB班
### 大概念
- DBの構築
- SQLファイルの作成
- DB<=>Flask間を通信するためのpythonプログラムを作成する
### 開発方針
 テーブル作成のSQL等は全てsqlファイルに記述してそれを実行する。後から再現出来るようにしたいのでお願いします🙇
### 作成テーブル(現時点で決まっているもの)
3つのテーブルを作成する。
- place_info(観光地名)
- name, text not null
- id, uuid not null primary key
- updated_at, time
- created_at, time not null
- pref_code, text not null
- tel, text not null
- desc, text // 説明文などの補足資料
- g_uuid, text not null // Google APIで一意に振られるID。独自実装がこちらに合わせることが出来ればこれを主キーにする。
- star, number not null default 0
- lat, number not null // 緯度
- lon, number not null // 経度
- 投稿データ
- id, uuid not null primary key
- updated_at, time
- created_at, time not null
- user_id, uuid not null
- place_id, uuid not null // place_info(仮)のID
- message, text //nullable
- star, number not null default ""
- photo_id not null default empty string // 補足します
- User情報
- name, text not null
- id, uuid not null primary key
- updated_at, time
- created_at, time not null
- email, text not null default ""
型や制約などはSQLファイルに対するPRを確認してブラッシュアップしていきましょう!
---
## API班
作るプログラムの大概念だけ共有しておきます。多分flaskで作るのが一番楽だと思います。
- ユーザー情報(いわゆるCRUD+Findが基本)
- 登録
- 条件検索
- 全件検索
- 削除
- 観光地情報の検索(こちらもCRUD+Complex Find)
- 基本的なCRUD
- 検索条件
- 距離
- 位置情報
- オススメ度合い
- 投稿機能
- CRUD
- これらは複合的な条件で検索される可能性がある。そこも許容して実装をする。
- 関数への入力はDB作成側で必要パラメーターを含んだ抽象クラスを作成して定義していただければおk
### API作成の大概念
お気持ち的には各情報のCRUDとComplex Findが出来ればおk。
フロントから良い感じにデータを投げつけるのでそれに対してコールバックを返せば良き。
JSONのキーはフロント班と連携を取りながら詳細を詰めつつ実装をお願いします。
開発の流れですが
1. CRUD用の各関数を生やす
2. とりあえずアクセスしたらテストデータが返るようにする
3. JSONのカラムについてはフロント班と摺り合わせをする
4. 徐々にDBと繋ぎつつデータの登録処理などを実装する
ここから下はあくまで一例です。このようなお気持ちで各処理を摺り合わせながら実装してください🙇
### 投稿API
新規にデータを投稿する(POST)
#### input
```json=
{
"user_id": "example-user-id",
"message": "hogehoge",
"star": 4.5
"photo_id": "photo-link-id"
"id" : :"post-id" // これを設定すると編集になる。ない場合は新しいテーブルでデータを保存。つまり、編集機能をサポートする。
}
```
#### 200
```json=
{
"status":"success"
}
```
#### 4xx,5xx
```json=
{
"status":"success",
"message":"An error occured in this server"
}
```
### 観光地情報API
新規にデータを投稿する(POST)
#### input
```json=
{
"user_id": "example-user-id",
"message": "hogehoge",
"lan": 45.9,
"lon": 135.8
"star": 4.5,
"photo_id": "photo-link-id"
"title" : "hogehoge動物園"
}
```
#### 200
```json=
{
"status":"success"
}
```
#### 4xx,5xx
```json=
{
"status":"success",
"message":"An error occured in this server"
}
```
次に行く観光地をサジェスト(POST)
Inputパラメーターにnull許容でさまざまな値を放り込めば柔軟に検索できるようになる。追加仕様はお任せします。ミニマムは緯度経度だけなのでこちらはnot null制約でお願いします。
#### Input
```json=
{
"lon" : 45.03
'lan' ; 136.3
}
```
### 200
```json=
{
"name": "hogehoge植物園"
"lon" : 46
"lan" : 135.6
"photo_id" : "example-photo-link"
"star":3.2
"id" : "uuid"
}
```
#### 4xx,5xx
```json=
{
"status":"success",
"message":"An error occured in this server"
}
```