## 方針
- マップをビューのベースに持ってくる
- 時間、距離、いいね、評価関数
- リストをなくしてマップに表示
- 周囲?m以内で評価関数で表示
- 差分だけ送る
- 離れたらそっちで破棄
- この辺で何件(遠いとこ)
- twitterとgoogleでログイン
## page
-
## DB
### post
| column | type |
| :-- | :-- |
| ==id==(primary) | integer |
| longitude | integer |
| latitude | integer |
| url | string |
| body | text |
| created_at | datetime |
| updated_at | datetime |
### user
| column | type |
| :-- | :-- |
| ==id==(primary) | integer |
|name|strnig|
| email | string |
| password_digest | string |
| token | string |
| created_at | datetime |
| updated_at | datetime |
## API
base_url: `https://monu-geometry.herokkuapp.com/v1/`
### get /posts
#### Request
##### params
| param | value |
| -------- | -------- |
| longitude | 34.684860 |
| latitude | 135.1994354 |
| delta | 0.003 |
#### Response
##### 正常系
post のリスト
距離近い順
```jsonld
{
"posts": [
{
"distance": 12, // number: メートル単位
"body": "this is body", // string: ツイート本文
"url": "https://<slug>", // string: ツイートに含まれるURL
"created_at": 1571454012 // number: UNIX時間
},
{
"distance": 13, // number: メートル単位
"body": "this is body", // string
"url": "https://<slug>", // string
"created_at": 1571454012 // number
},
]
}
```
##### 異常系
| failure mode | HTTP status |
| -------- | -------- |
| longitude or latitude が未指定 or numberじゃない | 400 Bad Request |
| 上記以外 | 500 internal server error |
```jsonld
{
msg: "error message"
}
```
### post /posts
新しいpostを作成
#### Request
##### body
```jsonld
{
"longitude": 34.684860, // number
"latitude": 135.1994354, // number
"url": "http://hogehoge",
"body": "this is body"
}
```
#### Response
##### 正常系
post のリスト
距離近い順
```jsonld
{
post: {
"body": "this is body", // string: ツイート本文
"url": "https://<slug>", // string: ツイートに含まれるURL
"created_at": 1571454012 // number: UNIX時間
}
}
```
#### 異常系
| failure mode | HTTP status |
| -------- | -------- |
| どれかが未指定 | 400 Bad Request |
| 上記以外 | 500 internal server error |
```jsonld
{
msg: "error message"
}
```
## apilists
```
v1_users GET /v1/users(.:format) v1/users#index
POST /v1/users(.:format) v1/users#create
v1_user GET /v1/users/:id(.:format) v1/users#show
PATCH /v1/users/:id(.:format) v1/users#update
PUT /v1/users/:id(.:format) v1/users#update
DELETE /v1/users/:id(.:format) v1/users#destroy
v1_me GET /v1/me(.:format) v1/users#me
v1_login POST /v1/login(.:format) v1/users#log_in
v1_posts GET /v1/posts(.:format) v1/posts#index
POST /v1/posts(.:format) v1/posts#create
v1_post GET /v1/posts/:id(.:format) v1/posts#show
PATCH /v1/posts/:id(.:format) v1/posts#update
PUT /v1/posts/:id(.:format) v1/posts#update
DELETE /v1/posts/:id(.:format) v1/posts#destroy
v1 POST /v1/images/:post_id(.:format) v1/images#create
GET /v1/images/:post_id(.:format) v1/images#show
POST /v1/posts/:id/good(.:format) v1/posts#good
v2_users GET /v2/users(.:format) v2/users#index
POST /v2/users(.:format) v2/users#create
v2_user GET /v2/users/:id(.:format) v2/users#show
PATCH /v2/users/:id(.:format) v2/users#update
PUT /v2/users/:id(.:format) v2/users#update
DELETE /v2/users/:id(.:format) v2/users#destroy
v2_me GET /v2/me(.:format) v2/users#me
v2_login POST /v2/login(.:format) v2/users#log_in
v2_posts GET /v2/posts(.:format) v2/posts#index
POST /v2/posts(.:format) v2/posts#create
v2_post GET /v2/posts/:id(.:format) v2/posts#show
PATCH /v2/posts/:id(.:format) v2/posts#update
PUT /v2/posts/:id(.:format) v2/posts#update
DELETE /v2/posts/:id(.:format) v2/posts#destroy
v2 POST /v2/images/:post_id(.:format) v2/images#create
GET /v2/images/:post_id(.:format) v2/images#show
POST /v2/posts/:id/good(.:format) v2/posts#good
```
### Auth方法
1. (GET)/login または (POST)/usersでログインかユーザー作成
2. json形式の`{"token": "huahkdailno"}`がもらえる
3. headerに`Authorization`と`Bearer {token}`を追加し、送信
4. 簡単にauthできてるかの確認として(GET)/meにアクセス(ユーザーオブジェクトがもらえる)
### POST /v2/users
```jsonld
//request
{
"name": "hoge1",
"email": "kooala",
"password": "password",
"image": "url_to_image"
}
//response: user_obj(include token)
{
"id": 6,
"name": "hoge",
"email": "a21ala@s.q",
"token": "GtvXPzfyK2KVJ2fNkUSYC28n"
}
```
### GET /v2/me (==need Auth==)
```jsonld
//response: user_obj(include token)
{
"id": 5,
"name": "json野郎",
"email": "imjson",
"token": "WzW2aqrSthsbhhx4dJ64LB2K",
"image": null
}
```
### POST /v2/login
```jsonld
//request
{
"email": "a21ala@s.q",
"password": "hgehoelaal"
}
//response: user_obj(include token)
{
"id": 6,
"name": "hoge",
"email": "a21ala@s.q",
"token": "GtvXPzfyK2KVJ2fNkUSYC28n",
"image": "http://kakka"
}
```
### GET /v2/users/:id
```jsonld
//response: user_obj
{
"id": 1,
"name": "hoge",
"email": "aaa@a.a",
"image": null
}
```
### POST /v2/posts (==need Auth==)
```jsonld
//request
{
"longitude": 34.684860,
"latitude": 135.1994354,
"url": "http://hogehoge",
"body": "this is body"
}
//response: post_obj
{
"id": 76,
"url": "http://hogehkakkakkkkoge",
"body": "this is body",
"created_at": "2019-10-20T01:15:24.797Z"
}
```
### POST /v2/posts/:post_id/good (==need Auth==)
```jsonld
//response good_obj
{"id":3,
"post_id":72,
"user_id":5,
"created_at":"2019-10-20T01:16:45.620Z",
"updated_at":"2019-10-20T01:16:45.620Z"
}
```
### GET /v2/posts
```jsonld
//request => /v2/posts?longitude=34.684860&latitude=135.1994354&delta=0.05
//response: arrayof posts_obj
[{
{
"id": 5,
"body": "this is body",
"url": "http://hogehkakkakkkkoge",
"distance": 0.004452779394415685,
"created_at": "2019-10-20T03:03:31.892Z",
"latitude": 34.6941384,
"longitude": 135.1961528,
"user": "hhha",
"user_id": 8,
"already": true,
"good": 1
}]
```
### GET /v2/posts/:id
```jsonld
//response: posts_obj
{
"id": 1,
"longitude": 34.68486,
"latitude": 135.1994354,
"url": "http://hogehoge",
"body": "this is body",
"created_at": "2019-10-19T06:59:10.460Z",
"updated_at": "2019-10-19T06:59:10.460Z",
"user_id": null
}
```