diff --git a/frontend/application/frontend/api/PostClient.py b/frontend/application/frontend/api/PostClient.py index 1a7ec0d25ff1f76260b2a932174a385da7f08cad..f7665bbabd3f7a537b6081598670b6a4c3070369 100644 --- a/frontend/application/frontend/api/PostClient.py +++ b/frontend/application/frontend/api/PostClient.py @@ -30,6 +30,18 @@ class PostClient: return response + def get_search(query): + url = 'http://' + PostClient.post_service + '/api/search/' + str(query) + response = requests.request(method="GET", url=url) + + if response.status_code == 404: + return response.status_code + + response = response.json() + # print(response) + + return response + def get_comment(post_id, comment_id): url = 'http://' + PostClient.post_service + '/api/' + str(post_id) + '/' + str(comment_id) response = requests.request(method="GET", url=url) diff --git a/frontend/application/frontend/views.py b/frontend/application/frontend/views.py index b7466bd1977ee2998621652cbb22c1676459f99e..b5058dd50bfb8cecea74c9e0eb1e9b442c7fcc11 100644 --- a/frontend/application/frontend/views.py +++ b/frontend/application/frontend/views.py @@ -14,6 +14,7 @@ import secrets from PIL import Image from flask import send_file from os import environ, path +from difflib import SequenceMatcher @login_manager.user_loader def load_user(user_id): @@ -137,7 +138,30 @@ def categories(category = None): return redirect(url_for('frontend.get_posts')) return render_template('forum/index.html', - data=zip(category_posts,image_urls), category=category) + data=zip(category_posts,image_urls), category=category) + + +@frontend_blueprint.route('/search', methods=['GET','POST']) +def search(): + if len(session)<4: + return redirect(url_for('frontend.login_route')) + + form = forms.SearchForm(request.form) + words = form.keywords.data + + image_urls = [] + posts = PostClient.get_search(words) + + if posts == 404: + flash('No search result found', 'fail') + return redirect(url_for('frontend.get_posts')) + + for post in posts: + user = UserClient.get_otheruser(post['user_id']) + image_urls.append(user['image_url']) + + return render_template('forum/index.html', + data=zip(posts,image_urls)) def save_post_image(image_file): diff --git a/frontend/application/templates/navbar.html b/frontend/application/templates/navbar.html index dc8f552f6c984970299ce8638577084a18140ffb..fca276562ebca11b4658312bf2238a2456739b9c 100644 --- a/frontend/application/templates/navbar.html +++ b/frontend/application/templates/navbar.html @@ -3,6 +3,13 @@ <ul class="nav navbar-nav"> <li><a href="{{ url_for('frontend.get_posts') }}" class="navbar-brand">SurreySocial</a></li> </ul> + <form action="{{ url_for('frontend.search') }}" method="POST"> + <input type="text" id="keywords" name="keywords" placeholder="Search content keywords + "> + <ul class="nav navbar-nav"> + <li><a class="btn btn--link" href="{{ url_for('frontend.search') }}">Search</a></li> + </ul> + </form> <ul class="nav navbar-nav pull-right"> <li><a class="btn btn--link" href="{{ url_for('frontend.logout') }}">Logout</a></li> </ul> diff --git a/post-service/application/models.py b/post-service/application/models.py index 3fecb837f25e3840737e063a9b1ed2b57570800d..b59ae4872af9debffb98ace3fa581d619240659e 100644 --- a/post-service/application/models.py +++ b/post-service/application/models.py @@ -3,6 +3,7 @@ from . import db from datetime import datetime class Post(db.Model): + __searchable__ = ['title','content'] id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer) user_name = db.Column(db.String(255), nullable=False) diff --git a/post-service/application/post_api/routes.py b/post-service/application/post_api/routes.py index 0bdc961fd2428fe4946849371997a9e0f5677a61..9a1c7de891e0a30ec009f54dcd686cc55e855fc3 100644 --- a/post-service/application/post_api/routes.py +++ b/post-service/application/post_api/routes.py @@ -18,6 +18,22 @@ def get_posts(): response = jsonify(data) return response + +@post_api_blueprint.route('/api/search/<query>', methods=['GET']) +def get_search(query): + responses = [] + query = query.replace(" ", "%") + + for row in Post.query.filter(Post.content.like('%'+query+'%')).order_by(Post.date_added.desc()).all(): + responses.append(row.to_json()) + + if responses == []: + abort(404) + + response = jsonify(responses) + return response + + @post_api_blueprint.route('/api/<int:post_id>', methods=['GET']) def get_post(post_id): responses = [] diff --git a/post-service/instance/posts-service.db b/post-service/instance/posts-service.db index a04cec11ce5c881e4ea16be66fdc7e5fe1705e3e..22429d9bb99fd02a1d1b643f9d1a42f31970fd7b 100644 Binary files a/post-service/instance/posts-service.db and b/post-service/instance/posts-service.db differ diff --git a/user-service/instance/users-service.db b/user-service/instance/users-service.db index 683a2edb7ee3a1cfcf8ea88e445a618df676d5d5..a0b581d7b48cbdebfc661ed95e2d2becf155f752 100644 Binary files a/user-service/instance/users-service.db and b/user-service/instance/users-service.db differ