about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-09-27 16:58:23 +0200
committerEugen Rochko <eugen@zeonfederated.com>2016-09-27 16:59:08 +0200
commit4f9b7432dd4d323ac6cc4efceeae2efaffe62e7d (patch)
treeacae9e59bd6971885f7cb7b7ed45c4c9d1af4fca
parent3f75f522856954690d92358107e78bafd0db0baa (diff)
Fix #52 - Add API versioning (v1)
-rw-r--r--app/assets/javascripts/components/actions/accounts.jsx10
-rw-r--r--app/assets/javascripts/components/actions/compose.jsx4
-rw-r--r--app/assets/javascripts/components/actions/follow.jsx2
-rw-r--r--app/assets/javascripts/components/actions/interactions.jsx8
-rw-r--r--app/assets/javascripts/components/actions/statuses.jsx2
-rw-r--r--app/assets/javascripts/components/actions/timelines.jsx4
-rw-r--r--app/controllers/api/v1/accounts_controller.rb (renamed from app/controllers/api/accounts_controller.rb)2
-rw-r--r--app/controllers/api/v1/apps_controller.rb (renamed from app/controllers/api/apps_controller.rb)2
-rw-r--r--app/controllers/api/v1/follows_controller.rb (renamed from app/controllers/api/follows_controller.rb)2
-rw-r--r--app/controllers/api/v1/media_controller.rb (renamed from app/controllers/api/media_controller.rb)2
-rw-r--r--app/controllers/api/v1/statuses_controller.rb (renamed from app/controllers/api/statuses_controller.rb)2
-rw-r--r--app/helpers/api/accounts_helper.rb2
-rw-r--r--app/helpers/api/apps_helper.rb2
-rw-r--r--app/helpers/api/follows_helper.rb2
-rw-r--r--app/helpers/api/media_helper.rb2
-rw-r--r--app/helpers/api/salmon_helper.rb2
-rw-r--r--app/helpers/api/statuses_helper.rb2
-rw-r--r--app/helpers/api/subscriptions_helper.rb2
-rw-r--r--app/helpers/home_helper.rb6
-rw-r--r--app/lib/feed_manager.rb2
-rw-r--r--app/views/api/accounts/followers.rabl2
-rw-r--r--app/views/api/accounts/following.rabl2
-rw-r--r--app/views/api/accounts/relationships.rabl2
-rw-r--r--app/views/api/accounts/statuses.rabl2
-rw-r--r--app/views/api/follows/show.rabl2
-rw-r--r--app/views/api/statuses/home.rabl2
-rw-r--r--app/views/api/statuses/mentions.rabl2
-rw-r--r--app/views/api/v1/accounts/followers.rabl2
-rw-r--r--app/views/api/v1/accounts/following.rabl2
-rw-r--r--app/views/api/v1/accounts/relationship.rabl (renamed from app/views/api/accounts/relationship.rabl)0
-rw-r--r--app/views/api/v1/accounts/relationships.rabl2
-rw-r--r--app/views/api/v1/accounts/show.rabl (renamed from app/views/api/accounts/show.rabl)0
-rw-r--r--app/views/api/v1/accounts/statuses.rabl2
-rw-r--r--app/views/api/v1/apps/create.rabl (renamed from app/views/api/apps/create.rabl)0
-rw-r--r--app/views/api/v1/follows/show.rabl2
-rw-r--r--app/views/api/v1/media/create.rabl (renamed from app/views/api/media/create.rabl)0
-rw-r--r--app/views/api/v1/statuses/context.rabl (renamed from app/views/api/statuses/context.rabl)4
-rw-r--r--app/views/api/v1/statuses/home.rabl2
-rw-r--r--app/views/api/v1/statuses/mentions.rabl2
-rw-r--r--app/views/api/v1/statuses/show.rabl (renamed from app/views/api/statuses/show.rabl)4
-rw-r--r--config/routes.rb62
-rw-r--r--spec/controllers/api/v1/accounts_controller_spec.rb (renamed from spec/controllers/api/accounts_controller_spec.rb)2
-rw-r--r--spec/controllers/api/v1/apps_controller_spec.rb (renamed from spec/controllers/api/apps_controller_spec.rb)2
-rw-r--r--spec/controllers/api/v1/follows_controller_spec.rb (renamed from spec/controllers/api/follows_controller_spec.rb)2
-rw-r--r--spec/controllers/api/v1/media_controller_spec.rb (renamed from spec/controllers/api/media_controller_spec.rb)2
-rw-r--r--spec/controllers/api/v1/statuses_controller_spec.rb (renamed from spec/controllers/api/statuses_controller_spec.rb)2
-rw-r--r--spec/helpers/api/accounts_helper_spec.rb5
-rw-r--r--spec/helpers/api/apps_helper_spec.rb15
-rw-r--r--spec/helpers/api/follows_helper_spec.rb5
-rw-r--r--spec/helpers/api/media_helper_spec.rb5
-rw-r--r--spec/helpers/api/salmon_helper_spec.rb5
-rw-r--r--spec/helpers/api/statuses_helper_spec.rb5
-rw-r--r--spec/helpers/api/subscriptions_helper_spec.rb5
53 files changed, 79 insertions, 136 deletions
diff --git a/app/assets/javascripts/components/actions/accounts.jsx b/app/assets/javascripts/components/actions/accounts.jsx
index b4183bbee..c4aa2d80c 100644
--- a/app/assets/javascripts/components/actions/accounts.jsx
+++ b/app/assets/javascripts/components/actions/accounts.jsx
@@ -36,7 +36,7 @@ export function fetchAccount(id) {
 
     dispatch(fetchAccountRequest(id));
 
-    axios.all([boundApi.get(`/api/accounts/${id}`), boundApi.get(`/api/accounts/relationships?id=${id}`)]).then(values => {
+    axios.all([boundApi.get(`/api/v1/accounts/${id}`), boundApi.get(`/api/v1/accounts/relationships?id=${id}`)]).then(values => {
       dispatch(fetchAccountSuccess(values[0].data, values[1].data[0]));
     }).catch(error => {
       dispatch(fetchAccountFail(id, error));
@@ -48,7 +48,7 @@ export function fetchAccountTimeline(id) {
   return (dispatch, getState) => {
     dispatch(fetchAccountTimelineRequest(id));
 
-    api(getState).get(`/api/accounts/${id}/statuses`).then(response => {
+    api(getState).get(`/api/v1/accounts/${id}/statuses`).then(response => {
       dispatch(fetchAccountTimelineSuccess(id, response.data));
     }).catch(error => {
       dispatch(fetchAccountTimelineFail(id, error));
@@ -62,7 +62,7 @@ export function expandAccountTimeline(id) {
 
     dispatch(expandAccountTimelineRequest(id));
 
-    api(getState).get(`/api/accounts/${id}/statuses?max_id=${lastId}`).then(response => {
+    api(getState).get(`/api/v1/accounts/${id}/statuses?max_id=${lastId}`).then(response => {
       dispatch(expandAccountTimelineSuccess(id, response.data));
     }).catch(error => {
       dispatch(expandAccountTimelineFail(id, error));
@@ -97,7 +97,7 @@ export function followAccount(id) {
   return (dispatch, getState) => {
     dispatch(followAccountRequest(id));
 
-    api(getState).post(`/api/accounts/${id}/follow`).then(response => {
+    api(getState).post(`/api/v1/accounts/${id}/follow`).then(response => {
       dispatch(followAccountSuccess(response.data));
     }).catch(error => {
       dispatch(followAccountFail(error));
@@ -109,7 +109,7 @@ export function unfollowAccount(id) {
   return (dispatch, getState) => {
     dispatch(unfollowAccountRequest(id));
 
-    api(getState).post(`/api/accounts/${id}/unfollow`).then(response => {
+    api(getState).post(`/api/v1/accounts/${id}/unfollow`).then(response => {
       dispatch(unfollowAccountSuccess(response.data));
     }).catch(error => {
       dispatch(unfollowAccountFail(error));
diff --git a/app/assets/javascripts/components/actions/compose.jsx b/app/assets/javascripts/components/actions/compose.jsx
index b4d0b06a2..402c59dc6 100644
--- a/app/assets/javascripts/components/actions/compose.jsx
+++ b/app/assets/javascripts/components/actions/compose.jsx
@@ -36,7 +36,7 @@ export function submitCompose() {
   return function (dispatch, getState) {
     dispatch(submitComposeRequest());
 
-    api(getState).post('/api/statuses', {
+    api(getState).post('/api/v1/statuses', {
       status: getState().getIn(['compose', 'text'], ''),
       in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null),
       media_ids: getState().getIn(['compose', 'media_attachments']).map(item => item.get('id'))
@@ -75,7 +75,7 @@ export function uploadCompose(files) {
     let data = new FormData();
     data.append('file', files[0]);
 
-    api(getState).post('/api/media', data, {
+    api(getState).post('/api/v1/media', data, {
       onUploadProgress: function (e) {
         dispatch(uploadComposeProgress(e.loaded, e.total));
       }
diff --git a/app/assets/javascripts/components/actions/follow.jsx b/app/assets/javascripts/components/actions/follow.jsx
index f747a3190..8eb440789 100644
--- a/app/assets/javascripts/components/actions/follow.jsx
+++ b/app/assets/javascripts/components/actions/follow.jsx
@@ -16,7 +16,7 @@ export function submitFollow(router) {
   return function (dispatch, getState) {
     dispatch(submitFollowRequest());
 
-    api(getState).post('/api/follows', {
+    api(getState).post('/api/v1/follows', {
       uri: getState().getIn(['follow', 'text'])
     }).then(function (response) {
       dispatch(submitFollowSuccess(response.data));
diff --git a/app/assets/javascripts/components/actions/interactions.jsx b/app/assets/javascripts/components/actions/interactions.jsx
index 3b3e2a6b6..8ce0c7561 100644
--- a/app/assets/javascripts/components/actions/interactions.jsx
+++ b/app/assets/javascripts/components/actions/interactions.jsx
@@ -12,7 +12,7 @@ export function reblog(status) {
   return function (dispatch, getState) {
     dispatch(reblogRequest(status));
 
-    api(getState).post(`/api/statuses/${status.get('id')}/reblog`).then(function (response) {
+    api(getState).post(`/api/v1/statuses/${status.get('id')}/reblog`).then(function (response) {
       // The reblog API method returns a new status wrapped around the original. In this case we are only
       // interested in how the original is modified, hence passing it skipping the wrapper
       dispatch(reblogSuccess(status, response.data.reblog));
@@ -24,7 +24,7 @@ export function reblog(status) {
 
 export function unreblog(status) {
   return (dispatch, getState) => {
-    api(getState).post(`/api/statuses/${status.get('id')}/unreblog`).then(response => {
+    api(getState).post(`/api/v1/statuses/${status.get('id')}/unreblog`).then(response => {
       //
     }).catch(error => {
       //
@@ -59,7 +59,7 @@ export function favourite(status) {
   return function (dispatch, getState) {
     dispatch(favouriteRequest(status));
 
-    api(getState).post(`/api/statuses/${status.get('id')}/favourite`).then(function (response) {
+    api(getState).post(`/api/v1/statuses/${status.get('id')}/favourite`).then(function (response) {
       dispatch(favouriteSuccess(status, response.data));
     }).catch(function (error) {
       dispatch(favouriteFail(status, error));
@@ -69,7 +69,7 @@ export function favourite(status) {
 
 export function unfavourite(status) {
   return (dispatch, getState) => {
-    api(getState).post(`/api/statuses/${status.get('id')}/unfavourite`).then(response => {
+    api(getState).post(`/api/v1/statuses/${status.get('id')}/unfavourite`).then(response => {
       //
     }).catch(error => {
       //
diff --git a/app/assets/javascripts/components/actions/statuses.jsx b/app/assets/javascripts/components/actions/statuses.jsx
index 1dcf300c4..9b757fceb 100644
--- a/app/assets/javascripts/components/actions/statuses.jsx
+++ b/app/assets/javascripts/components/actions/statuses.jsx
@@ -18,7 +18,7 @@ export function fetchStatus(id) {
 
     dispatch(fetchStatusRequest(id));
 
-    axios.all([boundApi.get(`/api/statuses/${id}`), boundApi.get(`/api/statuses/${id}/context`)]).then(values => {
+    axios.all([boundApi.get(`/api/v1/statuses/${id}`), boundApi.get(`/api/v1/statuses/${id}/context`)]).then(values => {
       dispatch(fetchStatusSuccess(values[0].data, values[1].data));
     }).catch(error => {
       dispatch(fetchStatusFail(id, error));
diff --git a/app/assets/javascripts/components/actions/timelines.jsx b/app/assets/javascripts/components/actions/timelines.jsx
index 8a05c37fd..f92f758f5 100644
--- a/app/assets/javascripts/components/actions/timelines.jsx
+++ b/app/assets/javascripts/components/actions/timelines.jsx
@@ -45,7 +45,7 @@ export function refreshTimeline(timeline) {
   return function (dispatch, getState) {
     dispatch(refreshTimelineRequest(timeline));
 
-    api(getState).get(`/api/statuses/${timeline}`).then(function (response) {
+    api(getState).get(`/api/v1/statuses/${timeline}`).then(function (response) {
       dispatch(refreshTimelineSuccess(timeline, response.data));
     }).catch(function (error) {
       dispatch(refreshTimelineFail(timeline, error));
@@ -67,7 +67,7 @@ export function expandTimeline(timeline) {
 
     dispatch(expandTimelineRequest(timeline));
 
-    api(getState).get(`/api/statuses/${timeline}?max_id=${lastId}`).then(response => {
+    api(getState).get(`/api/v1/statuses/${timeline}?max_id=${lastId}`).then(response => {
       dispatch(expandTimelineSuccess(timeline, response.data));
     }).catch(error => {
       dispatch(expandTimelineFail(timeline, error));
diff --git a/app/controllers/api/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb
index 490c28e75..23f48782f 100644
--- a/app/controllers/api/accounts_controller.rb
+++ b/app/controllers/api/v1/accounts_controller.rb
@@ -1,4 +1,4 @@
-class Api::AccountsController < ApiController
+class Api::V1::AccountsController < ApiController
   before_action :doorkeeper_authorize!
   before_action :set_account
   respond_to    :json
diff --git a/app/controllers/api/apps_controller.rb b/app/controllers/api/v1/apps_controller.rb
index 629cb2416..f7a5e0b0a 100644
--- a/app/controllers/api/apps_controller.rb
+++ b/app/controllers/api/v1/apps_controller.rb
@@ -1,4 +1,4 @@
-class Api::AppsController < ApplicationController
+class Api::V1::AppsController < ApplicationController
   respond_to :json
 
   def create
diff --git a/app/controllers/api/follows_controller.rb b/app/controllers/api/v1/follows_controller.rb
index dbd44cc54..de006f671 100644
--- a/app/controllers/api/follows_controller.rb
+++ b/app/controllers/api/v1/follows_controller.rb
@@ -1,4 +1,4 @@
-class Api::FollowsController < ApiController
+class Api::V1::FollowsController < ApiController
   before_action :doorkeeper_authorize!
   respond_to    :json
 
diff --git a/app/controllers/api/media_controller.rb b/app/controllers/api/v1/media_controller.rb
index d5a0a124a..4896534ad 100644
--- a/app/controllers/api/media_controller.rb
+++ b/app/controllers/api/v1/media_controller.rb
@@ -1,4 +1,4 @@
-class Api::MediaController < ApiController
+class Api::V1::MediaController < ApiController
   before_action :doorkeeper_authorize!
   respond_to    :json
 
diff --git a/app/controllers/api/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb
index 44fb40bae..4196852f2 100644
--- a/app/controllers/api/statuses_controller.rb
+++ b/app/controllers/api/v1/statuses_controller.rb
@@ -1,4 +1,4 @@
-class Api::StatusesController < ApiController
+class Api::V1::StatusesController < ApiController
   before_action :doorkeeper_authorize!
   respond_to    :json
 
diff --git a/app/helpers/api/accounts_helper.rb b/app/helpers/api/accounts_helper.rb
deleted file mode 100644
index d9a54c7bc..000000000
--- a/app/helpers/api/accounts_helper.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-module Api::AccountsHelper
-end
diff --git a/app/helpers/api/apps_helper.rb b/app/helpers/api/apps_helper.rb
deleted file mode 100644
index f6b0c6635..000000000
--- a/app/helpers/api/apps_helper.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-module Api::AppsHelper
-end
diff --git a/app/helpers/api/follows_helper.rb b/app/helpers/api/follows_helper.rb
deleted file mode 100644
index d8022d93c..000000000
--- a/app/helpers/api/follows_helper.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-module Api::FollowsHelper
-end
diff --git a/app/helpers/api/media_helper.rb b/app/helpers/api/media_helper.rb
deleted file mode 100644
index ecaa91e7b..000000000
--- a/app/helpers/api/media_helper.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-module Api::MediaHelper
-end
diff --git a/app/helpers/api/salmon_helper.rb b/app/helpers/api/salmon_helper.rb
deleted file mode 100644
index 513c6fb7d..000000000
--- a/app/helpers/api/salmon_helper.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-module Api::SalmonHelper
-end
diff --git a/app/helpers/api/statuses_helper.rb b/app/helpers/api/statuses_helper.rb
deleted file mode 100644
index 3187f3e3b..000000000
--- a/app/helpers/api/statuses_helper.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-module Api::StatusesHelper
-end
diff --git a/app/helpers/api/subscriptions_helper.rb b/app/helpers/api/subscriptions_helper.rb
deleted file mode 100644
index 3796aee42..000000000
--- a/app/helpers/api/subscriptions_helper.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-module Api::SubscriptionsHelper
-end
diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb
index d08264e1e..61a4b4dd8 100644
--- a/app/helpers/home_helper.rb
+++ b/app/helpers/home_helper.rb
@@ -3,11 +3,11 @@ module HomeHelper
     {
       token: @token,
 
-      account: render(file: 'api/accounts/show', locals: { account: current_user.account }, formats: :json),
+      account: render(file: 'api/v1/accounts/show', locals: { account: current_user.account }, formats: :json),
 
       timelines: {
-        home: render(file: 'api/statuses/home', locals: { statuses: @home }, formats: :json),
-        mentions: render(file: 'api/statuses/mentions', locals: { statuses: @mentions }, formats: :json)
+        home: render(file: 'api/v1/statuses/home', locals: { statuses: @home }, formats: :json),
+        mentions: render(file: 'api/v1/statuses/mentions', locals: { statuses: @mentions }, formats: :json)
       }
     }
   end
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index 8e141eb41..c6ba96771 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -54,6 +54,6 @@ class FeedManager
       end
     end
 
-    Rabl::Renderer.new('api/statuses/show', status,  view_path: 'app/views', format: :json, scope: rabl_scope.new(target_account)).render
+    Rabl::Renderer.new('api/v1/statuses/show', status, view_path: 'app/views', format: :json, scope: rabl_scope.new(target_account)).render
   end
 end
diff --git a/app/views/api/accounts/followers.rabl b/app/views/api/accounts/followers.rabl
deleted file mode 100644
index 9bb0d9c8f..000000000
--- a/app/views/api/accounts/followers.rabl
+++ /dev/null
@@ -1,2 +0,0 @@
-collection @followers
-extends('api/accounts/show')
diff --git a/app/views/api/accounts/following.rabl b/app/views/api/accounts/following.rabl
deleted file mode 100644
index 9f2155293..000000000
--- a/app/views/api/accounts/following.rabl
+++ /dev/null
@@ -1,2 +0,0 @@
-collection @following
-extends('api/accounts/show')
diff --git a/app/views/api/accounts/relationships.rabl b/app/views/api/accounts/relationships.rabl
deleted file mode 100644
index 16fdc40d9..000000000
--- a/app/views/api/accounts/relationships.rabl
+++ /dev/null
@@ -1,2 +0,0 @@
-collection @accounts
-extends 'api/accounts/relationship'
diff --git a/app/views/api/accounts/statuses.rabl b/app/views/api/accounts/statuses.rabl
deleted file mode 100644
index 12f00dd21..000000000
--- a/app/views/api/accounts/statuses.rabl
+++ /dev/null
@@ -1,2 +0,0 @@
-collection @statuses
-extends('api/statuses/show')
diff --git a/app/views/api/follows/show.rabl b/app/views/api/follows/show.rabl
deleted file mode 100644
index 0f24ddb4d..000000000
--- a/app/views/api/follows/show.rabl
+++ /dev/null
@@ -1,2 +0,0 @@
-object @account
-extends('api/accounts/show')
diff --git a/app/views/api/statuses/home.rabl b/app/views/api/statuses/home.rabl
deleted file mode 100644
index 12f00dd21..000000000
--- a/app/views/api/statuses/home.rabl
+++ /dev/null
@@ -1,2 +0,0 @@
-collection @statuses
-extends('api/statuses/show')
diff --git a/app/views/api/statuses/mentions.rabl b/app/views/api/statuses/mentions.rabl
deleted file mode 100644
index 12f00dd21..000000000
--- a/app/views/api/statuses/mentions.rabl
+++ /dev/null
@@ -1,2 +0,0 @@
-collection @statuses
-extends('api/statuses/show')
diff --git a/app/views/api/v1/accounts/followers.rabl b/app/views/api/v1/accounts/followers.rabl
new file mode 100644
index 000000000..c54b0487e
--- /dev/null
+++ b/app/views/api/v1/accounts/followers.rabl
@@ -0,0 +1,2 @@
+collection @followers
+extends('api/v1/accounts/show')
diff --git a/app/views/api/v1/accounts/following.rabl b/app/views/api/v1/accounts/following.rabl
new file mode 100644
index 000000000..87b454ffa
--- /dev/null
+++ b/app/views/api/v1/accounts/following.rabl
@@ -0,0 +1,2 @@
+collection @following
+extends('api/v1/accounts/show')
diff --git a/app/views/api/accounts/relationship.rabl b/app/views/api/v1/accounts/relationship.rabl
index 3e5bf882c..3e5bf882c 100644
--- a/app/views/api/accounts/relationship.rabl
+++ b/app/views/api/v1/accounts/relationship.rabl
diff --git a/app/views/api/v1/accounts/relationships.rabl b/app/views/api/v1/accounts/relationships.rabl
new file mode 100644
index 000000000..022ea2ac4
--- /dev/null
+++ b/app/views/api/v1/accounts/relationships.rabl
@@ -0,0 +1,2 @@
+collection @accounts
+extends 'api/v1/accounts/relationship'
diff --git a/app/views/api/accounts/show.rabl b/app/views/api/v1/accounts/show.rabl
index 4f6a3ff99..4f6a3ff99 100644
--- a/app/views/api/accounts/show.rabl
+++ b/app/views/api/v1/accounts/show.rabl
diff --git a/app/views/api/v1/accounts/statuses.rabl b/app/views/api/v1/accounts/statuses.rabl
new file mode 100644
index 000000000..0a0ed13c5
--- /dev/null
+++ b/app/views/api/v1/accounts/statuses.rabl
@@ -0,0 +1,2 @@
+collection @statuses
+extends('api/v1/statuses/show')
diff --git a/app/views/api/apps/create.rabl b/app/views/api/v1/apps/create.rabl
index 1ff6469a4..1ff6469a4 100644
--- a/app/views/api/apps/create.rabl
+++ b/app/views/api/v1/apps/create.rabl
diff --git a/app/views/api/v1/follows/show.rabl b/app/views/api/v1/follows/show.rabl
new file mode 100644
index 000000000..e07106164
--- /dev/null
+++ b/app/views/api/v1/follows/show.rabl
@@ -0,0 +1,2 @@
+object @account
+extends('api/v1/accounts/show')
diff --git a/app/views/api/media/create.rabl b/app/views/api/v1/media/create.rabl
index 803a93094..803a93094 100644
--- a/app/views/api/media/create.rabl
+++ b/app/views/api/v1/media/create.rabl
diff --git a/app/views/api/statuses/context.rabl b/app/views/api/v1/statuses/context.rabl
index 71aff690d..e9176dc29 100644
--- a/app/views/api/statuses/context.rabl
+++ b/app/views/api/v1/statuses/context.rabl
@@ -2,12 +2,12 @@ object false
 
 node :ancestors do
   @ancestors.map do |status|
-    partial('api/statuses/show', object: status)
+    partial('api/v1/statuses/show', object: status)
   end
 end
 
 node :descendants do
   @descendants.map do |status|
-    partial('api/statuses/show', object: status)
+    partial('api/v1/statuses/show', object: status)
   end
 end
diff --git a/app/views/api/v1/statuses/home.rabl b/app/views/api/v1/statuses/home.rabl
new file mode 100644
index 000000000..0a0ed13c5
--- /dev/null
+++ b/app/views/api/v1/statuses/home.rabl
@@ -0,0 +1,2 @@
+collection @statuses
+extends('api/v1/statuses/show')
diff --git a/app/views/api/v1/statuses/mentions.rabl b/app/views/api/v1/statuses/mentions.rabl
new file mode 100644
index 000000000..0a0ed13c5
--- /dev/null
+++ b/app/views/api/v1/statuses/mentions.rabl
@@ -0,0 +1,2 @@
+collection @statuses
+extends('api/v1/statuses/show')
diff --git a/app/views/api/statuses/show.rabl b/app/views/api/v1/statuses/show.rabl
index f06aa6e74..3595bafb4 100644
--- a/app/views/api/statuses/show.rabl
+++ b/app/views/api/v1/statuses/show.rabl
@@ -10,11 +10,11 @@ node(:favourited)       { |status| current_account.favourited?(status) }
 node(:reblogged)        { |status| current_account.reblogged?(status) }
 
 child :reblog => :reblog do
-  extends('api/statuses/show')
+  extends('api/v1/statuses/show')
 end
 
 child :account do
-  extends('api/accounts/show')
+  extends('api/v1/accounts/show')
 end
 
 child :media_attachments, object_root: false do
diff --git a/config/routes.rb b/config/routes.rb
index 737dbbecf..f95ac2ab7 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -39,38 +39,40 @@ Rails.application.routes.draw do
     post '/salmon/:id', to: 'salmon#update', as: :salmon
 
     # JSON / REST API
-    resources :statuses, only: [:create, :show, :destroy] do
-      collection do
-        get :home
-        get :mentions
+    namespace :v1 do
+      resources :statuses, only: [:create, :show, :destroy] do
+        collection do
+          get :home
+          get :mentions
+        end
+
+        member do
+          get :context
+
+          post :reblog
+          post :unreblog
+          post :favourite
+          post :unfavourite
+        end
       end
 
-      member do
-        get :context
-
-        post :reblog
-        post :unreblog
-        post :favourite
-        post :unfavourite
-      end
-    end
-
-    resources :follows,  only: [:create]
-    resources :media,    only: [:create]
-    resources :apps,     only: [:create]
-    
-    resources :accounts, only: [:show] do
-      collection do
-        get :relationships
-      end
-
-      member do
-        get :statuses
-        get :followers
-        get :following
-
-        post :follow
-        post :unfollow
+      resources :follows,  only: [:create]
+      resources :media,    only: [:create]
+      resources :apps,     only: [:create]
+      
+      resources :accounts, only: [:show] do
+        collection do
+          get :relationships
+        end
+
+        member do
+          get :statuses
+          get :followers
+          get :following
+
+          post :follow
+          post :unfollow
+        end
       end
     end
   end
diff --git a/spec/controllers/api/accounts_controller_spec.rb b/spec/controllers/api/v1/accounts_controller_spec.rb
index 7fef8b9fe..bc7c78c70 100644
--- a/spec/controllers/api/accounts_controller_spec.rb
+++ b/spec/controllers/api/v1/accounts_controller_spec.rb
@@ -1,6 +1,6 @@
 require 'rails_helper'
 
-RSpec.describe Api::AccountsController, type: :controller do
+RSpec.describe Api::V1::AccountsController, type: :controller do
   render_views
 
   let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
diff --git a/spec/controllers/api/apps_controller_spec.rb b/spec/controllers/api/v1/apps_controller_spec.rb
index ebadddde2..20a0755ff 100644
--- a/spec/controllers/api/apps_controller_spec.rb
+++ b/spec/controllers/api/v1/apps_controller_spec.rb
@@ -1,6 +1,6 @@
 require 'rails_helper'
 
-RSpec.describe Api::AppsController, type: :controller do
+RSpec.describe Api::V1::AppsController, type: :controller do
   render_views
 
   describe 'POST #create' do
diff --git a/spec/controllers/api/follows_controller_spec.rb b/spec/controllers/api/v1/follows_controller_spec.rb
index f1775dfbc..1346141fa 100644
--- a/spec/controllers/api/follows_controller_spec.rb
+++ b/spec/controllers/api/v1/follows_controller_spec.rb
@@ -1,6 +1,6 @@
 require 'rails_helper'
 
-RSpec.describe Api::FollowsController, type: :controller do
+RSpec.describe Api::V1::FollowsController, type: :controller do
   render_views
 
   let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
diff --git a/spec/controllers/api/media_controller_spec.rb b/spec/controllers/api/v1/media_controller_spec.rb
index e6c44cc9f..1b91354d4 100644
--- a/spec/controllers/api/media_controller_spec.rb
+++ b/spec/controllers/api/v1/media_controller_spec.rb
@@ -1,6 +1,6 @@
 require 'rails_helper'
 
-RSpec.describe Api::MediaController, type: :controller do
+RSpec.describe Api::V1::MediaController, type: :controller do
   render_views
 
   let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
diff --git a/spec/controllers/api/statuses_controller_spec.rb b/spec/controllers/api/v1/statuses_controller_spec.rb
index b1f0a7bcc..7af54299a 100644
--- a/spec/controllers/api/statuses_controller_spec.rb
+++ b/spec/controllers/api/v1/statuses_controller_spec.rb
@@ -1,6 +1,6 @@
 require 'rails_helper'
 
-RSpec.describe Api::StatusesController, type: :controller do
+RSpec.describe Api::V1::StatusesController, type: :controller do
   render_views
 
   let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
diff --git a/spec/helpers/api/accounts_helper_spec.rb b/spec/helpers/api/accounts_helper_spec.rb
deleted file mode 100644
index 8880aaef4..000000000
--- a/spec/helpers/api/accounts_helper_spec.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe Api::AccountsHelper, type: :helper do
-
-end
diff --git a/spec/helpers/api/apps_helper_spec.rb b/spec/helpers/api/apps_helper_spec.rb
deleted file mode 100644
index e26bca2cc..000000000
--- a/spec/helpers/api/apps_helper_spec.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-require 'rails_helper'
-
-# Specs in this file have access to a helper object that includes
-# the Api::AppsHelper. For example:
-#
-# describe Api::AppsHelper do
-#   describe "string concat" do
-#     it "concats two strings with spaces" do
-#       expect(helper.concat_strings("this","that")).to eq("this that")
-#     end
-#   end
-# end
-RSpec.describe Api::AppsHelper, type: :helper do
-  pending "add some examples to (or delete) #{__FILE__}"
-end
diff --git a/spec/helpers/api/follows_helper_spec.rb b/spec/helpers/api/follows_helper_spec.rb
deleted file mode 100644
index ecd9acc7a..000000000
--- a/spec/helpers/api/follows_helper_spec.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe Api::FollowsHelper, type: :helper do
-
-end
diff --git a/spec/helpers/api/media_helper_spec.rb b/spec/helpers/api/media_helper_spec.rb
deleted file mode 100644
index 5eb2def2a..000000000
--- a/spec/helpers/api/media_helper_spec.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe Api::MediaHelper, type: :helper do
-
-end
diff --git a/spec/helpers/api/salmon_helper_spec.rb b/spec/helpers/api/salmon_helper_spec.rb
deleted file mode 100644
index 23f1584df..000000000
--- a/spec/helpers/api/salmon_helper_spec.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe Api::SalmonHelper, type: :helper do
-
-end
diff --git a/spec/helpers/api/statuses_helper_spec.rb b/spec/helpers/api/statuses_helper_spec.rb
deleted file mode 100644
index c1793fda5..000000000
--- a/spec/helpers/api/statuses_helper_spec.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe Api::StatusesHelper, type: :helper do
-
-end
diff --git a/spec/helpers/api/subscriptions_helper_spec.rb b/spec/helpers/api/subscriptions_helper_spec.rb
deleted file mode 100644
index 9e6457c6f..000000000
--- a/spec/helpers/api/subscriptions_helper_spec.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe Api::SubscriptionsHelper, type: :helper do
-
-end