filter maps by user_id in api (#872)
* filter maps by user_id in api * test user_id map filter * update starred maps example to make starred true lol * add user id to map schema/examples
This commit is contained in:
parent
a32f98bde2
commit
1fbfd56d57
8 changed files with 72 additions and 8 deletions
|
@ -5,6 +5,11 @@ module Api
|
||||||
def searchable_columns
|
def searchable_columns
|
||||||
[:name, :desc]
|
[:name, :desc]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def apply_filters(collection)
|
||||||
|
collection = collection.where(user_id: params[:user_id]) if params[:user_id]
|
||||||
|
collection
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -141,6 +141,7 @@ module Api
|
||||||
collection = accessible_records
|
collection = accessible_records
|
||||||
collection = yield collection if block_given?
|
collection = yield collection if block_given?
|
||||||
collection = search_by_q(collection) if params[:q]
|
collection = search_by_q(collection) if params[:q]
|
||||||
|
collection = apply_filters(collection)
|
||||||
collection = order_by_sort(collection) if params[:sort]
|
collection = order_by_sort(collection) if params[:sort]
|
||||||
collection = collection.page(params[:page]).per(params[:per])
|
collection = collection.page(params[:page]).per(params[:per])
|
||||||
self.collection = collection
|
self.collection = collection
|
||||||
|
@ -167,6 +168,11 @@ module Api
|
||||||
collection.where(condition)
|
collection.where(condition)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def apply_filters(collection)
|
||||||
|
# override this function for specific filters
|
||||||
|
collection
|
||||||
|
end
|
||||||
|
|
||||||
def order_by_sort(collection)
|
def order_by_sort(collection)
|
||||||
builder = collection
|
builder = collection
|
||||||
sorts = params[:sort].split(',')
|
sorts = params[:sort].split(',')
|
||||||
|
|
|
@ -2,6 +2,12 @@
|
||||||
get:
|
get:
|
||||||
is: [ searchable: { searchFields: "name, desc" }, embeddable: { embedFields: "user,topics,synapses,mappings,contributors,collaborators" }, orderable, pageable ]
|
is: [ searchable: { searchFields: "name, desc" }, embeddable: { embedFields: "user,topics,synapses,mappings,contributors,collaborators" }, orderable, pageable ]
|
||||||
securedBy: [ null, token, oauth_2_0, cookie ]
|
securedBy: [ null, token, oauth_2_0, cookie ]
|
||||||
|
queryParameters:
|
||||||
|
user_id:
|
||||||
|
description: |
|
||||||
|
Pass a user_id to only return maps created by that user. For example, `/api/v2/maps?user_id=1` would return maps created by the Metamaps user with id 1.
|
||||||
|
required: false
|
||||||
|
type: number
|
||||||
responses:
|
responses:
|
||||||
200:
|
200:
|
||||||
body:
|
body:
|
||||||
|
@ -91,7 +97,7 @@ post:
|
||||||
description: Created
|
description: Created
|
||||||
body:
|
body:
|
||||||
application/json:
|
application/json:
|
||||||
example: !include ../examples/map.json
|
example: !include ../examples/map_starred.json
|
||||||
delete:
|
delete:
|
||||||
responses:
|
responses:
|
||||||
204:
|
204:
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
"starred": false,
|
"starred": false,
|
||||||
"created_at": "2016-03-26T08:02:05.379Z",
|
"created_at": "2016-03-26T08:02:05.379Z",
|
||||||
"updated_at": "2016-03-27T07:20:18.047Z",
|
"updated_at": "2016-03-27T07:20:18.047Z",
|
||||||
|
"user_id": 1234,
|
||||||
"topic_ids": [
|
"topic_ids": [
|
||||||
58,
|
58,
|
||||||
59
|
59
|
||||||
|
|
29
doc/api/examples/map_starred.json
Normal file
29
doc/api/examples/map_starred.json
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"id": 2,
|
||||||
|
"name": "Emergent Network Phenomena",
|
||||||
|
"desc": "Example map for the API",
|
||||||
|
"permission": "commons",
|
||||||
|
"screenshot": "https://s3.amazonaws.com/metamaps-assets/site/missing-map.png",
|
||||||
|
"starred": true,
|
||||||
|
"created_at": "2016-03-26T08:02:05.379Z",
|
||||||
|
"updated_at": "2016-03-27T07:20:18.047Z",
|
||||||
|
"user_id": 1234,
|
||||||
|
"topic_ids": [
|
||||||
|
58,
|
||||||
|
59
|
||||||
|
],
|
||||||
|
"synapse_ids": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"mapping_ids": [
|
||||||
|
94,
|
||||||
|
95,
|
||||||
|
96
|
||||||
|
],
|
||||||
|
"collaborator_ids": [],
|
||||||
|
"contributor_ids": [
|
||||||
|
2
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,6 +9,7 @@
|
||||||
"starred": false,
|
"starred": false,
|
||||||
"created_at": "2016-03-26T08:02:05.379Z",
|
"created_at": "2016-03-26T08:02:05.379Z",
|
||||||
"updated_at": "2016-03-27T07:20:18.047Z",
|
"updated_at": "2016-03-27T07:20:18.047Z",
|
||||||
|
"user_id": 1234,
|
||||||
"topic_ids": [
|
"topic_ids": [
|
||||||
58,
|
58,
|
||||||
59
|
59
|
||||||
|
|
|
@ -27,6 +27,9 @@
|
||||||
"updated_at": {
|
"updated_at": {
|
||||||
"$ref": "_datetimestamp.json"
|
"$ref": "_datetimestamp.json"
|
||||||
},
|
},
|
||||||
|
"user_id": {
|
||||||
|
"$ref": "_id.json"
|
||||||
|
},
|
||||||
"topic_ids": {
|
"topic_ids": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# frozen_string_literal: true
|
#t frozen_string_literal: true
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe 'maps API', type: :request do
|
RSpec.describe 'maps API', type: :request do
|
||||||
|
@ -6,13 +6,26 @@ RSpec.describe 'maps API', type: :request do
|
||||||
let(:token) { create(:token, user: user).token }
|
let(:token) { create(:token, user: user).token }
|
||||||
let(:map) { create(:map, user: user) }
|
let(:map) { create(:map, user: user) }
|
||||||
|
|
||||||
it 'GET /api/v2/maps' do
|
describe 'GET /api/v2/maps' do
|
||||||
create_list(:map, 5)
|
it 'returns all maps' do
|
||||||
get '/api/v2/maps'
|
create_list(:map, 5)
|
||||||
|
get '/api/v2/maps'
|
||||||
|
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
expect(response).to match_json_schema(:maps)
|
expect(response).to match_json_schema(:maps)
|
||||||
expect(JSON.parse(response.body)['data'].count).to eq 5
|
expect(JSON.parse(response.body)['data'].count).to eq 5
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'filters by user id' do
|
||||||
|
create(:map, user_id: 1)
|
||||||
|
create(:map, user_id: 2)
|
||||||
|
create(:map, user_id: 2, permission: :private)
|
||||||
|
get '/api/v2/maps', params: { user_id: 2 }
|
||||||
|
|
||||||
|
expect(response).to have_http_status(:success)
|
||||||
|
expect(JSON.parse(response.body)['data'].count).to eq 1
|
||||||
|
expect(JSON.parse(response.body)['data'][0]['user_id']).to eq 2
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'GET /api/v2/maps/:id' do
|
it 'GET /api/v2/maps/:id' do
|
||||||
|
|
Loading…
Add table
Reference in a new issue