From cd1a352b8bec5ee45033e181108e091a358d49f3 Mon Sep 17 00:00:00 2001 From: MCAyd <ma04274@surrey.ac.uk> Date: Thu, 20 Apr 2023 01:49:59 +0100 Subject: [PATCH] search is added to navigation, search can be made by content keywords, post_db is made searchable --- .../application/frontend/api/PostClient.py | 12 ++++++++ frontend/application/frontend/views.py | 26 +++++++++++++++++- frontend/application/templates/navbar.html | 7 +++++ post-service/application/models.py | 1 + post-service/application/post_api/routes.py | 16 +++++++++++ post-service/instance/posts-service.db | Bin 16384 -> 16384 bytes user-service/instance/users-service.db | Bin 16384 -> 16384 bytes 7 files changed, 61 insertions(+), 1 deletion(-) diff --git a/frontend/application/frontend/api/PostClient.py b/frontend/application/frontend/api/PostClient.py index 1a7ec0d..f7665bb 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 b7466bd..b5058dd 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 dc8f552..fca2765 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 3fecb83..b59ae48 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 0bdc961..9a1c7de 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 GIT binary patch delta 964 zcmaKqPixdb7>75my1Q+Y*><6SY{3adh0;wYlWCg`r4m*T9(oWJ=|MDYW;bclO-RNr zd)n<?!Qv+ng@Sll`WZZU_tc9APvT8PJvy^nEkV}947`weo;Sbu?e(NyPkJ#g%^oe( zrP=<IH(;q!DCPiDzAM}ECpnVGCtgiVjUSKw7<)E0S9)8zS^QAkDf}!vFBJQSr<c2j z7b>NkG;gbRDqq~H+tA*=l~O0!^`M`^c9aBus|n*IifIydoL%N0_{^s%M%bt#QpE@& zWD(QS4Q&mZCPEwW=4ik&Y=({tSp-u`A@jNp+gOP=y{S^JRGnAt2l5v6_9=sPrv>ef z>$lu?9JxVzl-XFdbfRG$4b2`6!wC9JG#^F>H0%i14uu{~s4)4H!c<l5+XGW0t8xRU z9mV{PTqh1jI*El$P1ki|nEY>tPB(5lfgAH99tXlj%fdCI+V@`eu1?<_i8Cx>Xy%$h z^mUHo)G9G>HQA$kJm|(AKYrTg*uWK31_bqnYCD`d^Oz;R6GHqSIMOwv#^+W0+bbVy z=q{hdGz2uFgpWkbeUOs!Cne#yKm0_;n2gdOY+<aCb%Kak0G4#b+MMk{Ler-qO9gme z7T`tIe#pTKcmBocHHZxht@4%9R`oR#ohLl#8tRxBJRaCcqJ7x%o8Dl7PUfzBy|h$O zPII6OzJbr+BX|!8xCW*{LHVV8QBFZ0JOXvF1zv+A5T2;;ozhkEs&w8$C0kBq%gJn6 i&XyosD%nyl<!7Xb@g1B1`9&#pLV7)+t&{DQ<MMA`aUNIz delta 85 zcmV-b0IL6hfB}Gj0gxL35s@520THoaqz@bn3K;+obPn_mSq<L}Zw(6!p$rlWrwaB8 rj0zdCf%yru85-*a4h#=N01tl;@(<$=)DOk8ARxL9k&t(@LodA$2hJL1 diff --git a/user-service/instance/users-service.db b/user-service/instance/users-service.db index 683a2edb7ee3a1cfcf8ea88e445a618df676d5d5..a0b581d7b48cbdebfc661ed95e2d2becf155f752 100644 GIT binary patch delta 267 zcmZo@U~Fh$oFL8UF;T{u(PLx6Qhsiprwn{O{0_X2c%E)-6y;&zcVOh3*tkcqv5JMC z!I+m>T3DE~QQfpreX_G`tFMZwN>P4kUP`g8sj;bnfq_bJd8VaaRiT-Fn4xEGR+f>9 zlY5?rg?m(nK~auJl%7FauwJ%LsEc#DTW+CSxS>J5b69FgxN)GqbGYf|6S8(fT=N<D r|L}k3|HMCkv!Fs3e;WUHhG2#umPU0(s#?av!py+P3?i7AnHe|%0k}(R delta 126 zcmZo@U~Fh$oFL8UFj2;t(P3l4Qhsh;V+Ot+eh1!1yv7?FMR^4H9T@o-pn$K3k!fP% zKY>Oa7Cr`JUS?@wVa`T%Q-;akWLh_$khK%yddtB7hyOeOC;qpa1r@sZS^4?@Fa%9( V^b=-bW?*Ci5zHWhiJ6&!69A$}9G3t9 -- GitLab