Skip to content

Commit

Permalink
updated club search capabilities (#139)
Browse files Browse the repository at this point in the history
  • Loading branch information
tariqabulaban authored and bfbachmann committed Mar 23, 2019
1 parent f52df3b commit 6efe7c5
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 23 deletions.
18 changes: 12 additions & 6 deletions bounce/db/club.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"""
import math

from sqlalchemy import Column, Integer, String, desc, func
from sqlalchemy import Column, Integer, String, desc, func, or_
from sqlalchemy.orm import relationship
from sqlalchemy.types import TIMESTAMP

Expand Down Expand Up @@ -74,7 +74,7 @@ def select(session, name):
return None if club is None else club.to_dict()


def search(session, query=None, page=0, size=MAX_SIZE):
def search(session, name=None, description=None, page=0, size=MAX_SIZE):
# TODO: does query, page and size need default values if it's
# already being set using the JSON schema?
"""Returns a list of clubs that contain content from the user's query"""
Expand All @@ -83,12 +83,18 @@ def search(session, query=None, page=0, size=MAX_SIZE):
offset_num = page * size
clubs = session.query(Club)

if query:
# show clubs that have a name that matches the query
clubs = clubs.filter(Club.name.ilike(f'%{query}%'))
else:
not_null_filters = []

if name:
not_null_filters.append(Club.name.ilike(f'%{name}%'))
if description:
not_null_filters.append(Club.description.ilike(f'%{description}%'))

if not not_null_filters:
# show clubs ordered by most recently created
clubs = clubs.order_by(desc(Club.created_at))
else:
clubs = clubs.filter(or_(*not_null_filters))

result_count = clubs.count()
total_pages = math.ceil(result_count / size)
Expand Down
13 changes: 9 additions & 4 deletions bounce/server/api/clubs.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,13 @@ async def get(self, session, request):
"""Handles a GET /club/search request by returning
clubs that contain content from the query."""

query = None
if 'query' in request.args:
query = request.args['query']
name = None
description = None
if 'name' in request.args:
name = request.args['name']
if 'description' in request.args:
description = request.args['description']

page = int(request.args['page'])
size = int(request.args['size'])
if size > MAX_SIZE:
Expand All @@ -128,7 +132,8 @@ async def get(self, session, request):
raise APIError('size too low', status=400)

queried_clubs, result_count, total_pages = club.search(
session, query, page, size)
session, name, description, page, size)

if not queried_clubs:
# Failed to find clubs that match the query
raise APIError('No clubs match your query', status=404)
Expand Down
28 changes: 16 additions & 12 deletions bounce/server/resource/club.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,18 +105,22 @@ class GetClubResponse(metaclass=ResourceMeta):
class SearchClubsRequest(metaclass=ResourceMeta):
"""Defines the schema for a GET /clubs/search request."""
__params__ = {
'query': {
'type': 'string',
},
'page': {
'type': 'string',
'default': '0',
'minimum': '0',
},
'size': {
'type': 'string',
'default': '20',
'minimum': '1',
'type': 'object',
'properties': {
'name': {
'type': 'string',
},
'description': {
'type': 'string',
},
'page': {
'type': 'string',
'default': '0',
},
'size': {
'type': 'string',
'default': '20',
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion tests/api/endpoints/test_2_clubs.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ def test_paginate_clubs__success(server):


def test_search_clubs__success(server):
_, response = server.app.test_client.get('/clubs/search?query=UBC')
_, response = server.app.test_client.get('/clubs/search?name=UBC')
assert response.status == 200
body = response.json
assert len(body.get('results')) == 2
Expand Down

0 comments on commit 6efe7c5

Please sign in to comment.