Skip to content

Commit

Permalink
can search by name and description of club, updated tests
Browse files Browse the repository at this point in the history
  • Loading branch information
tariqa96 authored and tariqa96 committed Mar 14, 2019
1 parent ffd19e0 commit b6d007f
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 23 deletions.
21 changes: 15 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,21 @@ 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 = []

triggered = False
if name or description:
triggered = True
if name:
not_null_filters.append(Club.name.ilike(f'%{name}%'))
if description:
not_null_filters.append(Club.description.ilike(f'%{description}%'))

if triggered is False:
# 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
12 changes: 8 additions & 4 deletions bounce/server/api/clubs.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,13 @@ async def get(self, 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 @@ -130,7 +134,7 @@ async def get(self, request):
raise APIError('size too low', status=400)

queried_clubs, result_count, total_pages = club.search(
self.server.db_session, query, page, size)
self.server.db_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 b6d007f

Please sign in to comment.