Fix #52 - Add API versioning (v1)
This commit is contained in:
		| @@ -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)); | ||||
|   | ||||
| @@ -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)); | ||||
|       } | ||||
|   | ||||
| @@ -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)); | ||||
|   | ||||
| @@ -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 => { | ||||
|       // | ||||
|   | ||||
| @@ -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)); | ||||
|   | ||||
| @@ -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)); | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| class Api::AccountsController < ApiController | ||||
| class Api::V1::AccountsController < ApiController | ||||
|   before_action :doorkeeper_authorize! | ||||
|   before_action :set_account | ||||
|   respond_to    :json | ||||
| @@ -1,4 +1,4 @@ | ||||
| class Api::AppsController < ApplicationController | ||||
| class Api::V1::AppsController < ApplicationController | ||||
|   respond_to :json | ||||
| 
 | ||||
|   def create | ||||
| @@ -1,4 +1,4 @@ | ||||
| class Api::FollowsController < ApiController | ||||
| class Api::V1::FollowsController < ApiController | ||||
|   before_action :doorkeeper_authorize! | ||||
|   respond_to    :json | ||||
| 
 | ||||
| @@ -1,4 +1,4 @@ | ||||
| class Api::MediaController < ApiController | ||||
| class Api::V1::MediaController < ApiController | ||||
|   before_action :doorkeeper_authorize! | ||||
|   respond_to    :json | ||||
| 
 | ||||
| @@ -1,4 +1,4 @@ | ||||
| class Api::StatusesController < ApiController | ||||
| class Api::V1::StatusesController < ApiController | ||||
|   before_action :doorkeeper_authorize! | ||||
|   respond_to    :json | ||||
| 
 | ||||
| @@ -1,2 +0,0 @@ | ||||
| module Api::AccountsHelper | ||||
| end | ||||
| @@ -1,2 +0,0 @@ | ||||
| module Api::AppsHelper | ||||
| end | ||||
| @@ -1,2 +0,0 @@ | ||||
| module Api::FollowsHelper | ||||
| end | ||||
| @@ -1,2 +0,0 @@ | ||||
| module Api::MediaHelper | ||||
| end | ||||
| @@ -1,2 +0,0 @@ | ||||
| module Api::SalmonHelper | ||||
| end | ||||
| @@ -1,2 +0,0 @@ | ||||
| module Api::StatusesHelper | ||||
| end | ||||
| @@ -1,2 +0,0 @@ | ||||
| module Api::SubscriptionsHelper | ||||
| end | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -1,2 +0,0 @@ | ||||
| collection @followers | ||||
| extends('api/accounts/show') | ||||
| @@ -1,2 +0,0 @@ | ||||
| collection @following | ||||
| extends('api/accounts/show') | ||||
| @@ -1,2 +0,0 @@ | ||||
| collection @accounts | ||||
| extends 'api/accounts/relationship' | ||||
| @@ -1,2 +0,0 @@ | ||||
| collection @statuses | ||||
| extends('api/statuses/show') | ||||
| @@ -1,2 +0,0 @@ | ||||
| object @account | ||||
| extends('api/accounts/show') | ||||
| @@ -1,2 +0,0 @@ | ||||
| collection @statuses | ||||
| extends('api/statuses/show') | ||||
| @@ -1,2 +0,0 @@ | ||||
| collection @statuses | ||||
| extends('api/statuses/show') | ||||
							
								
								
									
										2
									
								
								app/views/api/v1/accounts/followers.rabl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								app/views/api/v1/accounts/followers.rabl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| collection @followers | ||||
| extends('api/v1/accounts/show') | ||||
							
								
								
									
										2
									
								
								app/views/api/v1/accounts/following.rabl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								app/views/api/v1/accounts/following.rabl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| collection @following | ||||
| extends('api/v1/accounts/show') | ||||
							
								
								
									
										2
									
								
								app/views/api/v1/accounts/relationships.rabl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								app/views/api/v1/accounts/relationships.rabl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| collection @accounts | ||||
| extends 'api/v1/accounts/relationship' | ||||
							
								
								
									
										2
									
								
								app/views/api/v1/accounts/statuses.rabl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								app/views/api/v1/accounts/statuses.rabl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| collection @statuses | ||||
| extends('api/v1/statuses/show') | ||||
							
								
								
									
										2
									
								
								app/views/api/v1/follows/show.rabl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								app/views/api/v1/follows/show.rabl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| object @account | ||||
| extends('api/v1/accounts/show') | ||||
| @@ -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 | ||||
							
								
								
									
										2
									
								
								app/views/api/v1/statuses/home.rabl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								app/views/api/v1/statuses/home.rabl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| collection @statuses | ||||
| extends('api/v1/statuses/show') | ||||
							
								
								
									
										2
									
								
								app/views/api/v1/statuses/mentions.rabl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								app/views/api/v1/statuses/mentions.rabl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| collection @statuses | ||||
| extends('api/v1/statuses/show') | ||||
| @@ -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 | ||||
| @@ -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 | ||||
|       resources :follows,  only: [:create] | ||||
|       resources :media,    only: [:create] | ||||
|       resources :apps,     only: [:create] | ||||
|        | ||||
|       resources :accounts, only: [:show] do | ||||
|         collection do | ||||
|           get :relationships | ||||
|         end | ||||
|  | ||||
|         post :reblog | ||||
|         post :unreblog | ||||
|         post :favourite | ||||
|         post :unfavourite | ||||
|       end | ||||
|     end | ||||
|         member do | ||||
|           get :statuses | ||||
|           get :followers | ||||
|           get :following | ||||
|  | ||||
|     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 | ||||
|           post :follow | ||||
|           post :unfollow | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|   end | ||||
|   | ||||
| @@ -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')) } | ||||
| @@ -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 | ||||
| @@ -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')) } | ||||
| @@ -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')) } | ||||
| @@ -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')) } | ||||
| @@ -1,5 +0,0 @@ | ||||
| require 'rails_helper' | ||||
|  | ||||
| RSpec.describe Api::AccountsHelper, type: :helper do | ||||
|  | ||||
| end | ||||
| @@ -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 | ||||
| @@ -1,5 +0,0 @@ | ||||
| require 'rails_helper' | ||||
|  | ||||
| RSpec.describe Api::FollowsHelper, type: :helper do | ||||
|  | ||||
| end | ||||
| @@ -1,5 +0,0 @@ | ||||
| require 'rails_helper' | ||||
|  | ||||
| RSpec.describe Api::MediaHelper, type: :helper do | ||||
|  | ||||
| end | ||||
| @@ -1,5 +0,0 @@ | ||||
| require 'rails_helper' | ||||
|  | ||||
| RSpec.describe Api::SalmonHelper, type: :helper do | ||||
|  | ||||
| end | ||||
| @@ -1,5 +0,0 @@ | ||||
| require 'rails_helper' | ||||
|  | ||||
| RSpec.describe Api::StatusesHelper, type: :helper do | ||||
|  | ||||
| end | ||||
| @@ -1,5 +0,0 @@ | ||||
| require 'rails_helper' | ||||
|  | ||||
| RSpec.describe Api::SubscriptionsHelper, type: :helper do | ||||
|  | ||||
| end | ||||
		Reference in New Issue
	
	Block a user