RealWorldプロジェクトのバックエンドAPIをRailsのapiモードで実装した。
ブログプラットフォームを作る RealWorld という OSS のプロジェクトがあります。RealWorld は実世界と同じ機能を持つプラットフォームを作ることで、学習したいフレームワークの技術を習得することを目的としてたプロジェクトです。
ここでは、RealWorld の バックエンドの API の仕様を満たす Rails API を作成します。
ステップ1とステップ2に分かれます。時間に余裕がない場合はステップ1に進んでください。時間に余裕がある場合はステップ2に進んでください。ステップ1を終えてからステップ2に進む設計にはなっていないため、最初にどちらに進むかを選択してください。
ステップ1は RealWorld の API の仕様を部分的に満たした API を作成します。具体的には、認証機能のない簡易バージョンの作成になります。
ステップ2は RealWorld の API の仕様を満たす API を作成します。認証機能付きのバージョンの作成になります。
基本的にはステップ2を進めていくことを想定していますが、時間に余裕がない場合はステップ1を進めてください。
RealWorld のドキュメント に目を通した上で、ステップに進んでください。
RealWorld の API のうち、次のエンドポイントを実装してください。
なお、Article に関わる要素のうち、認証機能及び著者、お気に入り(favorite) は実装しなくてよいものとします。
RealWorld の API のうち、次のエンドポイントを実装してください。
その際に、API spec と呼ばれている Postman のテスト(Conduit.postman_collection.json)の該当する箇所が通るように実装してください(該当箇所以外のテストは削除するとテストしやすいです)。
次のエンドポイントを実装してください。
その際に、Postman のテストの該当する箇所が通るように実装してください。
次のエンドポイントを実装してください。
その際に、Postman のテストの該当する箇所が通るように実装してください。
なお、Article に関わる要素のうち、お気に入り(favorite) は実装しなくてよいものとします。Postman のテストからも該当箇所のコードは削除し除外してください。
いずれかのエンドポイントのテストを1つ書いてください。
お気に入り(favorite)も実装してください。
post /api/users
post /api/users/login
get /api/user
put /api/user
post /api/articles
get /api/articles
get /api/articles/:slug
put /api/articles/:slug
delete /api/articles/:slug
post /api/articles/:slug/favorite
delete /api/articles/:slug/favorite
post http://localhost:3000/api/users
{
"user":{
"username": "Jacob",
"email": "jake@jake.jake",
"password": "jakejake"
}
}{
"user": {
"email": "jake@jake.jake",
"token": "jwt.token.here",
"username": "jake",
"bio": "I work at statefarm",
"image": null
}
}post http://localhost:3000/api/users/login
{
"user":{
"email": "jake@jake.jake",
"password": "jakejake"
}
}{
"user": {
"email": "jake@jake.jake",
"token": "jwt.token.here",
"username": "jake",
"bio": "I work at statefarm",
"image": null
}
}get http://localhost:3000/api/user
nil{
"user": {
"email": "jake@jake.jake",
"token": "jwt.token.here",
"username": "jake",
"bio": "I work at statefarm",
"image": null
}
}put http://localhost:3000/api/user
{
"user":{
"email": "jake@jake.jake",
"bio": "I like to skateboard",
"image": "https://i.stack.imgur.com/xHWG8.jpg"
}
}{
"user": {
"email": "jake@jake.jake",
"token": "jwt.token.here",
"username": "jake",
"bio": "I like to skateboard",
"image": "https://i.stack.imgur.com/xHWG8.jpg"
}
}post http://localhost:3000/api/articles
{
"article": {
"title": "How to train your dragon",
"description": "Ever wonder how?",
"body": "You have to believe",
"tagList": ["reactjs", "angularjs", "dragons"]
}
}{
"article": {
"slug": "how-to-train-your-dragon",
"title": "How to train your dragon",
"description": "Ever wonder how?",
"body": "It takes a Jacobian",
"tagList": ["dragons", "training"],
"createdAt": "2016-02-18T03:22:56.637Z",
"updatedAt": "2016-02-18T03:48:35.824Z",
"favorited": false,
"favoritesCount": 0,
"author": {
"username": "jake",
"bio": "I work at statefarm",
"image": "https://i.stack.imgur.com/xHWG8.jpg",
"following": false
}
}
}get http://localhost:3000/api/articles
tag, author, favorited, limit and offset
url例
get http://localhost:3000/api/articles?author=jake
{
"articles":[{
"slug": "how-to-train-your-dragon",
"title": "How to train your dragon",
"description": "Ever wonder how?",
"body": "It takes a Jacobian",
"tagList": ["dragons", "training"],
"createdAt": "2016-02-18T03:22:56.637Z",
"updatedAt": "2016-02-18T03:48:35.824Z",
"favorited": false,
"favoritesCount": 0,
"author": {
"username": "jake",
"bio": "I work at statefarm",
"image": "https://i.stack.imgur.com/xHWG8.jpg",
"following": false
}
}, {
"slug": "how-to-train-your-dragon-2",
"title": "How to train your dragon 2",
"description": "So toothless",
"body": "It a dragon",
"tagList": ["dragons", "training"],
"createdAt": "2016-02-18T03:22:56.637Z",
"updatedAt": "2016-02-18T03:48:35.824Z",
"favorited": false,
"favoritesCount": 0,
"author": {
"username": "jake",
"bio": "I work at statefarm",
"image": "https://i.stack.imgur.com/xHWG8.jpg",
"following": false
}
}],
"articlesCount": 2
}get http://localhost:3000/api/articles/:slug
{
"article": {
"slug": "how-to-train-your-dragon",
"title": "How to train your dragon",
"description": "Ever wonder how?",
"body": "It takes a Jacobian",
"tagList": ["dragons", "training"],
"createdAt": "2016-02-18T03:22:56.637Z",
"updatedAt": "2016-02-18T03:48:35.824Z",
"favorited": false,
"favoritesCount": 0,
"author": {
"username": "jake",
"bio": "I work at statefarm",
"image": "https://i.stack.imgur.com/xHWG8.jpg",
"following": false
}
}
}put http://localhost:3000/api/articles/:slug
{
"article": {
"title": "Did you train your dragon?"
}
}{
"article": {
"slug": "how-to-train-your-dragon",
"title": "How to train your dragon",
"description": "Ever wonder how?",
"body": "It takes a Jacobian",
"tagList": ["dragons", "training"],
"createdAt": "2016-02-18T03:22:56.637Z",
"updatedAt": "2016-02-18T03:48:35.824Z",
"favorited": false,
"favoritesCount": 0,
"author": {
"username": "jake",
"bio": "I work at statefarm",
"image": "https://i.stack.imgur.com/xHWG8.jpg",
"following": false
}
}
}delete http://localhost:3000/api/articles/:slug
レスポンスなし
post http://localhost:3000/api/articles/:slug/favorite
{
"article": {
"slug": "how-to-train-your-dragon",
"title": "How to train your dragon",
"description": "Ever wonder how?",
"body": "It takes a Jacobian",
"tagList": ["dragons", "training"],
"createdAt": "2016-02-18T03:22:56.637Z",
"updatedAt": "2016-02-18T03:48:35.824Z",
"favorited": false,
"favoritesCount": 0,
"author": {
"username": "jake",
"bio": "I work at statefarm",
"image": "https://i.stack.imgur.com/xHWG8.jpg",
"following": false
}
}
}delete http://localhost:3000/api/articles/:slug/favorite
レスポンスなし
