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