new: dev: update search_bookmarks

This commit is contained in:
rachmadaniHaryono 2019-05-16 21:40:29 +08:00
parent b94d348dc2
commit 8d617c6620
2 changed files with 87 additions and 5 deletions

View File

@ -256,11 +256,8 @@ def create_app(db_file=None):
app.add_url_rule(
'/api/bookmarks/<int:starting_id>/<int:ending_id>',
view_func=bookmark_range_api_view, methods=['GET', 'PUT', 'DELETE'])
app.add_url_rule(
'/api/bookmarks/search',
'search_bookmarks',
search_bookmarks,
methods=['GET', 'DELETE'])
bookmark_search_api_view = ApiBookmarkSearchView.as_view('bookmark_search_api')
app.add_url_rule('/api/bookmarks/search', view_func=bookmark_search_api_view, methods=['GET', 'DELETE'])
# non api
admin.add_view(views.BookmarkModelView(
bukudb, 'Bookmarks', page_size=per_page, url_render_mode=url_render_mode))
@ -455,6 +452,75 @@ class ApiBookmarkRangeView(MethodView):
return res
class ApiBookmarkSearchView(MethodView):
def get(self):
arg_obj = request.args
keywords = arg_obj.getlist('keywords')
all_keywords = arg_obj.get('all_keywords')
deep = arg_obj.get('deep')
regex = arg_obj.get('regex')
# api request is more strict
all_keywords = False if all_keywords is None else all_keywords
deep = False if deep is None else deep
regex = False if regex is None else regex
all_keywords = (
all_keywords if isinstance(all_keywords, bool) else
all_keywords.lower() == 'true'
)
deep = deep if isinstance(deep, bool) else deep.lower() == 'true'
regex = regex if isinstance(regex, bool) else regex.lower() == 'true'
result = {'bookmarks': []}
bukudb = getattr(flask.g, 'bukudb', get_bukudb())
found_bookmarks = bukudb.searchdb(keywords, all_keywords, deep, regex)
found_bookmarks = [] if found_bookmarks is None else found_bookmarks
res = None
if found_bookmarks is not None:
for bookmark in found_bookmarks:
result_bookmark = {
'id': bookmark[0],
'url': bookmark[1],
'title': bookmark[2],
'tags': list([_f for _f in bookmark[3].split(',') if _f]),
'description': bookmark[4]
}
result['bookmarks'].append(result_bookmark)
current_app.logger.debug('total bookmarks:{}'.format(len(result['bookmarks'])))
res = jsonify(result)
return res
def delete(self):
arg_obj = request.form
keywords = arg_obj.getlist('keywords')
all_keywords = arg_obj.get('all_keywords')
deep = arg_obj.get('deep')
regex = arg_obj.get('regex')
# api request is more strict
all_keywords = False if all_keywords is None else all_keywords
deep = False if deep is None else deep
regex = False if regex is None else regex
all_keywords = (
all_keywords if isinstance(all_keywords, bool) else
all_keywords.lower() == 'true'
)
deep = deep if isinstance(deep, bool) else deep.lower() == 'true'
regex = regex if isinstance(regex, bool) else regex.lower() == 'true'
bukudb = getattr(flask.g, 'bukudb', get_bukudb())
found_bookmarks = bukudb.searchdb(keywords, all_keywords, deep, regex)
found_bookmarks = [] if found_bookmarks is None else found_bookmarks
res = None
if found_bookmarks is not None:
for bookmark in found_bookmarks:
result_flag = bukudb.delete_rec(bookmark[0])
if result_flag is False:
res = jsonify(response.response_template['failure'])
res.status = status.HTTP_400_BAD_REQUEST
if res is None:
res = jsonify(response.response_template['success'])
return res
class CustomFlaskGroup(FlaskGroup): # pylint: disable=too-few-public-methods
def __init__(self, **kwargs):
super().__init__(**kwargs)

View File

@ -217,3 +217,19 @@ def test_bookmark_range_api(client):
assert rd.get_json() == response_template['success']
rd = client.get('/api/bookmarks')
assert rd.get_json() == {'bookmarks': []}
def test_bookmark_search(client):
status_code = 200
rd = client.post('/api/bookmarks', data={'url': 'http://google.com'})
assert rd.status_code == status_code
assert rd.get_json() == response_template['success']
rd = client.get('/api/bookmarks/search', query_string={'keywords': ['google']})
assert rd.status_code == status_code
assert rd.get_json() == {'bookmarks': [
{'description': '', 'id': 1, 'tags': [], 'title': '', 'url': 'http://google.com'}]}
rd = client.delete('/api/bookmarks/search', data={'keywords': ['google']})
assert rd.status_code == status_code
assert rd.get_json() == response_template['success']
rd = client.get('/api/bookmarks')
assert rd.get_json() == {'bookmarks': []}