From 6d7146745a64e9748053c8b79e18ec8919f87ede Mon Sep 17 00:00:00 2001
From: root <ma04274@surrey.ac.uk>
Date: Sat, 1 Apr 2023 00:35:00 +0100
Subject: [PATCH] frontend has now home, post and create_post pages, which
 returns all posts, specific post to and its comment section, and post
 creation page consecutively. Comment addition is integrated post display
 page. First run post-service, then run frontend.

---
 frontend/application/__init__.py              |   5 +-
 .../__pycache__/__init__.cpython-310.pyc      | Bin 639 -> 684 bytes
 .../__pycache__/forms.cpython-310.pyc         | Bin 1424 -> 1350 bytes
 .../__pycache__/views.cpython-310.pyc         | Bin 2868 -> 3000 bytes
 .../application/frontend/api/PostClient.py    |  20 ++--
 .../__pycache__/PostClient.cpython-310.pyc    | Bin 2202 -> 2164 bytes
 frontend/application/frontend/forms.py        |  12 +--
 frontend/application/frontend/views.py        |  53 ++++------
 frontend/application/{ => static}/css.css     |   0
 .../templates/forum/create_post.html          |  32 ++++++
 .../application/templates/forum/index.html    |  28 ++++++
 .../application/templates/forum/post.html     |  95 ++++++++++++++++++
 frontend/application/templates/macros.html    |  12 +++
 .../__pycache__/__init__.cpython-310.pyc      | Bin 725 -> 725 bytes
 .../__pycache__/models.cpython-310.pyc        | Bin 1772 -> 1772 bytes
 post-service/application/models.py            |   1 +
 .../__pycache__/routes.cpython-310.pyc        | Bin 3813 -> 3012 bytes
 post-service/application/post_api/routes.py   |  48 ++-------
 post-service/instance/posts-service.db        | Bin 16384 -> 16384 bytes
 19 files changed, 210 insertions(+), 96 deletions(-)
 rename frontend/application/{ => static}/css.css (100%)
 create mode 100644 frontend/application/templates/forum/create_post.html
 create mode 100644 frontend/application/templates/forum/index.html
 create mode 100644 frontend/application/templates/forum/post.html
 create mode 100644 frontend/application/templates/macros.html

diff --git a/frontend/application/__init__.py b/frontend/application/__init__.py
index 7200a3c..cda22c2 100644
--- a/frontend/application/__init__.py
+++ b/frontend/application/__init__.py
@@ -2,16 +2,17 @@
 from flask import Flask
 from os import environ
 from flask_login import LoginManager
+from flask_ckeditor import CKEditor
 
 login_manager = LoginManager()
 
-
 def create_app():
     app = Flask(__name__)
+    ckeditor = CKEditor(app)
 
     app.config['SECRET_KEY'] = '3834j2724827'
 
-    login_manager.init_app(app)
+    # login_manager.init_app(app)
 
     with app.app_context():
     	
diff --git a/frontend/application/__pycache__/__init__.cpython-310.pyc b/frontend/application/__pycache__/__init__.cpython-310.pyc
index fc074320b91121f073733f1fb80373225a2b52fb..3c389dc4b0d64f45b241c79d6ad942efecccb9c8 100644
GIT binary patch
delta 380
zcmX|6%}T>S5T4omZDS&$=&j(PP=g2Y?#b#w1TRH|B5Y%K6JqmIHY<8a@lfwl@&fkm
z$;ZhX_zWI&Q_&e_=9`~yhWR$%Ex+)67qlGR_W9@1@8aq5u)oiNo2i{SBL_iP3m8#u
zar*^E9qtSvpvx$D4zQtv%X6NnLQdKhe`07rwGFhDW9<|uT;LoOsX#~MSi!x)$q7{O
zX0G6M7l9l4qLtZmf^F5Q$O>C@0|YpjS{DYw5RRb?9(4z66VJv}61~5njOAe_7?W0;
z+LI!WlDOFjXEUa;5>Kk3k!(@UWv89lmLg6{B_z8`AH+;1xeAQN(2Ryoregh-?9?B4
zy+_d{uIUjM3F&>w9ZkOq+`3Epy=F5?!*a_08SDFgTEt1tvM>*0A?piru;pozhrenQ
GkNf~4Lt484

delta 309
zcmXv~y-ve05WaK%OxiF2MPgtBmB7x#)`^7$!O+D@Yd1=jIFV~4hIA@Bit+;O#KJT1
zAbtkkpaa-Ke5X5ocly55={|!WKdF->1`GLp$v?W}9B;du@rejFFb%oSgEyE)JbZ*S
z>QwqXchY|lOQ_9>&DG2n4H`GN297N(2`6`;y{+HE4iQ?|20M5kA#jiTWmrY)zbS38
z+n?ceKf?RvfpSX?WlUz3V9bQ`S}uy*BxRi!l2w_^a-j?@WT9EsG-hB6vmz~CwV?~;
znB>acWsa1{i<K6N&B_<is6y(L7|%Ks?Z5EpG$t;FBt}9m_UhQ09#Yz;WE`l0ZF)_v
N4&8f(=prOT?-#IbOc?+G

diff --git a/frontend/application/frontend/__pycache__/forms.cpython-310.pyc b/frontend/application/frontend/__pycache__/forms.cpython-310.pyc
index 4a22ad63e148a6a76e39717fc98514a9f9677412..a81f78029877e5827f4958a5ac6455a9b0e5e797 100644
GIT binary patch
delta 253
zcmbQheT<7QpO=@50SGkG)KliNY~+(?3TM$|y2VzUpPZSPbBiq)OlvY#apmL}m#C%X
zm*%BZaruDQZXh;LEqhvGa%oOU<t=tM2m`2^BdN4ftvEF&r;5V~$O;CsCZA(kz@`ec
zsz`Nm33CV|+vJnXy%Dk?0XYyM4<Zym1V4xXxvEGRL~wuz6%YZ@4QHu=Sn5DR3W$qA
f$~YKU7zLPk7>m>=uVYy*3X;RnG&ze^m5~nsVzoG-

delta 328
zcmX@cHG!KipO=@50SNfssHUW|Zse0^s^`#Ty2X-_np1F##REtJd29uhB^mj7x7Y%}
zG)N>bKP5G*_!gTVm<Eclr>Ewn7A5A~Vt0oyfMOhJsi`SRiOJcwINYEtO{OZ2jFQ|O
z-Q?opDh`hjUmpeM;9!vc;?jbG{GyUuO6<W97Eq8YE3quGIJqdZpyU>p7o0u0g=qns
zKG4-g`jfSoLm0Ux*E9D<sDlJFK!hfU&;k+sAOhsUB3%%{0V4E31VlHSWdLFs0tq=F
hE(R&%U|?YsVB%pcGMt>kvRo7-hoNb*0;?*c5CEO<RYL#(

diff --git a/frontend/application/frontend/__pycache__/views.cpython-310.pyc b/frontend/application/frontend/__pycache__/views.cpython-310.pyc
index f56790c1c496b6811314f58abf343f6845edcc7d..2f86372d518740b140f44703d650e258eefb7e29 100644
GIT binary patch
delta 1484
zcmZ8h&1+;u5buxoJ#Suy#B4T`7&DvQ#J3xh1=kOZE{O}P2##Vz)>9m(Uv{6FkI=8<
z>hOjLIf#esr5C(-NWe=jf*|5W*uUcmf){a5-UFglJ(H|E168lPs=K=C_p6$pF8neT
zb<5>|!0+3gCGmCiWAr!u$b#)HknA!jMULn(>64rYy2E6sn4kxg62%1r8$V>5B)000
zA5ubkmF=$FYp<pqk$kaoPqkYow6J%(naW~IUuTn%^dY321a(5>Mg0N0`OXw<LXZrV
z$35mzi!ti_E78;QSMmO8C%Io(@4vVCVH1q!KMpG!#AMske|huty7v87u3Ewt&LKOX
zn?(4KCK17Ryw6lggel3{_w)gH;&NS9^&Nli*}~2Cn$0B3PRF-px1*AdSh<_1Et9%_
z;4j=RtnEhHDtJA)AM+yEZQM<^RH|ADIJ&Z3Sa|gG!l3@9Od2XNw+#w0l?#w%9O_^F
znfV$l3#Xl^dtFhCf8J=N0#A24TiM>H?NsSM{aV`q6?2J)<t4n~HcetmUPO~o)3{m!
zg-B(yph6x{j|S8NsnCE`C<813&3_`>oa{{u@O(Y(sMj#(tyJ99k64xdtbb#-_v^WJ
z<Q)@PSAK4N78s_<Q7N}_a?JX6Zp(EQBDe<(dZ4T#;R3wg0BZ2~BKV&NZi&(%M;dYl
zF}MhU21kvF2xxGIG>p~dGgt|9&;*glsjPzP&ED#^+et@%;!n-afZ=rVoE(v6yRF8T
z2I3R_2ftL6b8sSN1Hi7~nj73?P0w33=LNJ>^jp^QzJc@#?ByaT=uZh)$mek#4Vi12
zhm|bjsS+w|&H*Q`#OQ@5lWe!!$&$e<%jh@E0#BIrAmRvFMJUoYo@9=fGJH6&u<bn-
z(hx{P0>g6($0_4O3LSYvuh|<PpSQe(yEvdZ$tlpoau`k+(&%hRVb7*vNT*4k3#$(V
z<kk+CbKtj!)bin7q;^^V;Lct#oSD&y!zau@1MWew&@P4{U3C`ejNWh-D+s)dQC$TU
zyZS3<X@3N|*cqS}48g%LFT&|!?96Z${3Q(ZDyoq_N87s~8QMehKM^vE18fw&03CEY
zGdFwHRlQ+P=r`TV`gb-Tnfe*j&!Gvqe(0`Gp7k4%<~`GMFYCu{4QeWR3*)9H9H`ip
z9(?4AUiX&nAoGK149)C3mGl}qN0LU{Hi$_&cq-|DS%&S9$u<3U@J)<EY-Uv6z!laj
XM`D`j)A}^HHs(XQ6ClrlOhxQJWg|Q4

delta 1258
zcmZ8h&u<$=6rP!#{ppPzk~+2niEE5fwkdTeY9mlnwW`D=BCQm9ZKyIXq$PIrb`wOj
zhDtec;53LM)JJY0frJGA01{U&D}=<61LB4dQY*f<uF_CT@6*hCZ+GW?-#7lg@$Fo7
zI5ias{6_U9^Hc4c>R<Af!uC2MeF2b(hjJ`NA{R#9R}^Q;$RjDS-xP`3_~SDvMB-3@
z)*^hjpKa|8(=4SL_K7Uqa`%;>hCNVMR_e&ch?Ls{Cs2XZk~n)<?Oom(WN&c)){ePS
z=$kh--?o41dHJ>73%hpN?XIuq`e85@w2niCxz5E{jojR&%UNVx;~gm}vPu>kKUepr
zOz^2XlA8jx&_pL{nydCpw=S#pJGU)c_7}Hfzi`6(;mqA3?eCs9JL%s0cRnmfN$jlm
zqW#VB8i^`2>bvwj&YL)e=Cjg*z2SAd)10c=1Mi$%uvc~4{^+%D7iz~)$Q8eQrU<B?
z?hOZNpB9m&Hp2p-@VAG%yZu4Ni$R73HMmwnlN;ibM`FIxCHtyB+l;|qBxhu#PD$k`
zsigO)>d{$y+rPG^(O2qtfQ6AG#aiYfm!Qqb9iyP<H1q^b(9<zaOBme}BMoYm{nc+?
z%5?6QMVD4GFl>D0ao}Pdn6Tv3%Y3j4OTZ454f60Q+X-gv>%o$ox9<c?Eq2kr&rO&u
zaf^ogSw9Kv=fRm3ScD)vO`(e_3~Z3Zn=lqVAqJM9WiGyKe-G+wJzoBwBI4XdL^==9
zPAu77v4YDO!BY&DVnscBDO@`bI^=|oF^I`Q0?4QxlcA2u08zQL<M3+T;g6nTfaS&H
zIOpu&VFz<IqwWmPNv{APH~X79_O0m5$Ly9#GmBotrNj5(0iNkKE<Q5|=Qa>2E3cjC
z#2}G69)r6M!ydn_H|T$`jqUM|FR+VX@m2bseXLH)3%2d7HbcHAlY3!sfjN?BgIe~1
zv)CkN?(m6H+tk04^~)<@e{i}N>FIbCVrLcA>t)MLoZwBq7F8rmJ5!feF9Gb9?p#aM
zBwKp^nORrSbQh7%0b-sNc4kXYL#%13|H0qGs{J|oBw^FjS%y;lk~n_)1bgMXoA#s1
Pa?Quni--nduB!e6;->$c

diff --git a/frontend/application/frontend/api/PostClient.py b/frontend/application/frontend/api/PostClient.py
index f779577..24155e0 100644
--- a/frontend/application/frontend/api/PostClient.py
+++ b/frontend/application/frontend/api/PostClient.py
@@ -36,10 +36,11 @@ class PostClient:
 
         return response
 
-
     def create_post(form):
+        # payload = {'title':form.title.data, 'category':form.category.data,
+        #                 'content':form.content.data, 'user':current_user}
         payload = {'title':form.title.data, 'category':form.category.data,
-                        'content':form.content.data, 'user':current_user}
+                        'content':form.content.data}
 
         url = 'http://172.16.238.130:5002/api/new-post'
         response = requests.request(method="POST", url=url, data=payload)
@@ -47,16 +48,6 @@ class PostClient:
         if response:
             return response
 
-    # def create_post(form):
-    #     payload = {'title':form.title, 'category':form.category,
-    #                     'content':form.content, 'user':form.user_id}
-
-    #     url = 'http://172.16.238.130:5002/api/new-post'
-    #     response = requests.request(method="POST", url=url, data=payload)
-
-    #     if response:
-    #         return response
-
     def delete_post(post_id):
 
         url = 'http://172.16.238.130:5002/api/' + str(post_id) + '/delete'
@@ -66,8 +57,9 @@ class PostClient:
             return response
 
     def create_comment(form, post_id):
-        payload = {'content':form.content.data, 'user':current_user, 
-                'post_id':post_id}
+        # payload = {'content':form.content.data, 'user':current_user, 
+        #         'post_id':post_id}
+        payload = {'content':form.content.data, 'post_id':post_id}
 
         url = 'http://172.16.238.130:5002/api/new-comment'
         response = requests.request(method="POST", url=url, data=payload)
diff --git a/frontend/application/frontend/api/__pycache__/PostClient.cpython-310.pyc b/frontend/application/frontend/api/__pycache__/PostClient.cpython-310.pyc
index 1e3590b2d6bdb6a42923fe3e019cf624cbf3b994..c104fb547b7b4b247ef6fd088662cfa373ba4971 100644
GIT binary patch
delta 372
zcmYL@Jx{|h5QgK}P7F<|RBDz&Ddj5)f-VRN0Sn@5W9g2B>Ie~`rgFVdIbvb$bYemM
z6AVl&jEv0v8}I`-hXD_d&aZuU&r9Pc3X3pYbnu+#iQIn;zbQEY!s1IwX0#;IEnUrW
zE~#-1k!(s!YN%=%+IOVWcT#?p(mB_6`aYYB!Hv#t3-vJf2gOilLp@2LK|1iny0NEP
zxJ7j=mMoSL@X1bs1dDNm2&e}!e<W>q=7(etzWCW`4|C(>PEK$=nV}9UQSIgwl~Afu
zVuq>Muzw}Dny#AIJlU=kN-x-L<5jI7Qug;=$q1V+*p#bPTiY(xg?DeKeuU*XK-4L7
vBlz%}5c;EN-TtViF<WiG)KAC-y!kR(v%#jtmPG=o==n7f2ocoaS{(lZ&yz{I

delta 377
zcmYL^u}%U(5QcAW=k8W=7Y~CLAc&&i6&f3&Arz8O)9?TmE-|@6ljUg4Ua+w=7SkDC
zLJJGu!Nged8rmA1ISaS=GW+jj=G*W1sT|!zQOTk6v(eTc&(W6@JruBclz|ot$c1)u
zH}g_oOY2&p;X&roN>j6P>}Y4~B;F_i96(hqVK$wZ+YS!=7T!U<6__dwHcdv2u}xTp
zmosA~*VzSk;|mPJLyD&{AruN%Fc%G+dp*&|H*a`;Lb-KPClwj*7YmuY<Rmkh0y&XY
z;RF`UmW6*OS!^?PJoUTX1`RPggv9%cn;h&i6l0A*PkUTf7%c+6Lls~B_41G|g`X0x
u@K+%5)4z`oxUU!tT($8k=!g+M20Gs7pu^y=nFOUe4nkE?DlFld>i+_-9ZP!v

diff --git a/frontend/application/frontend/forms.py b/frontend/application/frontend/forms.py
index c224908..6725245 100644
--- a/frontend/application/frontend/forms.py
+++ b/frontend/application/frontend/forms.py
@@ -14,14 +14,10 @@ class CreatePostForm(FlaskForm):
 
     title = StringField('Title', validators=[InputRequired()])
     category = SelectField('Category', choices=[
-                            ('help', 'Help'),
-                            ('python', 'Python'),
-                            ('nodejs', 'Nodejs'),
-                            ('general', 'General'),
-                            ('feedback', 'Feedback'),
-                            ('html-css', 'HTML CSS'),
-                            ('support', 'Support'),
-                            ('javascript', 'Javascript')
+                            ('social', 'Social'),
+                            ('lost&found', 'Lost&Found'),
+                            ('faculty', 'Faculty'),
+                            ('buy&sell', 'Buy&Sell')
                             ])
     content = CKEditorField('Content', validators=[
                             InputRequired(), Length(min=20)])
diff --git a/frontend/application/frontend/views.py b/frontend/application/frontend/views.py
index 4a938d7..240fc64 100644
--- a/frontend/application/frontend/views.py
+++ b/frontend/application/frontend/views.py
@@ -16,8 +16,9 @@ def get_posts():
 
     if posts == 404:
         abort(404)
-    return posts
-    
+
+    return render_template('forum/index.html',
+                           posts=posts)    
 
 @frontend_blueprint.route('/post/new', methods=['GET','POST'])
 # @login_required
@@ -28,10 +29,16 @@ def create_post():
             post = PostClient.create_post(form)
             if post:
                 flash('Post created successfully', 'success')
-                return redirect(url_for('forum.create_post', _external=True))
+                return redirect(url_for('frontend.get_posts', _external=True))
             else :
                 flash('Post not successful', 'fail')
-                return redirect(url_for('forum.forum_route', _external=True))
+                return redirect(url_for('frontend.get_posts', _external=True))
+    content = {
+        'page_title': 'New',
+        'form': form,
+        'post': None
+        }
+    return render_template('forum/create_post.html', **content)
 
 
 @frontend_blueprint.route('/post/<int:post_id>', methods=['GET','POST'])
@@ -49,14 +56,15 @@ def display_post(post_id):
 
     if request.method == "POST":
         if form.validate_on_submit():
+            print(form.content)
             comment = PostClient.create_comment(form, post_id)
             if comment:
                 flash('Comment created successfully', 'success')
-                return redirect(url_for('forum.display_post', post_id=post.id))
+                return redirect(url_for('frontend.display_post', post_id=post_id))
             else:
                 flash('Comment not successful', 'fail')
-                return redirect(url_for('forum.display_post', form=form, post_id=post.id))                
-    
+                return redirect(url_for('frontend.display_post', form=form, post_id=post_id))                
+
     content = {
         'post': post,
         'form': form,
@@ -69,7 +77,6 @@ def display_post(post_id):
 @frontend_blueprint.route('/post/<int:post_id>/<int:comment_id>/delete', methods=['GET', 'POST'])
 # @login_required
 def delete_comment(post_id,comment_id):
-    user_id = 2
     comment = PostClient.get_comment(post_id,comment_id)
 
     if comment == 404:
@@ -77,7 +84,8 @@ def delete_comment(post_id,comment_id):
 
     comment_user_id = comment[0]['user_id']
 
-    # if comment_user_id != current_user:
+    # if comment_user_id != int(current_user['id']):
+    user_id = 1
     if comment_user_id != user_id:
         abort(403)
 
@@ -88,13 +96,12 @@ def delete_comment(post_id,comment_id):
     else:
         flash(' Comment deletion not successful', 'fail')
 
-    return redirect(url_for('forum.forum_route'))
+    return redirect(url_for('frontend.display_post',post_id=post_id))
 
 
 @frontend_blueprint.route('/post/<int:post_id>/delete', methods=['GET', 'POST'])
 # @login_required
 def delete_post(post_id):
-    user_id = 1
     post = PostClient.get_post(post_id)
 
     if post == 404:
@@ -102,7 +109,8 @@ def delete_post(post_id):
 
     post_user_id = post[0]['user_id']
 
-    # if post_user_id != current_user:
+    # if post_user_id != int(current_user['id']):
+    user_id = 1
     if post_user_id != user_id:
         abort(403)
 
@@ -112,23 +120,4 @@ def delete_post(post_id):
     else:
         flash(' Post deletion not successful', 'fail')
 
-    return redirect(url_for('forum.forum_route'))
-
-
-# @frontend_blueprint.route('/post/new', methods=['GET','POST'])
-# # @login_required
-# def create_post():
-#     # form = forms.CreatePostForm()
-#     # if request.method == "POST":
-#     #     if form.validate_on_submit():
-#     form = FlaskForm(meta={'csrf': False})
-#     form.title = 'hello world v2'
-#     form.category = 'social'
-#     form.content = 'testing from frontend'
-#     form.user_id = 1
-
-#     post = PostClient.create_post(form)
-#     print(post)
-#     if post:
-#         print('Post created successfully', 'success')
-#                 # return redirect(url_for('forum.create_post', _external=True))
\ No newline at end of file
+    return redirect(url_for('frontend.get_posts'))
\ No newline at end of file
diff --git a/frontend/application/css.css b/frontend/application/static/css.css
similarity index 100%
rename from frontend/application/css.css
rename to frontend/application/static/css.css
diff --git a/frontend/application/templates/forum/create_post.html b/frontend/application/templates/forum/create_post.html
new file mode 100644
index 0000000..e30d80e
--- /dev/null
+++ b/frontend/application/templates/forum/create_post.html
@@ -0,0 +1,32 @@
+{# application/templates/forum/create_post.html #}
+
+{% from 'macros.html' import displayField %}
+
+{% block title %}Create Post{% endblock %}
+
+{% block content %}
+
+    <h1>{{ page_title }} Post</h1>
+
+    <form class="post__form" action="" method="POST">
+
+      {{ displayField(form.title, 'Enter post title') }}
+        <select id="category" name="category">
+          <option value="social">Social</option>
+          <option value="lost&found">Lost&Found</option>
+          <option value="faculty">Faculty</option>
+          <option value="buy&sell">Buy&Sell</option>
+        </select>
+      {{ displayField(form.content, 'Type content here') }}
+
+      <button class="btn btn--solid post-btn" aria-label="Create" type="submit">CREATE</button>
+      <a class="btn btn--cancel" href="{{ url_for('frontend.get_posts') }}">CANCEL</a>
+
+      {{ form.csrf_token }}
+
+    </form>
+
+    {{ ckeditor.load() }}
+    {{ ckeditor.config(name='content') }}
+
+{% endblock %}
diff --git a/frontend/application/templates/forum/index.html b/frontend/application/templates/forum/index.html
new file mode 100644
index 0000000..4055d45
--- /dev/null
+++ b/frontend/application/templates/forum/index.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<body>
+
+<h1>Posts<h1>
+
+<a class="btn btn--link" href="{{ url_for('frontend.create_post') }}">New Post</a>
+
+{% for post in posts %}
+
+        <div class="tile tile--wide">
+
+          <div class="tile__content">
+
+            <header class="tile__header">
+              <h2 class="tile__title"><a href="{{ url_for('frontend.display_post', post_id=post.id) }}">{{ post['title'] }}</a></h2>
+              <span class="tile__date">{{ post['date_added']}}</span>
+            </header>
+
+            <div class="tile__text">
+              <p>{{ post['content'] | safe }}</p>
+            </div>
+
+          </div>
+
+        </div>
+
+      {% endfor %}
\ No newline at end of file
diff --git a/frontend/application/templates/forum/post.html b/frontend/application/templates/forum/post.html
new file mode 100644
index 0000000..80eaf32
--- /dev/null
+++ b/frontend/application/templates/forum/post.html
@@ -0,0 +1,95 @@
+{# application/templates/forum/post.html #}
+
+{% from 'macros.html' import displayField %}
+
+{% block title %}Post{% endblock %}
+
+  <section class="row latest">
+      
+    <!-- START posts -->
+
+    <div class="tile tile--wide">
+
+      <div class="tile__content">
+
+        <div class="tile__header">
+          <h2 class="tile__title"><a href="{{ url_for('frontend.display_post', post_id=post.id) }}">{{ post['title'] }}</a></h2>
+          <p class="tile__date">{{ post['date_added'] }}</p>
+        </div>
+
+        <div class="tile__text">
+          <p>{{ post['content'] | safe }}</p>
+        </div>
+
+        <div class="tile__footer">
+
+          <div class="tile__author">
+            {{ post['user_id']}}
+          </div>
+
+          <div class="tile__buttons">
+            <a class="tile__btn" href="{{ url_for('frontend.delete_post', post_id=post.id) }}">Delete</a>
+          </div>
+
+        </div>
+
+      </div>
+
+    </div>
+    
+    <!-- END posts -->
+
+    <!-- START comments -->
+
+    {% if comments %}
+
+      {% for comment in comments %}
+
+        <div class="comment comment--wide">
+
+          <div class="comment__content">
+
+            <div class="comment__header">
+              <h2 class="comment__title">{{ comment['title'] }}</h2>
+              <p class="tile__date">{{ comment['date_added'] }}</p>
+            </div>
+
+            <div class="comment__text">
+              <p>{{ comment['content'] | safe }}</p>
+            </div>
+
+            <div class="comment__footer">
+
+              <div class="comment__author">
+                <p class="comment__title">{{ comment['user_id']}}</p>
+              </div>
+
+            <div class="tile__buttons">
+              <a class="tile__btn" href="{{ url_for('frontend.delete_comment', post_id=post.id, comment_id=comment.id) }}">Delete Comment</a>
+            </div>
+
+            </div>
+
+          </div>
+
+        </div>
+
+      {% endfor %}
+
+    {% endif %}
+
+    <form class="comment__form" action="" method="POST">
+
+      {{ form.csrf_token }}
+
+      {{ displayField(form.content, 'Type comment here...') }}
+
+      <button class="btn btn--solid post-btn" type="submit">SUBMIT</button>
+      <a class="btn btn--link" href="{{ url_for('frontend.get_posts') }}">HOME</a>
+
+    </form>
+
+    {{ ckeditor.load(pkg_type="basic") }}
+    {{ ckeditor.config(name='content') }}
+
+    <!-- END comments -->
diff --git a/frontend/application/templates/macros.html b/frontend/application/templates/macros.html
new file mode 100644
index 0000000..3b27f63
--- /dev/null
+++ b/frontend/application/templates/macros.html
@@ -0,0 +1,12 @@
+{# application/templates/macros.html #}
+
+
+{% macro displayField(fieldName, placeholderValue) %}
+
+  {{ fieldName(class_='input__field', placeholder=placeholderValue, **kwargs) }}
+
+  {% for error in fieldName.errors %}
+    <p class="form__error">{{ error }}</p>
+  {% endfor %}
+
+{% endmacro %}
diff --git a/post-service/application/__pycache__/__init__.cpython-310.pyc b/post-service/application/__pycache__/__init__.cpython-310.pyc
index 01f59a94537dc3b4f411c5680869877bd387dfbd..7b3e4c585f168d3fe3a6724ca740665e46c8cddc 100644
GIT binary patch
delta 20
Zcmcc0dX<$spO=@50R&>yH*%k10st`71YQ6D

delta 20
acmcc0dX<$spO=@50SJz-R^7;biU|NX6$Nqt

diff --git a/post-service/application/__pycache__/models.cpython-310.pyc b/post-service/application/__pycache__/models.cpython-310.pyc
index 6651d0197ba8e2b46e0f0bbe8010326a5dd19023..0652316d85c960e44d4ebabb0352c9537bf710fc 100644
GIT binary patch
delta 55
zcmaFE`-Yb<pO=@50SKzR)Kk3JHu8OBVicOh{F{+w^B-m_Mn<*C=ByJKH7B27-O4C8
KxsENDQ4#>0#}51e

delta 55
zcmaFE`-Yb<pO=@50SJz-R!zCXx{>cA6QkfH=HHCWoBuFdF*2%7HfNo{s4@8j>sChD
K$#rbGj1mCN$PhCC

diff --git a/post-service/application/models.py b/post-service/application/models.py
index bb46f06..9af9ad5 100644
--- a/post-service/application/models.py
+++ b/post-service/application/models.py
@@ -14,6 +14,7 @@ class Post(db.Model):
     def __repr__(self):
         return '<Post %r>' % (self.title + str(self.id))
 
+     #this is going to change UserClient get user first_name, last_name by using user_id and return as 'user'
     def to_json(self):
         return {
         'id': self.id,
diff --git a/post-service/application/post_api/__pycache__/routes.cpython-310.pyc b/post-service/application/post_api/__pycache__/routes.cpython-310.pyc
index 1c46abf130a35003a70104be8e15244d557a2720..493b4f7de7b0050188b73b6aa70882525becf283 100644
GIT binary patch
literal 3012
zcmaJ@OK;mo5aupl67{g+IF9YSAAK-QqCV1Bng&IkqL;!A;PfK25M(dy$fiVPNi~Q-
z0|nA+Z$0)PAM=-Z?J4KndTGBIlCs>|rLd#r%)aKEZ)O=a8lHjYVDBB}H4NiVdYOML
zynKZgFA2j?h7zGM5FIg)9XT*N=D_M$!cbC~p*?Uq4*Hg|(RVv8_nojZsCKFYujBDJ
zH>?fnow_grXRo0us=6zb_nTBTRsYp^DLPHoH)i^#T44PG>svGZ8MVmz7VFQ>^h@d-
z>(8)$S)DJ|Us0>9Uu6B7s=^|9=L_m0Th6lO(rm_Mb%pgytiL)p<C?n8mUHUHrs3aw
zO?dfM=I+JOu)p&nb9L}+9K=c181(jot`6c+G>n7H?rlXnc?}>9Uu27;C{DV)QNOzt
zj)Rfz50lq2H%YbS%glO=0hzlV4F<t5!3^(*IMC~1A8!+{jhSs)BF@Zjzj*?)I|!1e
zk&3tJJmq7eW23F3y?F?+YaAGfu_vbT(0FA0R6P)>F*Q>$wGNF#A&h5kiZT0AuO_w<
zFQG}C6p=ZQsoXSP$&LQ+aKLvp@g}q3sD6=|y)ew2-e?pIRpus9m!QzJuO^pXnVF?}
zNiQ>X^gOGSfV?vFDy)Bf*?t-gg7z5RwYQ&dh0!iMb_ef2_qPLhItu&Sy`&!v*+8JR
zbu><b`0nUMR^1JfE+bLJYHyklmTZcasK^SMCG-WTCX0;N1HgQrk?*UA+Z2lOq0^Q~
z#R@M#O5{kTKnDH`;3P|&5*rvgkictS9*SwDz>}~vQ?nfRY%LXx=k26g;OV8n^}tH4
zO+&Y^kzZpl^%?XtkGzR=_ul*W^jRqM5{Vj_oSlA{1Uhqz^Xo-2%~1AjeT9ZqOMK(Z
zqLKPM4O<~WaOYx;MpjDX&fzVl)ht;DbZc@3p48W&o-`P|?VO6IGfXdFaPE`KXJ()B
za~?S}JF%vH|9z-B9je^vZ5nWq#0`kajsM25%@HlecPXgExbis`)bF50P-PxeNRvW`
ze=8LTp`6->#sNa7j4@7?IC;1bau?x5cqu)SYATNh&zp1fGIq#=Ap0t_clsLev%5#$
zbB-6G@{Z1(waR`OzRWE&C&sQe2h)exHeQAR@4<Qbw}n<QD*|uQlG=x<2;nezeuqeb
z>hk^OlVhdAp#{*WRKy{K5_zdma<xbWWunLUDGNO_kuMDp*+{J}Xb)+n64FjhNGEak
zD${CeF>ciN4h<k!Q+8@i>xYJN{va&v)J7R~H#8j}vy*-j23ZC99_&V_EkI$IaLId&
zb6@Q#6{uH|s$CrSc7x0TUgI$F8``A#)=s1cd2w>7qJR?mJs9+D5_d>YnaJE2^HEVy
zyOhctg1Vn@wc?EPoy;1aF!vfQa8fSSIVk}z{eO*7F{PO0c+wM|aHNwrQOElt1?5wi
zC#xqAS_NT{1jlL<c}9&xL(!hAOCmA%tf`#}hMD>f!|W=dWS=SxS8m_j&~4hX&M@Yi
zD8F)4dh{ij865o)dYO}t(I1nVS!*)4^{E)t@)=x=f5fbq?ufccF4xKB&+$5GvCG86
zg5KNE&K^pZ83}2PQ%OkFLjtEJs3#$j#E^F4?77oQYBCzsuQD2*vXI0zkj`e(arO0`
zoOC%YsCZ5q>v@gKd8Y3|=hvB8`UCXyT&D=+P|Wzmkm-A5nBkQZ$=08cmPgVS`dt#I
zQ>Z}YDMsZv%@kq+3FnAD_hFyhI)Og_u7~Y{PxEDw5GJIVPmj>~-;yW`OmWN6*T5X6
zCBslOk-{az7D^0DlGRQsk@_a~)o+oYgv<f_jCwNweJe+qZ-G-`YZk04fcphY@Lkrl
z%2HT23j%%t+lIf4${hCM{XE+#uQUO|g*r2|OMR{p&LG0tah@W41vl~OarfvmOxH0s
zv-w+uzcTo?<hzQCE+;wDUQ@g@?LT+l@pYWv#1F95I1C=r7fE~zVnx*PYoRr9`eqHS
SRs1h_vbEyLricIKru+x)j)4>a

literal 3813
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
bb_DHEv|4CQH0smuYAD<5p+sM{Z?@z&tY$6G

diff --git a/post-service/application/post_api/routes.py b/post-service/application/post_api/routes.py
index 116dd30..a0a34ca 100644
--- a/post-service/application/post_api/routes.py
+++ b/post-service/application/post_api/routes.py
@@ -5,39 +5,7 @@ from .. import db
 from ..models import Post, Comment
 from .api.UserClient import UserClient
 
-# for initial post
-@post_api_blueprint.route('/api/initial-post')
-def post_initialpost():
 
-    post = Post()
-    post.user_id = int(1)
-    post.title = 'hello surrey'
-    post.category = 'social'
-    post.content = 'this is initial post, hello world'
-
-    db.session.add(post)
-    db.session.commit()
-    
-    response = jsonify({'message': 'Post added', 'result': post.to_json()})
-
-    return response
-
-# for initial comment
-@post_api_blueprint.route('/api/initial-comment')
-def post_initialcomment():
-
-    comment = Comment()
-    comment.user_id = int(2)
-    comment.post_id = int(2) 
-    comment.content = 'welcome to comment section'
-
-    db.session.add(comment)
-    db.session.commit()
-    
-    response = jsonify({'message': 'Comment added', 'result': comment.to_json()})
-
-    return response
-    
 @post_api_blueprint.route('/api/posts', methods=['GET'])
 def get_posts():
     data = []
@@ -99,9 +67,9 @@ def get_comment(post_id,comment_id):
 # @login_required
 def post_newpost():
 
-    # user_id = request.form['user']
-    user = request.form['current_user']
-    u_id = int(user['id'])
+    # user = request.form['user']
+    # u_id = int(user['id'])
+    u_id = 1
 
     title = request.form['title']
     category = request.form['category']
@@ -133,21 +101,21 @@ def delete_post(post_id):
 
     return response
 
-# @post_api_blueprint.route('/api/<int:post_id>/new-comment', methods=['POST'])
 @post_api_blueprint.route('/api/new-comment', methods=['POST'])
 # @login_required
 def post_comment():
 
-    user = request.form['current_user']
-    u_id = int(user['id'])
+    # user = request.form['user']
+    # u_id = int(user['id'])
+    u_id = 1
 
     content = request.form['content']
-    post_id = request.from_object['post_id']
+    post_id = request.form['post_id']
 
     comment = Comment()
     comment.user_id = u_id
     comment.post_id = post_id
-    comment.connect = content
+    comment.content = content
 
     db.session.add(comment)
     db.session.commit()
diff --git a/post-service/instance/posts-service.db b/post-service/instance/posts-service.db
index c0d65ae2fb58b795e3cce7e9b99df4007ff0b280..f6e18b37da6a48346349bc2e23f0587e609bd451 100755
GIT binary patch
delta 743
zcmZ{hziZS`9Kc^p?k>q)@`77wOJ7l(t})5WZ_|_@NDG}bbT(eodT^J7yGSW2y?~p8
z9{CGg#ie#}b}9-Eg0t@39Gra@jfdKMJP7a0C!d7Rn@p(5gnGG5?Mzp0Q#+^kUqJ|2
zK#N@<zJ;OK6}xAWv?87qbh8Dxd#l0Y@L_+9$c|7FAE7KA=O|6k!6;4gIN3*8bQnK)
zbbMnR4+ff|;SB|EU=?ZDRW(;LWye-5$MQ0Nn*eDS<$rXQs-K`<l*fnZ=orm3(J;G3
zRNTP3nfU@AGUc1K^{YgvsxEOVmW;8Z*>?GLZJmLy!S1x!z7jTSN>g3cadj*^1T&3_
z0s!nyi@OpJzX2Ma19%R<zzcYBCZTt5uS2g=_5U|{dWjmRy?!)c;1AFyZ_d_y+L)cH
z84$>$El2>qhj$<=et^%!=i;s?2%m%(f^=GZ@0>gpSP&Ee;HZDXn683ln=H#9Vdh18
z>2Me)IXXy3q*FW(K1&tv|JNNYs8_{nUfb-nKo9`xug|NlVY^tB70ohjTqgeVb!M}D
zIcT}MB0IX{n9gsIzZ@i&ZOevfYD#V77J`<n+PbOKMs^`+%9^R_xH9sL*Z2j3^0RN0
U?A8;`Yt@s`H#m=~Pan68pM+er6#xJL

delta 356
zcmZo@U~Fh$oFL6;JW<A((RgFRLVkV*1_ow+4hH^J{2}}te0w$v2*~hFY;|Y!nb_zJ
zB0T)OnAsUPH6<O*Gg5PM@)gSSi*iyF%8ZKhlQR=@j0}v7bq$PljSUox46KZdtqe@{
z%ndCp%uGvCi%T-|(iPH*@^e8%UP)?RN(j^BFnL8GBNGKf6Dv~#D?<xCLo-uTOUucf
z@`_9$jBr^aD<cytV-r1Na|<&wbC9e67ucx}82G>Ozvh3ye|58f!VZ2PpdbSSH<(0W
zaxqIXLY&BqU@~zsOL9U)dHK2+Soype_z&^B0X=?_&zsMCv!a4IAEzxlJA<Pm10&<)
uUVBqkCjJ%%`-zR#oVKhm;mdZWliBTSS%CK0O>DH{v|)tEa85pLZwdgxT2aaX

-- 
GitLab